From 0a7a8723ceffd60e39c878d628501103e98fd5eb Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Mon, 28 Sep 2020 10:01:59 +0100 Subject: [PATCH 001/156] [CI] cherry-pick #20891 (#21314) Co-authored-by: Ivan Fernandez Calvo --- Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index e7f91ef95e5..a70d6f77bd0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -21,6 +21,7 @@ pipeline { JOB_GCS_CREDENTIALS = 'beats-ci-gcs-plugin' OSS_MODULE_PATTERN = '^[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' PIPELINE_LOG_LEVEL = 'INFO' + PYTEST_ADDOPTS = "${params.PYTEST_ADDOPTS}" RUNBLD_DISABLE_NOTIFICATIONS = 'true' TERRAFORM_VERSION = "0.12.24" XPACK_MODULE_PATTERN = '^x-pack\\/[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' @@ -44,6 +45,7 @@ pipeline { string(name: 'awsRegion', defaultValue: 'eu-central-1', description: 'Default AWS region to use for testing.') booleanParam(name: 'runAllStages', defaultValue: false, description: 'Allow to run all stages.') booleanParam(name: 'macosTest', defaultValue: false, description: 'Allow macOS stages.') + string(name: 'PYTEST_ADDOPTS', defaultValue: '', description: 'Additional options to pass to pytest. Use PYTEST_ADDOPTS="-k pattern" to only run tests matching the specified pattern. For retries you can use `--reruns 3 --reruns-delay 15`') } stages { stage('Checkout') { From 5b5c4cfef566073376852b91a2d8ac4c4cc960b5 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Mon, 28 Sep 2020 11:23:49 +0100 Subject: [PATCH 002/156] [CI] refactor runbld post build action (#21256) --- Jenkinsfile | 51 ++++----------------------------------------------- 1 file changed, 4 insertions(+), 47 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index a70d6f77bd0..9121d0d48cf 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,7 +12,8 @@ pipeline { agent { label 'ubuntu-18 && immutable' } environment { AWS_ACCOUNT_SECRET = 'secret/observability-team/ci/elastic-observability-aws-account-auth' - BASE_DIR = 'src/github.com/elastic/beats' + REPO = 'beats' + BASE_DIR = "src/github.com/elastic/${env.REPO}" DOCKERELASTIC_SECRET = 'secret/observability-team/ci/docker-registry/prod' DOCKER_COMPOSE_VERSION = "1.21.0" DOCKER_REGISTRY = 'docker.elastic.co' @@ -122,7 +123,7 @@ pipeline { } post { always { - runbld() + runbld(stashedTestReports: stashedTestReports, project: env.REPO) } cleanup { notifyBuildResult(prComment: true) @@ -348,7 +349,7 @@ def archiveTestOutput(Map args = [:]) { } cmd(label: 'Prepare test output', script: 'python .ci/scripts/pre_archive_test.py') dir('build') { - junitAndStore(allowEmptyResults: true, keepLongStdio: true, testResults: args.testResults, id: args.id) + junitAndStore(allowEmptyResults: true, keepLongStdio: true, testResults: args.testResults, stashedTestReports: stashedTestReports, id: args.id) archiveArtifacts(allowEmptyArchive: true, artifacts: args.artifacts) } catchError(buildResult: 'SUCCESS', message: 'Failed to archive the build test results', stageResult: 'SUCCESS') { @@ -362,50 +363,6 @@ def archiveTestOutput(Map args = [:]) { } } -/** -* This method wraps the junit built-in step to archive the test reports that gonna be populated later on -* with the runbld post build step. -*/ -def junitAndStore(Map args = [:]) { - junit(args) - // args.id could be null in some cases, so let's use the currentmilliseconds - def stageName = args.id ? args.id?.replaceAll("[\\W]|_",'-') : "uncategorized-${new java.util.Date().getTime()}" - stash(includes: args.testResults, allowEmpty: true, name: stageName, useDefaultExcludes: true) - stashedTestReports[stageName] = stageName -} - -/** -* This method populates the test output using the runbld approach. For such it requires the -* global variable stashedTestReports. -* TODO: should be moved to the shared library -*/ -def runbld() { - catchError(buildResult: 'SUCCESS', message: 'runbld post build action failed.') { - if (stashedTestReports) { - def jobName = isPR() ? 'elastic+beats+pull-request' : 'elastic+beats' - deleteDir() - unstashV2(name: 'source', bucket: "${JOB_GCS_BUCKET}", credentialsId: "${JOB_GCS_CREDENTIALS}") - dir("${env.BASE_DIR}") { - // Unstash the test reports - stashedTestReports.each { k, v -> - dir(k) { - unstash(v) - } - } - } - sh(label: 'Process JUnit reports with runbld', - script: """\ - ## for debugging purposes - find . -name "TEST-*.xml" - cat >./runbld-script < Date: Mon, 28 Sep 2020 11:24:05 +0100 Subject: [PATCH 003/156] [CI] Enable macOS builds for branches/tags (#21323) --- auditbeat/Jenkinsfile.yml | 4 +++- filebeat/Jenkinsfile.yml | 4 +++- generator/Jenkinsfile.yml | 8 ++++++-- heartbeat/Jenkinsfile.yml | 4 +++- metricbeat/Jenkinsfile.yml | 4 +++- packetbeat/Jenkinsfile.yml | 4 +++- x-pack/auditbeat/Jenkinsfile.yml | 4 +++- x-pack/elastic-agent/Jenkinsfile.yml | 4 +++- x-pack/filebeat/Jenkinsfile.yml | 4 +++- x-pack/functionbeat/Jenkinsfile.yml | 4 +++- x-pack/metricbeat/Jenkinsfile.yml | 4 +++- 11 files changed, 36 insertions(+), 12 deletions(-) diff --git a/auditbeat/Jenkinsfile.yml b/auditbeat/Jenkinsfile.yml index 873e2c319f3..84bef6a6ceb 100644 --- a/auditbeat/Jenkinsfile.yml +++ b/auditbeat/Jenkinsfile.yml @@ -21,13 +21,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test auditbeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/filebeat/Jenkinsfile.yml b/filebeat/Jenkinsfile.yml index 45b032accfb..d0f36b24536 100644 --- a/filebeat/Jenkinsfile.yml +++ b/filebeat/Jenkinsfile.yml @@ -20,13 +20,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test filebeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/generator/Jenkinsfile.yml b/generator/Jenkinsfile.yml index 071d24858bb..b20081956ee 100644 --- a/generator/Jenkinsfile.yml +++ b/generator/Jenkinsfile.yml @@ -23,21 +23,25 @@ stages: make: "make -C generator/_templates/metricbeat test" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test generator for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags macos-beat: make: "make -C generator/_templates/beat test" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test generator for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/heartbeat/Jenkinsfile.yml b/heartbeat/Jenkinsfile.yml index b8668715c3c..71369fd5814 100644 --- a/heartbeat/Jenkinsfile.yml +++ b/heartbeat/Jenkinsfile.yml @@ -19,13 +19,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test heartbeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/metricbeat/Jenkinsfile.yml b/metricbeat/Jenkinsfile.yml index 1219a27af77..09f1a49b9e2 100644 --- a/metricbeat/Jenkinsfile.yml +++ b/metricbeat/Jenkinsfile.yml @@ -27,13 +27,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test metricbeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/packetbeat/Jenkinsfile.yml b/packetbeat/Jenkinsfile.yml index 416e69a203b..580826bf2fa 100644 --- a/packetbeat/Jenkinsfile.yml +++ b/packetbeat/Jenkinsfile.yml @@ -19,13 +19,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test packetbeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/x-pack/auditbeat/Jenkinsfile.yml b/x-pack/auditbeat/Jenkinsfile.yml index 86f0832d3f2..fd73c10a1c5 100644 --- a/x-pack/auditbeat/Jenkinsfile.yml +++ b/x-pack/auditbeat/Jenkinsfile.yml @@ -20,13 +20,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test auditbeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/x-pack/elastic-agent/Jenkinsfile.yml b/x-pack/elastic-agent/Jenkinsfile.yml index 8f99e11da3c..f5074df5965 100644 --- a/x-pack/elastic-agent/Jenkinsfile.yml +++ b/x-pack/elastic-agent/Jenkinsfile.yml @@ -19,13 +19,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test x-pack/elastic-agent for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/x-pack/filebeat/Jenkinsfile.yml b/x-pack/filebeat/Jenkinsfile.yml index d3d5e6d862e..437f4c074db 100644 --- a/x-pack/filebeat/Jenkinsfile.yml +++ b/x-pack/filebeat/Jenkinsfile.yml @@ -20,13 +20,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test x-pack/filebeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/x-pack/functionbeat/Jenkinsfile.yml b/x-pack/functionbeat/Jenkinsfile.yml index f3428ae7cc8..20a8527eae3 100644 --- a/x-pack/functionbeat/Jenkinsfile.yml +++ b/x-pack/functionbeat/Jenkinsfile.yml @@ -19,13 +19,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test x-pack/functionbeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. diff --git a/x-pack/metricbeat/Jenkinsfile.yml b/x-pack/metricbeat/Jenkinsfile.yml index 2448d43d85b..00fa2c1265e 100644 --- a/x-pack/metricbeat/Jenkinsfile.yml +++ b/x-pack/metricbeat/Jenkinsfile.yml @@ -22,13 +22,15 @@ stages: mage: "mage build unitTest" platforms: ## override default label in this specific stage. - "macosx" - when: ## Aggregate when with the top-level one. + when: ## Override the top-level when. comments: - "/test x-pack/metricbeat for macos" labels: - "macOS" parameters: - "macosTest" + branches: true ## for all the branches + tags: true ## for all the tags windows: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. From a75582f3d7233c8fb9828e25fd39cf9ad35cf903 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Mon, 28 Sep 2020 13:34:12 +0200 Subject: [PATCH 004/156] Skip flaky test TestClientPublishEventKerberosAware (#21296) --- libbeat/outputs/elasticsearch/client_integration_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libbeat/outputs/elasticsearch/client_integration_test.go b/libbeat/outputs/elasticsearch/client_integration_test.go index e243cb7d1e4..67ccc34b8f7 100644 --- a/libbeat/outputs/elasticsearch/client_integration_test.go +++ b/libbeat/outputs/elasticsearch/client_integration_test.go @@ -55,6 +55,8 @@ func TestClientPublishEvent(t *testing.T) { } func TestClientPublishEventKerberosAware(t *testing.T) { + t.Skip("Flaky test: https://github.com/elastic/beats/issues/21295") + err := setupRoleMapping(t, eslegtest.GetEsKerberosHost()) if err != nil { t.Fatal(err) From 2b8fd7ce88b38528647d59da14c623aad6d1553f Mon Sep 17 00:00:00 2001 From: Fae Charlton Date: Mon, 28 Sep 2020 10:38:32 -0400 Subject: [PATCH 005/156] [libbeat] Disk queue implementation (#21176) Initial implementation of the new libbeat disk queue --- libbeat/publisher/includes/includes.go | 1 + libbeat/publisher/queue/diskqueue/acks.go | 146 ++++++ libbeat/publisher/queue/diskqueue/checksum.go | 33 ++ libbeat/publisher/queue/diskqueue/config.go | 158 ++++++ libbeat/publisher/queue/diskqueue/consumer.go | 114 +++++ .../publisher/queue/diskqueue/core_loop.go | 449 ++++++++++++++++++ .../queue/diskqueue/core_loop_test.go | 94 ++++ .../publisher/queue/diskqueue/deleter_loop.go | 99 ++++ libbeat/publisher/queue/diskqueue/frames.go | 72 +++ libbeat/publisher/queue/diskqueue/producer.go | 109 +++++ libbeat/publisher/queue/diskqueue/queue.go | 249 ++++++++++ .../publisher/queue/diskqueue/reader_loop.go | 247 ++++++++++ libbeat/publisher/queue/diskqueue/segments.go | 254 ++++++++++ .../publisher/queue/diskqueue/serialize.go | 154 ++++++ .../publisher/queue/diskqueue/state_file.go | 93 ++++ libbeat/publisher/queue/diskqueue/util.go | 89 ++++ .../publisher/queue/diskqueue/writer_loop.go | 239 ++++++++++ 17 files changed, 2600 insertions(+) create mode 100644 libbeat/publisher/queue/diskqueue/acks.go create mode 100644 libbeat/publisher/queue/diskqueue/checksum.go create mode 100644 libbeat/publisher/queue/diskqueue/config.go create mode 100644 libbeat/publisher/queue/diskqueue/consumer.go create mode 100644 libbeat/publisher/queue/diskqueue/core_loop.go create mode 100644 libbeat/publisher/queue/diskqueue/core_loop_test.go create mode 100644 libbeat/publisher/queue/diskqueue/deleter_loop.go create mode 100644 libbeat/publisher/queue/diskqueue/frames.go create mode 100644 libbeat/publisher/queue/diskqueue/producer.go create mode 100644 libbeat/publisher/queue/diskqueue/queue.go create mode 100644 libbeat/publisher/queue/diskqueue/reader_loop.go create mode 100644 libbeat/publisher/queue/diskqueue/segments.go create mode 100644 libbeat/publisher/queue/diskqueue/serialize.go create mode 100644 libbeat/publisher/queue/diskqueue/state_file.go create mode 100644 libbeat/publisher/queue/diskqueue/util.go create mode 100644 libbeat/publisher/queue/diskqueue/writer_loop.go diff --git a/libbeat/publisher/includes/includes.go b/libbeat/publisher/includes/includes.go index e6f3ded0bee..a14dd16d3ba 100644 --- a/libbeat/publisher/includes/includes.go +++ b/libbeat/publisher/includes/includes.go @@ -27,6 +27,7 @@ import ( _ "github.com/elastic/beats/v7/libbeat/outputs/kafka" _ "github.com/elastic/beats/v7/libbeat/outputs/logstash" _ "github.com/elastic/beats/v7/libbeat/outputs/redis" + _ "github.com/elastic/beats/v7/libbeat/publisher/queue/diskqueue" _ "github.com/elastic/beats/v7/libbeat/publisher/queue/memqueue" _ "github.com/elastic/beats/v7/libbeat/publisher/queue/spool" ) diff --git a/libbeat/publisher/queue/diskqueue/acks.go b/libbeat/publisher/queue/diskqueue/acks.go new file mode 100644 index 00000000000..ed9d7589db2 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/acks.go @@ -0,0 +1,146 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "os" + "sync" + + "github.com/elastic/beats/v7/libbeat/logp" +) + +// queuePosition represents a logical position within the queue buffer. +type queuePosition struct { + segmentID segmentID + offset segmentOffset +} + +type diskQueueACKs struct { + logger *logp.Logger + + // This lock must be held to access diskQueueACKs fields (except for + // diskQueueACKs.done, which is always safe). + lock sync.Mutex + + // The id and position of the first unacknowledged frame. + nextFrameID frameID + nextPosition queuePosition + + // If a frame has been ACKed, then frameSize[frameID] contains its size on + // disk. The size is used to track the queuePosition of the oldest + // remaining frame, which is written to disk as ACKs are received. (We do + // this to avoid duplicating events if the beat terminates without a clean + // shutdown.) + frameSize map[frameID]uint64 + + // segmentBoundaries maps the first frameID of each segment to its + // corresponding segment ID. + segmentBoundaries map[frameID]segmentID + + // When a segment has been completely acknowledged by a consumer, it sends + // the segment ID to this channel, where it is read by the core loop and + // scheduled for deletion. + segmentACKChan chan segmentID + + // An open writable file handle to the file that stores the queue position. + // This position is advanced as we receive ACKs, confirming it is safe + // to move forward, so the acking code is responsible for updating this + // file. + positionFile *os.File + + // When the queue is closed, diskQueueACKs.done is closed to signal that + // the core loop will not accept any more acked segments and any future + // ACKs should be ignored. + done chan struct{} +} + +func newDiskQueueACKs( + logger *logp.Logger, position queuePosition, positionFile *os.File, +) *diskQueueACKs { + return &diskQueueACKs{ + logger: logger, + nextFrameID: 0, + nextPosition: position, + frameSize: make(map[frameID]uint64), + segmentBoundaries: make(map[frameID]segmentID), + segmentACKChan: make(chan segmentID), + positionFile: positionFile, + done: make(chan struct{}), + } +} + +func (dqa *diskQueueACKs) addFrames(frames []*readFrame) { + dqa.lock.Lock() + defer dqa.lock.Unlock() + select { + case <-dqa.done: + // We are already done and should ignore any leftover ACKs we receive. + return + default: + } + for _, frame := range frames { + segment := frame.segment + if frame.id != 0 && frame.id == segment.firstFrameID { + // This is the first frame in its segment, mark it so we know when + // we're starting a new segment. + // + // Subtlety: we don't count the very first frame as a "boundary" even + // though it is the first frame we read from its segment. This prevents + // us from resetting our segment offset to zero, in case the initial + // offset was restored from a previous session instead of starting at + // the beginning of the first file. + dqa.segmentBoundaries[frame.id] = segment.id + } + dqa.frameSize[frame.id] = frame.bytesOnDisk + } + oldSegmentID := dqa.nextPosition.segmentID + if dqa.frameSize[dqa.nextFrameID] != 0 { + for ; dqa.frameSize[dqa.nextFrameID] != 0; dqa.nextFrameID++ { + newSegment, ok := dqa.segmentBoundaries[dqa.nextFrameID] + if ok { + // This is the start of a new segment. Remove this frame from the + // segment boundary list and set the position to the start of the + // new segment. + delete(dqa.segmentBoundaries, dqa.nextFrameID) + dqa.nextPosition = queuePosition{ + segmentID: newSegment, + offset: 0, + } + } + dqa.nextPosition.offset += segmentOffset(dqa.frameSize[dqa.nextFrameID]) + delete(dqa.frameSize, dqa.nextFrameID) + } + // We advanced the ACK position at least somewhat, so write its + // new value. + err := writeQueuePositionToHandle(dqa.positionFile, dqa.nextPosition) + if err != nil { + // TODO: Don't spam this warning on every ACK if it's a permanent error. + dqa.logger.Warnf("Couldn't save queue position: %v", err) + } + } + if oldSegmentID != dqa.nextPosition.segmentID { + // We crossed at least one segment boundary, inform the listener that + // everything before the current segment has been acknowledged (but bail + // out if our done channel has been closed, since that means there is no + // listener on the other end.) + select { + case dqa.segmentACKChan <- dqa.nextPosition.segmentID - 1: + case <-dqa.done: + } + } +} diff --git a/libbeat/publisher/queue/diskqueue/checksum.go b/libbeat/publisher/queue/diskqueue/checksum.go new file mode 100644 index 00000000000..87cdb7b1aef --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/checksum.go @@ -0,0 +1,33 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "encoding/binary" + "hash/crc32" +) + +// Computes the checksum that should be written / read in a frame footer +// based on the raw content of that frame (excluding header / footer). +func computeChecksum(data []byte) uint32 { + hash := crc32.NewIEEE() + frameLength := uint32(len(data) + frameMetadataSize) + binary.Write(hash, binary.LittleEndian, &frameLength) + hash.Write(data) + return hash.Sum32() +} diff --git a/libbeat/publisher/queue/diskqueue/config.go b/libbeat/publisher/queue/diskqueue/config.go new file mode 100644 index 00000000000..f39f608361d --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/config.go @@ -0,0 +1,158 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "errors" + "fmt" + "path/filepath" + + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/cfgtype" + "github.com/elastic/beats/v7/libbeat/paths" + "github.com/elastic/beats/v7/libbeat/publisher/queue" +) + +// Settings contains the configuration fields to create a new disk queue +// or open an existing one. +type Settings struct { + // The path on disk of the queue's containing directory, which will be + // created if it doesn't exist. Within the directory, the queue's state + // is stored in state.dat and each segment's data is stored in + // {segmentIndex}.seg + // If blank, the default directory is "diskqueue" within the beat's data + // directory. + Path string + + // MaxBufferSize is the maximum number of bytes that the queue should + // ever occupy on disk. A value of 0 means the queue can grow until the + // disk is full (this is not recommended on a primary system disk). + MaxBufferSize uint64 + + // MaxSegmentSize is the maximum number of bytes that should be written + // to a single segment file before creating a new one. + MaxSegmentSize uint64 + + // How many events will be read from disk while waiting for a consumer + // request. + ReadAheadLimit int + + // How many events will be queued in memory waiting to be written to disk. + // This setting should rarely matter in practice, but if data is coming + // in faster than it can be written to disk for an extended period, + // this limit can keep it from overflowing memory. + WriteAheadLimit int + + // A listener that should be sent ACKs when an event is successfully + // written to disk. + WriteToDiskListener queue.ACKListener +} + +// userConfig holds the parameters for a disk queue that are configurable +// by the end user in the beats yml file. +type userConfig struct { + Path string `config:"path"` + MaxSize cfgtype.ByteSize `config:"max_size" validate:"required"` + SegmentSize *cfgtype.ByteSize `config:"segment_size"` + ReadAheadLimit *int `config:"read_ahead"` + WriteAheadLimit *int `config:"write_ahead"` +} + +func (c *userConfig) Validate() error { + // If the segment size is explicitly specified, the total queue size must + // be at least twice as large. + if c.SegmentSize != nil && c.MaxSize != 0 && c.MaxSize < *c.SegmentSize*2 { + return errors.New( + "Disk queue max_size must be at least twice as big as segment_size") + } + + // We require a total queue size of at least 10MB, and a segment size of + // at least 1MB. The queue can support lower thresholds, but it will perform + // terribly, so we give an explicit error in that case. + // These bounds are still extremely low for Beats ingestion, but if all you + // need is for a low-volume stream on a tiny device to persist between + // restarts, it will work fine. + if c.MaxSize != 0 && c.MaxSize < 10*1000*1000 { + return fmt.Errorf( + "Disk queue max_size (%d) cannot be less than 10MB", c.MaxSize) + } + if c.SegmentSize != nil && *c.SegmentSize < 1000*1000 { + return fmt.Errorf( + "Disk queue segment_size (%d) cannot be less than 1MB", *c.SegmentSize) + } + + return nil +} + +// DefaultSettings returns a Settings object with reasonable default values +// for all important fields. +func DefaultSettings() Settings { + return Settings{ + MaxSegmentSize: 100 * (1 << 20), // 100MiB + MaxBufferSize: (1 << 30), // 1GiB + + ReadAheadLimit: 256, + WriteAheadLimit: 1024, + } +} + +// SettingsForUserConfig returns a Settings struct initialized with the +// end-user-configurable settings in the given config tree. +func SettingsForUserConfig(config *common.Config) (Settings, error) { + userConfig := userConfig{} + if err := config.Unpack(&userConfig); err != nil { + return Settings{}, fmt.Errorf("parsing user config: %w", err) + } + settings := DefaultSettings() + settings.Path = userConfig.Path + + settings.MaxBufferSize = uint64(userConfig.MaxSize) + if userConfig.SegmentSize != nil { + settings.MaxSegmentSize = uint64(*userConfig.SegmentSize) + } else { + // If no value is specified, default segment size is total queue size + // divided by 10. + settings.MaxSegmentSize = uint64(userConfig.MaxSize) / 10 + } + return settings, nil +} + +// +// bookkeeping helpers +// + +func (settings Settings) directoryPath() string { + if settings.Path == "" { + return paths.Resolve(paths.Data, "diskqueue") + } + return settings.Path +} + +func (settings Settings) stateFilePath() string { + return filepath.Join(settings.directoryPath(), "state.dat") +} + +func (settings Settings) segmentPath(segmentID segmentID) string { + return filepath.Join( + settings.directoryPath(), + fmt.Sprintf("%v.seg", segmentID)) +} + +func (settings Settings) maxSegmentOffset() segmentOffset { + return segmentOffset(settings.MaxSegmentSize - segmentHeaderSize) +} diff --git a/libbeat/publisher/queue/diskqueue/consumer.go b/libbeat/publisher/queue/diskqueue/consumer.go new file mode 100644 index 00000000000..b2922778ea5 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/consumer.go @@ -0,0 +1,114 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "fmt" + + "github.com/elastic/beats/v7/libbeat/publisher" + "github.com/elastic/beats/v7/libbeat/publisher/queue" +) + +type diskQueueConsumer struct { + queue *diskQueue + closed bool +} + +type diskQueueBatch struct { + queue *diskQueue + frames []*readFrame +} + +// +// diskQueueConsumer implementation of the queue.Consumer interface +// + +func (consumer *diskQueueConsumer) Get(eventCount int) (queue.Batch, error) { + if consumer.closed { + return nil, fmt.Errorf("Tried to read from a closed disk queue consumer") + } + + // Read at least one frame. This is guaranteed to eventually + // succeed unless the queue is closed. + frame, ok := <-consumer.queue.readerLoop.output + if !ok { + return nil, fmt.Errorf("Tried to read from a closed disk queue") + } + frames := []*readFrame{frame} +eventLoop: + for eventCount <= 0 || len(frames) < eventCount { + select { + case frame, ok := <-consumer.queue.readerLoop.output: + if !ok { + // The queue was closed while we were reading it, just send back + // what we have so far. + break eventLoop + } + frames = append(frames, frame) + default: + // We can't read any more frames without blocking, so send back + // what we have now. + break eventLoop + } + } + + // There is a mild race condition here based on queue closure: events + // written to readerLoop.output may have been buffered before the + // queue was closed, and we may be reading its leftovers afterwards. + // We could try to detect this case here by checking the + // consumer.queue.done channel, and return nothing if it's been closed. + // But this gives rise to another race: maybe the queue was + // closed _after_ we read those frames, and we _ought_ to return them + // to the reader. The queue interface doesn't specify the proper + // behavior in this case. + // + // Lacking formal requirements, we elect to be permissive: if we have + // managed to read frames, then the queue already knows and considers them + // "read," so we lose no consistency by returning them. If someone closes + // the queue while we are draining the channel, nothing changes functionally + // except that any ACKs after that point will be ignored. A well-behaved + // Beats shutdown will always ACK / close its consumers before closing the + // queue itself, so we expect this corner case not to arise in practice, but + // if it does it is innocuous. + + return &diskQueueBatch{ + queue: consumer.queue, + frames: frames, + }, nil +} + +func (consumer *diskQueueConsumer) Close() error { + consumer.closed = true + return nil +} + +// +// diskQueueBatch implementation of the queue.Batch interface +// + +func (batch *diskQueueBatch) Events() []publisher.Event { + events := make([]publisher.Event, len(batch.frames)) + for i, frame := range batch.frames { + events[i] = frame.event + } + return events +} + +func (batch *diskQueueBatch) ACK() { + batch.queue.acks.addFrames(batch.frames) +} diff --git a/libbeat/publisher/queue/diskqueue/core_loop.go b/libbeat/publisher/queue/diskqueue/core_loop.go new file mode 100644 index 00000000000..56a50b5a422 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/core_loop.go @@ -0,0 +1,449 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import "fmt" + +// This file contains the queue's "core loop" -- the central goroutine +// that owns all queue state that is not encapsulated in one of the +// self-contained helper loops. This is the only file that is allowed to +// modify the queue state after its creation, and it contains the full +// logical "state transition diagram" for queue operation. + +func (dq *diskQueue) run() { + // Wake up the reader and deleter loops if there are segments to process + // from a previous instantiation of the queue. + dq.maybeReadPending() + dq.maybeDeleteACKed() + + for { + select { + // Endpoints used by the producer / consumer API implementation. + case producerWriteRequest := <-dq.producerWriteRequestChan: + dq.handleProducerWriteRequest(producerWriteRequest) + + // After a write request, there may be data ready to send to the + // writer loop. + dq.maybeWritePending() + + case ackedSegmentID := <-dq.acks.segmentACKChan: + dq.handleSegmentACK(ackedSegmentID) + + // After receiving new ACKs, a segment might be ready to delete. + dq.maybeDeleteACKed() + + case <-dq.done: + dq.handleShutdown() + return + + // Writer loop handling + case writerLoopResponse := <-dq.writerLoop.responseChan: + dq.handleWriterLoopResponse(writerLoopResponse) + + // The writer loop completed a request, so check if there is more + // data to be sent. + dq.maybeWritePending() + // We also check whether the reader loop is waiting for the data + // that was just written. + dq.maybeReadPending() + + // Reader loop handling + case readerLoopResponse := <-dq.readerLoop.responseChan: + dq.handleReaderLoopResponse(readerLoopResponse) + + // If there is more data to read, start a new read request. + dq.maybeReadPending() + + // Deleter loop handling + case deleterLoopResponse := <-dq.deleterLoop.responseChan: + dq.handleDeleterLoopResponse(deleterLoopResponse) + + // If there are still files waiting to be deleted, send another request. + dq.maybeDeleteACKed() + + // If there were blocked producers waiting for more queue space, + // we might be able to unblock them now. + dq.maybeUnblockProducers() + } + } +} + +func (dq *diskQueue) handleProducerWriteRequest(request producerWriteRequest) { + // Pathological case checking: make sure the incoming frame isn't bigger + // than an entire segment all by itself (as long as it isn't, it is + // guaranteed to eventually enter the queue assuming no disk errors). + frameSize := request.frame.sizeOnDisk() + if dq.settings.MaxSegmentSize < frameSize { + dq.logger.Warnf( + "Rejecting event with size %v because the maximum segment size is %v", + frameSize, dq.settings.MaxSegmentSize) + request.responseChan <- false + return + } + + // If no one else is blocked waiting for queue capacity, and there is + // enough space, then we add the new frame and report success. + // Otherwise, we either add to the end of blockedProducers to wait for + // the requested space or report immediate failure, depending on the + // producer settings. + if len(dq.blockedProducers) == 0 && dq.canAcceptFrameOfSize(frameSize) { + // There is enough space for the new frame! Add it to the + // pending list and report success, then dispatch it to the + // writer loop if no other requests are outstanding. + dq.enqueueWriteFrame(request.frame) + request.responseChan <- true + } else { + // The queue is too full. Either add the request to blockedProducers, + // or send an immediate reject. + if request.shouldBlock { + dq.blockedProducers = append(dq.blockedProducers, request) + } else { + request.responseChan <- false + } + } +} + +func (dq *diskQueue) handleWriterLoopResponse(response writerLoopResponse) { + dq.writing = false + + // The writer loop response contains the number of bytes written to + // each segment that appeared in the request. Entries always appear in + // the same sequence as (the beginning of) segments.writing. + for index, bytesWritten := range response.bytesWritten { + // Update the segment with its new size. + dq.segments.writing[index].endOffset += segmentOffset(bytesWritten) + } + + // If there is more than one segment in the response, then all but the + // last have been closed and are ready to move to the reading list. + closedCount := len(response.bytesWritten) - 1 + if closedCount > 0 { + // Remove the prefix of the writing array and append to to reading. + closedSegments := dq.segments.writing[:closedCount] + dq.segments.writing = dq.segments.writing[closedCount:] + dq.segments.reading = + append(dq.segments.reading, closedSegments...) + } +} + +func (dq *diskQueue) handleReaderLoopResponse(response readerLoopResponse) { + dq.reading = false + + // Advance the frame / offset based on what was just completed. + dq.segments.nextReadFrameID += frameID(response.frameCount) + dq.segments.nextReadOffset += segmentOffset(response.byteCount) + + var segment *queueSegment + if len(dq.segments.reading) > 0 { + // A segment is finished if we have read all the data, or + // the read response reports an error. + // Segments in the reading list have been completely written, + // so we can rely on their endOffset field to determine their size. + segment = dq.segments.reading[0] + if dq.segments.nextReadOffset >= segment.endOffset || response.err != nil { + dq.segments.reading = dq.segments.reading[1:] + dq.segments.acking = append(dq.segments.acking, segment) + dq.segments.nextReadOffset = 0 + } + } else { + // A segment in the writing list can't be finished writing, + // so we don't check the endOffset. + segment = dq.segments.writing[0] + } + segment.framesRead = uint64(dq.segments.nextReadFrameID - segment.firstFrameID) + + // If there was an error, report it. + if response.err != nil { + dq.logger.Errorf( + "Error reading segment file %s: %v", + dq.settings.segmentPath(segment.id), response.err) + } +} + +func (dq *diskQueue) handleDeleterLoopResponse(response deleterLoopResponse) { + dq.deleting = false + newAckedSegments := []*queueSegment{} + errors := []error{} + for i, err := range response.results { + if err != nil { + // This segment had an error, so it stays in the acked list. + newAckedSegments = append(newAckedSegments, dq.segments.acked[i]) + errors = append(errors, + fmt.Errorf("Couldn't delete segment %d: %w", + dq.segments.acked[i].id, err)) + } + } + if len(dq.segments.acked) > len(response.results) { + // Preserve any new acked segments that were added during the deletion + // request. + tail := dq.segments.acked[len(response.results):] + newAckedSegments = append(newAckedSegments, tail...) + } + dq.segments.acked = newAckedSegments + if len(errors) > 0 { + dq.logger.Errorw("Deleting segment files", "errors", errors) + } +} + +func (dq *diskQueue) handleSegmentACK(ackedSegmentID segmentID) { + acking := dq.segments.acking + if len(acking) == 0 { + return + } + ackedSegmentCount := 0 + for ; ackedSegmentCount < len(acking); ackedSegmentCount++ { + if acking[ackedSegmentCount].id > ackedSegmentID { + // This segment has not been acked yet, we're done. + break + } + } + if ackedSegmentCount > 0 { + // Move fully acked segments to the acked list and remove them + // from the acking list. + dq.segments.acked = + append(dq.segments.acked, acking[:ackedSegmentCount]...) + dq.segments.acking = acking[ackedSegmentCount:] + } +} + +func (dq *diskQueue) handleShutdown() { + // Shutdown: first, we wait for any outstanding requests to complete, to + // make sure the helper loops are idle and all state is finalized, then + // we do final cleanup and write our position to disk. + + // Close the reader loop's request channel to signal an abort in case it's + // still processing a request (we don't need any more frames). + // We still wait for acknowledgement afterwards: if there is a request in + // progress, it's possible that a consumer already read and acknowledged + // some of its data, so we want the final metadata before we write our + // closing state. + close(dq.readerLoop.requestChan) + if dq.reading { + response := <-dq.readerLoop.responseChan + dq.handleReaderLoopResponse(response) + } + + // We are assured by our callers within Beats that we will not be sent a + // shutdown signal until all our producers have been finalized / + // shut down -- thus, there should be no writer requests outstanding, and + // writerLoop.requestChan should be idle. But just in case (and in + // particular to handle the case where a request is stuck retrying a fatal + // error), we signal abort by closing the request channel, and read the + // final state if there is any. + close(dq.writerLoop.requestChan) + if dq.writing { + response := <-dq.writerLoop.responseChan + dq.handleWriterLoopResponse(response) + } + + // We let the deleter loop finish its current request, but we don't send + // the abort signal yet, since we might want to do one last deletion + // after checking the final consumer ACK state. + if dq.deleting { + response := <-dq.deleterLoop.responseChan + dq.handleDeleterLoopResponse(response) + } + + // If there are any blocked producers still hoping for space to open up + // in the queue, send them the bad news. + for _, request := range dq.blockedProducers { + request.responseChan <- false + } + dq.blockedProducers = nil + + // The reader and writer loops are now shut down, and the deleter loop is + // idle. The remaining cleanup is in finalizing the read position in the + // queue (the first event that hasn't been acknowledged by consumers), and + // in deleting any older segment files that may be left. + // + // Events read by consumers have been accumulating their ACK data in + // dq.acks. During regular operation the core loop is not allowed to use + // this data, since it requires holding a mutex, but during shutdown we're + // allowed to block to acquire it. However, we still must close its done + // channel first, otherwise the lock may be held by a consumer that is + // blocked trying to send us a message we're no longer listening to... + close(dq.acks.done) + dq.acks.lock.Lock() + finalPosition := dq.acks.nextPosition + // We won't be updating the position anymore, so we can close the file. + dq.acks.positionFile.Sync() + dq.acks.positionFile.Close() + dq.acks.lock.Unlock() + + // First check for the rare and fortunate case that every single event we + // wrote to the queue was ACKed. In this case it is safe to delete + // everything up to and including the current segment. Otherwise, we only + // delete things before the current segment. + if len(dq.segments.writing) > 0 && + finalPosition.segmentID == dq.segments.writing[0].id && + finalPosition.offset >= dq.segments.writing[0].endOffset { + dq.handleSegmentACK(finalPosition.segmentID) + } else if finalPosition.segmentID > 0 { + dq.handleSegmentACK(finalPosition.segmentID - 1) + } + + // Do one last round of deletions, then shut down the deleter loop. + dq.maybeDeleteACKed() + if dq.deleting { + response := <-dq.deleterLoop.responseChan + dq.handleDeleterLoopResponse(response) + } + close(dq.deleterLoop.requestChan) +} + +// If the pendingFrames list is nonempty, and there are no outstanding +// requests to the writer loop, send the next batch of frames. +func (dq *diskQueue) maybeWritePending() { + if dq.writing || len(dq.pendingFrames) == 0 { + // Nothing to do right now + return + } + // Remove everything from pendingFrames and forward it to the writer loop. + frames := dq.pendingFrames + dq.pendingFrames = nil + + dq.writerLoop.requestChan <- writerLoopRequest{ + frames: frames, + } + dq.writing = true +} + +// Returns the active read segment, or nil if there is none. +func (segments *diskQueueSegments) readingSegment() *queueSegment { + if len(segments.reading) > 0 { + return segments.reading[0] + } + if len(segments.writing) > 0 { + return segments.writing[0] + } + return nil +} + +// If the reading list is nonempty, and there are no outstanding read +// requests, send one. +func (dq *diskQueue) maybeReadPending() { + if dq.reading { + // A read request is already pending + return + } + segment := dq.segments.readingSegment() + if segment == nil || + dq.segments.nextReadOffset >= segmentOffset(segment.endOffset) { + // Nothing to read + return + } + if dq.segments.nextReadOffset == 0 { + // If we're reading the beginning of this segment, assign its firstFrameID. + segment.firstFrameID = dq.segments.nextReadFrameID + } + request := readerLoopRequest{ + segment: segment, + startFrameID: dq.segments.nextReadFrameID, + startOffset: dq.segments.nextReadOffset, + endOffset: segment.endOffset, + } + dq.readerLoop.requestChan <- request + dq.reading = true +} + +// If the acked list is nonempty, and there are no outstanding deletion +// requests, send one. +func (dq *diskQueue) maybeDeleteACKed() { + if !dq.deleting && len(dq.segments.acked) > 0 { + dq.deleterLoop.requestChan <- deleterLoopRequest{ + segments: dq.segments.acked} + dq.deleting = true + } +} + +// maybeUnblockProducers checks whether the queue has enough free space +// to accept any of the requests in the blockedProducers list, and if so +// accepts them in order and updates the list. +func (dq *diskQueue) maybeUnblockProducers() { + unblockedCount := 0 + for _, request := range dq.blockedProducers { + if !dq.canAcceptFrameOfSize(request.frame.sizeOnDisk()) { + // Not enough space for this frame, we're done. + break + } + // Add the frame to pendingFrames and report success. + dq.enqueueWriteFrame(request.frame) + request.responseChan <- true + unblockedCount++ + } + if unblockedCount > 0 { + dq.blockedProducers = dq.blockedProducers[unblockedCount:] + } +} + +// enqueueWriteFrame determines which segment an incoming frame should be +// written to and adds the resulting segmentedFrame to pendingFrames. +func (dq *diskQueue) enqueueWriteFrame(frame *writeFrame) { + // Start with the most recent writing segment if there is one. + var segment *queueSegment + if len(dq.segments.writing) > 0 { + segment = dq.segments.writing[len(dq.segments.writing)-1] + } + frameLen := segmentOffset(frame.sizeOnDisk()) + // If segment is nil, or the new segment exceeds its bounds, + // we need to create a new writing segment. + if segment == nil || + dq.segments.nextWriteOffset+frameLen > dq.settings.maxSegmentOffset() { + segment = &queueSegment{id: dq.segments.nextID} + dq.segments.writing = append(dq.segments.writing, segment) + dq.segments.nextID++ + dq.segments.nextWriteOffset = 0 + } + + dq.segments.nextWriteOffset += frameLen + dq.pendingFrames = append(dq.pendingFrames, segmentedFrame{ + frame: frame, + segment: segment, + }) +} + +// canAcceptFrameOfSize checks whether there is enough free space in the +// queue (subject to settings.MaxBufferSize) to accept a new frame with +// the given size. Size includes both the serialized data and the frame +// header / footer; the easy way to do this for a writeFrame is to pass +// in frame.sizeOnDisk(). +// Capacity calculations do not include requests in the blockedProducers +// list (that data is owned by its callers and we can't touch it until +// we are ready to respond). That allows this helper to be used both while +// handling producer requests and while deciding whether to unblock +// producers after free capacity increases. +// If we decide to add limits on how many events / bytes can be stored +// in pendingFrames (to avoid unbounded memory use if the input is faster +// than the disk), this is the function to modify. +func (dq *diskQueue) canAcceptFrameOfSize(frameSize uint64) bool { + if dq.settings.MaxBufferSize == 0 { + // Currently we impose no limitations if the queue size is unbounded. + return true + } + + // Compute the current queue size. We accept if there is enough capacity + // left in the queue after accounting for the existing segments and the + // pending writes that were already accepted. + pendingBytes := uint64(0) + for _, request := range dq.pendingFrames { + pendingBytes += request.frame.sizeOnDisk() + } + currentSize := pendingBytes + dq.segments.sizeOnDisk() + + return currentSize+frameSize <= dq.settings.MaxBufferSize +} diff --git a/libbeat/publisher/queue/diskqueue/core_loop_test.go b/libbeat/publisher/queue/diskqueue/core_loop_test.go new file mode 100644 index 00000000000..b5f0d301d15 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/core_loop_test.go @@ -0,0 +1,94 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import "testing" + +func TestProducerWriteRequest(t *testing.T) { + dq := &diskQueue{settings: DefaultSettings()} + frame := &writeFrame{ + serialized: make([]byte, 100), + } + request := producerWriteRequest{ + frame: frame, + shouldBlock: true, + responseChan: make(chan bool, 1), + } + dq.handleProducerWriteRequest(request) + + // The request inserts 100 bytes into an empty queue, so it should succeed. + // We expect: + // - the response channel should contain the value true + // - the frame should be added to pendingFrames and assigned to + // segment 0. + success, ok := <-request.responseChan + if !ok { + t.Error("Expected a response from the producer write request.") + } + if !success { + t.Error("Expected write request to succeed") + } + + if len(dq.pendingFrames) != 1 { + t.Error("Expected 1 pending frame after a write request.") + } + if dq.pendingFrames[0].frame != frame { + t.Error("Expected pendingFrames to contain the new frame.") + } + if dq.pendingFrames[0].segment.id != 0 { + t.Error("Expected new frame to be assigned to segment 0.") + } +} + +func TestHandleWriterLoopResponse(t *testing.T) { + // Initialize the queue with two writing segments only. + dq := &diskQueue{ + settings: DefaultSettings(), + segments: diskQueueSegments{ + writing: []*queueSegment{ + {id: 1}, + {id: 2}, + }, + }, + } + // This response says that the writer loop wrote 200 bytes to the first + // segment and 100 bytes to the second. + dq.handleWriterLoopResponse(writerLoopResponse{ + bytesWritten: []int64{200, 100}, + }) + + // After the response is handled, we expect: + // - Each segment's endOffset should be incremented by the bytes written + // - Segment 1 should be moved to the reading list (because all but the + // last segment in a writer loop response has been closed) + // - Segment 2 should remain in the writing list + if len(dq.segments.reading) != 1 || dq.segments.reading[0].id != 1 { + t.Error("Expected segment 1 to move to the reading list") + } + if len(dq.segments.writing) != 1 || dq.segments.writing[0].id != 2 { + t.Error("Expected segment 2 to remain in the writing list") + } + if dq.segments.reading[0].endOffset != 200 { + t.Errorf("Expected segment 1 endOffset 200, got %d", + dq.segments.reading[0].endOffset) + } + if dq.segments.writing[0].endOffset != 100 { + t.Errorf("Expected segment 2 endOffset 100, got %d", + dq.segments.writing[0].endOffset) + } +} diff --git a/libbeat/publisher/queue/diskqueue/deleter_loop.go b/libbeat/publisher/queue/diskqueue/deleter_loop.go new file mode 100644 index 00000000000..4e685285948 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/deleter_loop.go @@ -0,0 +1,99 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "errors" + "os" + "time" +) + +type deleterLoop struct { + // The settings for the queue that created this loop. + settings Settings + + // When one or more segments are ready to delete, they are sent to + // requestChan. At most one deleteRequest may be outstanding at any time. + requestChan chan deleterLoopRequest + + // When a request has been completely processed, a response is sent on + // responseChan. If at least one deletion was successful, the response + // is sent immediately. Otherwise, the deleter loop delays for + // queueSettings.RetryWriteInterval before returning, so timed retries + // don't have to be handled by the core loop. + responseChan chan deleterLoopResponse +} + +type deleterLoopRequest struct { + segments []*queueSegment +} + +type deleterLoopResponse struct { + results []error +} + +func newDeleterLoop(settings Settings) *deleterLoop { + return &deleterLoop{ + settings: settings, + + requestChan: make(chan deleterLoopRequest, 1), + responseChan: make(chan deleterLoopResponse), + } +} + +func (dl *deleterLoop) run() { + for { + request, ok := <-dl.requestChan + if !ok { + // The channel has been closed, time to shut down. + return + } + results := []error{} + deletedCount := 0 + for _, segment := range request.segments { + path := dl.settings.segmentPath(segment.id) + err := os.Remove(path) + // We ignore errors caused by the file not existing: this shouldn't + // happen, but it is still safe to report it as successfully removed. + if err == nil || errors.Is(err, os.ErrNotExist) { + deletedCount++ + results = append(results, nil) + } else { + results = append(results, err) + } + } + if len(request.segments) > 0 && deletedCount == 0 { + // If we were asked to delete segments but could not delete + // _any_ of them, we haven't made progress. Returning an error + // will log the issue and retry, but in this situation we + // want to delay before retrying. The core loop itself can't + // delay (it can never sleep or block), so we handle the + // delay here, by waiting before sending the result. + // The delay can be interrupted if the request channel is closed, + // indicating queue shutdown. + select { + // TODO: make the retry interval configurable. + case <-time.After(time.Second): + case <-dl.requestChan: + } + } + dl.responseChan <- deleterLoopResponse{ + results: results, + } + } +} diff --git a/libbeat/publisher/queue/diskqueue/frames.go b/libbeat/publisher/queue/diskqueue/frames.go new file mode 100644 index 00000000000..02571a65ce9 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/frames.go @@ -0,0 +1,72 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import "github.com/elastic/beats/v7/libbeat/publisher" + +// Every data frame read from the queue is assigned a unique sequential +// integer, which is used to keep track of which frames have been +// acknowledged. +// This id is not stable between restarts; the value 0 is always assigned +// to the oldest remaining frame on startup. +type frameID uint64 + +// A data frame created through the producer API and waiting to be +// written to disk. +type writeFrame struct { + // The event, serialized for writing to disk and wrapped in a frame + // header / footer. + serialized []byte + + // The producer that created this frame. This is included in the + // frame structure itself because we may need the producer and / or + // its config at any time up until it has been completely written: + // - While the core loop is tracking frames to send to the writer, + // it may receive a Cancel request, which requires us to know + // the producer / config each frame came from. + // - After the writer loop has finished writing the frame to disk, + // it needs to call the ACK function specified in ProducerConfig. + producer *diskQueueProducer +} + +// A frame that has been read from disk and is waiting to be read / +// acknowledged through the consumer API. +type readFrame struct { + // The segment containing this frame. + segment *queueSegment + + // The id of this frame. + id frameID + + // The event decoded from the data frame. + event publisher.Event + + // How much space this frame occupied on disk (before deserialization), + // including the frame header / footer. + bytesOnDisk uint64 +} + +// Each data frame has a 32-bit length in the header, and a 32-bit checksum +// and a duplicate 32-bit length in the footer. +const frameHeaderSize = 4 +const frameFooterSize = 8 +const frameMetadataSize = frameHeaderSize + frameFooterSize + +func (frame writeFrame) sizeOnDisk() uint64 { + return uint64(len(frame.serialized) + frameMetadataSize) +} diff --git a/libbeat/publisher/queue/diskqueue/producer.go b/libbeat/publisher/queue/diskqueue/producer.go new file mode 100644 index 00000000000..f4ff4ef2706 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/producer.go @@ -0,0 +1,109 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "github.com/elastic/beats/v7/libbeat/publisher" + "github.com/elastic/beats/v7/libbeat/publisher/queue" +) + +type diskQueueProducer struct { + // The disk queue that created this producer. + queue *diskQueue + + // The configuration this producer was created with. + config queue.ProducerConfig + + encoder *eventEncoder + + // When a producer is cancelled, cancelled is set to true and the done + // channel is closed. (We could get by with just a done channel, but we + // need to make sure that calling Cancel repeatedly doesn't close an + // already-closed channel, which would panic.) + cancelled bool + done chan struct{} +} + +// A request sent from a producer to the core loop to add a frame to the queue. +type producerWriteRequest struct { + frame *writeFrame + shouldBlock bool + responseChan chan bool +} + +// +// diskQueueProducer implementation of the queue.Producer interface +// + +func (producer *diskQueueProducer) Publish(event publisher.Event) bool { + return producer.publish(event, true) +} + +func (producer *diskQueueProducer) TryPublish(event publisher.Event) bool { + return producer.publish(event, false) +} + +func (producer *diskQueueProducer) publish( + event publisher.Event, shouldBlock bool, +) bool { + if producer.cancelled { + return false + } + serialized, err := producer.encoder.encode(&event) + if err != nil { + producer.queue.logger.Errorf( + "Couldn't serialize incoming event: %v", err) + return false + } + request := producerWriteRequest{ + frame: &writeFrame{ + serialized: serialized, + producer: producer, + }, + shouldBlock: shouldBlock, + // This response channel will be used by the core loop, so it must have + // buffer size 1 to guarantee that the core loop will not need to block. + responseChan: make(chan bool, 1), + } + + select { + case producer.queue.producerWriteRequestChan <- request: + // The request has been sent, and we are now guaranteed to get a result on + // the response channel, so we must read from it immediately to avoid + // blocking the core loop. + response := <-request.responseChan + return response + case <-producer.queue.done: + return false + case <-producer.done: + return false + } +} + +func (producer *diskQueueProducer) Cancel() int { + if producer.cancelled { + return 0 + } + producer.cancelled = true + close(producer.done) + + // TODO (possibly?): message the core loop to remove any pending events that + // were sent through this producer. If we do, return the number of cancelled + // events here instead of zero. + return 0 +} diff --git a/libbeat/publisher/queue/diskqueue/queue.go b/libbeat/publisher/queue/diskqueue/queue.go new file mode 100644 index 00000000000..5f756996e5f --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/queue.go @@ -0,0 +1,249 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "errors" + "fmt" + "os" + "sync" + + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/feature" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/publisher/queue" +) + +// diskQueue is the internal type representing a disk-based implementation +// of queue.Queue. +type diskQueue struct { + logger *logp.Logger + settings Settings + + // Metadata related to the segment files. + segments diskQueueSegments + + // Metadata related to consumer acks / positions of the oldest remaining + // frame. + acks *diskQueueACKs + + // The queue's helper loops, each of which is run in its own goroutine. + readerLoop *readerLoop + writerLoop *writerLoop + deleterLoop *deleterLoop + + // Wait group for shutdown of the goroutines associated with this queue: + // reader loop, writer loop, deleter loop, and core loop (diskQueue.run()). + waitGroup sync.WaitGroup + + // writing is true if the writer loop is processing a request, false + // otherwise. + writing bool + + // reading is true if the reader loop is processing a request, false + // otherwise. + reading bool + + // deleting is true if the deleter loop is processing a request, false + // otherwise. + deleting bool + + // The API channel used by diskQueueProducer to write events. + producerWriteRequestChan chan producerWriteRequest + + // pendingFrames is a list of all incoming data frames that have been + // accepted by the queue and are waiting to be sent to the writer loop. + // Segment ids in this list always appear in sorted order, even between + // requests (that is, a frame added to this list always has segment id + // at least as high as every previous frame that has ever been added). + pendingFrames []segmentedFrame + + // blockedProducers is a list of all producer write requests that are + // waiting for free space in the queue. + blockedProducers []producerWriteRequest + + // The channel to signal our goroutines to shut down. + done chan struct{} +} + +func init() { + queue.RegisterQueueType( + "disk", + queueFactory, + feature.MakeDetails( + "Disk queue", + "Buffer events on disk before sending to the output.", + feature.Beta)) +} + +// queueFactory matches the queue.Factory interface, and is used to add the +// disk queue to the registry. +func queueFactory( + ackListener queue.ACKListener, logger *logp.Logger, cfg *common.Config, +) (queue.Queue, error) { + settings, err := SettingsForUserConfig(cfg) + if err != nil { + return nil, fmt.Errorf("disk queue couldn't load user config: %w", err) + } + settings.WriteToDiskListener = ackListener + return NewQueue(logger, settings) +} + +// NewQueue returns a disk-based queue configured with the given logger +// and settings, creating it if it doesn't exist. +func NewQueue(logger *logp.Logger, settings Settings) (queue.Queue, error) { + logger = logger.Named("diskqueue") + logger.Debugf( + "Initializing disk queue at path %v", settings.directoryPath()) + + if settings.MaxBufferSize > 0 && + settings.MaxBufferSize < settings.MaxSegmentSize*2 { + return nil, fmt.Errorf( + "disk queue buffer size (%v) must be at least "+ + "twice the segment size (%v)", + settings.MaxBufferSize, settings.MaxSegmentSize) + } + + // Create the given directory path if it doesn't exist. + err := os.MkdirAll(settings.directoryPath(), os.ModePerm) + if err != nil { + return nil, fmt.Errorf("couldn't create disk queue directory: %w", err) + } + + // Load the previous queue position, if any. + nextReadPosition, err := queuePositionFromPath(settings.stateFilePath()) + if err != nil && !errors.Is(err, os.ErrNotExist) { + // Errors reading / writing the position are non-fatal -- we just log a + // warning and fall back on the oldest existing segment, if any. + logger.Warnf("Couldn't load most recent queue position: %v", err) + } + positionFile, err := os.OpenFile( + settings.stateFilePath(), os.O_WRONLY|os.O_CREATE, 0600) + if err != nil { + // This is not the _worst_ error: we could try operating even without a + // position file. But it indicates a problem with the queue permissions on + // disk, which keeps us from tracking our position within the segment files + // and could also prevent us from creating new ones, so we treat this as a + // fatal error on startup rather than quietly providing degraded + // performance. + return nil, fmt.Errorf("couldn't write to state file: %v", err) + } + + // Index any existing data segments to be placed in segments.reading. + initialSegments, err := scanExistingSegments(settings.directoryPath()) + if err != nil { + return nil, err + } + var nextSegmentID segmentID + if len(initialSegments) > 0 { + // Initialize nextSegmentID to the first ID after the existing segments. + lastID := initialSegments[len(initialSegments)-1].id + nextSegmentID = lastID + 1 + } + + // If any of the initial segments are older than the current queue + // position, move them directly to the acked list where they can be + // deleted. + ackedSegments := []*queueSegment{} + readSegmentID := nextReadPosition.segmentID + for len(initialSegments) > 0 && initialSegments[0].id < readSegmentID { + ackedSegments = append(ackedSegments, initialSegments[0]) + initialSegments = initialSegments[1:] + } + + // If the queue position is older than all existing segments, advance + // it to the beginning of the first one. + if len(initialSegments) > 0 && readSegmentID < initialSegments[0].id { + nextReadPosition = queuePosition{segmentID: initialSegments[0].id} + } + + queue := &diskQueue{ + logger: logger, + settings: settings, + + segments: diskQueueSegments{ + reading: initialSegments, + nextID: nextSegmentID, + nextReadOffset: nextReadPosition.offset, + }, + + acks: newDiskQueueACKs(logger, nextReadPosition, positionFile), + + readerLoop: newReaderLoop(settings), + writerLoop: newWriterLoop(logger, settings), + deleterLoop: newDeleterLoop(settings), + + producerWriteRequestChan: make(chan producerWriteRequest), + + done: make(chan struct{}), + } + + // We wait for four goroutines on shutdown: core loop, reader loop, + // writer loop, deleter loop. + queue.waitGroup.Add(4) + + // Start the goroutines and return the queue! + go func() { + queue.readerLoop.run() + queue.waitGroup.Done() + }() + go func() { + queue.writerLoop.run() + queue.waitGroup.Done() + }() + go func() { + queue.deleterLoop.run() + queue.waitGroup.Done() + }() + go func() { + queue.run() + queue.waitGroup.Done() + }() + + return queue, nil +} + +// +// diskQueue implementation of the queue.Queue interface +// + +func (dq *diskQueue) Close() error { + // Closing the done channel signals to the core loop that it should + // shut down the other helper goroutines and wrap everything up. + close(dq.done) + dq.waitGroup.Wait() + + return nil +} + +func (dq *diskQueue) BufferConfig() queue.BufferConfig { + return queue.BufferConfig{MaxEvents: 0} +} + +func (dq *diskQueue) Producer(cfg queue.ProducerConfig) queue.Producer { + return &diskQueueProducer{ + queue: dq, + config: cfg, + encoder: newEventEncoder(), + done: make(chan struct{}), + } +} + +func (dq *diskQueue) Consumer() queue.Consumer { + return &diskQueueConsumer{queue: dq} +} diff --git a/libbeat/publisher/queue/diskqueue/reader_loop.go b/libbeat/publisher/queue/diskqueue/reader_loop.go new file mode 100644 index 00000000000..dc2bb95777f --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/reader_loop.go @@ -0,0 +1,247 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "encoding/binary" + "fmt" + "os" +) + +type readerLoopRequest struct { + segment *queueSegment + startOffset segmentOffset + startFrameID frameID + endOffset segmentOffset +} + +type readerLoopResponse struct { + // The number of frames successfully read from the requested segment file. + frameCount uint64 + + // The number of bytes successfully read from the requested segment file. + byteCount uint64 + + // If there was an error in the segment file (i.e. inconsistent data), the + // err field is set. + err error +} + +type readerLoop struct { + // The settings for the queue that created this loop. + settings Settings + + // When there is a block available for reading, it will be sent to + // requestChan. When the reader loop has finished processing it, it + // sends the result to finishedReading. If there is more than one block + // available for reading, the core loop will wait until it gets a + // finishedReadingMessage before it + requestChan chan readerLoopRequest + responseChan chan readerLoopResponse + + // Frames that have been read from disk are sent to this channel. + // Unlike most of the queue's API channels, this one is buffered to allow + // the reader to read ahead and cache pending frames before a consumer + // explicitly requests them. + output chan *readFrame + + // The helper object to deserialize binary blobs from the queue into + // publisher.Event objects that can be returned in a readFrame. + decoder *eventDecoder +} + +func newReaderLoop(settings Settings) *readerLoop { + return &readerLoop{ + settings: settings, + + requestChan: make(chan readerLoopRequest, 1), + responseChan: make(chan readerLoopResponse), + output: make(chan *readFrame, settings.ReadAheadLimit), + decoder: newEventDecoder(), + } +} + +func (rl *readerLoop) run() { + for { + request, ok := <-rl.requestChan + if !ok { + // The channel is closed, we are shutting down. + close(rl.output) + return + } + response := rl.processRequest(request) + rl.responseChan <- response + } +} + +func (rl *readerLoop) processRequest(request readerLoopRequest) readerLoopResponse { + frameCount := uint64(0) + byteCount := uint64(0) + nextFrameID := request.startFrameID + + // Open the file and seek to the starting position. + handle, err := request.segment.getReader(rl.settings) + if err != nil { + return readerLoopResponse{err: err} + } + defer handle.Close() + _, err = handle.Seek(segmentHeaderSize+int64(request.startOffset), 0) + if err != nil { + return readerLoopResponse{err: err} + } + + targetLength := uint64(request.endOffset - request.startOffset) + for { + remainingLength := targetLength - byteCount + + // Try to read the next frame, clipping to the given bound. + // If the next frame extends past this boundary, nextFrame will return + // an error. + frame, err := rl.nextFrame(handle, remainingLength) + if frame != nil { + // Add the segment / frame ID, which nextFrame leaves blank. + frame.segment = request.segment + frame.id = nextFrameID + nextFrameID++ + // We've read the frame, try sending it to the output channel. + select { + case rl.output <- frame: + // Successfully sent! Increment the total for this request. + frameCount++ + byteCount += frame.bytesOnDisk + case <-rl.requestChan: + // Since we haven't sent a finishedReading message yet, we can only + // reach this case when the nextReadBlock channel is closed, indicating + // queue shutdown. In this case we immediately return. + return readerLoopResponse{ + frameCount: frameCount, + byteCount: byteCount, + err: nil, + } + } + } + + // We are done with this request if: + // - there was an error reading the frame, + // - there are no more frames to read, or + // - we have reached the end of the requested region + if err != nil || frame == nil || byteCount >= targetLength { + return readerLoopResponse{ + frameCount: frameCount, + byteCount: byteCount, + err: err, + } + } + + // If the output channel's buffer is not full, the previous select + // might not recognize when the queue is being closed, so check that + // again separately before we move on to the next data frame. + select { + case <-rl.requestChan: + return readerLoopResponse{ + frameCount: frameCount, + byteCount: byteCount, + err: nil, + } + default: + } + } +} + +// nextFrame reads and decodes one frame from the given file handle, as long +// it does not exceed the given length bound. The returned frame leaves the +// segment and frame IDs unset. +func (rl *readerLoop) nextFrame( + handle *os.File, maxLength uint64, +) (*readFrame, error) { + // Ensure we are allowed to read the frame header. + if maxLength < frameHeaderSize { + return nil, fmt.Errorf( + "Can't read next frame: remaining length %d is too low", maxLength) + } + // Wrap the handle to retry non-fatal errors and always return the full + // requested data length if possible. + reader := autoRetryReader{handle} + var frameLength uint32 + err := binary.Read(reader, binary.LittleEndian, &frameLength) + if err != nil { + return nil, fmt.Errorf("Couldn't read data frame header: %w", err) + } + + // If the frame extends past the area we were told to read, return an error. + // This should never happen unless the segment file is corrupted. + if maxLength < uint64(frameLength) { + return nil, fmt.Errorf( + "Can't read next frame: frame size is %d but remaining data is only %d", + frameLength, maxLength) + } + if frameLength <= frameMetadataSize { + // Valid enqueued data must have positive length + return nil, fmt.Errorf( + "Data frame with no data (length %d)", frameLength) + } + + // Read the actual frame data + dataLength := frameLength - frameMetadataSize + bytes := rl.decoder.Buffer(int(dataLength)) + _, err = reader.Read(bytes) + if err != nil { + return nil, fmt.Errorf("Couldn't read data frame content: %w", err) + } + + // Read the footer (checksum + duplicate length) + var checksum uint32 + err = binary.Read(reader, binary.LittleEndian, &checksum) + if err != nil { + return nil, fmt.Errorf("Couldn't read data frame checksum: %w", err) + } + expected := computeChecksum(bytes) + if checksum != expected { + return nil, fmt.Errorf( + "Data frame checksum mismatch (%x != %x)", checksum, expected) + } + + var duplicateLength uint32 + err = binary.Read(reader, binary.LittleEndian, &duplicateLength) + if err != nil { + return nil, fmt.Errorf("Couldn't read data frame footer: %w", err) + } + if duplicateLength != frameLength { + return nil, fmt.Errorf( + "Inconsistent data frame length (%d vs %d)", + frameLength, duplicateLength) + } + + event, err := rl.decoder.Decode() + if err != nil { + // Unlike errors in the segment or frame metadata, this is entirely + // a problem in the event [de]serialization which may be isolated (i.e. + // may not indicate data corruption in the segment). + // TODO: Rather than pass this error back to the read request, which + // discards the rest of the segment, we should just log the error and + // advance to the next frame, which is likely still valid. + return nil, fmt.Errorf("Couldn't decode data frame: %w", err) + } + + frame := &readFrame{ + event: event, + bytesOnDisk: uint64(frameLength), + } + + return frame, nil +} diff --git a/libbeat/publisher/queue/diskqueue/segments.go b/libbeat/publisher/queue/diskqueue/segments.go new file mode 100644 index 00000000000..5ce0dc49962 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/segments.go @@ -0,0 +1,254 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "encoding/binary" + "fmt" + "io/ioutil" + "os" + "sort" + "strconv" + "strings" +) + +// diskQueueSegments encapsulates segment-related queue metadata. +type diskQueueSegments struct { + + // A list of the segments that have not yet been completely written, sorted + // by increasing segment ID. When the first entry has been completely + // written, it is removed from this list and appended to reading. + // + // If the reading list is empty, the queue may read from a segment that is + // still being written, but it will always be writing[0], since later + // entries do not yet exist on disk. + writing []*queueSegment + + // A list of the segments that have been completely written but have + // not yet been completely read, sorted by increasing segment ID. When the + // first entry has been completely read, it is removed from this list and + // appended to acking. + reading []*queueSegment + + // A list of the segments that have been completely read but have not yet + // been completely acknowledged, sorted by increasing segment ID. When the + // first entry has been completely acknowledged, it is removed from this + // list and appended to acked. + acking []*queueSegment + + // A list of the segments that have been completely read and acknowledged + // and are ready to be deleted. When a segment is successfully deleted, it + // is removed from this list and discarded. + acked []*queueSegment + + // The next sequential unused segment ID. This is what will be assigned + // to the next queueSegment we create. + nextID segmentID + + // nextWriteOffset is the segment offset at which the next new frame + // should be written. This offset always applies to the last entry of + // writing[]. This is distinct from the endOffset field within a segment: + // endOffset tracks how much data _has_ been written to a segment, while + // nextWriteOffset also includes everything that is _scheduled_ to be + // written. + nextWriteOffset segmentOffset + + // nextReadFrameID is the first frame ID in the current or pending + // read request. + nextReadFrameID frameID + + // nextReadOffset is the segment offset corresponding to the frame + // nextReadFrameID. This offset always applies to the first reading + // segment: either reading[0], or writing[0] if reading is empty. + nextReadOffset segmentOffset +} + +// segmentID is a unique persistent integer id assigned to each created +// segment in ascending order. +type segmentID uint64 + +// segmentOffset is a byte index into the segment's data region. +// An offset of 0 means the first byte after the segment file header. +type segmentOffset uint64 + +// The metadata for a single segment file. +type queueSegment struct { + // A segment id is globally unique within its originating queue. + id segmentID + + // The byte offset of the end of the segment's data region. This is + // updated when the segment is written to, and should always correspond + // to the end of a complete data frame. The total size of a segment file + // on disk is segmentHeaderSize + segment.endOffset. + endOffset segmentOffset + + // The ID of the first frame that was / will be read from this segment. + // This field is only valid after a read request has been sent for + // this segment. (Currently it is only used to handle consumer ACKs, + // which can only happen after reading has begun on the segment.) + firstFrameID frameID + + // The number of frames read from this segment during this session. This + // does not necessarily equal the number of frames in the segment, even + // after reading is complete, since the segment may have been partially + // read during a previous session. + // + // Used to count how many frames still need to be acknowledged by consumers. + framesRead uint64 +} + +type segmentHeader struct { + version uint32 +} + +// Segment headers are currently just a 32-bit version. +const segmentHeaderSize = 4 + +// Sort order: we store loaded segments in ascending order by their id. +type bySegmentID []*queueSegment + +func (s bySegmentID) Len() int { return len(s) } +func (s bySegmentID) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s bySegmentID) Less(i, j int) bool { return s[i].id < s[j].id } + +// Scan the given path for segment files, and return them in a list +// ordered by segment id. +func scanExistingSegments(path string) ([]*queueSegment, error) { + files, err := ioutil.ReadDir(path) + if err != nil { + return nil, fmt.Errorf("Couldn't read queue directory '%s': %w", path, err) + } + + segments := []*queueSegment{} + for _, file := range files { + if file.Size() <= segmentHeaderSize { + // Ignore segments that don't have at least some data beyond the + // header (this will always be true of segments we write unless there + // is an error). + continue + } + components := strings.Split(file.Name(), ".") + if len(components) == 2 && strings.ToLower(components[1]) == "seg" { + // Parse the id as base-10 64-bit unsigned int. We ignore file names that + // don't match the "[uint64].seg" pattern. + if id, err := strconv.ParseUint(components[0], 10, 64); err == nil { + segments = append(segments, + &queueSegment{ + id: segmentID(id), + endOffset: segmentOffset(file.Size() - segmentHeaderSize), + }) + } + } + } + sort.Sort(bySegmentID(segments)) + return segments, nil +} + +func (segment *queueSegment) sizeOnDisk() uint64 { + return uint64(segment.endOffset) + segmentHeaderSize +} + +// Should only be called from the reader loop. +func (segment *queueSegment) getReader( + queueSettings Settings, +) (*os.File, error) { + path := queueSettings.segmentPath(segment.id) + file, err := os.Open(path) + if err != nil { + return nil, fmt.Errorf( + "Couldn't open segment %d: %w", segment.id, err) + } + // Right now there is only one valid header (indicating schema version + // zero) so we don't need the value itself. + _, err = readSegmentHeader(file) + if err != nil { + file.Close() + return nil, fmt.Errorf("Couldn't read segment header: %w", err) + } + + return file, nil +} + +// Should only be called from the writer loop. +func (segment *queueSegment) getWriter( + queueSettings Settings, +) (*os.File, error) { + path := queueSettings.segmentPath(segment.id) + file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + return nil, err + } + header := &segmentHeader{version: 0} + err = writeSegmentHeader(file, header) + if err != nil { + return nil, fmt.Errorf("Couldn't write segment header: %w", err) + } + + return file, nil +} + +// getWriterWithRetry tries to create a file handle for writing via +// queueSegment.getWriter. On error, it retries as long as the given +// retry callback returns true. This is used for timed retries when +// creating a queue segment from the writer loop. +func (segment *queueSegment) getWriterWithRetry( + queueSettings Settings, retry func(error) bool, +) (*os.File, error) { + file, err := segment.getWriter(queueSettings) + for err != nil && retry(err) { + // Try again + file, err = segment.getWriter(queueSettings) + } + return file, err +} + +func readSegmentHeader(in *os.File) (*segmentHeader, error) { + header := &segmentHeader{} + err := binary.Read(in, binary.LittleEndian, &header.version) + if err != nil { + return nil, err + } + if header.version != 0 { + return nil, fmt.Errorf("Unrecognized schema version %d", header.version) + } + return header, nil +} + +func writeSegmentHeader(out *os.File, header *segmentHeader) error { + err := binary.Write(out, binary.LittleEndian, header.version) + return err +} + +// The number of bytes occupied by all the queue's segment files. This +// should only be called from the core loop. +func (segments *diskQueueSegments) sizeOnDisk() uint64 { + total := uint64(0) + for _, segment := range segments.writing { + total += segment.sizeOnDisk() + } + for _, segment := range segments.reading { + total += segment.sizeOnDisk() + } + for _, segment := range segments.acking { + total += segment.sizeOnDisk() + } + for _, segment := range segments.acked { + total += segment.sizeOnDisk() + } + return total +} diff --git a/libbeat/publisher/queue/diskqueue/serialize.go b/libbeat/publisher/queue/diskqueue/serialize.go new file mode 100644 index 00000000000..9db8e7b1bd9 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/serialize.go @@ -0,0 +1,154 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Encoding / decoding routines adapted from +// libbeat/publisher/queue/spool/codec.go. + +package diskqueue + +import ( + "bytes" + "time" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/outputs/codec" + "github.com/elastic/beats/v7/libbeat/publisher" + "github.com/elastic/go-structform/gotype" + "github.com/elastic/go-structform/json" +) + +type eventEncoder struct { + buf bytes.Buffer + folder *gotype.Iterator +} + +type eventDecoder struct { + buf []byte + + parser *json.Parser + unfolder *gotype.Unfolder +} + +type entry struct { + Timestamp int64 + Flags uint8 + Meta common.MapStr + Fields common.MapStr +} + +const ( + // If + flagGuaranteed uint8 = 1 << 0 +) + +func newEventEncoder() *eventEncoder { + e := &eventEncoder{} + e.reset() + return e +} + +func (e *eventEncoder) reset() { + e.folder = nil + + visitor := json.NewVisitor(&e.buf) + // This can't return an error: NewIterator is deterministic based on its + // input, and doesn't return an error when called with valid options. In + // this case the options are hard-coded to fixed values, so they are + // guaranteed to be valid and we can safely proceed. + folder, _ := gotype.NewIterator(visitor, + gotype.Folders( + codec.MakeTimestampEncoder(), + codec.MakeBCTimestampEncoder(), + ), + ) + + e.folder = folder +} + +func (e *eventEncoder) encode(event *publisher.Event) ([]byte, error) { + e.buf.Reset() + + err := e.folder.Fold(entry{ + Timestamp: event.Content.Timestamp.UTC().UnixNano(), + Flags: uint8(event.Flags), + Meta: event.Content.Meta, + Fields: event.Content.Fields, + }) + if err != nil { + e.reset() + return nil, err + } + + // Copy the encoded bytes to a new array owned by the caller. + bytes := e.buf.Bytes() + result := make([]byte, len(bytes)) + copy(result, bytes) + + return result, nil +} + +func newEventDecoder() *eventDecoder { + d := &eventDecoder{} + d.reset() + return d +} + +func (d *eventDecoder) reset() { + // When called on nil, NewUnfolder deterministically returns a nil error, + // so it's safe to ignore the error result. + unfolder, _ := gotype.NewUnfolder(nil) + + d.unfolder = unfolder + d.parser = json.NewParser(unfolder) +} + +// Buffer prepares the read buffer to hold the next event of n bytes. +func (d *eventDecoder) Buffer(n int) []byte { + if cap(d.buf) > n { + d.buf = d.buf[:n] + } else { + d.buf = make([]byte, n) + } + return d.buf +} + +func (d *eventDecoder) Decode() (publisher.Event, error) { + var ( + to entry + err error + ) + + d.unfolder.SetTarget(&to) + defer d.unfolder.Reset() + + err = d.parser.Parse(d.buf) + + if err != nil { + d.reset() // reset parser just in case + return publisher.Event{}, err + } + + return publisher.Event{ + Flags: publisher.EventFlags(to.Flags), + Content: beat.Event{ + Timestamp: time.Unix(0, to.Timestamp), + Fields: to.Fields, + Meta: to.Meta, + }, + }, nil +} diff --git a/libbeat/publisher/queue/diskqueue/state_file.go b/libbeat/publisher/queue/diskqueue/state_file.go new file mode 100644 index 00000000000..2ff14e3e5e2 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/state_file.go @@ -0,0 +1,93 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "bufio" + "encoding/binary" + "fmt" + "os" +) + +// Given an open file handle to the queue state, decode the current position +// and return the result if successful, otherwise an error. +func queuePositionFromHandle( + file *os.File, +) (queuePosition, error) { + _, err := file.Seek(0, 0) + if err != nil { + return queuePosition{}, err + } + + reader := bufio.NewReader(file) + var version uint32 + err = binary.Read(reader, binary.LittleEndian, &version) + if err != nil { + return queuePosition{}, err + } + if version != 0 { + return queuePosition{}, + fmt.Errorf("Unsupported queue metadata version (%d)", version) + } + + position := queuePosition{} + err = binary.Read(reader, binary.LittleEndian, &position.segmentID) + if err != nil { + return queuePosition{}, err + } + + err = binary.Read( + reader, binary.LittleEndian, &position.offset) + if err != nil { + return queuePosition{}, err + } + + return position, nil +} + +func queuePositionFromPath(path string) (queuePosition, error) { + // Try to open an existing state file. + file, err := os.OpenFile(path, os.O_RDONLY, 0600) + if err != nil { + return queuePosition{}, err + } + defer file.Close() + return queuePositionFromHandle(file) +} + +// Given the queue position, encode and write it to the given file handle. +// Returns nil if successful, otherwise an error. +func writeQueuePositionToHandle( + file *os.File, + position queuePosition, +) error { + _, err := file.Seek(0, 0) + if err != nil { + return err + } + + // Want to write: version (0), segment id, segment offset. + elems := []interface{}{uint32(0), position.segmentID, position.offset} + for _, elem := range elems { + err = binary.Write(file, binary.LittleEndian, &elem) + if err != nil { + return err + } + } + return nil +} diff --git a/libbeat/publisher/queue/diskqueue/util.go b/libbeat/publisher/queue/diskqueue/util.go new file mode 100644 index 00000000000..60c529a9992 --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/util.go @@ -0,0 +1,89 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "errors" + "io" + "syscall" +) + +// A wrapper for an io.Reader that tries to read the full number of bytes +// requested, retrying on EAGAIN and EINTR, and returns an error if +// and only if the number of bytes read is less than requested. +// This is similar to io.ReadFull but with retrying. +type autoRetryReader struct { + wrapped io.Reader +} + +func (r autoRetryReader) Read(p []byte) (int, error) { + bytesRead := 0 + reader := r.wrapped + n, err := reader.Read(p) + for n < len(p) { + if err != nil && !readErrorIsRetriable(err) { + return bytesRead + n, err + } + // If there is an error, it is retriable, so advance p and try again. + bytesRead += n + p = p[n:] + n, err = reader.Read(p) + } + return bytesRead + n, nil +} + +func readErrorIsRetriable(err error) bool { + return errors.Is(err, syscall.EINTR) || errors.Is(err, syscall.EAGAIN) +} + +// writeErrorIsRetriable returns true if the given IO error can be +// immediately retried. +func writeErrorIsRetriable(err error) bool { + return errors.Is(err, syscall.EINTR) || errors.Is(err, syscall.EAGAIN) +} + +// callbackRetryWriter is an io.Writer that wraps another writer and enables +// write-with-retry. When a Write encounters an error, it is passed to the +// retry callback. If the callback returns true, the the writer retries +// any unwritten portion of the input, otherwise it passes the error back +// to the caller. +// This helper is specifically for working with the writer loop, which needs +// to be able to retry forever at configurable intervals, but also cancel +// immediately if the queue is closed. +// This writer is unbuffered. In particular, it is safe to modify the +// "wrapped" field in-place as long as it isn't captured by the callback. +type callbackRetryWriter struct { + wrapped io.Writer + retry func(error) bool +} + +func (w callbackRetryWriter) Write(p []byte) (int, error) { + bytesWritten := 0 + writer := w.wrapped + n, err := writer.Write(p) + for n < len(p) { + if err != nil && !w.retry(err) { + return bytesWritten + n, err + } + // Advance p and try again. + bytesWritten += n + p = p[n:] + n, err = writer.Write(p) + } + return bytesWritten + n, nil +} diff --git a/libbeat/publisher/queue/diskqueue/writer_loop.go b/libbeat/publisher/queue/diskqueue/writer_loop.go new file mode 100644 index 00000000000..b42e4573cab --- /dev/null +++ b/libbeat/publisher/queue/diskqueue/writer_loop.go @@ -0,0 +1,239 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package diskqueue + +import ( + "encoding/binary" + "os" + "time" + + "github.com/elastic/beats/v7/libbeat/logp" +) + +// A segmentedFrame is a data frame waiting to be written to disk along with +// the segment it has been assigned to. +type segmentedFrame struct { + // The frame to be written to disk. + frame *writeFrame + + // The segment to which this frame should be written. + segment *queueSegment +} + +// A writer loop request contains a list of writeFrames with the +// segment each should be written to. +// +// Input invariant (segment ids are sorted): If a frame f is included in a +// writerLoopRequest, then every subsequent frame in this and future +// requests must have segment id at least f.segment.id. +// +// That is: we must write all frames for segment 0 before we start writing +// to frame 1, etc. This assumption allows all file operations to happen +// safely in the writer loop without any knowledge of the broader queue state. +type writerLoopRequest struct { + frames []segmentedFrame +} + +// A writerLoopResponse reports the number of bytes written to each +// segment in the request. There is guaranteed to be one entry for each +// segment that appeared in the request, in the same order. If there is +// more than one entry, then all but the last segment have been closed. +type writerLoopResponse struct { + bytesWritten []int64 +} + +type writerLoop struct { + // The settings for the queue that created this loop. + settings Settings + + // The logger for the writer loop, assigned when the queue creates it. + logger *logp.Logger + + // The writer loop listens on requestChan for frames to write, and + // writes them to disk immediately (all queue capacity checking etc. is + // done by the core loop before sending it to the writer). + // When this channel is closed, any in-progress writes are aborted and + // the run loop terminates. + requestChan chan writerLoopRequest + + // The writer loop sends to responseChan when it has finished handling a + // request, to signal the core loop that it is ready for the next one. + responseChan chan writerLoopResponse + + // The most recent segment that has been written to, if there is one. + // This segment + currentSegment *queueSegment + + // The file handle corresponding to currentSegment. When currentSegment + // changes, this handle is closed and a new one is created. + outputFile *os.File +} + +func newWriterLoop(logger *logp.Logger, settings Settings) *writerLoop { + return &writerLoop{ + logger: logger, + settings: settings, + + requestChan: make(chan writerLoopRequest, 1), + responseChan: make(chan writerLoopResponse), + } +} + +func (wl *writerLoop) run() { + for { + block, ok := <-wl.requestChan + if !ok { + // The request channel is closed, we are done + return + } + bytesWritten := wl.processRequest(block) + wl.responseChan <- writerLoopResponse{bytesWritten: bytesWritten} + } +} + +// processRequest writes the frames in the given request to disk and returns +// the number of bytes written to each segment, in the order they were +// encountered. +func (wl *writerLoop) processRequest(request writerLoopRequest) []int64 { + // retryWriter wraps the file handle with timed retries. + // retryWriter.Write is guaranteed to return only if the write + // completely succeeded or the queue is being closed. + retryWriter := callbackRetryWriter{retry: wl.retryCallback} + + // We keep track of how many frames are written during this request, + // and send the associated ACKs to the queue / producer listeners + // in a batch at the end (since each ACK call can involve a round-trip + // to the registry). + totalACKCount := 0 + producerACKCounts := make(map[*diskQueueProducer]int) + + var bytesWritten []int64 // Bytes written to all segments. + curBytesWritten := int64(0) // Bytes written to the current segment. +outerLoop: + for _, frameRequest := range request.frames { + // If the new segment doesn't match the last one, we need to open a new + // file handle and possibly clean up the old one. + if wl.currentSegment != frameRequest.segment { + wl.logger.Debugf( + "Creating new segment file with id %v\n", frameRequest.segment.id) + if wl.outputFile != nil { + // Try to sync to disk, then close the file. + wl.outputFile.Sync() + wl.outputFile.Close() + wl.outputFile = nil + // We are done with this segment, add the byte count to the list and + // reset the current counter. + bytesWritten = append(bytesWritten, curBytesWritten) + curBytesWritten = 0 + } + wl.currentSegment = frameRequest.segment + file, err := wl.currentSegment.getWriterWithRetry( + wl.settings, wl.retryCallback) + if err != nil { + // This can only happen if the queue is being closed; abort. + break + } + wl.outputFile = file + } + // Make sure our writer points to the current file handle. + retryWriter.wrapped = wl.outputFile + + // We have the data and a file to write it to. We are now committed + // to writing this block unless the queue is closed in the meantime. + frameSize := uint32(frameRequest.frame.sizeOnDisk()) + + // The Write calls below all pass through retryWriter, so they can + // only return an error if the write should be aborted. Thus, all we + // need to do when we see an error is break out of the request loop. + err := binary.Write(retryWriter, binary.LittleEndian, frameSize) + if err != nil { + break + } + _, err = retryWriter.Write(frameRequest.frame.serialized) + if err != nil { + break + } + // Compute / write the frame's checksum + checksum := computeChecksum(frameRequest.frame.serialized) + err = binary.Write(wl.outputFile, binary.LittleEndian, checksum) + if err != nil { + break + } + // Write the frame footer's (duplicate) length + err = binary.Write(wl.outputFile, binary.LittleEndian, frameSize) + if err != nil { + break + } + // Update the byte count as the last step: that way if we abort while + // a frame is partially written, we only report up to the last + // complete frame. (This almost never matters, but it allows for + // more controlled recovery after a bad shutdown.) + curBytesWritten += int64(frameSize) + + // Update the ACKs that will be sent at the end of the request. + totalACKCount++ + if frameRequest.frame.producer.config.ACK != nil { + producerACKCounts[frameRequest.frame.producer]++ + } + + // Explicitly check if we should abort before starting the next frame. + select { + case <-wl.requestChan: + break outerLoop + default: + } + } + // Try to sync the written data to disk. + wl.outputFile.Sync() + + // If the queue has an ACK listener, notify it the frames were written. + if wl.settings.WriteToDiskListener != nil { + wl.settings.WriteToDiskListener.OnACK(totalACKCount) + } + + // Notify any producers with ACK listeners that their frames were written. + for producer, ackCount := range producerACKCounts { + producer.config.ACK(ackCount) + } + + // Return the total byte counts, including the final segment. + return append(bytesWritten, curBytesWritten) +} + +// retryCallback is called (by way of retryCallbackWriter) when there is +// an error writing to a segment file. It pauses for a configurable +// interval and returns true if the operation should be retried (which +// it always should, unless the queue is being closed). +func (wl *writerLoop) retryCallback(err error) bool { + if writeErrorIsRetriable(err) { + return true + } + // If the error is not immediately retriable, log the error + // and wait for the retry interval before trying again, but + // abort if the queue is closed (indicated by the request channel + // becoming unblocked). + wl.logger.Errorf("Writing to segment %v: %v", + wl.currentSegment.id, err) + select { + case <-time.After(time.Second): + // TODO: use a configurable interval here + return true + case <-wl.requestChan: + return false + } +} From ddfe085974ef91f85f09eba65ace9b5149368b47 Mon Sep 17 00:00:00 2001 From: Shaunak Kashyap Date: Mon, 28 Sep 2020 12:50:45 -0400 Subject: [PATCH 006/156] Adds a default for failure_cache.min_ttl (#21085) * Adds a default for failure_cache.min_ttl * Parse YAML as inline + fix default value Fixes #21103 Co-authored-by: Adrian Serrano --- libbeat/processors/dns/config.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libbeat/processors/dns/config.go b/libbeat/processors/dns/config.go index b5e7cf0a0d3..8b0d6c9bd97 100644 --- a/libbeat/processors/dns/config.go +++ b/libbeat/processors/dns/config.go @@ -29,7 +29,7 @@ import ( // Config defines the configuration options for the DNS processor. type Config struct { - CacheConfig + CacheConfig `config:",inline"` Nameservers []string `config:"nameservers"` // Required on Windows. /etc/resolv.conf is used if none are given. Timeout time.Duration `conifg:"timeout"` // Per request timeout (with 2 nameservers the total timeout would be 2x). Type string `config:"type" validate:"required"` // Reverse is the only supported type currently. @@ -89,7 +89,7 @@ type CacheSettings struct { TTL time.Duration `config:"ttl"` // Minimum TTL value for successful DNS responses. - MinTTL time.Duration `config:"min_ttl" validate:"min=1"` + MinTTL time.Duration `config:"min_ttl" validate:"min=1ns"` // Initial capacity. How much space is allocated at initialization. InitialCapacity int `config:"capacity.initial" validate:"min=0"` @@ -166,6 +166,7 @@ var defaultConfig = Config{ MaxCapacity: 10000, }, FailureCache: CacheSettings{ + MinTTL: time.Minute, TTL: time.Minute, InitialCapacity: 1000, MaxCapacity: 10000, From 3f017df98891fda84b03a5640e42f9275ff2dfa9 Mon Sep 17 00:00:00 2001 From: Pier-Hugues Pellerin Date: Mon, 28 Sep 2020 15:37:30 -0400 Subject: [PATCH 007/156] [Elastic Agent] Allow embedding of certificate (#21179) * [Elastic Agent] Allow embedding of certificate This PR allow to embed Certificate authorities directly in the yaml configuration. This is useful in the context of fleet where distributing file to the remote host is not possible. The format of the string need to be in PEM. Example: Certificate Authorities ```yaml enabled: true verification_mode: null certificate: null key: null key_passphrase: null certificate_authorities: - | -----BEGIN CERTIFICATE----- MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl 94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t /D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux 8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D 874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw 3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu 8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk sxSmbIUfc2SGJGCJD4I= -----END CERTIFICATE----- cipher_suites: null curve_types: null supported_protocols: null ``` ```Certificate and Key enabled: true verification_mode: null certificate: | -----BEGIN CERTIFICATE----- MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl 94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t /D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux 8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D 874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw 3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu 8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk sxSmbIUfc2SGJGCJD4I= -----END CERTIFICATE----- key: | -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDXHufGPycpCOfI sjl6cRn8NP4DLxdIVEAHFK0jMRDup32UQOPW+DleEsFpgN9/ebi9ngdjQfMvKnUP Zrl1HTwVhOJfazGeoJn7vdDeQebhJfeDXHwX2DiotXyUPYu1ioU45UZDAoAZFj5F KJLwWRUbfEbRe8yO+wUhKKxxkApPbfw+wUtBicn1RIX7W1nBRABt1UXKDIRe5FM2 MKfqhEqK4hUWC3g1r+vGTrxu3qFpzz7L2UrRFRIpo7yuTUhEhEGvcVsiTppTil4Z HcprXFHf5158elEwhYJ5IM0nU1leNQiOgemifbLwkyNkLqCKth8V/4sezr1tYblZ nMh1cclBAgMBAAECggEBAKdP5jyOicqknoG9/G564RcDsDyRt64NuO7I6hBg7SZx Jn7UKWDdFuFP/RYtoabn6QOxkVVlydp5Typ3Xu7zmfOyss479Q/HIXxmmbkD0Kp0 eRm2KN3y0b6FySsS40KDRjKGQCuGGlNotW3crMw6vOvvsLTlcKgUHF054UVCHoK/ Piz7igkDU7NjvJeha53vXL4hIjb10UtJNaGPxIyFLYRZdRPyyBJX7Yt3w8dgz8WM epOPu0dq3bUrY3WQXcxKZo6sQjE1h7kdl4TNji5jaFlvD01Y8LnyG0oThOzf0tve Gaw+kuy17gTGZGMIfGVcdeb+SlioXMAAfOps+mNIwTECgYEA/gTO8W0hgYpOQJzn BpWkic3LAoBXWNpvsQkkC3uba8Fcps7iiEzotXGfwYcb5Ewf5O3Lrz1EwLj7GTW8 VNhB3gb7bGOvuwI/6vYk2/dwo84bwW9qRWP5hqPhNZ2AWl8kxmZgHns6WTTxpkRU zrfZ5eUrBDWjRU2R8uppgRImsxMCgYEA2MxuL/C/Ko0d7XsSX1kM4JHJiGpQDvb5 GUrlKjP/qVyUysNF92B9xAZZHxxfPWpdfGGBynhw7X6s+YeIoxTzFPZVV9hlkpAA 5igma0n8ZpZEqzttjVdpOQZK8o/Oni/Q2S10WGftQOOGw5Is8+LY30XnLvHBJhO7 TKMurJ4KCNsCgYAe5TDSVmaj3dGEtFC5EUxQ4nHVnQyCpxa8npL+vor5wSvmsfUF hO0s3GQE4sz2qHecnXuPldEd66HGwC1m2GKygYDk/v7prO1fQ47aHi9aDQB9N3Li e7Vmtdn3bm+lDjtn0h3Qt0YygWj+wwLZnazn9EaWHXv9OuEMfYxVgYKpdwKBgEze Zy8+WDm5IWRjn8cI5wT1DBT/RPWZYgcyxABrwXmGZwdhp3wnzU/kxFLAl5BKF22T kRZ+D+RVZvVutebE9c937BiilJkb0AXLNJwT9pdVLnHcN2LHHHronUhV7vetkop+ kGMMLlY0lkLfoGq1AxpfSbIea9KZam6o6VKxEnPDAoGAFDCJm+ZtsJK9nE5GEMav NHy+PwkYsHhbrPl4dgStTNXLenJLIJ+Ke0Pcld4ZPfYdSyu/Tv4rNswZBNpNsW9K 0NwJlyMBfayoPNcJKXrH/csJY7hbKviAHr1eYy9/8OL0dHf85FV+9uY5YndLcsDc nygO9KTJuUiBrLr0AHEnqko= -----END PRIVATE KEY----- key_passphrase: null certificate_authorities: cipher_suites: null curve_types: null supported_protocols: null ``` Related to: #19504 --- CHANGELOG.next.asciidoc | 1 + libbeat/common/transport/tlscommon/tls.go | 81 +++++- .../common/transport/tlscommon/tls_test.go | 266 ++++++++++++++++++ libbeat/docs/shared-ssl-config.asciidoc | 86 ++++++ 4 files changed, 423 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 67cac68940c..846c5427e8b 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -22,6 +22,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Added `certificate` TLS verification mode to ignore server name mismatch. {issue}12283[12283] {pull}20293[20293] - Autodiscover doesn't generate any configuration when a variable is missing. Previously it generated an incomplete configuration. {pull}20898[20898] - Remove redundant `cloudfoundry.*.timestamp` fields. This value is set in `@timestamp`. {pull}21175[21175] +- Allow embedding of CAs, Certificate of private keys for anything that support TLS in ouputs and inputs https://github.com/elastic/beats/pull/21179 *Auditbeat* diff --git a/libbeat/common/transport/tlscommon/tls.go b/libbeat/common/transport/tlscommon/tls.go index 5dea417637e..3616a9f07e4 100644 --- a/libbeat/common/transport/tlscommon/tls.go +++ b/libbeat/common/transport/tlscommon/tls.go @@ -24,7 +24,10 @@ import ( "encoding/pem" "errors" "fmt" + "io" "io/ioutil" + "os" + "strings" "github.com/elastic/beats/v7/libbeat/logp" ) @@ -67,13 +70,19 @@ func LoadCertificate(config *CertificateConfig) (*tls.Certificate, error) { return &cert, nil } -// ReadPEMFile reads a PEM format file on disk and decrypt it with the privided password and -// return the raw content. -func ReadPEMFile(log *logp.Logger, path, passphrase string) ([]byte, error) { +// ReadPEMFile reads a PEM formatted string either from disk or passed as a plain text starting with a "-" +// and decrypt it with the provided password and return the raw content. +func ReadPEMFile(log *logp.Logger, s, passphrase string) ([]byte, error) { pass := []byte(passphrase) var blocks []*pem.Block - content, err := ioutil.ReadFile(path) + r, err := NewPEMReader(s) + if err != nil { + return nil, err + } + defer r.Close() + + content, err := ioutil.ReadAll(r) if err != nil { return nil, err } @@ -102,7 +111,7 @@ func ReadPEMFile(log *logp.Logger, path, passphrase string) ([]byte, error) { if err != nil { log.Errorf("Dropping encrypted pem '%v' block read from %v. %+v", - block.Type, path, err) + block.Type, r, err) continue } @@ -139,20 +148,28 @@ func LoadCertificateAuthorities(CAs []string) (*x509.CertPool, []error) { log := logp.NewLogger(logSelector) roots := x509.NewCertPool() - for _, path := range CAs { - pemData, err := ioutil.ReadFile(path) + for _, s := range CAs { + r, err := NewPEMReader(s) if err != nil { log.Errorf("Failed reading CA certificate: %+v", err) - errors = append(errors, fmt.Errorf("%v reading %v", err, path)) + errors = append(errors, fmt.Errorf("%v reading %v", err, r)) + continue + } + defer r.Close() + + pemData, err := ioutil.ReadAll(r) + if err != nil { + log.Errorf("Failed reading CA certificate: %+v", err) + errors = append(errors, fmt.Errorf("%v reading %v", err, r)) continue } if ok := roots.AppendCertsFromPEM(pemData); !ok { - log.Error("Failed to add CA to the cert pool, CA is not a valid PEM file") - errors = append(errors, fmt.Errorf("%v adding %v to the list of known CAs", ErrNotACertificate, path)) + log.Error("Failed to add CA to the cert pool, CA is not a valid PEM document") + errors = append(errors, fmt.Errorf("%v adding %v to the list of known CAs", ErrNotACertificate, r)) continue } - log.Debugf("tls", "successfully loaded CA certificate: %v", path) + log.Debugf("tls", "successfully loaded CA certificate: %v", r) } return roots, errors @@ -187,3 +204,45 @@ func ResolveTLSVersion(v uint16) string { func ResolveCipherSuite(cipher uint16) string { return tlsCipherSuite(cipher).String() } + +// PEMReader allows to read a certificate in PEM format either through the disk or from a string. +type PEMReader struct { + reader io.ReadCloser + debugStr string +} + +// NewPEMReader returns a new PEMReader. +func NewPEMReader(certificate string) (*PEMReader, error) { + if IsPEMString(certificate) { + // Take a substring of the certificate so we do not leak the whole certificate or private key in the log. + debugStr := certificate[0:256] + "..." + return &PEMReader{reader: ioutil.NopCloser(strings.NewReader(certificate)), debugStr: debugStr}, nil + } + + r, err := os.Open(certificate) + if err != nil { + return nil, err + } + return &PEMReader{reader: r, debugStr: certificate}, nil +} + +// Close closes the target io.ReadCloser. +func (p *PEMReader) Close() error { + return p.reader.Close() +} + +// Read read bytes from the io.ReadCloser. +func (p *PEMReader) Read(b []byte) (n int, err error) { + return p.reader.Read(b) +} + +func (p *PEMReader) String() string { + return p.debugStr +} + +// IsPEMString returns true if the provided string match a PEM formatted certificate. try to pem decode to validate. +func IsPEMString(s string) bool { + // Trim the certificates to make sure we tolerate any yaml weirdness, we assume that the string starts + // with "-" and let further validation verifies the PEM format. + return strings.HasPrefix(strings.TrimSpace(s), "-") +} diff --git a/libbeat/common/transport/tlscommon/tls_test.go b/libbeat/common/transport/tlscommon/tls_test.go index 42748770069..53e9da18db3 100644 --- a/libbeat/common/transport/tlscommon/tls_test.go +++ b/libbeat/common/transport/tlscommon/tls_test.go @@ -22,6 +22,8 @@ package tlscommon import ( "crypto/tls" "fmt" + "io/ioutil" + "os" "testing" "github.com/stretchr/testify/assert" @@ -331,3 +333,267 @@ func TestResolveCipherSuite(t *testing.T) { c := ResolveCipherSuite(tls.TLS_RSA_WITH_AES_128_CBC_SHA) assert.Equal(t, "RSA-AES-128-CBC-SHA", c) } + +func TestPEMString(t *testing.T) { + t.Run("is PEM formatted String", func(t *testing.T) { + c := `-----BEGIN CERTIFICATE----- +MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF +ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 +MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n +fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl +94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t +/D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP +PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 +CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O +BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux +8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D +874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw +3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA +H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu +8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 +yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk +sxSmbIUfc2SGJGCJD4I= +-----END CERTIFICATE-----` + assert.True(t, IsPEMString(c)) + }) + + // Well use `|` if you want to keep the newline, theses are required so the PEM document is valid. + t.Run("From the YAML/multiline", func(t *testing.T) { + cfg, err := load(` +enabled: true +verification_mode: null +certificate: null +key: null +key_passphrase: null +certificate_authorities: + - | + -----BEGIN CERTIFICATE----- + MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF + ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 + MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB + BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n + fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl + 94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t + /D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP + PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 + CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O + BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux + 8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D + 874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw + 3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA + H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu + 8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 + yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk + sxSmbIUfc2SGJGCJD4I= + -----END CERTIFICATE----- +cipher_suites: null +curve_types: null +supported_protocols: null + `) + assert.NoError(t, err) + assert.True(t, IsPEMString(cfg.CAs[0])) + }) + + t.Run("is not a PEM formatted String", func(t *testing.T) { + c := "/tmp/certificate" + assert.False(t, IsPEMString(c)) + }) + + t.Run("is an empty string", func(t *testing.T) { + c := "" + assert.False(t, IsPEMString(c)) + }) +} + +func TestCertificate(t *testing.T) { + // Write certificate to a temporary file. + c := `-----BEGIN CERTIFICATE----- +MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF +ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 +MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n +fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl +94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t +/D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP +PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 +CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O +BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux +8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D +874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw +3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA +H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu +8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 +yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk +sxSmbIUfc2SGJGCJD4I= +-----END CERTIFICATE-----` + f, err := ioutil.TempFile("", "certificate.crt") + f.WriteString(c) + f.Close() + assert.NoError(t, err) + defer os.Remove(f.Name()) + + t.Run("certificate authorities", func(t *testing.T) { + t.Run("From configuration", func(t *testing.T) { + cfg, err := load(` +enabled: true +verification_mode: null +certificate: null +key: null +key_passphrase: null +certificate_authorities: + - | + -----BEGIN CERTIFICATE----- + MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF + ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 + MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB + BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n + fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl + 94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t + /D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP + PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 + CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O + BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux + 8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D + 874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw + 3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA + H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu + 8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 + yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk + sxSmbIUfc2SGJGCJD4I= + -----END CERTIFICATE----- +cipher_suites: null +curve_types: null +supported_protocols: null + `) + assert.NoError(t, err) + tlsC, err := LoadTLSConfig(cfg) + assert.NoError(t, err) + assert.NotNil(t, tlsC) + }) + + t.Run("From disk", func(t *testing.T) { + // Create a dummy configuration and append the CA after. + cfg, err := load(` +enabled: true +verification_mode: null +certificate: null +key: null +key_passphrase: null +certificate_authorities: +cipher_suites: null +curve_types: null +supported_protocols: null + `) + + cfg.CAs = []string{f.Name()} + tlsC, err := LoadTLSConfig(cfg) + assert.NoError(t, err) + + assert.NotNil(t, tlsC) + }) + + t.Run("mixed from disk and embed", func(t *testing.T) { + // Create a dummy configuration and append the CA after. + cfg, err := load(` +enabled: true +verification_mode: null +certificate: null +key: null +key_passphrase: null +certificate_authorities: +cipher_suites: null +curve_types: null +supported_protocols: null + `) + + cfg.CAs = []string{f.Name(), c} + tlsC, err := LoadTLSConfig(cfg) + assert.NoError(t, err) + + assert.NotNil(t, tlsC) + }) + }) + + t.Run("Certificate and Private keys", func(t *testing.T) { + key := ` +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDXHufGPycpCOfI +sjl6cRn8NP4DLxdIVEAHFK0jMRDup32UQOPW+DleEsFpgN9/ebi9ngdjQfMvKnUP +Zrl1HTwVhOJfazGeoJn7vdDeQebhJfeDXHwX2DiotXyUPYu1ioU45UZDAoAZFj5F +KJLwWRUbfEbRe8yO+wUhKKxxkApPbfw+wUtBicn1RIX7W1nBRABt1UXKDIRe5FM2 +MKfqhEqK4hUWC3g1r+vGTrxu3qFpzz7L2UrRFRIpo7yuTUhEhEGvcVsiTppTil4Z +HcprXFHf5158elEwhYJ5IM0nU1leNQiOgemifbLwkyNkLqCKth8V/4sezr1tYblZ +nMh1cclBAgMBAAECggEBAKdP5jyOicqknoG9/G564RcDsDyRt64NuO7I6hBg7SZx +Jn7UKWDdFuFP/RYtoabn6QOxkVVlydp5Typ3Xu7zmfOyss479Q/HIXxmmbkD0Kp0 +eRm2KN3y0b6FySsS40KDRjKGQCuGGlNotW3crMw6vOvvsLTlcKgUHF054UVCHoK/ +Piz7igkDU7NjvJeha53vXL4hIjb10UtJNaGPxIyFLYRZdRPyyBJX7Yt3w8dgz8WM +epOPu0dq3bUrY3WQXcxKZo6sQjE1h7kdl4TNji5jaFlvD01Y8LnyG0oThOzf0tve +Gaw+kuy17gTGZGMIfGVcdeb+SlioXMAAfOps+mNIwTECgYEA/gTO8W0hgYpOQJzn +BpWkic3LAoBXWNpvsQkkC3uba8Fcps7iiEzotXGfwYcb5Ewf5O3Lrz1EwLj7GTW8 +VNhB3gb7bGOvuwI/6vYk2/dwo84bwW9qRWP5hqPhNZ2AWl8kxmZgHns6WTTxpkRU +zrfZ5eUrBDWjRU2R8uppgRImsxMCgYEA2MxuL/C/Ko0d7XsSX1kM4JHJiGpQDvb5 +GUrlKjP/qVyUysNF92B9xAZZHxxfPWpdfGGBynhw7X6s+YeIoxTzFPZVV9hlkpAA +5igma0n8ZpZEqzttjVdpOQZK8o/Oni/Q2S10WGftQOOGw5Is8+LY30XnLvHBJhO7 +TKMurJ4KCNsCgYAe5TDSVmaj3dGEtFC5EUxQ4nHVnQyCpxa8npL+vor5wSvmsfUF +hO0s3GQE4sz2qHecnXuPldEd66HGwC1m2GKygYDk/v7prO1fQ47aHi9aDQB9N3Li +e7Vmtdn3bm+lDjtn0h3Qt0YygWj+wwLZnazn9EaWHXv9OuEMfYxVgYKpdwKBgEze +Zy8+WDm5IWRjn8cI5wT1DBT/RPWZYgcyxABrwXmGZwdhp3wnzU/kxFLAl5BKF22T +kRZ+D+RVZvVutebE9c937BiilJkb0AXLNJwT9pdVLnHcN2LHHHronUhV7vetkop+ +kGMMLlY0lkLfoGq1AxpfSbIea9KZam6o6VKxEnPDAoGAFDCJm+ZtsJK9nE5GEMav +NHy+PwkYsHhbrPl4dgStTNXLenJLIJ+Ke0Pcld4ZPfYdSyu/Tv4rNswZBNpNsW9K +0NwJlyMBfayoPNcJKXrH/csJY7hbKviAHr1eYy9/8OL0dHf85FV+9uY5YndLcsDc +nygO9KTJuUiBrLr0AHEnqko= +-----END PRIVATE KEY----- +` + t.Run("embed", func(t *testing.T) { + // Create a dummy configuration and append the CA after. + cfg, err := load(` +enabled: true +verification_mode: null +certificate: null +key: null +key_passphrase: null +certificate_authorities: +cipher_suites: null +curve_types: null +supported_protocols: null + `) + cfg.Certificate.Certificate = c + cfg.Certificate.Key = key + + tlsC, err := LoadTLSConfig(cfg) + assert.NoError(t, err) + + assert.NotNil(t, tlsC) + }) + + t.Run("From disk", func(t *testing.T) { + k, err := ioutil.TempFile("", "certificate.key") + k.WriteString(key) + k.Close() + assert.NoError(t, err) + defer os.Remove(k.Name()) + // Create a dummy configuration and append the CA after. + cfg, err := load(` +enabled: true +verification_mode: null +certificate: null +key: null +key_passphrase: null +certificate_authorities: +cipher_suites: null +curve_types: null +supported_protocols: null + `) + + cfg.Certificate.Certificate = f.Name() + cfg.Certificate.Key = k.Name() + + tlsC, err := LoadTLSConfig(cfg) + assert.NoError(t, err) + + assert.NotNil(t, tlsC) + }) + }) +} diff --git a/libbeat/docs/shared-ssl-config.asciidoc b/libbeat/docs/shared-ssl-config.asciidoc index 8aa9a33a828..43a88002bcd 100644 --- a/libbeat/docs/shared-ssl-config.asciidoc +++ b/libbeat/docs/shared-ssl-config.asciidoc @@ -105,6 +105,32 @@ NOTE: SSL settings are disabled if either `enabled` is set to `false` or the ==== `certificate_authorities` The list of root certificates for server verifications. If `certificate_authorities` is empty or not set, the trusted certificate authorities of the host system are used. +By default you can specify a list of file that +{beatname_lc} will read, but you can also embed a certificate directly in the `YAML` configuration: + +[source,yaml] +---- +certificate_authorities: + - | + -----BEGIN CERTIFICATE----- + MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF + ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 + MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB + BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n + fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl + 94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t + /D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP + PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 + CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O + BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux + 8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D + 874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw + 3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA + H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu + 8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 + yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk + sxSmbIUfc2SGJGCJD4I= + -----END CERTIFICATE----- +---- [float] [[certificate]] @@ -117,12 +143,72 @@ require client authentication, the certificate will be loaded, but not requested by the server. When this option is configured, the <> option is also required. +The certificate option support embedding of the certificate: + +[source,yaml] +---- +certificate: | + -----BEGIN CERTIFICATE----- + MIIDCjCCAfKgAwIBAgITJ706Mu2wJlKckpIvkWxEHvEyijANBgkqhkiG9w0BAQsF + ADAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwIBcNMTkwNzIyMTkyOTA0WhgPMjExOTA2 + MjgxOTI5MDRaMBQxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB + BQADggEPADCCAQoCggEBANce58Y/JykI58iyOXpxGfw0/gMvF0hUQAcUrSMxEO6n + fZRA49b4OV4SwWmA3395uL2eB2NB8y8qdQ9muXUdPBWE4l9rMZ6gmfu90N5B5uEl + 94NcfBfYOKi1fJQ9i7WKhTjlRkMCgBkWPkUokvBZFRt8RtF7zI77BSEorHGQCk9t + /D7BS0GJyfVEhftbWcFEAG3VRcoMhF7kUzYwp+qESoriFRYLeDWv68ZOvG7eoWnP + PsvZStEVEimjvK5NSESEQa9xWyJOmlOKXhkdymtcUd/nXnx6UTCFgnkgzSdTWV41 + CI6B6aJ9svCTI2QuoIq2HxX/ix7OvW1huVmcyHVxyUECAwEAAaNTMFEwHQYDVR0O + BBYEFPwN1OceFGm9v6ux8G+DZ3TUDYxqMB8GA1UdIwQYMBaAFPwN1OceFGm9v6ux + 8G+DZ3TUDYxqMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAG5D + 874A4YI7YUwOVsVAdbWtgp1d0zKcPRR+r2OdSbTAV5/gcS3jgBJ3i1BN34JuDVFw + 3DeJSYT3nxy2Y56lLnxDeF8CUTUtVQx3CuGkRg1ouGAHpO/6OqOhwLLorEmxi7tA + H2O8mtT0poX5AnOAhzVy7QW0D/k4WaoLyckM5hUa6RtvgvLxOwA0U+VGurCDoctu + 8F4QOgTAWyh8EZIwaKCliFRSynDpv3JTUwtfZkxo6K6nce1RhCWFAsMvDZL8Dgc0 + yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk + sxSmbIUfc2SGJGCJD4I= + -----END CERTIFICATE----- +---- + [float] [[key]] ==== `key: "/etc/pki/client/cert.key"` The client certificate key used for client authentication. This option is required if <> is specified. +The key option support embedding of the private key: + +[source,yaml] +---- +key: | + -----BEGIN PRIVATE KEY----- + MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDXHufGPycpCOfI + sjl6cRn8NP4DLxdIVEAHFK0jMRDup32UQOPW+DleEsFpgN9/ebi9ngdjQfMvKnUP + Zrl1HTwVhOJfazGeoJn7vdDeQebhJfeDXHwX2DiotXyUPYu1ioU45UZDAoAZFj5F + KJLwWRUbfEbRe8yO+wUhKKxxkApPbfw+wUtBicn1RIX7W1nBRABt1UXKDIRe5FM2 + MKfqhEqK4hUWC3g1r+vGTrxu3qFpzz7L2UrRFRIpo7yuTUhEhEGvcVsiTppTil4Z + HcprXFHf5158elEwhYJ5IM0nU1leNQiOgemifbLwkyNkLqCKth8V/4sezr1tYblZ + nMh1cclBAgMBAAECggEBAKdP5jyOicqknoG9/G564RcDsDyRt64NuO7I6hBg7SZx + Jn7UKWDdFuFP/RYtoabn6QOxkVVlydp5Typ3Xu7zmfOyss479Q/HIXxmmbkD0Kp0 + eRm2KN3y0b6FySsS40KDRjKGQCuGGlNotW3crMw6vOvvsLTlcKgUHF054UVCHoK/ + Piz7igkDU7NjvJeha53vXL4hIjb10UtJNaGPxIyFLYRZdRPyyBJX7Yt3w8dgz8WM + epOPu0dq3bUrY3WQXcxKZo6sQjE1h7kdl4TNji5jaFlvD01Y8LnyG0oThOzf0tve + Gaw+kuy17gTGZGMIfGVcdeb+SlioXMAAfOps+mNIwTECgYEA/gTO8W0hgYpOQJzn + BpWkic3LAoBXWNpvsQkkC3uba8Fcps7iiEzotXGfwYcb5Ewf5O3Lrz1EwLj7GTW8 + VNhB3gb7bGOvuwI/6vYk2/dwo84bwW9qRWP5hqPhNZ2AWl8kxmZgHns6WTTxpkRU + zrfZ5eUrBDWjRU2R8uppgRImsxMCgYEA2MxuL/C/Ko0d7XsSX1kM4JHJiGpQDvb5 + GUrlKjP/qVyUysNF92B9xAZZHxxfPWpdfGGBynhw7X6s+YeIoxTzFPZVV9hlkpAA + 5igma0n8ZpZEqzttjVdpOQZK8o/Oni/Q2S10WGftQOOGw5Is8+LY30XnLvHBJhO7 + TKMurJ4KCNsCgYAe5TDSVmaj3dGEtFC5EUxQ4nHVnQyCpxa8npL+vor5wSvmsfUF + hO0s3GQE4sz2qHecnXuPldEd66HGwC1m2GKygYDk/v7prO1fQ47aHi9aDQB9N3Li + e7Vmtdn3bm+lDjtn0h3Qt0YygWj+wwLZnazn9EaWHXv9OuEMfYxVgYKpdwKBgEze + Zy8+WDm5IWRjn8cI5wT1DBT/RPWZYgcyxABrwXmGZwdhp3wnzU/kxFLAl5BKF22T + kRZ+D+RVZvVutebE9c937BiilJkb0AXLNJwT9pdVLnHcN2LHHHronUhV7vetkop+ + kGMMLlY0lkLfoGq1AxpfSbIea9KZam6o6VKxEnPDAoGAFDCJm+ZtsJK9nE5GEMav + NHy+PwkYsHhbrPl4dgStTNXLenJLIJ+Ke0Pcld4ZPfYdSyu/Tv4rNswZBNpNsW9K + 0NwJlyMBfayoPNcJKXrH/csJY7hbKviAHr1eYy9/8OL0dHf85FV+9uY5YndLcsDc + nygO9KTJuUiBrLr0AHEnqko= + -----END PRIVATE KEY----- +---- [float] ==== `key_passphrase` From 30ff4d50f6a2e52b50bae53bc166fbc786abd1e5 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Mon, 28 Sep 2020 14:21:09 -0600 Subject: [PATCH 008/156] Add dashboard for pubsub metricset in googlecloud module (#21326) * Add dashboard for pubsub metricset in googlecloud module --- CHANGELOG.next.asciidoc | 1 + ...metricbeat-googlecloud-pubsub-overview.png | Bin 566083 -> 787320 bytes ...etricbeat-googlecloud-pubsub-overview.json | 1695 +++++++++++------ 3 files changed, 1079 insertions(+), 617 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 846c5427e8b..13602e72d21 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -718,6 +718,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Sanitize `event.host`. {pull}21022[21022] - Add overview and platform health dashboards to Cloud Foundry module. {pull}21124[21124] - Release lambda metricset in aws module as GA. {issue}21251[21251] {pull}21255[21255] +- Add dashboard for pubsub metricset in googlecloud module. {pull}21326[21326] {issue}17137[17137] *Packetbeat* diff --git a/metricbeat/docs/images/metricbeat-googlecloud-pubsub-overview.png b/metricbeat/docs/images/metricbeat-googlecloud-pubsub-overview.png index 5d0ffd588febea92740797d0d3cabdadcc85873f..b1bfdd4531f09d80a844cbdfea7b0297918a5d84 100644 GIT binary patch literal 787320 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 z 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 literal 566083 zcmeFZcT`i~)-H^QC~8DOL__Z)O?q#F^d=zE5u|qr5Ly5MK|p%10i^d{g;12CzYp=c5+-uHfKJ(cLQB#ox+y~yr!NCE@ z%So%_;1Hv5aPITn!^dt(i0^R4{%Ew4l2VhGlA=~~b}+ZHHN(M?3yDv>tEn;jENHle zKRxi-SC=;q{!h2ZY;f*uf25(vS z#SOW{RxqBWUymsP%Fx)D24`~O3JlqM3wgItM;>{Kgx!2#t`vOp3`gyGUx+OY%kA~p ztu2$^cW7~<$S3S8lzvieTF1S|v;6$B{u}6s9vlu@p;u(|rtO5NVQ_Fh518JMxkVkh znQc)SGb&&z)HfxWtvLOsm>ZH_KlWa9NTx$RsV3_}mnP1wCUeEl_ketxGh zKy>+2l{0mlj8!jHjKefEwgK}{hx`ehbLbt#PP5;FZ(v`U&F|-dLdLUyn0g34)EU@| z>q%lBT9Fw}H8IweKCFq19AJMO+;6QybkTp7M03^O+VC(L_L6~1txk5s#g5##qy(R@ zds@|e^KGy91+9aQw~uGi05q18y81yit*Oo1txmocJ|#D?!hy^RW_%iIoDs>Va(8K| zag>$_8~pAH&<;6|Uf_Et9DTUg(92BQMCutJ;DR4%#v5yIV`l?syMUx!H6z9u4_-(& z^V#VcJ@A7w7ixNX&OLJ>_WMMD69vq-%L~I%Bgb1(AX8-RNvSdJf>ms>eZYAoL9vxN z9LrpRSJ!r{0atbDuD`^~uXs)$IX`}W8ueML^I{Jk9IT9Gwukt8#=xw zC*bgpT~-nx8w%j>Tz4e#es1qS+&R76T!H6vCz2K?TFUY(rAdeYjhNg^qDXogTvLF$ zUmVSQInl9D7uxzK1V=!Wf4gzPbD=Jx)lh<;(#G0JN&`TpCwaJ_$K!#GUmL@>JHLJO z`N*uzR&rMJQ0`eQe=K1XyqB;C$^0~w^H(g9>XUbT z8rICDFIAbL>xD;JM-M&fu5?ifC`Odtk;Buk_hs%I-VY8rALC7L3+?y63jAw{O&pBBYsY38`dZ5NG2aT(5P&#ESurse-ILisz3lVkzaAO);D zp4PmlM6MEd@=dZk)a2hYYYJwMm2zbll?dta>bf>s=kC0CPXNezG5);9MVE75pfvH! zHR$YN`HQp{spb>I4ZN$dDS0XRK-p4>Qpx?Yxeu;QO;FF2ORZD$QzqbZ04N*K$Vp5h+8dJ(%K}zCW#7SZh?QXrrkoD=d*(-lBo_KeM4oiO5$eQYjqL zNjEkqDr;u{P_KEOcA(hwY9TB`g(Kf6CvwYb`_4|t>DjjHZuoZUmhATC4*!-oC-n<~ z7xXXUfG*F!J>LNi@#>ptTU?BMwOlieGpXq;7~hJm3~~DQTV~aKm4=v?I7q%uKE3yo zMrdKMRi0J+HU)QDa;#3utbKLrMnz+bN2o_G3h-d2qut-85}s|r=$3b^v^Y?de9qdN zV3?qj;F4tH$+1K4$9I8tiOm49_gLoBP>!ZWZD9#WR

<1P9Jqf1Vs=;G?OC*3kALi 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

m+mOpt4t?G}Wd~mm8mfnTl<1H# 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

`0t1_V(`BA<_Z-{1%7%u zx-att7bF}SL*#I+MvA|ka>9VpediR%c(qa_`2aio3?zc7Y9{6clj zHr?6b+y%{JlE|-brCKYaeDzY+JxLj?F;n&Y?7DWM{(JF%bCUi~qKrZ0Gh&{*!#<+{>(0l8pz%HXO%)axsu`4LLck-VB8nKIP9OqTZe5GY^!mN z`tF`h%ZB;l_LFW!iA&7v#L1KWmbaGKSw`(bQ_1s}>Xc1+**5J-V!`WHSo?yY5mqs& zBUk>5;T2(C|LcSV>&a^y9_u3Crjb2}ZVM1I zjUfvf8?x5Fxu2S*B$$8n(_Fd!fIY-z&`*UBlbe62^%`mha>m2;PJOs;mjV8O3ADu! z(aum@KeaMamIPpNC`lk?b~A{)WDBT0ER`9p&hRq+M(9fZmG8_iIqjBYzBR z!p-_=u8$Bq`p}HAikfL{@_B!$AjIzPjWkLg@VSNGnbz&B0UIps$`v!pZ|Xrft07KK zi^L)ya_`%R13JFTRBNc^OC%-F%y=*VadVz>bVuvdpl4IX3(|Z&Y^2rF^)OPrme8Nh zYwUq=#w$*=wY9b>^&&C8$=4!Jip#=BJ7FWInVjvNu;RAg-kEG|nDu!h_kX2gogAOr znmaUK8UueTD{F3+Y-=u7&@<~)`um>#c9bE$@Ba5byM&~zziTW0?R!OR1L7P(Yefjx zQRK8WuI!qwIZQt%R8$?YxWMsQZ$#7>wtedG(Q@TnPma1j<2K>$ckKJL#HY14iX7>~ z+H~=F)2AG#Bhq`K?PXR%(R0rGPu%7A!~1_$r>&9m8<;zz+58`qE>dUY!+Wwr7BvaCHf}M{`%eBj{jaz6e;(aZ=?JiXlpDGy3z(oN zkUFGByD*&OW|Vl&E-#~xZQWQzMf)3siDy_dA2E=lG&c+8Iteh{C>@Izi&KI*5&JmN zF=5L-@TJBmW@7Q7Z_61?Y)5Z7j|ou$CC?GaE?|Q}1 z{^y+i^Q+6DhhfAbqLWYcTSV+ZptcZhXI6#}WO^t1Xy&d|4A363f(hiZNJP!cT9e{C z?sO&hd-C)@EUpW$ecZM~f_EUnzu&myCQOgCLXp+u^thn$}%0QCuhcH*d$o-3-Bu?A*KvpYeLKxf-7L<$;45h}^4nyH z`h%KEDh*~#P8UH^R1@hv^aYumgbEcHn^tytg?cp9cgLkt6VPS)emo6NxB1I@xc}A( z-oJa}49XNhtKfQ&b)h+AT_**yzng(siOWE)V)4yFsaUt8W4*HwhgW*QnWMNiSUTBl z(+cfVR<{cw4<@>K9_@whDNC*kUcT~msKQuO|4_2CG~{?AASY@{hISf?VW1I-*4_C_ z*H&{gd=j~3=4g*)JaTy=&S`rxGCM-7eNUIGm_Xl#ZIb|=d`I0*hDNxwVo{hVxPMt3l&Q3~U~^K~Bvf(w_Vn#R0rdp+rIeeS8 z7!IF>di1h!Z2;q}w3O#HuPb|ik&oaZwJUcXUO?&t!%|zIYmD>0ZN>uJ#9e1P;sqN+ za}Vh-?(x?Pe$`ua4VijCT7tT&h4ZqhHf#Pggm9M}Wh$lR&IlT3kh1(IPx2_j*qL+s zDV=v~Q)L9EACm4EtNj$LZuvzD7QybVj~62z8@ckfJ$mP{kS!Z5{rm)5TPe!Z#9Y2o zBy0=t+X6l%(5K*gycZVALW?NE2hm1X3b2na1`2keQ_uM=uks2aUB1_*ejQ<{*x*D+ zID{rLw(1^g_Ur5-77pOIjU#bP*5H@WO0dN9 zMGNW1JaX(RF=60BmMgUQKa0{3uX-kL*q$>sSkS5Dq%vR2+SsTGOSObaSxso38)Tr@ z&gHM%IK{jge^vFPmC@9Syga9Iym84o=Fex@^FAv7LmT~HUqSsN0CE%{>8@H<(iR^^ zuCV$J>QMeB4?Zyr#O&C{(mKQURDb8D;_>*}Q@8aOk{E8ZeFGWH)2DivI44(IAAe#X zpnWU$?Vs!mo|s8@MtCMzNe0N1NAywttCsfRx-v_}Yfvyxqfav3)Pbs-D5QiHjwT{K zStkmypxK)*4cc0P>5RV~WBT(TLKn`Zj1;IQj?WPcu}{$a9#x@KN}sMn;Gl}7HRQ~qk;oyL44jY$ZlY?RQqcvJ;3A&tKnJV%!#u=xJtve)jnFKu_u za!7=sul~&x@^9LM!mAz&16NkBz!h=43$09yhl&kTL|_~{a*0ZaBu!_z)YA+n42l)X zuY@N*ykGU79LImMVSY3ED6a#9F6HMcd+7^y6F^)_0Cpv=GJeZYC{$50N#MtWhzKAU zUsvVc#VR2m#9cg#w<-(LIb>}z9lw_y@arT25TF%D4FcXO<@wb4m=%Gu(8oD!$TCXY z!tP`EUsR-Wjne ze@|)NdoX83P5wqqH-KsEf<}?fdB&T7fZ8zad7oS7r;GLBs~qo@j1HvoYZNU)EHvUR zB$1ivPQ0}HmrWe#-PIJs@qU6YP^mP9TV$d4)@(N`_(G!CV3#*Rs#w&@Mr21pjR5SK z7;x*&wOo=n{%B?L(jv6~>}0*eU>lQ6{D5<)DCC&IwA!sAU``gujClO1=5j&HgH)Y< zv;JWdJA+Wtu{*h zV&-(O=sLM?Tbtq^EMX#_j%d>E0n5sWP8G;Sjb9f_hX~tr|7wcKJF@EGIFRO4&2*Y~ zOiruwBVvsgtF^c9`1&c}1v2Ho$KBVqSHLqL!S5Dt_a**&~^VF>vh_C z`eQ`jz}@f`NDdQ|-pG+lBXkiTnJUM!73s0l=I-^f5GKA6^klV_eE0<~dNrwfY#5Z= z-^)C+%Hi^5H!X|@Z{_vrHpMJ)p?IM8EIOsX)aS6pZ4svE66;^45z^7V!#l|p2(&<@ zWHl8iahK)yH{>xhN3!G%4izMj48*WOjuQjz5FZVMx2<&bJLkYRTY&F?v7Xs00n&{$ z5y-~qEeoANbUr6X41aQ?R#b0wUrAG+>Nmqq#eXc6OaXhjaEsxD8{$LKXCO;B|8swX#-@{v1A|gh(5$HxOxUv_EVnVtk&7PSL8YKI`eVo=Y;SQl#@USi~mgMv~mqT&}x<%1>uQhywQN44LN8yi$E0>^KQn@Q4OkAGIc6yv1K`Wo180 z?Wgpyv=|OVE1eT-Ns)1ttjFkdy+Zl!xQQAZCoz31gZ^H9&LUTnCF3t$Ar7o5MYp$V zyG6Vy#w2dG9}QrB8+dJc7y3g*6nV8i%wfNPtW1QX_RUg8ZoCdP8F+%KXwxr#I8ENa2DP>^tPIdsYO0*rtSiUuI9DcdN0C(_BxQC5A1v$gg0oJzN?wr|kNm z$$|HmfRjBLbUX`}ui(V$-2}Ko!Kw=}`GhF(s@vCMz#o^(kH&A=a#Ee73FPB>ztK#qb5bJ8lk$iUL6B$U39 zlgR2+E-i4zN|d{#OGU9BA4Mg}a`!uDl)mPNqa2&rkq-By=g5Rn-6(w-&FUJztR*o3 zL%B~}l=dlY$a0%NBexplxkq8701}opBvpGMGl4ljY+l;EXvg40fQjzKTuTVqpz#Ui zLp0@1d0lv1YCq$onU>)yRK-Y_!2wx)z~OArC}l45OPVw8jt=p4$+I!rAAd6YE!mQA z^AY#26;)RQZgxS9Tk-kPF$;TfeeKr_4_35`=PA#QXAKY4rUkYNdT&El0Sf8U`#xd9 zq9~7d3hlBG^?!x_-#vd8b_Azi{HoM^o&&yL>@G7I+B&Y5xa+q(-V%OqlzCmZ{g8n%qweqX z56;@sSr6qsPJQwSXv8*7L%K7w88{NS?&^6sXwNmi4XJ(|ec*krchg2kcJEAY?g~6a zE^IGgSmKpe>$9=$5EL`oL$Ufvj8Y=2CEIn2n%9f0wU~_~4UjZT%1ylGJDb!(5ewam zBL~^u1J8y5YVn0>!H|%jcLBb^e@f#@oi4!;|Gu+H9*3$273x(8Bjm|2UHs9BHw+4_ z2z{3~WvF&tf=Tj)&v^q};c2?1Ht+I7gIn33!{d!zSDz?fV(Tb)U0+IYWMmfx%c5ZT zsHm|&DRz_99L{?k#yU{saTR|4hH1U1-nQ0I(d$slrusj3T#t_sfyjiw?k93~kfS3iy;$nR zsuIDMqZ&1Q;6G)5E|2C!$a0s;>kEgrNC;&P#rnafJrxMt;VxY5>+jF&#sRN*t_nhB5gW&8ujl$Z#(X z&dP`dctFW(#aNyPhc6$%UxPD)y*S7dXff2F_FPOGymbvO`cBi3Pdghh0eP=CJVP-D z73tzpu0%M`;*Gs)v2&`{k&f>hQS1*#%?Vc+GhVR4LwizhwZEljw=L-|t$;nMUnjT! zwF~w0>GJT?Y@8!=9N4x9Ryoe1g~*adJdme~0E$&L>|itqQF|5sC!-r$YTd&GXdvH_<2rb)edts#w`UvDCNn zpOGm$GjsD4lDN(+Vic@HEvt_a*){SA8&c`C1v)d$W&U-1r_&{Vi5DW}%HqgRV*QX# z%9ei9DW8@L;xF&v*68-2soC}I-?O@sDZ*mv1S|fxiTv+AzQZbD!)PvR)1Ly34Ol)| z)I5%$%}HWEbn=G(2nIh1TD5+MK5hdxNyX7ii(9h?dM_rjd80=jZL>t4%#+JQ&g=Tl z#wqS(kdLF7_nymHfhPehL0;VXt{kxGLWx*W9hC zX!@Bv7AW&GVzS?+80lhWAljup5 z@TFlW#7DsJqNChK$-tRWaTgf??OrjjcX;FYUFWievM}U^t{Mr9Sx#WY*348SJqP85 zjcYqeo3SA31RyaP>%Od=)BSV}k$P;Z3-gID;E;5MCg6wHe>&U7tPJ;6L8w6dIUL=R7}p282iiJE z142erLRHL3_u-ujNZ*55(H?4?d8cqgL|WvX@f8&+KV#>Cp9%aFPvAw^W|g0@S$7`g z51s`a@Zq_>EKY(C+jiMZe7*80SY#B#A0zbvE-+{#P0K?-MfAavJd5w|F>OfEYSb6$O^Mk>-y{;?m zyYv*OD9TvE2RDbHfZDUEWPadYG5(vCBi}XX`q90e6XnkDN-Pkjbsc~JGS4#hc;7ff zfm&O*C66AM2N??L!fTblj4E$J zQj=)dpV$w__jZzj`q6nAMR42Lk0Xay85iv#GQ=F8KyFa+xK_J^VU_{Pl%*KT0-BQQ zuN4NLN|W&&{SxjtL>91B7JuW{7{^*~S#~A=yOHBw)doa2W~}Iuh}p`B5%=wkg7!vnt~%qTrO-T;dEI(ppVN@dn(O#m zE_UJ1LfLsrf1Uk!i?8$YLRr$A4l(Ni59-+VtFiLAzpD48I?g(_ZNB&~J>|Q+XKrqz zn!}Kd17#rwAOat7dXj$<0K1trRmau(BqVPr(H+oiY5*qKeMjhmPJ}*y6l}h_1yG0w zvSiWeUk4+~b@i0gwwYf-yPs;q_vtEAdpQ+aAV?_5e=@MMA{Y@Cv*QBRV3yPBZ@cSK zj=Wka@W0I8^lwa4J$Ea1Dvk0{+Go%+K!>IG1P;&4qEQ2h84+lFDsv9yQR#;kY@B_>)xNzK4;>Ay- zrqPM|1WaU1g67a?P?M^Lb$CAc79Vc*qitv7b zftE-M5PXG-X&Fr!Tfe>va_B7{8}%H=m zRpiLSA95-7LEQ3TKYS2so!Zt@v2DZkqVK%lep=e;iQTP=l1Rlb;oTepyA4O|?gAa1 z%X~EG4d2D~y=lU`IL#yr_}s>Ab=d#c+V?*{7-Wn(&AkNEKRfSB8Z6=YQG%G@5_8b; zVDUL!%Njq}w}OJRKtSwPB%n8<^LagFWa5 z_Xv~VFf;DqyMu6X5InQoo8hJ>YS%Q-JF)vgFM{vkltRUHB4{d2U0q#i>lPZ@(UBRf zQDqqv->beHD#X5#GJVW5ARHRI`~1#rB6uFtdgKM?Fe%o;oI#6rn^oowL5hlBjv;mk zSK$wm^-C4>h%V#oJe@waJ0KWlg6ZxMMe8sNoYi%se(Eb*NZ~+y?zzr;zd0I|%6S5& z4^sgIiTPMn^D)L^25^wZIBq|E>DZiYl=}4C4g6RQL0yfPJxSZ&|eAil1Ec1bS! z-5=OYGO-jFb&?eP>;RVB|9I#cD#{xeT9B@qGCJxTd2522RzH6-T@X6)vG}ba0olSBtkkxPLTJ@FS zE$JZ4Ii?MV)eeMW=2SYXAd20iH~Q#qu{3j{#+A<0rs4`$6#gE>UA=b2>3BT1%ve3w zV&-SSbo4glTemN-!;3!5s?gj1prmGK#jVX6bXtXUWz?{<^Lw`so){p3nA2ssF`!Ot z16`*DR@4CI>smY(NMf3qoP3HaO2t;>F&C3Xfv<-Ifb?T z|F)abX<|U1K1d^-JhIHfC8e`|DNV{V-=8_~tDq7ia92`1Ay(dO0**#zw$zTNiD=)7 z&HkJyW<{R9t}Ia)y!}O@yTPSaHEgF5S?*{(y#GtreO#*JXJui*jEZpjU38Q`{?8{l z=P?8JXvw-_U-nl-hSrXF&MbfHsgkL-5-WJ?IT{J(5H@$7fO5u4zQN1Ahik{l{YT%E zo6k7rGVU0^G?#1s{;m^j6)wxW4TWaeIEAHTt-kVNV?@79t}A)~gp3ZzQ{md9_2 zx)7&7JwG6P{=>#&0}(!q5Gc>^1KlSH<1tG-D-*IBb{j1FbYsYblsyO^s5j4B~vj-d-Y!b|&?q-Nh%%V&;8DpEEEZO9orr-D`MW#vTE!%*9;pzczdr~ks zcwQSucnQ|kW7Rg+KUwJ>MZ5dpwxh!L!`#1j|44Dp(tlhyXWE^LV#6mm2j}&xW2yv` z*@u}g44}-3@O{0PWiewX8Qn`AF6j+ar(DI1WDCseuvQQ4C8a*2Y~Z(csPafbbMpiUM132%a8bW=%gm~NWt*t&SG2e5BtNt2{>XPyb-vt3 zV_C-Dt@<{R)G$oO;um(UI-?wUMY~OW4Q}p&-61CW%+s;q@aoVOr68pC$RC%tpI*_$ zx);NRqp>@^?hF-TP9sp!*WxwNsnP~dI9-4tRK%4ACv*PsJ6~s8f8f6AQ9su^+)h7t zVy)TfK~Mn!14Ky`m6A?rQ9wXCh8~pe z24P@eR6ts!yBmh?H0aKuL%MT_q2A3o=ebAm9QC=s`~IU0%*@{3wO4#rvs~|Fw*YD@ zOMnvQkR(0F&MflzG!Hj)K5T6{0*!pqNB9KOE8vmdKUWt0MjcaTWk@*1Bc{_~f8#=hI2d_UJrM zMv|Po{1oOn8jN?Z1)0&I5b-4}Oc*tKd85P%(69GKzxY;StM!vrs-}tPGf&@5)XGrNRE+z8 z&aJEHmk91!tcn*3x$E8h7gqYwxy(@4>WJY}U)AdA9=pLRRRLaSRADyIhiI{L0gu!G2r0ov7rrOtKOOA0 z%pkhs`pZA}D1Vsmdqpko$J7KJYSt_hcBV`2uj{OLs>C6Gz zqWU|bF8CM;=g}_(xt*qwPHoVgQHXncDN4R9%-dQhdmimyf+}Yc%?9t#Mg7T(0PBCB ze+jq|77eDG3fsNofMHFk?49 zK7s-LSFbp)O=C;+;$i_9r2yCu5k(S*RykZ`97@JzaeFQ*!?~}-d^~D&@5-<5D-MMb zaq4^mJMHy5toIdwnhf?T7Vl%T-n0Okd+$$KE~r9~_Kr&;3NIJHrA2`GeWgjBc+fxF zC&2d`)hB;E3x$$e08yCW5HS=M86$>>s@E}>fLf9S)UasR;K{?7Y*e&XfPIAkae?Tbw8{8(saQaAhk=21CO`q|qXU53 z!+~^a=Eo7&I1&b>EaiY6AqqTFE~cV$Ew$pEzwwOXrqQvtdc051tdJo{Yne1&W$i^X zzxI`v;cL0+1QTShSS)x^yy|CK`CE#=yfFZTlleBjT-U6P6*&Ut>U_l>R<2%~!0X~z$1T3Ez1}cqMt{<3W0Tsno zel-9`V&p$^<6jv7k`l&1IIx``pNv}v@E@B8vxx;pO3c9%R*)`XqWk3PD!wVL*MFT$ z{lkkE+{a4Vyt$#oPBe(0!mkXqmiB!~I8eQ$l{KZU^PM6Td|x}GF@$OR^)HS+i=Wbj zU_fQ~05Ip!1lV{y*ER}lw=)5vGJgc9CCTw)dCl+n2>=u6Ob>R~?6+U^S3&Ic?YaNd zjaNczfv0K;7)TnGW>= z<)3D!W&Be9fVZj&q@%MerxaqwqYLm1o#(OrNI6WxiVV8$W@j*w{kE36c0KKw4t6b3 z`^$G{|CfNnDU*xgkn+Cjgq|FXgRiX5N$;*te%=9A%SNJ~e0_*5rwT0bvJN8BunDkT z9T^T~G94?5X=v4Q!?z0kk1ww^&mvljcVOMMizJawppg{OF-}M)Lf@@ejTwgN!0N#WKIT;@0QZe^j-uf~B=U zS-~=3hug^sw|Bo>mmUDNgk}NJ^LFTGZrW#tgZa9}MtvE%npIaKfM%|@JEHi1UVwly zF1HHM5$=9M@u#`qB0#;p-C0_k1R}tBz9gJOQID+Es~kpwq=PXKV7a{FPtH$hFjAW5 z3ru7_U0ND-&%AQO9SD^5^@59T6cxN~#^oH*YKvgUS!|vA_7Fcc845vyv>-HKY1sI1 zYj^?W#X~WfqZ6RXp(ueV{o!wtS+Eiv1a>Y$&UaDTBvH5==J9Q{vI30-PV)2MYT-%f zTIH7C(czqcKf!wHxd@>6(~0WIU(>{<={o_bm)}zf+62Zdg?~B*2f??ER)^DKQvjD8eX@_r=bvGbm z6~I_gE4!&Dzbyl_vT=sQ!7-dJ@tollCwm?oHjNXVV%1enZhV`KB})wDnpcJx`Tm&$ zeiRgi96?~G#4=FURt(r(QS3D}U=qkeA5fo9!ldO&^X#;hDMg0gcL`XnGIoN^B9}W3 zJAbh<_ZH^ijQr`AN1!H2k^fC69o{nF3Yd4 zVFb!qYgt1>w}2E^Atui292}+h$wNlJQ9bsT-p>%e9sFK^f=;|P7KJeP8Z_Ae?C308>K*0a|Hl~DOYN! zXMnAG#dY39q6_S6PzE51SaFP6!qRO~TkSz35X`Eb0EVt;FkNsq_r5`&59|_93|<2~ z9`y5(x?RBkI1l%JL}_Q0`d?56CVt}?`*hBS_%xp1m4XEffN@bF_2jEYGRfAlm1zNRGnrrm4RMJ@q{kG6i4zpt2t3!tY)Rc%NYMr6l6b z-JMOs0QJLTpeAVs^N4Xgf8lk9mGi`|y``iiP^0wg+KE4fPzHt$#M+7hlR3bSP!CjH zA=F_r?7l|=#2AfwbcFuAEsQ^GX1yPo@oCS345OzLzvH%nc|-*NZ)CXtW|Uf>@FH00 zo5G9Y3Jw(w0N*N}G^JIaH#tVxuLOYkHBVH6I03XMvfv98+5i3VpZ!GpRB%!Vs184c zwgVZ8nI-_N^Xzk)ZVc!L(2X(BuK2P?>o2=ZaJLiaA_4SVB;d7-0mV)-jnsE>t$`E> zrc#c14}B-S;hjq&G$yLUhCit0)U;0x*V*sm56(kTr98#iUPr%wS9|FqD?;l$O?SS_;_Wb%VkD zWZaufwGd#QaW9~h)lP;0SJ8nrYl7bvWC(yYAUNE{Z8NVGs&3^8nD=%9Qeer^)Ry}s z{+}0V)(|`>1l%x4&gmq3pcAYzbjJaxE$3pyC;>dQ)2s?gr5p(RRB5TL;3K=MWu_AU z^%?%t9|#zLV}d99w4eRvsn9SIaOPhGIRf@O5gI4Wzn^qmg?T#w#Th`#=cn_Lmp)TRab&#<;XE(H_G5yAD+l%=MEGiv%!f zndM}f?@v{%$QWm#R(1HPx-)db<+l$BR7c)|ZRKc5=@I)7{-{2G>-K;5W3UT%1RKF` z_9DW?{)_wjnX32~Mu)MT((_5U;XiT0|Kac0E&=1!h`%6OpZ`3v^Z$Iwq*KBXH~(w- z#{bb{0z&XtHbHm5)`{5ZRDDnXf%5Mj)b7U^NNv0Q2=Kl?BreExT#;nez9Z__JRQsc zoG#hrO)tgoa?=0qeQ_ojcij%zje0F&T@df*s!T%UXn!Mb@l#LX`&0j^ssH|+!aKpF z_cafENz59-PhxhlRov4b{3dYv6@kxQ>d%YHaG-Yy9Y;J}%r?=ZZTDgW_MMQYQcel| z!=wB^;u+wZiC+sQZJ(xERC+Glv`cm9uRIMx|L>mBZ+`6E-77TH(v(L1S)S~Mf-w6C zP#f!igaGL^F8Mqw5 zZv0YmQE0tAYX3{SlT|;^3liC}-CR5lG=ZuF*4yTkI~c3)3jF_01}Dr-y!{>wg4c*r z%j?D=YrXRnFm%jzQUNn6zu5d9+s~ZYhKAXy2m-DL7k;C<=vxy1mpt>~IyLn)W7#5; z9tI1B-&z5o1Y&S#<>K<*pihSY1R~bZVzQo_nGI>c`1+t@xj0<9TDM{`Ww=sX0HWoz zhC^3N_0LlD{~+;y%RT_^L(biCQMrAnLXJ*hs$p6aT~fzyrJz4P7QM5$9Bt=tV!X2T znfnpyVO&qTyxn|()<=Il^4#mTiKS_-UH4cT!_V)m=96hgXBk3BcndSx#dL&x2>weF z{Z}lwNqBpj5zLH|*3??7*m+W-wUO9^RcKABHYZq2R-aYTX=7 zrvl$4M8zg4`N)oAz<(G8$sCL zlgqCJT#zCD%Hox@mh6MVUUeg9jdBHIq7+{}L)EuOE3HMY*?q!U`!F zRBPcFKvhvKKNm^uU*St;8kQ3bi*;8s81aA1_J;kDKT(&Tf^SETrQv6G^uhhuFqO zbIWT_Js39$EdhqHe>+WX4uc%J=Q0Gx=PztH9$!<7<*#bDrT#kVj=MH!f3haJlFtx2 zByiN@?{%~1q+=|)7Nj_~PjT{q^FZYGm1{RtKHqJ;_Eh1$qyj-5X0}phUw?6rDfi0r z;qc>B)|K&v!XBw2m)-vIV%mg<`VJqpBQ=&T)YO0zQi{BdNa#IS-yia^gGma z483quH|}opq}Aw0>Y?dZ2fiwU!mIe`I2J4naoXBdXJVTak2BP9$?U82d?XFx<&CGv zXxZv>z@eFs>-PqU8ire%74@v2xyuH&DP@Z9GDF^I1mb;L`7YSp!6@@FT;zXr` z@1Q}72xU#UXI)3jdhD|3#*;?$b?($K5IXW)h8A6-E@1bCa3JWpoFuvcNEV;16 z!AZYPL;y!~zRsRzuM_wZHh9tA5aAi2hem2-=~QzM*OY_5;bskAW;fs1%Yl0hb+>ZX zMIQOEBia0rK3%Rb8saN`4++2BLQ_h;UNO#>d~fQcpxkS-%xkO6YunbwSbf5LZ#~{| z%D2XbjbQ30n&_9xmX~2dVJyGKpsv~^8u`iu{RcNkPz^(9sN0kO(ktn>)Cb@mc`)h2 z>i796&y4w1)8CGX5l6GgoJUd7vSi^F@^l`u?Ux|GV_LgzjPU3Jn}%ZV^J1;1C;+8pAN;KQwF1@qq9F1z7^vo z5m-&Jc-L8t{~rTzi3u%LUTSJ4S4B}?F@7^&E|?&;r_8zyTt`cvBcofS$WftzhbTR# zM%(jG12nz?h;c1ATrJy!U)_en8b&J_T;M9Vzjvox!8mXCkjr7}C4@I^jwBs*8pTY< z!r_dxB!oq*PqTt&nj3j%p~7|d4N*Q~;(n&j6%&^$GrTVfv1{)P)cgAGykUn9JtNb! zZPlR8NvZ5LSQ<~Oa?>!5x1wbv#~16R4_uPiXJ0ZQK#?Hi*C-y^Q83cca6;Wl0?paR zUJ2MX*Xm6%RQnQV9hmvadCGq2xYjT4i6lH>STQTxz9RaKES6>oYQ)!29IjI}H#gf6 zp&+Y+0<`ya2Xq@siK*8SwD`XN%uKF=T9>%!6dmCTa}w%x2VM%wGI3c|v5OW^Pg+`9 zU0Z>Kt4UfCxvy2#17t6Cz6yz7O%!|_!X#YxCB5OjSUGfAaWS@64GXJ^K%dlm?P}(w znCC{a0dM~0V*fD&VKg$;OC63-$(Uum2X{EWCpz#Zby-(Y!<=VNFM_e&BFVDUR&PCo zhy_%01?2ctqC3l~_ULd2Cu6E^bs0%kJNVV_;8u0&@nteDR`k&d@C;LboqM0%^b8TH z<)$!GhI3dpHrUcULyLQJ!O=RrEdrF5U(Nw3V(Bi>WhU3G(J6SFM!PEn69B1oIe>I) zG1$q?7al2}SEU&v8syCDD^vdvc>bI76w1a`xg7&E6;b{nI@>7%%Scp1is_|Cg@m+F z6)`_AS(>%^V!XXf!p@d4Oh5Vt2i`lU#z|Mvo36!BV^>Nn+~(-l)y8>wmfVb|HzU8q zcyw-#ka)!JG5MNNRK*vpawM>rW@e|dp#Y^OsNZKuCN`YKwH#gB-`h0M!dc8FjeMI{dvh8Qc#>Jv3TQwSc;|@bBq@PSTj!is*8QMU*+t1 z`Wx((daz}XDDGPiWhg3r$eB8@H}1*6eGquivta*TOU#?+?qR9U*>PB+mu40s~_^;h-m=xB0V z1|?TJ)Vx`WTskz9$(nlGrR|oY!gE(VS0484znnrY$W?uH6!z~cOs8a9j%X^k-0WK< zk}Rs(vFIlHk0Sp@6Mq98U@cg^q~JvRe$s3H7u2QRO`T=bS0I1~$B+*qFJj*H@abFb z!Bh>@b_)A6kfl3Q@8Wycr9Ks7F}4F=tn-kEil$$4*rIi`!tF#^h;Z=Jjh80|0vM2jP(b0=yby*Z9sm+SzBB$bMFwcpX|$L`~In;VW0~E#6z=;DDSw3(_?3N z1XH-AwD zp?&U_PaK~mT$k^G3(`>@o^nUp`ZAU>9Y2rpVp9kO$8Y!>!0)TPdRw*fY5VW6@BF*k z`)UEIxM_^FU_s1Z=me#*-1o#b?0-06_(|8#fYIYL3YBbRONUKg-@2+%M zk1Fc3f@F)#1qFQvvm$&qvF zCB$B=qoR2<0!zjCahtBcqSf!UVM6$yPFDSOPy(@02_A5zy7h z5%=1ZRutWH&QV&Wv*@^EIdQYC!q8%rdUvQKXCT`Ld+NN-W9A6E7D@4i(X`shK@)m# zEc|XN!HrSrt<|Wsy?SedcVGTC(tptkY4c|TN+97;?a(nP1HG{(9_ z2d%P3eu!etnA}|Ary6OYv%Qhk)#B}g?`z{5VXfJ3tj%p4z)}oN3k4s_s3>{(sG&4W ztf>VU8(tmd>_E#!{hf~ZN109EZ6sm-a$<_QQms;)r1x0QY-P(%+>dcMr+dI7r1%(E ztc%v7s2xmfuWFb~G(^{-v$SF_MO$W`@BxB+FWg6q%9nYhpGk~8dQ0Oo%CBpF&pj*z zs?DBl4ws!@`$VN+)xA5P9Tg)2tA>jEy!UF4>Yt2yX^&Qklla>9a}pilUPULX<)$rh zP?5@`)zlf|qPakS+d}&f^_RsJf{cPwu}(=ZtJZjCUt_lUq%cUD_uf+5>>Hpy+EM zUewL>Tc6d^?#(aO{=D*{(+S1wpKr;}~5}Awn`8Em1k!WqrvrDD*YaqK0J*y=Q9tsB3)Dtfszy#Ck$Dvi?AuDor&hb1` zkwYB>rC@r=&TE{{@JD#}KBNRin#)b*w>76#cIxCj?1#On3*ELRdj@Rzpz-y>C>}^Z z*7DICelF~k8;6y3VmY76|G?bT@YRY8|8P!kPY<6FD`0VDC-HJ-z-IT1FQyOKV70Y`}ZzrQ{^E#z1D!D9_ zpxd~2yxXA0jMFX`SRpMUNq#dmBtm2K8Vaws5@LqftET6D3AJ=GstGH9C+Tv*&FITK zmg97Pm!v<~DU@kLq%C$pT2``Om*9ZMIxitUfz9UG6BCIM!TX}@Z?TsU(w<1|H|*T^ z%i_BRB*-IrbK!AZzT^W27J)I}hR?o%ZT|sv2L7%+nsku`e3bLvu5%d6MI0TNl-JO0 z(UW71W+IT>awo!2TinCtLf5S!S*i77Hi7jSN;CRiih3o~-7iD?_Qv-1#`p;B$`)O0ANy=f>9=>jg7}KJ z$AtD>OJ*`oUY2DRe^+BATlKcSF?&TUwz#h$8c70rYI}-+jqn44rrXvB)XCd8p;tI3F;-d3C5MLpFtdGHa ze?lhNay%Fptphs>G}OIYw0tEQ!MkMiG_wuiKIf9G&lwZ)dFtbNrnoJi;_6K>EzPkf zbf@uY-PRZRb1_d-e17@_Cd6P{ka0vs3tn1p;A77pllbI>69FK9t81;7VN8iP!TB4D z%QtSt#x?HY$TA$yn>2b)Jt6Gjlw~IK)x!c+G9Q2HKc;?>$BbQ}ZkAX&K4XkaEPVYl zgZy+SVTYCBMomldB-c-6PH-3_O2Np8grMsA6$?4)R*b$?^8CYfTIbx&Fq2WTPd!T| z1YXQsJ~AftQJSw=b&nCrAeJCLP!)DNwm zc7NG`d&~0-kz9!|RMXdI+?JF6*}?gbq@4b>JV3B%5WCMV5t*;xa*euwP#n(h!cB=L z5W1G8)pRTCC258~mVGzWw?u^PkX* zxDOX&i#VpTjLO$(Rfx|LP~$P+5NJ$3%)jtcz5>4W(mAvWBO|he2eRj)GT>ao5MQGe zb!Ux@UX-4s-AtB?L<`=qQ($$bUQuihJQSK7T0GM-sEC*ku#N5sAe3J6Z}Cg-rrfyn ziy8^RiA%ktDhaxfeCl;Tzk5ub?6`dXIl!V~l7n+H|5+x`R49*WZlyXtGjzD)YEx+5oRDd{%BNAY! z&6L!%`FXX&{5AA`(rj?KQ0xsG&%WGCXQ^0Tc~1Da{E$Wu_A_g7%0d$q=y-iP6f(gs z&)rpQIMFH;8}R#WN)!t;Suvtgi;jcwgF>9!edb3w^ty`ekwcq_8LP$UWGZ{NOjR~B zj-k2vly7eRN@u!aaVg}YFso38Vy7Qk;(^wWK*-hF z-moR1#(=2rDx?2XoU;u19hn3XR~o@^P=C~wlH-c{1s%fg{(265^a;Sdqf@*E;%Djp zomK?6cfCw7J0qJv7UTMS3VQpHk>$Q^PvBaUZtQ_FW94pocZVa30jK{AZ*~z5Xld#> zgwtbwZxaX4q}SMGFnQC@L+jp8Z}c4cG5th&PN_~Lp3}z?@cypnOS?1odWnrNt`RJc zKlV+e>x^po&&%0M1DT4#!R*#1o{qw35L-gwV|dzAkABSNqK!65ZlzvFVB#>9Or?IX zl4)y5qVwnZ(WkZPhv!KOw{x?bWXH|`yt6Mm*#Y+sW#gt~&Yuzi&%3R3HkB(_a`n;z z2c7P(^MbC7m`27riC%$>9fBq8rrCM2PqWm(Xwl%q{gs@BDoGE8k$st`Y1h-5`l!4? z)We$gwYvguv_%$E3=@NUsUB}IPh$JOQwY1?7#1e)r<$m2YU`WPEUuvNN`07f1@Wk& zXE)HUEzTm8!+ap+QKCNW;8zOymp9Im_RI-iJ&ik*KU!g=Sa=mIns624JDqr{D=Mic zc7=~Q%*SSD!hNeLofXLlf2Y zrOCTf)ey!jG3ta-NK>pv*2oZ}p2KvE3XgI3P=+pd?Gr zP$MW1P#xh?wnGojMjkXfvBTiuh=82vSn^Ot#YC#-eZJ||Hshv&Y_~Iz3D7p_*Z0}f z1L}<@*jYz&_Jtb?br-}}MvBEMyd!pZx*-rhJNQ6$1(ZuMPg7is_!k1)N{}{yObH=9 zR4-FvEw}=VI6EWZt=HCv@484IA=Zjs&Jfpqd0K&3rQHb)cTlf6+>H&_eXM@=6KB2v zSmbsOEtR%Ihq|geX?-zxb`JgLUdG}K*#`gF?pJ=~9UAc3{`Z&#n>DJ{`dxO4N-tksG zZZT~=fuuEF?k8_3pYU!Pb3A;JG|L;FuwdWT>5)^DJj0W(_;q_{bD4X8kbH$MB4Yt- ztX-1-7dOxQPzL&}B_tccY}W61GsNNt=9R8p^EwO;4qk!??0K@VukeH+rWc#7!dusTQn@_UT$&*X-Gz(yvaXsd|`gmzc+c zt!!I8QJIdj#y1s<+!lDQ)S)Hcb7f>0J-DIp>*#LbK~%|gd!&;R*=SJ82r)$#tKREb zzMZ6MhlAU0j=avfpHNcW=LMv@-r;NZ7MPoY;v1~h?`RELnht-+S=fC5j;Cxpd%iOY zV6VVcaWL})PAKYRDc=>V5%xn!19pD`an&Kpj4)h{qPs(BC3-=* z0Dn;@-QKEC-?K)_|9H4&F=jGA6IDc^2 z+9~w*>#BPn$(<+HU+Mf}AQ=`zhc3b73f^?cK7KO2ZjJrK>9 zH0G~jc9U~fF+hskwK~JsXJ1adK#R0OFm~0O4t}-E_AtcqIO~kyV^nSi9nrZsKXGwJ z((i752n;-Z-ZpcU!_z}9i#5<3LOMh*uryT|Am=Y&4{J%@r6G z1+OwZh$O&qnw4gxX5A`xxkKI?uUJ|paCIhS4~H-epEHA&U0 zUm*ZNB@^ezBSST`0H&&VKVE?&P-+rej|;yG^Toj|ACi-EFY`Vrvyz|A$-8mzbGZfZ zzb%@+@A3_VcBh_cmF>}d3_tCJPJhI^B^osSB8@wGno#E)L|RNW4aF=CvWDv{++##is4!k0d-fF^{&Y+%$}{ zA{&l{f8g<;NuQyy{8jy@00DIu6=O|2J^0lI^rg02+*rinUdL(mzbC`+QL$RO^=>DL>K>wOGYg-g8- zv(<}~Ain(J;SHk=>MMW-MpW{cS)bUDjZ`{BcJGj-t%aHpTz$^|vMtg+5_O+yA?AQQ zWa;J)I{gOk}~4QYl3fdMChZiHtB!u(iTd zFueHKHd-nMZfX_8NluW~+&32OMt*rfHSK1yx^vG(kha82Tmb^Bijx0OHw= zFaBc4AM)$vY_3$8QAK^+NueCuZ_kpTie!4c zRl_0g>~mo3M;zIDNZcY3XnhvV!{BsRmVJ|fS($y&dfu}09cpSC@bZzdW(o3NfF@u{ zRGDi5FK8eB^2r0UkW1d4U07tL=u*M6H^S5vS`seh@H$^9)xUFFPqR$T96pp|Qh?Lx zwk_LCHr_Q=B8eyhxn0DNtd(MUDE8Sy_@HU~O%T&pV##OgV>VHGM48)Ta*h8sRPawl z-kA(|bS{&|s;II-PGiP5H(8$cn3aL7J=SqmL$7{i`kooip_AQMZ`R&nO_8>iwkRO- zKJ1&xXc>KR=fYVV{~tf{Z-Iy=uo%i>DXIs{1iefP?rSRORrKJ|Es1bM(r|H$s6%1U zqu%*ih5TrCG`0MA^B*xzWmX#`>m4YW|#=R>ynqp zEG~9yHbz%OM5#f4xIV!4k@_QzvcX?m2~hH2>;bwKoyFa352RcN6Bzz}rma`Uz~{fxU=4}T|4{PtJ*jOj!XiF9F1gKcE6pa>)%$dwA3yODk)7-i zrE)F&`)T~~lZHmEvCE8~Z<&lqPFCfiR|?`}Gj)}}A_ny&(|HM1#?8K}7MjSQpZVC} z?%OFddn(R9Z4$0iB|^GJIO*p}$cCkjg- z7akQ*5hi7tK?HZl!l-kcD3b?U77Pv>V-_bJRU7)d&Y6-CWxel|5y(uwnefgchcBa7 zi5m5bxWxn|j5s+*HF=b(YLos2eHOC*n;0?}8>*XUn6qk;%Va$i<`uWjJ+{$|jt!8{bz4qNI_(eVmz;(SiTy(l6ea*5iwQr-} zKf5o(*@Q7ri@%VSo8GSnI2-R9F=Vw_m~sf!RxeZ?mC$qR?`*$uH$W|8M%V`9rI$~|pSswwqoshX^MHC12!`gcmL{DYv(dkFjE`i==L1fBAo5G@s< zhxHv-RD7JjtwH;PJJ7{z4MD!?9eSd4>GrP#1DI48u?LKG7H5b8?=c84#z^}o(IVRC zVtP`p&yaietG<7mxz=e#Y;peqRbxU=eq^~_svk68!eJMjT`D7gz35Tt z*76-)0=40hnkll+eb$2D4aO!iBAuVdx?LZk&!~aB3o@me^rZIap8EFJirFuc?BY#o z4iP39i2RRV^`}e$HAb2=o1AxbOCi;2#jBkqF-{}$*5>SfbfLx)NG;iqO4qxoZ`pD^ zya8gy^M397lJti6mJk4XUkFUifWUYi``_uOnj03O`__c})Or6=t~M}u&NiZCkTVHD@_ZLRDywxY)ITH}k<-E`9AdvEkWVQ=L7 zkIW5J96gC{^neg!C+xo76BOGK+6|Y>l{j}EC1ry-%s18#4sFOdrI7RdJK-0dDouv*;Xkx!;# z9@=M^^itT}iC`*K{noIQurLE%9UTXotEU(NxpB&QsH6ORD|-e|yBNWKrad#H0cp++ z7lMBL_z{~0+Y$rw(TE$@2>Y=*y}~~00l}4TnxSEEO07f8&wFZa8@t$3b9F*4@L2fD zCzpzLITft$nO~6eN^XCn*=$w*d*%B`|K$tsALdb_D`k%MsujgsHZ4+g1%xx#Q=#`= z+(xx5*%S^eFXs`nZHe)5)6_3NMY|=yJ41~0-u%=XJr`U?CA!0N;T9M%zm)wvJT_LY zj3}kcdZ>+RquRUM5zctTQhnI+5=-&j8l9+v*@gzg2l-@Or9nxxP)jfui)IYnl%BeEy{&%9 zEktaO?U9C~$Dr+~#-7|I?}zbspfaVcZ0gt1hi$g2@R2HG$#8P%epW?%K4xLQ*L>t< z#u$Z{d&7)#k*JzD0Pbn&P*i4l8b28zPRb*U*j`H4!Hb~JZn1rsIm8n`v02oP6Ks=yA1fV#m zrkt{CkDCx|%Feyles`t7@s7)yTH%B{2IIZEnBU9l8BKEz-IO4g4B-VLG6E}-96-v| zre!264_;`jePn#Uy-ncxgSrF}0y0wrXca)!l;Mi{+%zlK)xZNufmR0wQrs{lW6xnt zGpy@#slO7eT=ldW=VNH6`4%_B1PPgr$t@>cVCCm#eZRk*&J|1(+7{^^v`B|5A@k&3 zX8N!6B?IzzOuA7k7m>oU$wpG7@*=h*Z+eN3GBOoZiZ$p8Nc^!7?*g6>k`pGs8>3{i z?Y}H}YgC%~&IpxB)^y*|5KFWa&%Fvmu_pxA5v!TfeZt{G1(sE^t&Gw@>a>|ZBtC+p zJ+FUWMME(@-;~a_awF{BRpLiqsQGUZ#`9CA8qWIA5J!^&X)W((ekRU)T{l*^6zxx{ znPc>KAt~*M^F4vR;X{cr(E%I-H`+H!)g*ijW%4Rz3b~Eus`dmZV@f zyJ4y%J(nXIvu2=qOp0YyDe8H3+NGaE`c6GG50-I9c^>RxM^I%OY`CAf-2Z|kDkJ7O zuDP0v;}77>RTQ&QZrXe+#B^1xBaFWboj1DnNKkSR(7=2`JW~^bzDpq?W8|{7) z7UY(D)|{LP9`6+h=4RC;TZM7eO{`lKE!3M!dP*g)_2?TO6xp{Zkv#&@RfsM*_fbzN zqw0cJ`^J3N=2tqZ*M1~e^eq2jc`D!5L_J#0k*^`62*3R zIma5V!K#Mxk=D_fNQ;G!ie3H1p&Yt7%2~F< zQea2lSEy&P3yu@VgXJ0Yp>C&^obsC?c0R?a(#2OrNUvmahMQBLsYDFd?yfBix9zs8ta`SuCC_l%i;^Z)8^NU;Wttnrtk6P{kwQTn zvs>xpAESNS_c*WyS`-z=Qew!K2@?7FR9%*9RU+d3iCp5^MEw_Q=jzB>d&XYi4Vo%N zkCrH{m1*)d7#z;aM&wQKkMiD?8eQ46cFL2bfDa_R-eD=OaKV?Xo-%7A>vwLUDGq&T zb@-;-e)&R`)4*q8M#k_)2eN^3aYhl`UdHN}gieW}Hg1_@4ReOxj1|35=1QiMq;Px# zkpvavI}E>2Ln{Qi(cMGBbVZaMt&DTVx>A#rw!@=1Y(@5T&IaE>yFYA^Jf^D4(Abmo zo*gm^(FhKDIDILRbQ3jJdsN3vT7R{o} z9RCY}Ek5nMAIqt=K^j5ppJPklKoQ!_{~LoK44 z9=F|121W38RJp=_<&|>cfGB#%ekL;jiOa zl~fb&i-zlRFKcg3o542~bhk}(09q+rdM^-(V+oA90ksvZ&srJ${t#&rfX6VUd&si!_ z+gWrcG4Fg$HEXC73coZfGud9JT3UxgLF`GExU}XdGZk^7H$5y*er0e9UZ!E+F_x)K z=hyOL$A?bJXo)9h@i0#f8BNjFr>Ga5^I_C+KODc1l75s2^OzuUqhQuZ{ zsh(k24+XOM`23}UtoqLbGq1#Ez8W7ZJQ~W^tpKto7W&Vkxir($r`WYoY=HQTIA_8A zm-O{!H*Orv%n_A(V*)$Si>t%p=s15Pqe22>3GRzfDW*}dbWS9pZ%c2c^xht?Igkmz zubW}g`xRW#$6aat25+sUvw9!gbA5L_4i>wzJAzs@fp3Lo; zYGBG6PD`++@@(?mf;+@qw$o`6|xXI3}lPqwohy|2=jBLd@iZY4CtPGcz}O31`JbVlwbngr<{jFiRG>hMU93 z4C^BOE^}bY_$X?1m%MNJ|;MLG7x<|1<-4SFmVRBP`WFkifOM~>ob zD50i`ep7(|cB_CHqP=3RudN`3&Q_Vx_At~{a^Hi$tKPrF_++)irf`H#!h#BmoJ(Vi zV&6-|-f43z^5G94{(B#<+)Z!;F05L-`cB-ba0rTE?0jO6cU4+zZyw|QjkC%}$&= zs!Q6O3q<{v|B3Q=<(<5E3-v_)<>J$Rvr1NgkluZ6Eo(_*Co4UU=H_O#{~u@X9oO{s ztP5{YP*FgoZK*2Kn+TydML_92bW}P>?=_$z(nWd=y+dfBlOPC4uOW1hPUsy1gg5@~ zJ@;;LUpeRfkMAc5$(r@dGi9xrAw9C{D;$W(>RqYQzK3oNho`Ng-PXB-KC-xZ_2%VE zf{-UCH|NolUne-EkrQXm3Sm$9ilSTphc*#Pez3uFMq64^?I;na?h`zS}LzvBZ;4~4+p~&)9Ilpzv2VDF^u1sg|$Nh_je2RRT zKq<#_JjCnIDuR7gBJnEq@NUODia*vKjH3}cX zmz36rvnO-ZRZSuTK}}H3+kDSmPfyR6zZM)1raLq1T#R;q1#msnD@2;B;b0I6tTvcD z8;4{AS*6z8P-Xn&H~p3$!g?k3!Yu3=ImB{^HyM zGOdZYJ{PX4Pd&|N+6Teii{7kK9*yGQ)CDP}a6|tBsyq3)aC#eZ6%o(lf}AUel11y) zz#_oZeA{y!rOehLz||3@oU-%E7uR;Wuu)yf^RPkDa3wXa6p`%-z+KYpw3`_H^B<>0 zDIU8#(H@)*BeSL?t|69PxvSyw9S;(_hYFOAgAM!WrbTmE!@H1l z?}k{pxFqF#cI6skG)*@k`jIhKy*jzEz?_xL?#!#suO-pTV{PD}wamU+`qRBQi8yJF zqxcl`0cne_TVW21)#rCjGUi{oFbYaj6FC+noBwpFF62UgK5k|C?&oSkrm#r!+Dnz( zlIX5E~Q;h~_ zMv3Tqk&!A$F>FOqR3wIK3K{M5FB9i(=p-j z#D*)~QBZ}ml_7O((cJq2NZw1~DQ%vLqiAuf(d{vpTRSGe00$uZU`n!fS)xejjF{Tq z_Y6mXz{LFXNinaIyE#6FaLm%?@{iRz&onr5X#9CK>}1t&1rwp?Hi?PF|Lafm=L^4) zq@M#X7JZNiStR38E~jnKZ}5%=*Z=k*J8f*`f_}`$ODioTQh9I{li8ph{qeUay$k7q z7 z{lu^;EMyB9#K{lIeLA>@0C_4ZozIDcDy?OF;H+xWBqv4c2GVD*Zs(*R)uwCpk&m|G z)Yx=*e`Bj(ypf}4jqy2TT=f}ecmUXUPQ1h6{cw=3BO3phQC#~seNENy`>d&Jak;;L zdpXrtAIcYyL_^(OauYXDK=W@pe+H>i7Tgzx28Foq~~qDU|9o}%sJTXtK(7{ zj-yio*29M>9LddhzeMZAs*LYE5pmnda*%R5xR7i_) zO!8P+)%OCmEt@jt&=e6VqdTlE}wE-rrS!(Sk?!w(O+FGBrSvw?lpZxMG`B$;z5aUikWY2Mp< z!?aNuXqJ6l0Tpu@*cI_S9I<-)O6 zqpj4ty%i=UHVK}P;?R{O<_zHnxA~v*Pwdhtqeg_r1CM8+w0{2IjtUy_%euR)Kt?EhEX0>zC{) zP`LERf5pH|2iDltmE94&Tn+~}1=fY&=OxtZbnTzWujY#xX7D2oa==q5%yKu^sV!M& zN}|m{LO?^c=rCBp&<_pU<+=9rbY0IABw~pjBfkmXjtE1#I9X%wFF>}d#8Lww;nu5v zq2rlv-;GFp%|8VJ{|yP^B0`ln1UQ}UX(w}Z^@sI7xsp3$Xd4>u1w}LMtAH`h0L<7b zZ!H&C;>q^F1Kx{X(JzwmZM&KeU4k+QsiHEtrdEZufJ*K!!iknTnM7S=Z(O|n<9h?w zYXN#A_rv81VJx1bW;i>;jbjy73E!?CCPy#hxQBCm6ZTt^5)@iZR-b$**WGUIapoU> z);Xk|-%JN9B0OFMznhu2PuSgZYKaF2-C8I8MEh8AaI@a<=0=TLmHfTDBbTs4i^J3u zO71hFN%wH>^YI+jncf_x_w&Cj>lc;(iTw3D*z5N}Q=^XZ?quut7HVK=qQ!$5;bC|E zaYf8zA6+EvuG`nS>6y7Ns>JWex8a(>-d^ZmClk4;9AB&uTxpIbHf3%tkEqk*4QRl2 zBS;Y~S^(P)d5+r-9Og*7^VtQY3u@Rql^W78A$#Z6QcAYCsU40=`OqSn#-K4Hw z!yAx|`}4^i_MD%2Jfo$+g{@Nt8{Uf=9C|Hqh6XMxE*DxHE;m`$Kf+!i29`sAo$yln5ss@1;#%HVa?%?CXDMZzS{+W~{6kfcU~w0DK?$Kacv zi8l2hMNF3Sc0v%59H_~W;TC@ z+@yS}stgd63pnANn%_aA-bZ^i>ve;hsw&)*Q$Ae$tdj(`5{yQ|==vYk^(U_Fr2KTo z$?D=JADAl#Nk9LX-y1iYAiRVhsu-q`tD?-2tAMDriAo|y*<0l~99R$Kht@gIcHW}t z+_7J&-Z{e#pUub)t<#mvJ9QeB`<@%TG{>POsj5nPCn1-czZa22CC$RZxOZOe%Cw~t zeTZp;^F(@I!@VK*%=dGNWE1S>cS_~ar$uZVQ&W}{*0%cx2J7o^*hW!Nk#4Y#?)aNY zW$mj`G!YE1r*U6TU%4@Q*ahk_XD0At=P_e!U#d4~ix*sSPnq6y2b+B_Nale@6qyDq zIk3aq%QrPFdQ`HC^wKpF!&!OGe2JpnU3A7@?ooRtQT_Y8#MN;3VobNhJzFl=3U_Nkn86;@f91+(_$>ro0 z1-Ng>hnmx=gI}*)(!$PH?rO*2d0s50QqrCCUQy+HEz*Ab&l?H+@=-?xMKtRdsbMSR zr~fynsD6=3E?N!qd0aAWLDmEHG=LQwVfm-JzODBal(<#~b($W9W01y5T8(zbNAuZ{ zr<6jEUQQZ4R6krWiv~THAxt@_##d_ZZ=W=@L?kev%@5p$7+eX}&wVp4#ohR!GCki z!Q8cq-qIXfgFG%(Q}dk<+^BKB+@AC7YJfKWpM!XFT->(3Lr^BmxDnkr9?N#63@>l> z4P_pwi*ln3#0r$M-QSqEJ<`j-JJA zMv03z?~fiaN%*S&>ZCX2b{YA)hsoN#Q3= zP;iTt5b@F9zE(ZGDW-yPmOf*KzkP)yx(- z9iGhLaK-ptXZtovYZ1-d0a;hg8|8VEpWADl$KEQuxMk0y|3ZZK>tkvJ zK@?c0C_Fa1{lm0TUG^)9(^rHqv6_GS_b|X);L`LCbnQ}R8G)?2W(veH{&>HmpI=0;l%94FG$H(g z!<%EDvVbqyI~{*Hj41pk0m0dG;Gia)aB;8o`>5N%&JL z#i$OSjI`t>`sfj>s0|Mk=RQHc$~6l99knin@Z}sBUqk&2kF}W2#_Tpke4<9O&M7lD zQb_g3%9t`A-SIt7iOrR$Ab2yJP0~1%gwi6JXjV6ewDs%fwLHW2t6ZD$ zlUWN!QEHu>C;*yP)Y;6nmvj`Hs9kRJVKoHDLSK!N)9^bUkM^SadW=}Zg4G(a2lrlk z?=<1Nu$Xm65TJP`rOI-#!q~sg4gZ#_H;$)8?bHd_5CzH8M%sSY&XFjcn?4T>z^Dl> zft^V2t>-+ZdVC3;R?FPCYN68c;Vt-hXkRUMP4`*QM)KWG;`_BJF~7x#c6Hbdm{64e z>+%iI!PUf*YGwX9;t6tu6>9mn9HKDqycUd2P+jd#Sw1xy*AxwueO}hEvUWrz0^Qsn zPanOmJ!48?-2z5`l*_!q#`~Rz)gnzKq8*NriEgC7!m@ zj>$*#bEAehw3}PI?JJ8r&jq3skUzgp3|=>#gSS*WUTFi1#>b) zt21emLecS%ccu-_ClgZy`JfSW_^Z%?&vkUe?afN75bR`QaRWk`ToLRc#gZI?WeoCB z6g9Fopy|E$wQX$WAP+BhTp@$kTfI|=QMRh~`bcoq^5OYOt=P1jAH4SHWy@IAk@Xp8 zTQL}8_fE&2NqzF~l|R?L+d+LrbZo91eqzE_0tO-4FdNN+K!swpuq}M zXE~)XhbDPdQHaR8&W<1K1;kGGL+6!%!+}rt=A;7QoewuaU+Q!>VO#0gGl`TFqe

NZ$rkfL$ZX6D|3%7mUYj2%63%n!xT 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%0D5+yQ&!cGP6X1JBSxsspPX^!vJYS+@ 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Ξ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 Hd$IoquqCNB literal 0 HcmV?d00001 diff --git a/metricbeat/docs/modules/azure.asciidoc b/metricbeat/docs/modules/azure.asciidoc index 4db38120041..42d4d619c02 100644 --- a/metricbeat/docs/modules/azure.asciidoc +++ b/metricbeat/docs/modules/azure.asciidoc @@ -45,6 +45,10 @@ The Azure billing dashboards show relevant usage and forecast information: image::./images/metricbeat-azure-billing-overview.png[] +The Azure app_state dashboard shows relevant application insights information: + +image::./images/metricbeat-azure-app-state-overview.png[] + [float] === Module-specific configuration notes @@ -120,6 +124,10 @@ so the `period` for `billing` metricset should be `24h` or multiples of `24h`. === `app_insights` This metricset will collect application insights metrics, the `period` (interval) for the `app-insights` metricset is set by default at `300s`. +[float] +=== `app_state` +This metricset concentrate on the most relevant application insights metrics and provides a dashboard for visualization, the `period` (interval) for the `app_state` metricset is set by default at `300s`. + [float] [[azure-api-cost]] == Additional notes about metrics and costs @@ -242,6 +250,14 @@ metricbeat.modules: api_key: '' metrics: - id: ["requests/count", "requests/duration"] + +- module: azure + metricsets: + - app_state + enabled: true + period: 300s + application_id: '' + api_key: '' ---- [float] @@ -251,6 +267,8 @@ The following metricsets are available: * <> +* <> + * <> * <> @@ -271,6 +289,8 @@ The following metricsets are available: include::azure/app_insights.asciidoc[] +include::azure/app_state.asciidoc[] + include::azure/billing.asciidoc[] include::azure/compute_vm.asciidoc[] diff --git a/metricbeat/docs/modules/azure/app_state.asciidoc b/metricbeat/docs/modules/azure/app_state.asciidoc new file mode 100644 index 00000000000..10485dc818e --- /dev/null +++ b/metricbeat/docs/modules/azure/app_state.asciidoc @@ -0,0 +1,24 @@ +//// +This file is generated! See scripts/mage/docs_collector.go +//// + +[[metricbeat-metricset-azure-app_state]] +[role="xpack"] +=== Azure app_state metricset + +beta[] + +include::../../../../x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc[] + + +==== Fields + +For a description of each field in the metricset, see the +<> section. + +Here is an example document generated by this metricset: + +[source,json] +---- +include::../../../../x-pack/metricbeat/module/azure/app_state/_meta/data.json[] +---- diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index 2232cf3b070..949657459db 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -33,7 +33,8 @@ This file is generated! See scripts/mage/docs_collector.go |<> beta[] |<> beta[] |<> |image:./images/icon-yes.png[Prebuilt dashboards are available] | -.10+| .10+| |<> beta[] +.11+| .11+| |<> beta[] +|<> beta[] |<> beta[] |<> |<> diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index ff9bffda33e..17c9234ea9f 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -343,6 +343,14 @@ metricbeat.modules: metrics: - id: ["requests/count", "requests/duration"] +- module: azure + metricsets: + - app_state + enabled: true + period: 300s + application_id: '' + api_key: '' + #--------------------------------- Beat Module --------------------------------- - module: beat metricsets: diff --git a/x-pack/metricbeat/module/azure/_meta/config.reference.yml b/x-pack/metricbeat/module/azure/_meta/config.reference.yml index 1f9ac04529e..b06e466a01f 100644 --- a/x-pack/metricbeat/module/azure/_meta/config.reference.yml +++ b/x-pack/metricbeat/module/azure/_meta/config.reference.yml @@ -102,3 +102,11 @@ api_key: '' metrics: - id: ["requests/count", "requests/duration"] + +- module: azure + metricsets: + - app_state + enabled: true + period: 300s + application_id: '' + api_key: '' diff --git a/x-pack/metricbeat/module/azure/_meta/config.yml b/x-pack/metricbeat/module/azure/_meta/config.yml index 0f497af6fb4..f7215d4f991 100644 --- a/x-pack/metricbeat/module/azure/_meta/config.yml +++ b/x-pack/metricbeat/module/azure/_meta/config.yml @@ -111,3 +111,11 @@ # api_key: '' # metrics: # - id: ["requests/count", "requests/duration"] + +#- module: azure +# metricsets: +# - app_state +# enabled: true +# period: 300s +# application_id: '' +# api_key: '' diff --git a/x-pack/metricbeat/module/azure/_meta/docs.asciidoc b/x-pack/metricbeat/module/azure/_meta/docs.asciidoc index b0f76ecb623..01f6389ab93 100644 --- a/x-pack/metricbeat/module/azure/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/azure/_meta/docs.asciidoc @@ -37,6 +37,10 @@ The Azure billing dashboards show relevant usage and forecast information: image::./images/metricbeat-azure-billing-overview.png[] +The Azure app_state dashboard shows relevant application insights information: + +image::./images/metricbeat-azure-app-state-overview.png[] + [float] === Module-specific configuration notes @@ -112,6 +116,10 @@ so the `period` for `billing` metricset should be `24h` or multiples of `24h`. === `app_insights` This metricset will collect application insights metrics, the `period` (interval) for the `app-insights` metricset is set by default at `300s`. +[float] +=== `app_state` +This metricset concentrate on the most relevant application insights metrics and provides a dashboard for visualization, the `period` (interval) for the `app_state` metricset is set by default at `300s`. + [float] [[azure-api-cost]] == Additional notes about metrics and costs diff --git a/x-pack/metricbeat/module/azure/_meta/fields.yml b/x-pack/metricbeat/module/azure/_meta/fields.yml index c6471dc108d..a6476fcc957 100644 --- a/x-pack/metricbeat/module/azure/_meta/fields.yml +++ b/x-pack/metricbeat/module/azure/_meta/fields.yml @@ -39,6 +39,10 @@ type: keyword description: > The subscription ID + - name: application_id + type: keyword + description: > + The application ID - name: dimensions.* type: object object_type: keyword diff --git a/x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json b/x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json new file mode 100644 index 00000000000..b447a6b276e --- /dev/null +++ b/x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json @@ -0,0 +1,1509 @@ +{ + "objects": [ + { + "attributes": { + "description": "Provides relevant app insights metrics for web applications", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [ + { + "$state": { + "store": "appState" + }, + "meta": { + "alias": null, + "controlledBy": "1532342651170", + "disabled": false, + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "key": "azure.app_state.application_id", + "negate": false, + "params": { + "query": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + }, + "type": "phrase" + }, + "query": { + "match_phrase": { + "azure.app_state.application_id": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + } + } + } + ], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "optionsJSON": { + "hidePanelTitles": false, + "useMargins": true + }, + "panelsJSON": [ + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "307a1ecd-284c-4f35-9a3c-d5b77c9a9c82", + "w": 7, + "x": 0, + "y": 0 + }, + "panelIndex": "307a1ecd-284c-4f35-9a3c-d5b77c9a9c82", + "panelRefName": "panel_0", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Exceptions" + }, + "gridData": { + "h": 15, + "i": "654e745f-360d-4898-89b6-57f788c5f540", + "w": 20, + "x": 7, + "y": 0 + }, + "panelIndex": "654e745f-360d-4898-89b6-57f788c5f540", + "panelRefName": "panel_1", + "title": "Exceptions", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Available Memory" + }, + "gridData": { + "h": 15, + "i": "5adca737-559d-4b4f-9fa7-58841daa99c5", + "w": 21, + "x": 27, + "y": 0 + }, + "panelIndex": "5adca737-559d-4b4f-9fa7-58841daa99c5", + "panelRefName": "panel_2", + "title": "Available Memory", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "531cf244-45e0-43c3-9920-8f32397bd973", + "w": 8, + "x": 0, + "y": 15 + }, + "panelIndex": "531cf244-45e0-43c3-9920-8f32397bd973", + "panelRefName": "panel_3", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "b9242495-babc-48a7-9ad7-56c62b1dc117", + "w": 8, + "x": 8, + "y": 15 + }, + "panelIndex": "b9242495-babc-48a7-9ad7-56c62b1dc117", + "panelRefName": "panel_4", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 15, + "i": "d311025a-f5c5-4e48-9f1c-710f59264c43", + "w": 8, + "x": 16, + "y": 15 + }, + "panelIndex": "d311025a-f5c5-4e48-9f1c-710f59264c43", + "panelRefName": "panel_5", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Requests" + }, + "gridData": { + "h": 15, + "i": "48974418-b1f7-4050-921e-a83771e125ae", + "w": 24, + "x": 24, + "y": 15 + }, + "panelIndex": "48974418-b1f7-4050-921e-a83771e125ae", + "panelRefName": "panel_6", + "title": "Requests", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Browser Send/Receive Duration" + }, + "gridData": { + "h": 15, + "i": "39d20db1-316a-4ff3-811a-5571cb4497c3", + "w": 24, + "x": 0, + "y": 30 + }, + "panelIndex": "39d20db1-316a-4ff3-811a-5571cb4497c3", + "panelRefName": "panel_7", + "title": "Browser Send/Receive Duration", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Browser Networking/Processing Duration" + }, + "gridData": { + "h": 15, + "i": "bc810208-0395-4c70-9057-d7307e064e43", + "w": 24, + "x": 24, + "y": 30 + }, + "panelIndex": "bc810208-0395-4c70-9057-d7307e064e43", + "panelRefName": "panel_8", + "title": "Browser Networking/Processing Duration", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Process CPU Usage" + }, + "gridData": { + "h": 15, + "i": "ecf6fbfa-ba65-481e-af85-07fd9d5feb5f", + "w": 24, + "x": 0, + "y": 45 + }, + "panelIndex": "ecf6fbfa-ba65-481e-af85-07fd9d5feb5f", + "panelRefName": "panel_9", + "title": "Process CPU Usage", + "version": "7.9.2" + }, + { + "embeddableConfig": { + "title": "Process Private Bytes" + }, + "gridData": { + "h": 15, + "i": "40a1b80b-cd62-446d-91aa-a971bb3769e7", + "w": 24, + "x": 24, + "y": 45 + }, + "panelIndex": "40a1b80b-cd62-446d-91aa-a971bb3769e7", + "panelRefName": "panel_10", + "title": "Process Private Bytes", + "version": "7.9.2" + } + ], + "timeRestore": false, + "title": "[Metricbeat Azure] App State Overview", + "version": 1 + }, + "id": "d5fbd610-03d9-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "dashboard": "7.3.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + }, + { + "id": "2e5183a0-03da-11eb-8034-63f2039e9d3f", + "name": "panel_0", + "type": "visualization" + }, + { + "id": "1064f9a0-04a5-11eb-8034-63f2039e9d3f", + "name": "panel_1", + "type": "lens" + }, + { + "id": "76cc1d70-04a7-11eb-8034-63f2039e9d3f", + "name": "panel_2", + "type": "lens" + }, + { + "id": "a89c8fd0-03ec-11eb-8034-63f2039e9d3f", + "name": "panel_3", + "type": "lens" + }, + { + "id": "cb5ec410-03ed-11eb-8034-63f2039e9d3f", + "name": "panel_4", + "type": "lens" + }, + { + "id": "0df175c0-03ee-11eb-8034-63f2039e9d3f", + "name": "panel_5", + "type": "lens" + }, + { + "id": "f0678020-04a2-11eb-8034-63f2039e9d3f", + "name": "panel_6", + "type": "lens" + }, + { + "id": "e2704140-04a3-11eb-8034-63f2039e9d3f", + "name": "panel_7", + "type": "lens" + }, + { + "id": "0e74dee0-04a4-11eb-8034-63f2039e9d3f", + "name": "panel_8", + "type": "lens" + }, + { + "id": "cfa361a0-04a8-11eb-8034-63f2039e9d3f", + "name": "panel_9", + "type": "lens" + }, + { + "id": "2b54b2c0-04a8-11eb-8034-63f2039e9d3f", + "name": "panel_10", + "type": "lens" + } + ], + "type": "dashboard", + "updated_at": "2020-10-02T12:22:06.090Z", + "version": "WzMzMDEsMl0=" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [ + { + "$state": { + "store": "appState" + }, + "meta": { + "alias": null, + "controlledBy": "1532342651170", + "disabled": false, + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "key": "azure.application_id", + "negate": false, + "params": { + "query": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + }, + "type": "phrase" + }, + "query": { + "match_phrase": { + "azure.application_id": "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + } + } + } + ], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "App State Filters [Metricbeat Azure]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "controls": [ + { + "fieldName": "azure.application_id", + "id": "1532342651170", + "indexPatternRefName": "control_0_index_pattern", + "label": "Application ID", + "options": { + "multiselect": true, + "order": "desc", + "size": 10, + "type": "terms" + }, + "parent": "", + "type": "list" + }, + { + "fieldName": "azure.dimensions.request_url_host", + "id": "1601559750853", + "indexPatternRefName": "control_1_index_pattern", + "label": "Host URL", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "1532342651170", + "type": "list" + }, + { + "fieldName": "azure.dimensions.cloud_role_name", + "id": "1601640368472", + "indexPatternRefName": "control_2_index_pattern", + "label": "Name", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "1532342651170", + "type": "list" + }, + { + "fieldName": "azure.dimensions.browser_timing_url_host", + "id": "1601640439434", + "indexPatternRefName": "control_3_index_pattern", + "label": "Browser URL Host", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "1532342651170", + "type": "list" + } + ], + "pinFilters": false, + "updateFiltersOnChange": true, + "useTimeFilter": false + }, + "title": "App State Filters [Metricbeat Azure]", + "type": "input_control_vis" + } + }, + "id": "2e5183a0-03da-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_0_index_pattern", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_1_index_pattern", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_2_index_pattern", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_3_index_pattern", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-02T12:22:51.232Z", + "version": "WzMzMTIsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"5788331a-267d-426a-a68e-94a5310af644\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.exception_type\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.exceptions_count.sum\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.exceptions_server.sum\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"9e183a5e-3dba-4929-b07e-2a3321f7926b\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.exceptions_browser.sum\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-4-5788331a-267d-426a-a68e-94a5310af644\\\":{\\\"label\\\":\\\"Type\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.exception_type\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"5788331a-267d-426a-a68e-94a5310af644\\\"},\\\"col-5-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Total\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.exceptions_count.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"col-6-e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\":{\\\"label\\\":\\\"Server \\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.exceptions_server.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\"},\\\"col-7-9e183a5e-3dba-4929-b07e-2a3321f7926b\\\":{\\\"label\\\":\\\"Browser\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.exceptions_browser.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"9e183a5e-3dba-4929-b07e-2a3321f7926b\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Total\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"5788331a-267d-426a-a68e-94a5310af644\" seriesType=\"area_stacked\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" accessors=\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\" accessors=\"9e183a5e-3dba-4929-b07e-2a3321f7926b\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Total\\\",\\\"e5c93c50-bb0a-4609-a7ce-7003f2f9a20e\\\":\\\"Server \\\",\\\"9e183a5e-3dba-4929-b07e-2a3321f7926b\\\":\\\"Browser\\\",\\\"5788331a-267d-426a-a68e-94a5310af644\\\":\\\"Type\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "5788331a-267d-426a-a68e-94a5310af644", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "e5c93c50-bb0a-4609-a7ce-7003f2f9a20e", + "9e183a5e-3dba-4929-b07e-2a3321f7926b" + ], + "columns": { + "5788331a-267d-426a-a68e-94a5310af644": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Type", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.exception_type" + }, + "9e183a5e-3dba-4929-b07e-2a3321f7926b": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Browser", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.exceptions_browser.sum" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.exceptions_count.sum" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + }, + "e5c93c50-bb0a-4609-a7ce-7003f2f9a20e": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Server ", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.exceptions_server.sum" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "e5c93c50-bb0a-4609-a7ce-7003f2f9a20e", + "9e183a5e-3dba-4929-b07e-2a3321f7926b" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area_stacked", + "showGridlines": false, + "splitAccessor": "5788331a-267d-426a-a68e-94a5310af644", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area_stacked" + } + }, + "title": "App state Exceptions [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "1064f9a0-04a5-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:53:16.483Z", + "version": "WzI5NjMsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_memory_available_bytes.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-2-a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":{\\\"label\\\":\\\"Instance\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\"},\\\"col-3-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Available memory\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_memory_available_bytes.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"bytes\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"}}\" | lens_format_column format=\"bytes\" columnId=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" decimals=2}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Available memory\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\" seriesType=\"area\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Available memory\\\",\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":\\\"Instance\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "columns": { + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Instance", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.cloud_role_instance" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Available memory", + "operationType": "avg", + "params": { + "format": { + "id": "bytes", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_memory_available_bytes.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Memory [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "76cc1d70-04a7-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T12:04:46.406Z", + "version": "WzMwNTcsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"82e648a8-6d9a-4ae0-9449-b802ce1ac723\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true aggConfigs=\"[{\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.users_count.unique\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\":{\\\"label\\\":\\\"Unique users\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.users_count.unique\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\"}}\"}\n| lens_metric_chart title=\"Unique users\" accessor=\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\" mode=\"full\"", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "82e648a8-6d9a-4ae0-9449-b802ce1ac723": { + "columnOrder": [ + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1" + ], + "columns": { + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Unique users", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.users_count.unique" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "accessor": "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1", + "layerId": "82e648a8-6d9a-4ae0-9449-b802ce1ac723" + } + }, + "title": "App state Unique users [Metricbeat Azure]", + "visualizationType": "lnsMetric" + }, + "id": "a89c8fd0-03ec-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-01T13:47:34.093Z", + "version": "WzEzMzAsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"82e648a8-6d9a-4ae0-9449-b802ce1ac723\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true aggConfigs=\"[{\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.users_authenticated.unique\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\":{\\\"label\\\":\\\"Unique authenticated users\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.users_authenticated.unique\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\"}}\"}\n| lens_metric_chart title=\"Unique authenticated users\" accessor=\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\" mode=\"full\"", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "82e648a8-6d9a-4ae0-9449-b802ce1ac723": { + "columnOrder": [ + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1" + ], + "columns": { + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Unique authenticated users", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.users_authenticated.unique" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "accessor": "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1", + "layerId": "82e648a8-6d9a-4ae0-9449-b802ce1ac723" + } + }, + "title": "App state Unique authenticated users [Metricbeat Azure]", + "visualizationType": "lnsMetric" + }, + "id": "cb5ec410-03ed-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-01T13:55:41.904Z", + "version": "WzE0MjAsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"82e648a8-6d9a-4ae0-9449-b802ce1ac723\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true aggConfigs=\"[{\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.sessions_count.unique\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\":{\\\"label\\\":\\\"Unique sessions\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.sessions_count.unique\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\\\"}}\"}\n| lens_metric_chart title=\"Unique sessions\" accessor=\"d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1\" mode=\"full\"", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "82e648a8-6d9a-4ae0-9449-b802ce1ac723": { + "columnOrder": [ + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1" + ], + "columns": { + "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Unique sessions", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.sessions_count.unique" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "accessor": "d62f1bf0-71b4-41ba-9d9c-dc9f4e478ac1", + "layerId": "82e648a8-6d9a-4ae0-9449-b802ce1ac723" + } + }, + "title": "App state Unique sessions [Metricbeat Azure]", + "visualizationType": "lnsMetric" + }, + "id": "0df175c0-03ee-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-01T13:57:33.596Z", + "version": "WzE0NjAsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"8864c98b-413a-484f-a61d-336a63ef3f13\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.request_url_host\\\",\\\"orderBy\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.requests_count.sum\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.requests_failed.sum\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-3-8864c98b-413a-484f-a61d-336a63ef3f13\\\":{\\\"label\\\":\\\"Host URL\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.request_url_host\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"8864c98b-413a-484f-a61d-336a63ef3f13\\\"},\\\"col-4-9ec4d260-e302-46c4-ac09-50ef54627894\\\":{\\\"label\\\":\\\"Total requests\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.requests_count.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\"},\\\"col-5-a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\":{\\\"label\\\":\\\"Failed requests\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.requests_failed.sum\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Total requests\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"8864c98b-413a-484f-a61d-336a63ef3f13\" seriesType=\"area\" accessors=\"9ec4d260-e302-46c4-ac09-50ef54627894\" accessors=\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\" columnToLabel=\"{\\\"9ec4d260-e302-46c4-ac09-50ef54627894\\\":\\\"Total requests\\\",\\\"a47e59dc-fb62-42f8-90e1-236c7c5a073d\\\":\\\"Failed requests\\\",\\\"8864c98b-413a-484f-a61d-336a63ef3f13\\\":\\\"Host URL\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "8864c98b-413a-484f-a61d-336a63ef3f13", + "9ec4d260-e302-46c4-ac09-50ef54627894", + "a47e59dc-fb62-42f8-90e1-236c7c5a073d" + ], + "columns": { + "8864c98b-413a-484f-a61d-336a63ef3f13": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Host URL", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "9ec4d260-e302-46c4-ac09-50ef54627894", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.request_url_host" + }, + "9ec4d260-e302-46c4-ac09-50ef54627894": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total requests", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.requests_count.sum" + }, + "a47e59dc-fb62-42f8-90e1-236c7c5a073d": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Failed requests", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.requests_failed.sum" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "9ec4d260-e302-46c4-ac09-50ef54627894", + "a47e59dc-fb62-42f8-90e1-236c7c5a073d" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "8864c98b-413a-484f-a61d-336a63ef3f13", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Requests [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "f0678020-04a2-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:32:22.946Z", + "version": "WzI0MzUsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"orderBy\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_send_duration.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_total_duration.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"988e9976-3471-478c-89f6-11fd46458d7f\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_receive_duration.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-4-4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":{\\\"label\\\":\\\"Url Path\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\"},\\\"col-5-be6a3d8b-9428-480b-a7b3-071127726093\\\":{\\\"label\\\":\\\"Send duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_send_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"params\\\":{},\\\"customLabel\\\":true,\\\"id\\\":\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\"},\\\"col-6-6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\":{\\\"label\\\":\\\"Total duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_total_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\"},\\\"col-7-988e9976-3471-478c-89f6-11fd46458d7f\\\":{\\\"label\\\":\\\"Receive duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_receive_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"988e9976-3471-478c-89f6-11fd46458d7f\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Send duration\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"4d4c068a-0194-4d54-a1fa-3863c3df9331\" seriesType=\"bar\" accessors=\"be6a3d8b-9428-480b-a7b3-071127726093\" accessors=\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\" accessors=\"988e9976-3471-478c-89f6-11fd46458d7f\" columnToLabel=\"{\\\"be6a3d8b-9428-480b-a7b3-071127726093\\\":\\\"Send duration\\\",\\\"6bc1fd35-168d-42d5-b9c8-7078896d8ce4\\\":\\\"Total duration\\\",\\\"988e9976-3471-478c-89f6-11fd46458d7f\\\":\\\"Receive duration\\\",\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":\\\"Url Path\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "be6a3d8b-9428-480b-a7b3-071127726093", + "6bc1fd35-168d-42d5-b9c8-7078896d8ce4", + "988e9976-3471-478c-89f6-11fd46458d7f" + ], + "columns": { + "4d4c068a-0194-4d54-a1fa-3863c3df9331": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Url Path", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "be6a3d8b-9428-480b-a7b3-071127726093", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.browser_timing_url_path" + }, + "6bc1fd35-168d-42d5-b9c8-7078896d8ce4": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_total_duration.avg" + }, + "988e9976-3471-478c-89f6-11fd46458d7f": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Receive duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_receive_duration.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + }, + "be6a3d8b-9428-480b-a7b3-071127726093": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Send duration", + "operationType": "avg", + "params": {}, + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_send_duration.avg" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "be6a3d8b-9428-480b-a7b3-071127726093", + "6bc1fd35-168d-42d5-b9c8-7078896d8ce4", + "988e9976-3471-478c-89f6-11fd46458d7f" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "bar", + "showGridlines": false, + "splitAccessor": "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "bar" + } + }, + "title": "App state Browser Send/Receive Duration [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "e2704140-04a3-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:39:09.012Z", + "version": "WzI2MzQsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"orderBy\\\":\\\"_key\\\",\\\"order\\\":\\\"asc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_network_duration.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"ab158cba-532f-47f8-8450-db883504dc0f\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.browser_timings_processing_duration.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-3-4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":{\\\"label\\\":\\\"Url Path\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.browser_timing_url_path\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"alphabetical\\\"},\\\"orderDirection\\\":\\\"asc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\"},\\\"col-4-b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\":{\\\"label\\\":\\\"Networking duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_network_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\"},\\\"col-5-ab158cba-532f-47f8-8450-db883504dc0f\\\":{\\\"label\\\":\\\"Processing duration\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.browser_timings_processing_duration.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"ab158cba-532f-47f8-8450-db883504dc0f\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Networking duration\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"4d4c068a-0194-4d54-a1fa-3863c3df9331\" seriesType=\"bar\" accessors=\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\" accessors=\"ab158cba-532f-47f8-8450-db883504dc0f\" columnToLabel=\"{\\\"b5a75764-e98b-434b-a0f0-5658a4aa1cf6\\\":\\\"Networking duration\\\",\\\"ab158cba-532f-47f8-8450-db883504dc0f\\\":\\\"Processing duration\\\",\\\"4d4c068a-0194-4d54-a1fa-3863c3df9331\\\":\\\"Url Path\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "b5a75764-e98b-434b-a0f0-5658a4aa1cf6", + "ab158cba-532f-47f8-8450-db883504dc0f" + ], + "columns": { + "4d4c068a-0194-4d54-a1fa-3863c3df9331": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Url Path", + "operationType": "terms", + "params": { + "orderBy": { + "type": "alphabetical" + }, + "orderDirection": "asc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.browser_timing_url_path" + }, + "ab158cba-532f-47f8-8450-db883504dc0f": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Processing duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_processing_duration.avg" + }, + "b5a75764-e98b-434b-a0f0-5658a4aa1cf6": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Networking duration", + "operationType": "avg", + "scale": "ratio", + "sourceField": "azure.app_state.browser_timings_network_duration.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b5a75764-e98b-434b-a0f0-5658a4aa1cf6", + "ab158cba-532f-47f8-8450-db883504dc0f" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "bar", + "showGridlines": false, + "splitAccessor": "4d4c068a-0194-4d54-a1fa-3863c3df9331", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "bar" + } + }, + "title": "App state Browser Networking/Processing Duration [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "0e74dee0-04a4-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T11:40:22.862Z", + "version": "WzI2ODQsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage_total.avg\\\",\\\"missing\\\":0}},{\\\"id\\\":\\\"252dfd5f-26bd-4861-bb01-4b3530cadd95\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-3-a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":{\\\"label\\\":\\\"Instance\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\"},\\\"col-4-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Total CPU percentage \\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage_total.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"percent\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"col-5-252dfd5f-26bd-4861-bb01-4b3530cadd95\\\":{\\\"label\\\":\\\"CPU percentage\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_process_cpu_percentage.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"percent\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"customLabel\\\":true,\\\"id\\\":\\\"252dfd5f-26bd-4861-bb01-4b3530cadd95\\\"}}\" | lens_format_column format=\"percent\" columnId=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" decimals=2 | lens_format_column format=\"percent\" columnId=\"252dfd5f-26bd-4861-bb01-4b3530cadd95\" decimals=2}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Total CPU percentage \" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\" seriesType=\"area\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" accessors=\"252dfd5f-26bd-4861-bb01-4b3530cadd95\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Total CPU percentage \\\",\\\"252dfd5f-26bd-4861-bb01-4b3530cadd95\\\":\\\"CPU percentage\\\",\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":\\\"Instance\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "252dfd5f-26bd-4861-bb01-4b3530cadd95" + ], + "columns": { + "252dfd5f-26bd-4861-bb01-4b3530cadd95": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "CPU percentage", + "operationType": "avg", + "params": { + "format": { + "id": "percent", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_process_cpu_percentage.avg" + }, + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Instance", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.cloud_role_instance" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Total CPU percentage ", + "operationType": "avg", + "params": { + "format": { + "id": "percent", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_process_cpu_percentage_total.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "252dfd5f-26bd-4861-bb01-4b3530cadd95" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Process CPU usage [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "cfa361a0-04a8-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T12:14:24.954Z", + "version": "WzMyNTMsMl0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"85644d0a-8011-45af-a751-7961b8bdd071\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"orderBy\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"azure.app_state.performance_counters_process_private_bytes.avg\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-bcbccc16-d042-40fa-a9b2-0f09268281ff\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"suggestedPriority\\\":1,\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"bcbccc16-d042-40fa-a9b2-0f09268281ff\\\"},\\\"col-2-a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":{\\\"label\\\":\\\"Instance\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"azure.dimensions.cloud_role_instance\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"customLabel\\\":true,\\\"id\\\":\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\"},\\\"col-3-b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":{\\\"label\\\":\\\"Process private bytes\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"sourceField\\\":\\\"azure.app_state.performance_counters_process_private_bytes.avg\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"bytes\\\",\\\"params\\\":{\\\"decimals\\\":2}}},\\\"id\\\":\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\"}}\" | lens_format_column format=\"bytes\" columnId=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" decimals=2}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Process private bytes\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"85644d0a-8011-45af-a751-7961b8bdd071\" hide=false xAccessor=\"bcbccc16-d042-40fa-a9b2-0f09268281ff\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\" seriesType=\"area\" accessors=\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\" columnToLabel=\"{\\\"b0d8f2d4-91f3-469c-8bcb-962a9fb48fba\\\":\\\"Process private bytes\\\",\\\"a1f669d0-c9f2-4bc5-9bdd-e40badd261b9\\\":\\\"Instance\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ + { + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "85644d0a-8011-45af-a751-7961b8bdd071": { + "columnOrder": [ + "bcbccc16-d042-40fa-a9b2-0f09268281ff", + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "columns": { + "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9": { + "customLabel": true, + "dataType": "string", + "isBucketed": true, + "label": "Instance", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "azure.dimensions.cloud_role_instance" + }, + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Process private bytes", + "operationType": "avg", + "params": { + "format": { + "id": "bytes", + "params": { + "decimals": 2 + } + } + }, + "scale": "ratio", + "sourceField": "azure.app_state.performance_counters_process_private_bytes.avg" + }, + "bcbccc16-d042-40fa-a9b2-0f09268281ff": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp", + "suggestedPriority": 1 + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "b0d8f2d4-91f3-469c-8bcb-962a9fb48fba" + ], + "layerId": "85644d0a-8011-45af-a751-7961b8bdd071", + "position": "top", + "seriesType": "area", + "showGridlines": false, + "splitAccessor": "a1f669d0-c9f2-4bc5-9bdd-e40badd261b9", + "xAccessor": "bcbccc16-d042-40fa-a9b2-0f09268281ff" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "area" + } + }, + "title": "App state Process Private Bytes [Metricbeat Azure]", + "visualizationType": "lnsXY" + }, + "id": "2b54b2c0-04a8-11eb-8034-63f2039e9d3f", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-10-02T12:09:49.291Z", + "version": "WzMxMjMsMl0=" + } + ], + "version": "7.9.2" +} diff --git a/x-pack/metricbeat/module/azure/app_insights/_meta/data.json b/x-pack/metricbeat/module/azure/app_insights/_meta/data.json index 3d1f07c1ac1..c9b35f39923 100644 --- a/x-pack/metricbeat/module/azure/app_insights/_meta/data.json +++ b/x-pack/metricbeat/module/azure/app_insights/_meta/data.json @@ -1,16 +1,15 @@ { "@timestamp": "2017-10-12T08:05:34.853Z", - "azure" : { - "app_insights" : { - "metrics" : { - "requests_failed" : { - "sum" : 182 - }, - "request_name" : "GET /favicon.ico" - }, - "start_date" : "2020-07-12T10:52:11.831Z", - "end_date" : "2020-07-12T12:52:11.831Z", - "application_id" : "42cb59a9-d5be-400b-a5c4-69b0a0026ac6" + "azure": { + "app_insights": { + "end_date": "2020-10-02T13:17:45.691Z", + "start_date": "2020-10-02T13:12:45.691Z" + }, + "application_id": "42cb59a9-d5be-400b-a5c4-69b0a00434fdf4", + "metrics": { + "requests_count": { + "sum": 0 + } } }, "cloud": { diff --git a/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml b/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml index 40ab8560827..4e8fa91edbd 100644 --- a/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml +++ b/x-pack/metricbeat/module/azure/app_insights/_meta/fields.yml @@ -4,10 +4,6 @@ description: > application insights fields: - - name: application_id - type: keyword - description: > - The application ID - name: start_date type: date description: > diff --git a/x-pack/metricbeat/module/azure/app_insights/app_insights.go b/x-pack/metricbeat/module/azure/app_insights/app_insights.go index 8ffe02eb860..091a72f465e 100644 --- a/x-pack/metricbeat/module/azure/app_insights/app_insights.go +++ b/x-pack/metricbeat/module/azure/app_insights/app_insights.go @@ -23,6 +23,7 @@ type Config struct { ApiKey string `config:"api_key" validate:"required"` Period time.Duration `config:"period" validate:"nonzero,required"` Metrics []Metric `config:"metrics" validate:"required"` + Namespace string `config:"namespace"` } // Metric struct used for configuration options @@ -70,7 +71,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { if err != nil { return errors.Wrap(err, "error retrieving metric values") } - events := EventsMapping(results, m.client.Config.ApplicationId) + events := EventsMapping(results, m.client.Config.ApplicationId, m.client.Config.Namespace) for _, event := range events { isOpen := report.Event(event) if !isOpen { diff --git a/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go b/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go index 3cb93663007..c33f05c2de6 100644 --- a/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go +++ b/x-pack/metricbeat/module/azure/app_insights/app_insights_integration_test.go @@ -10,12 +10,20 @@ package app_insights import ( "testing" + "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure/test" + "github.com/stretchr/testify/assert" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" ) +var metrics = []map[string]interface{}{{ + "id": "requests/count", +}} + func TestFetchMetricset(t *testing.T) { + config := test.GetConfigForInsights(t, "app_insights") + config["metrics"] = metrics metricSet := mbtest.NewReportingMetricSetV2Error(t, config) events, errs := mbtest.ReportingFetchV2Error(metricSet) if len(errs) > 0 { @@ -26,6 +34,8 @@ func TestFetchMetricset(t *testing.T) { } func TestData(t *testing.T) { + config := test.GetConfigForInsights(t, "app_insights") + config["metrics"] = metrics metricSet := mbtest.NewFetcher(t, config) metricSet.WriteEvents(t, "/") } diff --git a/x-pack/metricbeat/module/azure/app_insights/client.go b/x-pack/metricbeat/module/azure/app_insights/client.go index b78f2257d3f..49794da4d3f 100644 --- a/x-pack/metricbeat/module/azure/app_insights/client.go +++ b/x-pack/metricbeat/module/azure/app_insights/client.go @@ -23,9 +23,6 @@ type Client struct { Log *logp.Logger } -type MetricValue struct { -} - // NewClient instantiates the an Azure monitoring client func NewClient(config Config) (*Client, error) { service, err := NewService(config) diff --git a/x-pack/metricbeat/module/azure/app_insights/data.go b/x-pack/metricbeat/module/azure/app_insights/data.go index df7efdbeaba..1cd661cc3a0 100644 --- a/x-pack/metricbeat/module/azure/app_insights/data.go +++ b/x-pack/metricbeat/module/azure/app_insights/data.go @@ -6,98 +6,217 @@ package app_insights import ( "fmt" + "regexp" "strings" + "github.com/Azure/azure-sdk-for-go/services/preview/appinsights/v1/insights" "github.com/Azure/go-autorest/autorest/date" - "github.com/Azure/azure-sdk-for-go/services/preview/appinsights/v1/insights" + "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/metricbeat/mb" ) -func EventsMapping(metricValues insights.ListMetricsResultsItem, applicationId string) []mb.Event { - var events []mb.Event - if metricValues.Value == nil { - return events - } - groupedAddProp := make(map[string][]insights.MetricsResultInfo) +const aggsRegex = "_(?:sum|count|unique|avg|min|max)$" + +// segmentNames list is used to filter out the dimension from the api response. Based on the body format it is not possible to detect what was the segment selected +var segmentNames = []string{ + "request_source", "request_name", "request_url_host", "request_url_path", "request_success", "request_result_code", "request_performance_bucket", "operation_name", "operation_synthetic", "operation_synthetic_source", "user_authenticated", "application_version", "client_type", "client_model", + "client_os", "client_city", "client_state_or_province", "client_country_or_region", "client_browser", "cloud_role_name", "cloud_role_instance", "custom_dimensions__ms_processedb_by_metric_extractors", "custom_dimensions_developer_mode", + "page_view_name", "page_view_url_path", "page_view_url_host", "page_view_performance_bucket", "custom_dimensions_ibiza_session_id", "custom_dimensions_part_instance", "browser_timing_name", "browser_timing_url_host", "browser_timing_url_path", "browser_timing_performance_bucket", + "trace_severity_level", "type", "custom_dimensions_agent_session", "custom_dimensions_agent_version", "custom_dimensions_machine_name", "custom_dimensions_running_mode", "custom_dimensions_source", "custom_dimensions_agent_assembly_version", "custom_dimensions_agent_process_session", + "custom_dimensions_hashed_machine_name", + "custom_dimensions_data_cube", "dependency_target", "dependency_type", "dependency_name", "dependency_success", "dependency_result_code", "dependency_performance_bucket", "custom_dimensions_container", "custom_dimensions_blob", "custom_dimensions_error_message", + "custom_event_name", "custom_dimensions_event_name", "custom_dimensions_page_title", "custom_dimensions_service_profiler_content", "custom_dimensions_executing_assembly_file_version", "custom_dimensions_service_profiler_version", "custom_dimensions_process_id", "custom_dimensions_request_id", + "custom_dimensions_running_session", "custom_dimensions_problem_id", "custom_dimensions_snapshot_context", "custom_dimensions_snapshot_version", "custom_dimensions_duration", "custom_dimensions_snapshot_id", "custom_dimensions_stamp_id", "custom_dimensions_de_optimization_id", + "custom_dimensions_method", "custom_dimensions_parent_process_id", "custom_dimensions_section", "custom_dimensions_configuration", "custom_dimensions_dump_folder", "custom_dimensions_reason", "custom_dimensions_extension_version", "custom_dimensions_site_name", + "availability_result_name", "availability_result_location", "availability_result_success", "custom_dimensions_full_test_result_available", "exception_problem_id", "exception_handled_at", "exception_type", "exception_assembly", "exception_method", "custom_dimensions_custom_perf_counter", + "exception_severity_level", "custom_dimensions_url", "custom_dimensions_ai.snapshot_stampid", "custom_dimensions_ai.snapshot_id", "custom_dimensions_ai.snapshot_version", "custom_dimensions_ai.snapshot_planid", "custom_dimensions__ms_example", "custom_dimensions_sa_origin_app_id", + "custom_dimensions_base_sdk_target_framework", "custom_dimensions_runtime_framework", "custom_dimensions__ms_aggregation_interval_ms", "custom_dimensions_problem_id", "custom_dimensions_operation_name", "custom_dimensions_request_success", "custom_dimensions__ms_metric_id", + "custom_dimensions_dependency_success", "custom_dimensions__ms_is_autocollected", "custom_dimensions_dependency_type", "performance_counter_name", "performance_counter_category", "performance_counter_counter", "performance_counter_instance", "custom_dimensions_counter_instance_name", +} + +type MetricValue struct { + SegmentName map[string]string + Value map[string]interface{} + Segments []MetricValue + Interval string + Start *date.Time + End *date.Time +} + +func mapMetricValues(metricValues insights.ListMetricsResultsItem) []MetricValue { + var mapped []MetricValue for _, item := range *metricValues.Value { + metricValue := MetricValue{ + Start: item.Body.Value.Start, + End: item.Body.Value.End, + Value: map[string]interface{}{}, + SegmentName: map[string]string{}, + } + metricValue.Interval = fmt.Sprintf("%sTO%s", item.Body.Value.Start, item.Body.Value.End) if item.Body != nil && item.Body.Value != nil { if item.Body.Value.AdditionalProperties != nil { - groupedAddProp[fmt.Sprintf("%sTO%s", item.Body.Value.Start, item.Body.Value.End)] = - append(groupedAddProp[fmt.Sprintf("%sTO%s", item.Body.Value.Start, item.Body.Value.End)], *item.Body.Value) - } else if item.Body.Value.Segments != nil { - for _, segment := range *item.Body.Value.Segments { - event, ok := createSegmentEvent(*item.Body.Value.Start, *item.Body.Value.End, segment, applicationId) - if ok { - events = append(events, event) + metrics := getAdditionalPropMetric(item.Body.Value.AdditionalProperties) + for key, metric := range metrics { + if isSegment(key) { + metricValue.SegmentName[key] = metric.(string) + } else { + metricValue.Value[key] = metric } } } + if item.Body.Value.Segments != nil { + for _, segment := range *item.Body.Value.Segments { + metVal := mapSegment(segment, metricValue.SegmentName) + metricValue.Segments = append(metricValue.Segments, metVal) + } + } + mapped = append(mapped, metricValue) } + } - if len(groupedAddProp) > 0 { - for _, val := range groupedAddProp { - event, ok := createEvent(val, applicationId) - if ok { - events = append(events, event) + return mapped +} + +func mapSegment(segment insights.MetricsSegmentInfo, parentSeg map[string]string) MetricValue { + metricValue := MetricValue{Value: map[string]interface{}{}, SegmentName: map[string]string{}} + if segment.AdditionalProperties != nil { + metrics := getAdditionalPropMetric(segment.AdditionalProperties) + for key, metric := range metrics { + if isSegment(key) { + metricValue.SegmentName[key] = metric.(string) + } else { + metricValue.Value[key] = metric + } + } + } + if len(parentSeg) > 0 { + for key, val := range parentSeg { + metricValue.SegmentName[key] = val + } + } + if segment.Segments != nil { + for _, segment := range *segment.Segments { + metVal := mapSegment(segment, metricValue.SegmentName) + metricValue.Segments = append(metricValue.Segments, metVal) + } + } + + return metricValue +} + +func isSegment(metric string) bool { + for _, seg := range segmentNames { + if metric == seg { + return true + } + } + return false +} + +func EventsMapping(metricValues insights.ListMetricsResultsItem, applicationId string, namespace string) []mb.Event { + var events []mb.Event + if metricValues.Value == nil { + return events + } + groupedAddProp := make(map[string][]MetricValue) + mValues := mapMetricValues(metricValues) + + var segValues []MetricValue + for _, mv := range mValues { + if len(mv.Segments) == 0 { + groupedAddProp[mv.Interval] = append(groupedAddProp[mv.Interval], mv) + } else { + segValues = append(segValues, mv) + } + } + + for _, val := range groupedAddProp { + event := createNoSegEvent(val, applicationId, namespace) + if len(event.MetricSetFields) > 0 { + events = append(events, event) + } + } + for _, val := range segValues { + for _, seg := range val.Segments { + lastSeg := getValue(seg) + for _, ls := range lastSeg { + events = append(events, createSegEvent(val, ls, applicationId, namespace)) } } } return events } -func createSegmentEvent(start date.Time, end date.Time, segment insights.MetricsSegmentInfo, applicationId string) (mb.Event, bool) { - metricList := common.MapStr{} - metrics := getMetric(segment.AdditionalProperties) - if len(metrics) == 0 { - return mb.Event{}, false +func getValue(metric MetricValue) []MetricValue { + var values []MetricValue + if metric.Segments == nil { + return []MetricValue{metric} + } + for _, met := range metric.Segments { + values = append(values, getValue(met)...) } - for key, metric := range metrics { + return values +} + +func createSegEvent(parentMetricValue MetricValue, metricValue MetricValue, applicationId string, namespace string) mb.Event { + metricList := common.MapStr{} + for key, metric := range metricValue.Value { metricList.Put(key, metric) } + if len(metricList) == 0 { + return mb.Event{} + } + event := createEvent(parentMetricValue.Start, parentMetricValue.End, applicationId, namespace, metricList) + if len(parentMetricValue.SegmentName) > 0 { + event.ModuleFields.Put("dimensions", parentMetricValue.SegmentName) + } + if len(metricValue.SegmentName) > 0 { + event.ModuleFields.Put("dimensions", metricValue.SegmentName) + } + return event +} + +func createEvent(start *date.Time, end *date.Time, applicationId string, namespace string, metricList common.MapStr) mb.Event { event := mb.Event{ - MetricSetFields: common.MapStr{ - "start_date": start, - "end_date": end, + ModuleFields: common.MapStr{ "application_id": applicationId, }, + MetricSetFields: common.MapStr{ + "start_date": start, + "end_date": end, + }, Timestamp: end.Time, } event.RootFields = common.MapStr{} event.RootFields.Put("cloud.provider", "azure") - event.MetricSetFields.Put("metrics", metricList) - return event, true + if namespace == "" { + event.ModuleFields.Put("metrics", metricList) + } else { + for key, metric := range metricList { + event.MetricSetFields.Put(key, metric) + } + } + return event } -func createEvent(values []insights.MetricsResultInfo, applicationId string) (mb.Event, bool) { +func createNoSegEvent(values []MetricValue, applicationId string, namespace string) mb.Event { metricList := common.MapStr{} for _, value := range values { - metrics := getMetric(value.AdditionalProperties) - for key, metric := range metrics { + for key, metric := range value.Value { metricList.Put(key, metric) } } if len(metricList) == 0 { - return mb.Event{}, false + return mb.Event{} } + return createEvent(values[0].Start, values[0].End, applicationId, namespace, metricList) - event := mb.Event{ - MetricSetFields: common.MapStr{ - "start_date": values[0].Start, - "end_date": values[0].End, - "application_id": applicationId, - }, - Timestamp: values[0].End.Time, - } - event.RootFields = common.MapStr{} - event.RootFields.Put("cloud.provider", "azure") - event.MetricSetFields.Put("metrics", metricList) - return event, true } -func getMetric(addProp map[string]interface{}) map[string]interface{} { +func getAdditionalPropMetric(addProp map[string]interface{}) map[string]interface{} { metricNames := make(map[string]interface{}) for key, val := range addProp { switch val.(type) { @@ -115,5 +234,19 @@ func getMetric(addProp map[string]interface{}) map[string]interface{} { } func cleanMetricNames(metric string) string { - return strings.Replace(metric, "/", "_", -1) + metric = strings.Replace(metric, "/", "_", -1) + metric = strings.Replace(metric, " ", "_", -1) + metric = azure.ReplaceUpperCase(metric) + obj := strings.Split(metric, ".") + for index := range obj { + // in some cases a trailing "_" is found + obj[index] = strings.TrimPrefix(obj[index], "_") + obj[index] = strings.TrimSuffix(obj[index], "_") + } + metric = strings.ToLower(strings.Join(obj, "_")) + aggsRegex := regexp.MustCompile(aggsRegex) + metric = aggsRegex.ReplaceAllStringFunc(metric, func(str string) string { + return strings.Replace(str, "_", ".", -1) + }) + return metric } diff --git a/x-pack/metricbeat/module/azure/app_insights/data_test.go b/x-pack/metricbeat/module/azure/app_insights/data_test.go index ebe4e7d98aa..f65f9f84b1d 100644 --- a/x-pack/metricbeat/module/azure/app_insights/data_test.go +++ b/x-pack/metricbeat/module/azure/app_insights/data_test.go @@ -39,20 +39,32 @@ func TestEventMapping(t *testing.T) { Value: &metrics, } applicationId := "abc" - events := EventsMapping(result, applicationId) + events := EventsMapping(result, applicationId, "") assert.Equal(t, len(events), 1) for _, event := range events { val1, _ := event.MetricSetFields.GetValue("start_date") assert.Equal(t, val1, &startDate) val2, _ := event.MetricSetFields.GetValue("end_date") assert.Equal(t, val2, &startDate) - val3, _ := event.MetricSetFields.GetValue("metrics.requests_count") + val3, _ := event.ModuleFields.GetValue("metrics.requests_count") assert.Equal(t, val3, common.MapStr{"sum": 12}) - val5, _ := event.MetricSetFields.GetValue("metrics.requests_failed") + val5, _ := event.ModuleFields.GetValue("metrics.requests_failed") assert.Equal(t, val5, common.MapStr{"sum": 10}) - val4, _ := event.MetricSetFields.GetValue("application_id") + val4, _ := event.ModuleFields.GetValue("application_id") assert.Equal(t, val4, applicationId) } } + +func TestCleanMetricNames(t *testing.T) { + ex := "customDimensions/ExecutingAssemblyFileVersion" + result := cleanMetricNames(ex) + assert.Equal(t, result, "custom_dimensions_executing_assembly_file_version") + ex = "customDimensions/_MS.AggregationIntervalMs" + result = cleanMetricNames(ex) + assert.Equal(t, result, "custom_dimensions__ms_aggregation_interval_ms") + ex = "customDimensions/_MS.IsAutocollected" + result = cleanMetricNames(ex) + assert.Equal(t, result, "custom_dimensions__ms_is_autocollected") +} diff --git a/x-pack/metricbeat/module/azure/app_state/_meta/data.json b/x-pack/metricbeat/module/azure/app_state/_meta/data.json new file mode 100644 index 00000000000..c4744db7f60 --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/_meta/data.json @@ -0,0 +1,32 @@ +{ + "@timestamp": "2017-10-12T08:05:34.853Z", + "azure": { + "app_state": { + "end_date": "2020-10-02T13:23:11.221Z", + "requests_count": { + "sum": 16 + }, + "start_date": "2020-10-01T13:23:11.221Z" + }, + "application_id": "42cb59a9-d5be-400b-a5c4-69b0a00434fdf4", + "dimensions": { + "request_name": "GET /auth", + "request_url_host": "demoapplogobs.azurewebsites.net" + } + }, + "cloud": { + "provider": "azure" + }, + "event": { + "dataset": "azure.app_state", + "duration": 115000, + "module": "azure" + }, + "metricset": { + "name": "app_state", + "period": 10000 + }, + "service": { + "type": "azure" + } +} diff --git a/x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc b/x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc new file mode 100644 index 00000000000..4517ccfed0d --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc @@ -0,0 +1,12 @@ +This is the app_state metricset of the module azure. + +This metricset allows users to retrieve application insights metrics from specified applications. + +[float] +==== Config options to identify resources + +`application_id`:: (_[]string_) ID of the application. This is Application ID from the API Access settings blade in the Azure portal. + +`api_key`:: (_[]string_) The API key which will be generated, more on the steps here https://dev.applicationinsights.io/documentation/Authorization/API-key-and-App-ID. + + diff --git a/x-pack/metricbeat/module/azure/app_state/_meta/fields.yml b/x-pack/metricbeat/module/azure/app_state/_meta/fields.yml new file mode 100644 index 00000000000..fad928c090f --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/_meta/fields.yml @@ -0,0 +1,86 @@ +- name: app_state + type: group + release: beta + description: > + application state + fields: + - name: start_date + type: date + description: > + The start date + - name: end_date + type: date + description: > + The end date + - name: requests_count.sum + type: float + description: > + Request count + - name: requests_failed.sum + type: float + description: > + Request failed count + - name: users_count.unique + type: float + description: > + User count + - name: sessions_count.unique + type: float + description: > + Session count + - name: users_authenticated.unique + type: float + description: > + Authenticated users count + - name: browser_timings_network_duration.avg + type: float + description: > + Browser timings network duration + - name: browser_timings_send_duration.avg + type: float + description: > + Browser timings send duration + - name: browser_timings_receive_uration.avg + type: float + description: > + Browser timings receive duration + - name: browser_timings_processing_duration.avg + type: float + description: > + Browser timings processing duration + - name: browser_timings_total_duration.avg + type: float + description: > + Browser timings total duration + - name: exceptions_count.sum + type: float + description: > + Exception count + - name: exceptions_browser.sum + type: float + description: > + Exception count at browser level + - name: exceptions_server.sum + type: float + description: > + Exception count at server level + - name: performance_counters_memory_available_bytes.avg + type: float + description: > + Performance counters memory available bytes + - name: performance_counters_process_private_bytes.avg + type: float + description: > + Performance counters process private bytes + - name: performance_counters_process_cpu_percentage_total.avg + type: float + description: > + Performance counters process cpu percentage total + - name: performance_counters_process_cpu_percentage.avg + type: float + description: > + Performance counters process cpu percentage + - name: performance_counters_processiobytes_per_second.avg + type: float + description: > + Performance counters process IO bytes per second diff --git a/x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go b/x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go new file mode 100644 index 00000000000..8762cae440d --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build integration +// +build azure + +package app_state + +import ( + "testing" + + "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure/test" + + "github.com/stretchr/testify/assert" + + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + + // Register input module and metricset + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure/app_insights" +) + +func TestFetchMetricset(t *testing.T) { + config := test.GetConfigForInsights(t, "app_state") + metricSet := mbtest.NewReportingMetricSetV2Error(t, config) + events, errs := mbtest.ReportingFetchV2Error(metricSet) + if len(errs) > 0 { + t.Fatalf("Expected 0 error, had %d. %v\n", len(errs), errs) + } + assert.NotEmpty(t, events) + mbtest.TestMetricsetFieldsDocumented(t, metricSet, events) +} + +func TestData(t *testing.T) { + config := test.GetConfigForInsights(t, "app_state") + metricSet := mbtest.NewFetcher(t, config) + metricSet.WriteEvents(t, "/") +} diff --git a/x-pack/metricbeat/module/azure/app_state/app_state_test.go b/x-pack/metricbeat/module/azure/app_state/app_state_test.go new file mode 100644 index 00000000000..a8dbab88081 --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/app_state_test.go @@ -0,0 +1,17 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package app_state + +import ( + "os" + + "github.com/elastic/beats/v7/metricbeat/mb" +) + +func init() { + // To be moved to some kind of helper + os.Setenv("BEAT_STRICT_PERMS", "false") + mb.Registry.SetSecondarySource(mb.NewLightModulesSource("../../../module")) +} diff --git a/x-pack/metricbeat/module/azure/app_state/manifest.yml b/x-pack/metricbeat/module/azure/app_state/manifest.yml new file mode 100644 index 00000000000..5c1d08a2ceb --- /dev/null +++ b/x-pack/metricbeat/module/azure/app_state/manifest.yml @@ -0,0 +1,29 @@ +default: false +input: + module: azure + metricset: app_insights + defaults: + namespace: app_state + metrics: + - id: ["requests/count", "requests/failed"] + segment: ["request/urlHost", "request/name"] + aggregation: ["sum"] + interval: "P5M" + - id: ["users/count", "sessions/count", "users/authenticated"] + segment: ["request/urlHost"] + aggregation: ["unique"] + interval: "P5M" + - id: ["browserTimings/networkDuration", "browserTimings/sendDuration", "browserTimings/receiveDuration", "browserTimings/processingDuration", "browserTimings/totalDuration"] + segment: ["browserTiming/urlHost", "browserTiming/urlPath"] + aggregation: ["avg"] + interval: "P5M" + top: 5 + - id: ["exceptions/count", "exceptions/browser", "exceptions/server"] + segment: ["exception/type", "cloud/roleName"] + aggregation: ["sum"] + interval: "P5M" + - id: ["performanceCounters/memoryAvailableBytes", "performanceCounters/processCpuPercentageTotal", "performanceCounters/processCpuPercentage", "performanceCounters/processIOBytesPerSecond", + "performanceCounters/processPrivateBytes"] + aggregation: ["avg"] + segment: ["cloud/roleName", "cloud/roleInstance"] + interval: "P5M" diff --git a/x-pack/metricbeat/module/azure/data.go b/x-pack/metricbeat/module/azure/data.go index bf77f657416..4d479ef45d5 100644 --- a/x-pack/metricbeat/module/azure/data.go +++ b/x-pack/metricbeat/module/azure/data.go @@ -120,7 +120,7 @@ func managePropertyName(metric string) string { // create an object in case of ":" resultMetricName = strings.Replace(resultMetricName, "_-_", "_", -1) // replace uppercases with underscores - resultMetricName = replaceUpperCase(resultMetricName) + resultMetricName = ReplaceUpperCase(resultMetricName) // avoid cases as this "logicaldisk_avg._disk_sec_per_transfer" obj := strings.Split(resultMetricName, ".") @@ -134,8 +134,8 @@ func managePropertyName(metric string) string { return resultMetricName } -// replaceUpperCase func will replace upper case with '_' -func replaceUpperCase(src string) string { +// ReplaceUpperCase func will replace upper case with '_' +func ReplaceUpperCase(src string) string { replaceUpperCaseRegexp := regexp.MustCompile(replaceUpperCaseRegex) return replaceUpperCaseRegexp.ReplaceAllStringFunc(src, func(str string) string { var newStr string diff --git a/x-pack/metricbeat/module/azure/data_test.go b/x-pack/metricbeat/module/azure/data_test.go index cdfad1965f8..cca7edc0233 100644 --- a/x-pack/metricbeat/module/azure/data_test.go +++ b/x-pack/metricbeat/module/azure/data_test.go @@ -47,10 +47,10 @@ func TestGetDimensionValue(t *testing.T) { } func TestReplaceUpperCase(t *testing.T) { - result := replaceUpperCase("TestReplaceUpper_Case") + result := ReplaceUpperCase("TestReplaceUpper_Case") assert.Equal(t, result, "Test_replace_upper_Case") // should not split on acronyms - result = replaceUpperCase("CPU_Percentage") + result = ReplaceUpperCase("CPU_Percentage") assert.Equal(t, result, "CPU_Percentage") } diff --git a/x-pack/metricbeat/module/azure/fields.go b/x-pack/metricbeat/module/azure/fields.go index 4c0ad95ad98..6a308a5d2ae 100644 --- a/x-pack/metricbeat/module/azure/fields.go +++ b/x-pack/metricbeat/module/azure/fields.go @@ -19,5 +19,5 @@ func init() { // AssetAzure returns asset data. // This is the base64 encoded gzipped contents of module/azure. func AssetAzure() string { - return "eJzUV8tu2zoQ3fsrBl4GSD7AiwsEt5suuuteGJNjhY1EEuQorfv1hR6kKVHyo1aKxIsAEcnzEM8MqUd4peMO8HfjaAPAiivawfa5/X+7AZDkhVOWldE7+G8DAP1cqI1sqnaJo4rQ0w5K3AAcFFXS77qJj6CxphN4++Ojbac609jhyQzDGCaFYlVT6VDpOBIgX+n40ziZPJ8F7n/fXwieexvETokZ3MDoyJvGCcoIUw9X0AUc8JaEOihKpU7tjiwfLY0Glh1fkBGktMvBHIATWbPUU4srcMfXkGNHw1j6p4dZWrP/QYInQ/3D4pywZEpRo7VKl8P87cP2NhN9bKKNTmwWmvavtziTmptjGqHAU0WCk9wENt/sI0Sh5P2cKSB8/ZIRSlWT9sro8T4t7NGF/bl2b85oHpVyIi4T3k/xTw836z5UBhcG/1b1t14MOOLGaZK5XLS2UNqr8oX9xf4T+/CeGK9TgNZWSmC3zTM857pSsnQcObi/R6SykvSl9J7RcSGR51vjzMAVvB1ovjZwkpZrM5KWy3zzYYUbmuE0tLBqK2wNDBqz5O5VVSldvkdoB2hALaHxWBJIYlTVtckVjXOkxXHdzM6iBkrriPFXIYyf7sbyPl3g/H+KFXszWXRck+aifbCuyxM4ZOAns0Y2WS7vJB5A88tQYO2SUHQVvGJ99vm60Bd6atLzXfAe4rPtYaiDwpJTRq7ehEOZ9fAwgY/HgBCmeZeoxTLvGZbzhoIbrFYtru4Q6mAhgw20B+NIoOfViQPwMnUfuJWPoqGVpmtjxzS1bZiKt3pyFo0//cYq/vl16qTyjIHCC6zIE38OJ1FuHJ/xphmVJtfeFBm1oI9tbVALQe0ZQ45K5dkdP4ehoPaMIU/uTX2WDRrE5h9/yLhHT8XQmT+ym6A1nCL5B6HRio27/p5aXnlLzYGnd9LlkvZsHJYfOiaDxPhe/wQAAP//ZxBMvQ==" + return "eJzkmU1v47YTxu/5FIMcA2w+gA9/IP+2hz0ULfpyJsbUWGEjkVxy6Kz76QuKkixLsizbspugOSywenme30MOJyLzBd5otwL8Ozh6AGDFBa3g8SX+//EBICMvnbKsjF7B/x4AID0LpclCEV9xVBB6WkGODwAbRUXmV9WDX0BjSXvx+MM7Gx91Jtj6yojDoUxXilVJuUOl2zuN5Bvt3o3LOtdHhdPPH68ELykGsVNyRLdxdORNcJIGht0MM+waHfCWpNoo6qL24x5E3lk6uHE88QmMBiW+DmYD3MEate5HXMC7HYahdhsYc//8NGpr1n+R5N6tdFFMgXUeESVaq3ReP//49HheiFQ2bYwKdlA08V9vcaRqzi7TVgo8FSS5UzeNmw/rVkKo7HrPriB8/XFgiNYWSuJifh29MbtMlaS9MvqwLI6UxIlymFsKE8gHnaMDNwBPj/jnp7O5N4XBIzcvpf45wYAjDk5TNsRFa4XSXuWv7E+2u7btr4lxHkF3mkd8ppqgZ3QsMuTxVjhyY0YvqkSH7zaepLOlHUlnx/3GqwXOaH79qoFFW18MUDOOlo7nw2Q3qZu+yX+9aBx9C+TZC2mC5mcfylHnsco4Yf1bUoZKeNp7g6qg7BbmSXmCIXhyTfig1bcwPvIXIPzpyU0Ye/JV17+J9+9J/GRuDPxKmuPioGxhhpeudvKb4Fk78+7JCVal0rkXmvjduDeRBVct3Gfc5kuR/T95Qe0FtRc0XrMAfbVS70Dnq/V7DpojSWpL4g5wtdV5fNYZGQtU53cZwL3deZhsGIu7EFZO03D0XVKld4NO/VOjPbE+O/71ON2QAJCb2YCCtlScQvLktjcnSiYTQJbcxrgStaQ0SbHFllQatxO4RVXguiCx3jH5Javp170tNLaQbKG1hcp2Pna9aIR1aot8L+raFWrXS6GlDcKSk6QZc0oL+W7s0gbYm6e1fW2Efwn+bGxlqhmL5MKTNDq7G/nXX1K1RD5I3oNdxloVhdL5LfYYtTSgjt86ceIzYlTF3A2qDM6RlrvRsbr4tGxUtZ1IR4zfhTS+Pw8Xz9APfa32CIYsOi5Js4gXlk25F4eB+D6sycJg93ulcS06PGLdf2XH/lNt+Rbc0KX6OrGRTNak+7GuN57cT9brIHYAZbLD0z24fsSbZZbkoSffnibIqj3coNTaZZ4cjtcbSg5YLLq4qpPOShYGso3txjiS6Hlx40b4uHUquIXPLupW2n237ZimtIFJbMveidfhH5QOKe5+arqnnAggvMSCPPHnSNLitvdHsmlGpckJpT3H39gfO1pNCw3tRCBHufLsdp8jUEM7ESjua9RnmaAadhAnQ8Y1ehJ1Z/7IaRrW5rfIIExptGLj5n+n5jO/UofC/W/S40vas3FxK/KBB7ZGbMf1nwAAAP//oQy/EA==" } diff --git a/x-pack/metricbeat/module/azure/module.yml b/x-pack/metricbeat/module/azure/module.yml index a51b202612b..4170154e246 100644 --- a/x-pack/metricbeat/module/azure/module.yml +++ b/x-pack/metricbeat/module/azure/module.yml @@ -4,5 +4,6 @@ metricsets: - container_instance - container_service - database_account + - app_state - compute_vm - compute_vm_scaleset diff --git a/x-pack/metricbeat/module/azure/test/integration.go b/x-pack/metricbeat/module/azure/test/integration.go index 7187e3b93f7..39e8402110c 100644 --- a/x-pack/metricbeat/module/azure/test/integration.go +++ b/x-pack/metricbeat/module/azure/test/integration.go @@ -40,3 +40,23 @@ func GetConfig(t *testing.T, metricSetName string) map[string]interface{} { "subscription_id": subId, } } + +// GetConfigForInsights function gets azure credentials for integration tests. +func GetConfigForInsights(t *testing.T, metricSetName string) map[string]interface{} { + t.Helper() + applicationId, ok := os.LookupEnv("AZURE_APPLICATION_ID") + if !ok { + t.Fatal("Could not find var AZURE_APPLICATION_ID") + } + apiKey, ok := os.LookupEnv("AZURE_API_KEY") + if !ok { + t.Fatal("Could not find var AZURE_API_KEY") + } + return map[string]interface{}{ + "module": "azure", + "period": "300s", + "metricsets": []string{metricSetName}, + "application_id": applicationId, + "api_key": apiKey, + } +} diff --git a/x-pack/metricbeat/modules.d/azure.yml.disabled b/x-pack/metricbeat/modules.d/azure.yml.disabled index 23211f47206..10d00e003cf 100644 --- a/x-pack/metricbeat/modules.d/azure.yml.disabled +++ b/x-pack/metricbeat/modules.d/azure.yml.disabled @@ -114,3 +114,11 @@ # api_key: '' # metrics: # - id: ["requests/count", "requests/duration"] + +#- module: azure +# metricsets: +# - app_state +# enabled: true +# period: 300s +# application_id: '' +# api_key: '' From 9aab0c0de9fd3ff44ae3307f174f256fa547e725 Mon Sep 17 00:00:00 2001 From: Mariana Dima Date: Mon, 5 Oct 2020 10:53:08 +0200 Subject: [PATCH 062/156] Map `cloud.account.id` to azure sub id (#21483) * mofidy doc * tet * add cloud * changelog --- CHANGELOG.next.asciidoc | 1 + .../add_cloud_metadata/provider_azure_vm.go | 3 + .../provider_azure_vm_test.go | 6 +- .../metricbeat/module/azure/add_metadata.go | 5 +- .../module/azure/compute_vm/_meta/data.json | 115 +++++++++++++----- .../azure/compute_vm_scaleset/_meta/data.json | 33 ++--- x-pack/metricbeat/module/azure/data.go | 4 +- 7 files changed, 120 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 68b77a46037..c72c4adb04b 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -731,6 +731,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add overview and platform health dashboards to Cloud Foundry module. {pull}21124[21124] - Release lambda metricset in aws module as GA. {issue}21251[21251] {pull}21255[21255] - Add dashboard for pubsub metricset in googlecloud module. {pull}21326[21326] {issue}17137[17137] +- Map cloud data filed `cloud.account.id` to azure subscription. {pull}21483[21483] {issue}21381[21381] *Packetbeat* diff --git a/libbeat/processors/add_cloud_metadata/provider_azure_vm.go b/libbeat/processors/add_cloud_metadata/provider_azure_vm.go index 9cd3eba55b8..3028d531c1e 100644 --- a/libbeat/processors/add_cloud_metadata/provider_azure_vm.go +++ b/libbeat/processors/add_cloud_metadata/provider_azure_vm.go @@ -34,6 +34,9 @@ var azureVMMetadataFetcher = provider{ azHeaders := map[string]string{"Metadata": "true"} azSchema := func(m map[string]interface{}) common.MapStr { out, _ := s.Schema{ + "account": s.Object{ + "id": c.Str("subscriptionId"), + }, "instance": s.Object{ "id": c.Str("vmId"), "name": c.Str("name"), diff --git a/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go b/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go index 307ac60abad..a988cc8873f 100644 --- a/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go +++ b/libbeat/processors/add_cloud_metadata/provider_azure_vm_test.go @@ -40,7 +40,8 @@ const azInstanceIdentityDocument = `{ "sku": "14.04.4-LTS", "version": "14.04.201605091", "vmId": "04ab04c3-63de-4709-a9f9-9ab8c0411d5e", - "vmSize": "Standard_D3_v2" + "vmSize": "Standard_D3_v2", + "subscriptionId": "5tfb04c3-63de-4709-a9f9-9ab8c0411d5e" }` func initAzureTestServer() *httptest.Server { @@ -87,6 +88,9 @@ func TestRetrieveAzureMetadata(t *testing.T) { "machine": common.MapStr{ "type": "Standard_D3_v2", }, + "account": common.MapStr{ + "id": "5tfb04c3-63de-4709-a9f9-9ab8c0411d5e", + }, "region": "eastus2", }, } diff --git a/x-pack/metricbeat/module/azure/add_metadata.go b/x-pack/metricbeat/module/azure/add_metadata.go index ba8f35c7db6..1342170aec0 100644 --- a/x-pack/metricbeat/module/azure/add_metadata.go +++ b/x-pack/metricbeat/module/azure/add_metadata.go @@ -35,7 +35,7 @@ func addHostMetadata(event *mb.Event, metricList common.MapStr) { } } -func addCloudVMMetadata(event *mb.Event, vm VmResource) { +func addCloudVMMetadata(event *mb.Event, vm VmResource, subscriptionId string) { if vm.Name != "" { event.RootFields.Put("cloud.instance.name", vm.Name) event.RootFields.Put("host.name", vm.Name) @@ -47,4 +47,7 @@ func addCloudVMMetadata(event *mb.Event, vm VmResource) { if vm.Size != "" { event.RootFields.Put("cloud.machine.type", vm.Size) } + if subscriptionId != "" { + event.RootFields.Put("cloud.account.id", subscriptionId) + } } diff --git a/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json b/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json index 1da5cfb63ab..c38407c76f1 100644 --- a/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json +++ b/x-pack/metricbeat/module/azure/compute_vm/_meta/data.json @@ -2,62 +2,86 @@ "@timestamp": "2017-10-12T08:05:34.853Z", "azure": { "compute_vm": { + "disk_read_bytes": { + "total": 0 + }, "disk_read_operations_per_sec": { - "avg": 3.3875 + "avg": 0 + }, + "disk_write_bytes": { + "total": 2969709.4 }, "disk_write_operations_per_sec": { - "avg": 0.6705 + "avg": 0.7809999999999999 }, "inbound_flows": { - "avg": 28.4 + "avg": 10 }, "inbound_flows_maximum_creation_rate": { - "avg": 10.4 + "avg": 10.6 + }, + "network_in": { + "total": 1478232 + }, + "network_in_total": { + "total": 1569665 + }, + "network_out": { + "total": 793344 + }, + "network_out_total": { + "total": 1074624 + }, + "os_disk_bandwidth_consumed_percentage": { + "avg": 0 + }, + "os_disk_iops_consumed_percentage": { + "avg": 0 }, "os_disk_queue_depth": { - "avg": 0.00125 + "avg": 0.002 }, "os_disk_read_bytes_per_sec": { - "avg": 602589.1825 + "avg": 0 }, "os_disk_read_operations_per_sec": { - "avg": 5.28375 + "avg": 0 }, "os_disk_write_bytes_per_sec": { - "avg": 14137.59375 + "avg": 9899.025 }, "os_disk_write_operations_per_sec": { - "avg": 1.46875 + "avg": 1.5619999999999998 }, "os_per_disk_qd": { - "avg": 0.00125 + "avg": 0.002 }, "os_per_disk_read_bytes_per_sec": { - "avg": 602589.1825 + "avg": 0 }, "os_per_disk_read_operations_per_sec": { - "avg": 5.28375 + "avg": 0 }, "os_per_disk_write_bytes_per_sec": { - "avg": 14137.59375 + "avg": 9899.025 }, "os_per_disk_write_operations_per_sec": { - "avg": 1.46875 + "avg": 1.5619999999999998 }, "outbound_flows": { - "avg": 28.4 + "avg": 10 }, "outbound_flows_maximum_creation_rate": { - "avg": 10.4 + "avg": 10.6 }, "per_disk_qd": { - "avg": 0.0025 + "avg": 0 }, "per_disk_read_bytes_per_sec": { - "avg": 51985.035 + "avg": 0 }, "per_disk_read_operations_per_sec": { - "avg": 2.92875 + "avg": 0 }, "per_disk_write_bytes_per_sec": { "avg": 0 @@ -66,26 +90,41 @@ "avg": 0 }, "percentage_cpu": { - "avg": 9.747 + "avg": 1.8719999999999999 + }, + "vm_cached_bandwidth_consumed_percentage": { + "avg": 0 + }, + "vm_cached_iops_consumed_percentage": { + "avg": 0 + }, + "vm_uncached_bandwidth_consumed_percentage": { + "avg": 0 + }, + "vm_uncached_iops_consumed_percentage": { + "avg": 0 } }, "namespace": "Microsoft.Compute/virtualMachines", "resource": { "group": "obs-infrastructure", - "id": "/subscriptions/70bd6e64-4b1e-4835-8896-db77b8eef364/resourceGroups/obs-infrastructure/providers/Microsoft.Compute/virtualMachines/obslinux", - "name": "obslinux", + "id": "/subscriptions/fd675b6f-b5e5-426e-ac45-d1f876d0ffa6/resourceGroups/obs-infrastructure/providers/Microsoft.Compute/virtualMachines/testaz", + "name": "testaz", "type": "Microsoft.Compute/virtualMachines" }, - "subscription_id": "70bd6e64-4b1e-4835-8896-db77b8eef364", + "subscription_id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6", "timegrain": "PT5M" }, "cloud": { + "account": { + "id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6" + }, "instance": { - "id": "d5d9444a-1964-4d23-9c62-5463ecb16fe0", - "name": "obslinux" + "id": "490fe4cf-2b33-4ead-a016-7e614c2f48ad", + "name": "testaz" }, "machine": { - "type": "Basic_A0" + "type": "Standard_A1_v2" }, "provider": "azure", "region": "westeurope" @@ -97,10 +136,28 @@ }, "host": { "cpu": { - "pct": 0.09747 + "pct": 0.01872 }, - "id": "d5d9444a-1964-4d23-9c62-5463ecb16fe0", - "name": "obslinux" + "disk": { + "read": { + "bytes": 0 + }, + "write": { + "bytes": 2969709.4 + } + }, + "id": "490fe4cf-2b33-4ead-a016-7e614c2f48ad", + "name": "testaz", + "network": { + "in": { + "bytes": 1569665, + "packets": 1478232 + }, + "out": { + "bytes": 1074624, + "packets": 793344 + } + } }, "metricset": { "name": "compute_vm", diff --git a/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json b/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json index e8f59859d8b..2d99d8ff6b0 100644 --- a/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json +++ b/x-pack/metricbeat/module/azure/compute_vm_scaleset/_meta/data.json @@ -2,6 +2,12 @@ "@timestamp": "2017-10-12T08:05:34.853Z", "azure": { "compute_vm_scaleset": { + "cpu_credits_consumed": { + "avg": 0.006999999999999999 + }, + "cpu_credits_remaining": { + "avg": 84.72 + }, "os_per_disk_qd": { "avg": 0 }, @@ -12,35 +18,34 @@ "avg": 0 }, "os_per_disk_write_bytes_per_sec": { - "avg": 1872.1200000000001 + "avg": 3846.531 }, "os_per_disk_write_operations_per_sec": { - "avg": 0.296 + "avg": 0.5519999999999999 } }, "namespace": "Microsoft.Compute/virtualMachineScaleSets", "resource": { - "group": "testgroup", - "id": "/subscriptions/70bd6e23-e3er3-4835-6785-db77b8eef364/resourceGroups/testgroup/providers/Microsoft.Compute/virtualMachineScaleSets/vmscaleset", - "name": "vmscaleset", - "tags": { - "environment": "staging", - "role": "allocator" - }, + "group": "obs-infrastructure", + "id": "/subscriptions/fd675b6f-b5e5-426e-ac45-d1f876d0ffa6/resourceGroups/obs-infrastructure/providers/Microsoft.Compute/virtualMachineScaleSets/obslinuxvmss", + "name": "obslinuxvmss", "type": "Microsoft.Compute/virtualMachineScaleSets" }, - "subscription_id": "70bd6e23-e3er3-4835-6785-db77b8eef364", + "subscription_id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6", "timegrain": "PT5M" }, "cloud": { + "account": { + "id": "fd675b6f-b5e5-426e-ac45-d1f876d0ffa6" + }, "instance": { - "name": "vmscaleset" + "name": "obslinuxvmss" }, "machine": { - "type": "Standard_D4s_v3" + "type": "Standard_B1ls" }, "provider": "azure", - "region": "eastus2" + "region": "westeurope" }, "event": { "dataset": "azure.compute_vm_scaleset", @@ -48,7 +53,7 @@ "module": "azure" }, "host": { - "name": "vmscaleset" + "name": "obslinuxvmss" }, "metricset": { "name": "compute_vm_scaleset", diff --git a/x-pack/metricbeat/module/azure/data.go b/x-pack/metricbeat/module/azure/data.go index 4d479ef45d5..eb7f1433142 100644 --- a/x-pack/metricbeat/module/azure/data.go +++ b/x-pack/metricbeat/module/azure/data.go @@ -82,7 +82,7 @@ func EventsMapping(metrics []Metric, client *Client, report mb.ReporterV2) error event, metricList = createEvent(timestamp, defaultMetric, resource, groupDimValues) if client.Config.AddCloudMetadata { vm = client.GetVMForMetaData(&resource, groupDimValues) - addCloudVMMetadata(&event, vm) + addCloudVMMetadata(&event, vm, resource.Subscription) } } } @@ -90,7 +90,7 @@ func EventsMapping(metrics []Metric, client *Client, report mb.ReporterV2) error event, metricList = createEvent(timestamp, defaultMetric, resource, groupTimeValues) if client.Config.AddCloudMetadata { vm = client.GetVMForMetaData(&resource, groupTimeValues) - addCloudVMMetadata(&event, vm) + addCloudVMMetadata(&event, vm, resource.Subscription) } } if client.Config.DefaultResourceType == "" { From c91216796739bea67c32c6d6c5dc349abb7eb017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Mon, 5 Oct 2020 10:53:30 +0200 Subject: [PATCH 063/156] Do not run symlink tests on Windows (#21472) --- filebeat/input/filestream/fswatch_test.go | 146 +++++++----------- .../filestream/fswatch_test_non_windows.go | 144 +++++++++++++++++ .../input/filestream/testdata/excluded_file | 0 .../input/filestream/testdata/included_file | 0 .../testdata/symlink_to_included_file | 1 - 5 files changed, 201 insertions(+), 90 deletions(-) create mode 100644 filebeat/input/filestream/fswatch_test_non_windows.go delete mode 100644 filebeat/input/filestream/testdata/excluded_file delete mode 100644 filebeat/input/filestream/testdata/included_file delete mode 120000 filebeat/input/filestream/testdata/symlink_to_included_file diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go index 5e63987c868..4979c9275c8 100644 --- a/filebeat/input/filestream/fswatch_test.go +++ b/filebeat/input/filestream/fswatch_test.go @@ -31,6 +31,12 @@ import ( "github.com/elastic/beats/v7/libbeat/logp" ) +var ( + excludedFilePath = filepath.Join("testdata", "excluded_file") + includedFilePath = filepath.Join("testdata", "included_file") + directoryPath = filepath.Join("testdata", "unharvestable_dir") +) + func TestFileScanner(t *testing.T) { testCases := map[string]struct { paths []string @@ -39,56 +45,30 @@ func TestFileScanner(t *testing.T) { expectedFiles []string }{ "select all files": { - paths: []string{ - filepath.Join("testdata", "excluded_file"), - filepath.Join("testdata", "included_file"), - }, + paths: []string{excludedFilePath, includedFilePath}, expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "excluded_file")), - mustAbsPath(filepath.Join("testdata", "included_file")), + mustAbsPath(excludedFilePath), + mustAbsPath(includedFilePath), }, }, "skip excluded files": { - paths: []string{ - filepath.Join("testdata", "excluded_file"), - filepath.Join("testdata", "included_file"), - }, + paths: []string{excludedFilePath, includedFilePath}, excludedFiles: []match.Matcher{ - match.MustCompile(filepath.Join("testdata", "excluded_file")), - }, - expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "included_file")), - }, - }, - // covers test_input.py/test_skip_symlinks - "skip symlinks": { - paths: []string{ - filepath.Join("testdata", "symlink_to_included_file"), - filepath.Join("testdata", "included_file"), + match.MustCompile("excluded_file"), }, - symlinks: false, expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "included_file")), - }, - }, - "return a file once if symlinks are enabled": { - paths: []string{ - filepath.Join("testdata", "symlink_to_included_file"), - filepath.Join("testdata", "included_file"), - }, - symlinks: true, - expectedFiles: []string{ - mustAbsPath(filepath.Join("testdata", "included_file")), + mustAbsPath(includedFilePath), }, }, "skip directories": { - paths: []string{ - filepath.Join("testdata", "unharvestable_dir"), - }, + paths: []string{directoryPath}, expectedFiles: []string{}, }, } + setupFilesForScannerTest(t) + defer removeFilesOfScannerTest(t) + for name, test := range testCases { test := test @@ -107,11 +87,50 @@ func TestFileScanner(t *testing.T) { for p, _ := range files { paths = append(paths, p) } - assert.Equal(t, test.expectedFiles, paths) + assert.True(t, checkIfSameContents(test.expectedFiles, paths)) }) } } +func setupFilesForScannerTest(t *testing.T) { + err := os.MkdirAll(directoryPath, 0750) + if err != nil { + t.Fatal(t) + } + + for _, path := range []string{excludedFilePath, includedFilePath} { + f, err := os.Create(path) + if err != nil { + t.Fatalf("file %s, error %v", path, err) + } + f.Close() + } +} + +func removeFilesOfScannerTest(t *testing.T) { + err := os.RemoveAll("testdata") + if err != nil { + t.Fatal(err) + } +} + +// only handles sets +func checkIfSameContents(one, other []string) bool { + if len(one) != len(other) { + return false + } + + mustFind := len(one) + for _, oneElem := range one { + for _, otherElem := range other { + if oneElem == otherElem { + mustFind-- + } + } + } + return mustFind == 0 +} + func TestFileWatchNewDeleteModified(t *testing.T) { oldTs := time.Now() newTs := oldTs.Add(5 * time.Second) @@ -201,9 +220,7 @@ func TestFileWatchNewDeleteModified(t *testing.T) { events: make(chan loginp.FSEvent), } - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go w.watch(ctx) + go w.watch(context.Background()) for _, expectedEvent := range test.expectedEvents { evt := w.Event() @@ -213,55 +230,6 @@ func TestFileWatchNewDeleteModified(t *testing.T) { } } -func TestFileWatcherRenamedFile(t *testing.T) { - testPath := mustAbsPath(filepath.Join("testdata", "first_name")) - renamedPath := mustAbsPath(filepath.Join("testdata", "renamed")) - - f, err := os.Create(testPath) - if err != nil { - t.Fatal(err) - } - f.Close() - fi, err := os.Stat(testPath) - if err != nil { - t.Fatal(err) - } - - cfg := fileScannerConfig{ - ExcludedFiles: nil, - Symlinks: false, - RecursiveGlob: false, - } - scanner, err := newFileScanner([]string{testPath, renamedPath}, cfg) - if err != nil { - t.Fatal(err) - } - w := fileWatcher{ - log: logp.L(), - scanner: scanner, - events: make(chan loginp.FSEvent), - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - go w.watch(ctx) - assert.Equal(t, loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: testPath, Info: fi}, w.Event()) - - err = os.Rename(testPath, renamedPath) - if err != nil { - t.Fatal(err) - } - defer os.Remove(renamedPath) - fi, err = os.Stat(renamedPath) - if err != nil { - t.Fatal(err) - } - - go w.watch(ctx) - assert.Equal(t, loginp.FSEvent{Op: loginp.OpRename, OldPath: testPath, NewPath: renamedPath, Info: fi}, w.Event()) -} - type mockScanner struct { files map[string]os.FileInfo } diff --git a/filebeat/input/filestream/fswatch_test_non_windows.go b/filebeat/input/filestream/fswatch_test_non_windows.go new file mode 100644 index 00000000000..eecfeddf930 --- /dev/null +++ b/filebeat/input/filestream/fswatch_test_non_windows.go @@ -0,0 +1,144 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build !windows + +package filestream + +import ( + "context" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/assert" + + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/logp" +) + +func TestFileScannerSymlinks(t *testing.T) { + testCases := map[string]struct { + paths []string + excludedFiles []match.Matcher + symlinks bool + expectedFiles []string + }{ + // covers test_input.py/test_skip_symlinks + "skip symlinks": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: false, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "return a file once if symlinks are enabled": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: true, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + } + + err := os.Symlink( + mustAbsPath(filepath.Join("testdata", "included_file")), + mustAbsPath(filepath.Join("testdata", "symlink_to_included_file")), + ) + if err != nil { + t.Fatal(err) + } + + for name, test := range testCases { + test := test + + t.Run(name, func(t *testing.T) { + cfg := fileScannerConfig{ + ExcludedFiles: test.excludedFiles, + Symlinks: true, + RecursiveGlob: false, + } + fs, err := newFileScanner(test.paths, cfg) + if err != nil { + t.Fatal(err) + } + files := fs.GetFiles() + paths := make([]string, 0) + for p, _ := range files { + paths = append(paths, p) + } + assert.Equal(t, test.expectedFiles, paths) + }) + } +} + +func TestFileWatcherRenamedFile(t *testing.T) { + testPath := mustAbsPath("first_name") + renamedPath := mustAbsPath("renamed") + + f, err := os.Create(testPath) + if err != nil { + t.Fatal(err) + } + f.Close() + fi, err := os.Stat(testPath) + if err != nil { + t.Fatal(err) + } + + cfg := fileScannerConfig{ + ExcludedFiles: nil, + Symlinks: false, + RecursiveGlob: false, + } + scanner, err := newFileScanner([]string{testPath, renamedPath}, cfg) + if err != nil { + t.Fatal(err) + } + w := fileWatcher{ + log: logp.L(), + scanner: scanner, + events: make(chan loginp.FSEvent), + } + + go w.watch(context.Background()) + assert.Equal(t, loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: testPath, Info: fi}, w.Event()) + + err = os.Rename(testPath, renamedPath) + if err != nil { + t.Fatal(err) + } + defer os.Remove(renamedPath) + fi, err = os.Stat(renamedPath) + if err != nil { + t.Fatal(err) + } + + go w.watch(context.Background()) + evt := w.Event() + + assert.Equal(t, loginp.OpRename, evt.Op) + assert.Equal(t, testPath, evt.OldPath) + assert.Equal(t, renamedPath, evt.NewPath) +} diff --git a/filebeat/input/filestream/testdata/excluded_file b/filebeat/input/filestream/testdata/excluded_file deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/filebeat/input/filestream/testdata/included_file b/filebeat/input/filestream/testdata/included_file deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/filebeat/input/filestream/testdata/symlink_to_included_file b/filebeat/input/filestream/testdata/symlink_to_included_file deleted file mode 120000 index 40824f3f7d3..00000000000 --- a/filebeat/input/filestream/testdata/symlink_to_included_file +++ /dev/null @@ -1 +0,0 @@ -filebeat/input/filestream/testdata/included_file \ No newline at end of file From 77163970c4e0b23148d583242e3aec477b03e275 Mon Sep 17 00:00:00 2001 From: Mariana Dima Date: Mon, 5 Oct 2020 12:03:20 +0200 Subject: [PATCH 064/156] Ignore unsupported metrics in the azure module (#21486) * mofidy doc * add ignore * changelog --- CHANGELOG.next.asciidoc | 1 + .../module/azure/compute_vm_scaleset/manifest.yml | 6 ++++++ x-pack/metricbeat/module/azure/config.go | 2 +- .../module/azure/container_instance/manifest.yml | 4 ++++ .../module/azure/container_service/manifest.yml | 6 ++++++ .../module/azure/database_account/manifest.yml | 8 ++++++++ .../module/azure/monitor/_meta/docs.asciidoc | 3 +++ .../metricbeat/module/azure/monitor/client_helper.go | 10 +++++----- .../module/azure/monitor/client_helper_test.go | 2 +- 9 files changed, 35 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index c72c4adb04b..2f956d70838 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -731,6 +731,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add overview and platform health dashboards to Cloud Foundry module. {pull}21124[21124] - Release lambda metricset in aws module as GA. {issue}21251[21251] {pull}21255[21255] - Add dashboard for pubsub metricset in googlecloud module. {pull}21326[21326] {issue}17137[17137] +- Expand unsupported option from namespace to metrics in the azure module. {pull}21486[21486] - Map cloud data filed `cloud.account.id` to azure subscription. {pull}21483[21483] {issue}21381[21381] *Packetbeat* diff --git a/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml b/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml index 9369a36b79e..37b1293a2e5 100644 --- a/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml +++ b/x-pack/metricbeat/module/azure/compute_vm_scaleset/manifest.yml @@ -12,8 +12,10 @@ input: - name: ["CPU Credits Remaining", "CPU Credits Consumed", "OS Per Disk Read Bytes/sec", "OS Per Disk Write Bytes/sec", "OS Per Disk Read Operations/Sec", "OS Per Disk Write Operations/Sec", "OS Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" timegrain: "PT5M" + ignore_unsupported: true - name: ["Per Disk Read Bytes/sec", "Per Disk Write Bytes/sec", "Per Disk Read Operations/Sec", "Per Disk Write Operations/Sec", "Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "SlotId" @@ -24,6 +26,7 @@ input: "Premium Data Disk Cache Read Hit", "Outbound Flows Maximum Creation Rate", "Inbound Flows Maximum Creation Rate", "Outbound Flows", "Inbound Flows", "OS Disk IOPS Consumed Percentage", "OS Disk Bandwidth Consumed Percentage", "OS Disk Queue Depth", "OS Disk Write Operations/Sec", "OS Disk Read Operations/Sec", "OS Disk Write Bytes/sec", "OS Disk Read Bytes/sec", "Data Disk IOPS Consumed Percentage"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "VMName" @@ -40,9 +43,11 @@ input: metrics: - name: ["CPU Credits Remaining", "CPU Credits Consumed", "OS Per Disk Read Bytes/sec", "OS Per Disk Write Bytes/sec", "OS Per Disk Read Operations/Sec", "OS Per Disk Write Operations/Sec", "OS Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" - name: ["Per Disk Read Bytes/sec", "Per Disk Write Bytes/sec", "Per Disk Read Operations/Sec", "Per Disk Write Operations/Sec", "Per Disk QD"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "SlotId" @@ -53,6 +58,7 @@ input: "Premium Data Disk Cache Read Hit", "Outbound Flows Maximum Creation Rate", "Inbound Flows Maximum Creation Rate", "Outbound Flows", "Inbound Flows", "OS Disk IOPS Consumed Percentage", "OS Disk Bandwidth Consumed Percentage", "OS Disk Queue Depth", "OS Disk Write Operations/Sec", "OS Disk Read Operations/Sec", "OS Disk Write Bytes/sec", "OS Disk Read Bytes/sec", "Data Disk IOPS Consumed Percentage"] namespace: "Microsoft.Compute/virtualMachineScaleSets" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "VMName" diff --git a/x-pack/metricbeat/module/azure/config.go b/x-pack/metricbeat/module/azure/config.go index 63bb5450b57..00f1af56126 100644 --- a/x-pack/metricbeat/module/azure/config.go +++ b/x-pack/metricbeat/module/azure/config.go @@ -41,7 +41,7 @@ type MetricConfig struct { Dimensions []DimensionConfig `config:"dimensions"` Timegrain string `config:"timegrain"` // namespaces can be unsupported by some resources and supported in some, this configuration option makes sure no error messages are returned if namespace is unsupported - // info messages will be logged instead + // info messages will be logged instead. Same situation with metrics, some are being removed from the API, we would like to make sure that does not affect the module IgnoreUnsupported bool `config:"ignore_unsupported"` } diff --git a/x-pack/metricbeat/module/azure/container_instance/manifest.yml b/x-pack/metricbeat/module/azure/container_instance/manifest.yml index a0e6cd5ec27..c767e072a42 100644 --- a/x-pack/metricbeat/module/azure/container_instance/manifest.yml +++ b/x-pack/metricbeat/module/azure/container_instance/manifest.yml @@ -10,21 +10,25 @@ input: metrics: - name: ["CpuUsage", "MemoryUsage"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "containerName" value: "*" - name: ["NetworkBytesReceivedPerSecond", "NetworkBytesTransmittedPerSecond"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" - resource_id: "" metrics: - name: ["CpuUsage", "MemoryUsage"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "containerName" value: "*" - name: ["NetworkBytesReceivedPerSecond", "NetworkBytesTransmittedPerSecond"] namespace: "Microsoft.ContainerInstance/containerGroups" + ignore_unsupported: true timegrain: "PT5M" diff --git a/x-pack/metricbeat/module/azure/container_service/manifest.yml b/x-pack/metricbeat/module/azure/container_service/manifest.yml index 1384a268868..b7cf7639d42 100644 --- a/x-pack/metricbeat/module/azure/container_service/manifest.yml +++ b/x-pack/metricbeat/module/azure/container_service/manifest.yml @@ -10,6 +10,7 @@ input: metrics: - name: ["kube_node_status_condition"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "node" @@ -20,9 +21,11 @@ input: value: "*" - name: ["kube_node_status_allocatable_cpu_cores", "kube_node_status_allocatable_memory_bytes"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" - name: ["kube_pod_status_ready", "kube_pod_status_phase"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "pod" @@ -31,6 +34,7 @@ input: metrics: - name: ["kube_node_status_condition"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "node" @@ -41,9 +45,11 @@ input: value: "*" - name: ["kube_node_status_allocatable_cpu_cores", "kube_node_status_allocatable_memory_bytes"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" - name: ["kube_pod_status_ready", "kube_pod_status_phase"] namespace: "Microsoft.ContainerService/managedClusters" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "pod" diff --git a/x-pack/metricbeat/module/azure/database_account/manifest.yml b/x-pack/metricbeat/module/azure/database_account/manifest.yml index 39086f6ff66..3436008db7e 100644 --- a/x-pack/metricbeat/module/azure/database_account/manifest.yml +++ b/x-pack/metricbeat/module/azure/database_account/manifest.yml @@ -14,12 +14,14 @@ input: - name: ["AvailableStorage", "DataUsage","DocumentCount", "DocumentQuota", "IndexUsage", "MetadataRequests", "MongoRequestCharge", "MongoRequests", "MongoRequestsCount", "MongoRequestsInsert", "MongoRequestsDelete", "MongoRequestsQuery", "MongoRequestsUpdate","ProvisionedThroughput", "NormalizedRUConsumption"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" value: "*" - name: ["TotalRequestUnits", "TotalRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" @@ -28,6 +30,7 @@ input: value: "*" - name: ["CassandraRequestCharges", "CassandraRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT1M" dimensions: - name: "DatabaseName" @@ -38,6 +41,7 @@ input: "SqlContainerDelete", "SqlContainerThroughputUpdate", "SqlContainerUpdate", "SqlDatabaseDelete", "SqlDatabaseThroughputUpdate", "SqlDatabaseUpdate", "TableTableDelete", "TableTableThroughputUpdate","TableTableUpdate"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true dimensions: - name: "ResourceName" value: "*" @@ -49,12 +53,14 @@ input: - name: ["AvailableStorage", "DataUsage","DocumentCount", "DocumentQuota", "IndexUsage", "MetadataRequests", "MongoRequestCharge", "MongoRequests", "MongoRequestsCount", "MongoRequestsInsert", "MongoRequestsDelete", "MongoRequestsQuery", "MongoRequestsUpdate","ProvisionedThroughput", "NormalizedRUConsumption"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" value: "*" - name: ["TotalRequestUnits", "TotalRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT5M" dimensions: - name: "DatabaseName" @@ -63,6 +69,7 @@ input: value: "*" - name: ["CassandraRequestCharges", "CassandraRequests"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true timegrain: "PT1M" dimensions: - name: "DatabaseName" @@ -73,6 +80,7 @@ input: "SqlContainerDelete", "SqlContainerThroughputUpdate", "SqlContainerUpdate", "SqlDatabaseDelete", "SqlDatabaseThroughputUpdate", "SqlDatabaseUpdate", "TableTableDelete", "TableTableThroughputUpdate","TableTableUpdate"] namespace: "Microsoft.DocumentDb/databaseAccounts" + ignore_unsupported: true dimensions: - name: "ResourceName" value: "*" diff --git a/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc b/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc index 19254f4ada9..9957b6a2ddd 100644 --- a/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/azure/monitor/_meta/docs.asciidoc @@ -50,6 +50,9 @@ Metrics with dimensions are exported as flattened single dimensional metrics, ag `name`:: Dimension key `value`:: Dimension value. (Users can select * to return metric values for each dimension) +`ignore_unsupported`:: (_bool_) Namespaces can be unsupported by some resources and supported in some, this configuration option makes sure no error messages are returned if the namespace is unsupported. +The same will go for the metrics configured, some can be removed from Azure Monitor and it should not affect the state of the module. + Users can select the options to retrieve all metrics from a specific namespace using the following: ["source","yaml"] diff --git a/x-pack/metricbeat/module/azure/monitor/client_helper.go b/x-pack/metricbeat/module/azure/monitor/client_helper.go index 82875f46de5..403b971496f 100644 --- a/x-pack/metricbeat/module/azure/monitor/client_helper.go +++ b/x-pack/metricbeat/module/azure/monitor/client_helper.go @@ -78,20 +78,20 @@ func filterMetricNames(resourceId string, metricConfig azure.MetricConfig, metri } } else { // verify if configured metric names are valid, return log error event for the invalid ones, map only the valid metric names - supportedMetricNames, unsupportedMetricNames = filterSConfiguredMetrics(metricConfig.Name, metricDefinitions) - if len(unsupportedMetricNames) > 0 { + supportedMetricNames, unsupportedMetricNames = filterConfiguredMetrics(metricConfig.Name, metricDefinitions) + if len(unsupportedMetricNames) > 0 && !metricConfig.IgnoreUnsupported { return nil, errors.Errorf("the metric names configured %s are not supported for the resource %s and namespace %s", strings.Join(unsupportedMetricNames, ","), resourceId, metricConfig.Namespace) } } - if len(supportedMetricNames) == 0 { + if len(supportedMetricNames) == 0 && !metricConfig.IgnoreUnsupported { return nil, errors.Errorf("the metric names configured : %s are not supported for the resource %s and namespace %s ", strings.Join(metricConfig.Name, ","), resourceId, metricConfig.Namespace) } return supportedMetricNames, nil } -// filterSConfiguredMetrics will filter out any unsupported metrics based on the namespace selected -func filterSConfiguredMetrics(selectedRange []string, allRange []insights.MetricDefinition) ([]string, []string) { +// filterConfiguredMetrics will filter out any unsupported metrics based on the namespace selected +func filterConfiguredMetrics(selectedRange []string, allRange []insights.MetricDefinition) ([]string, []string) { var inRange []string var notInRange []string var allMetrics string diff --git a/x-pack/metricbeat/module/azure/monitor/client_helper_test.go b/x-pack/metricbeat/module/azure/monitor/client_helper_test.go index a15ee0089b9..bcbad0f4c26 100644 --- a/x-pack/metricbeat/module/azure/monitor/client_helper_test.go +++ b/x-pack/metricbeat/module/azure/monitor/client_helper_test.go @@ -108,7 +108,7 @@ func TestMapMetric(t *testing.T) { func TestFilterSConfiguredMetrics(t *testing.T) { selectedRange := []string{"TotalRequests", "Capacity", "CPUUsage"} - intersection, difference := filterSConfiguredMetrics(selectedRange, *MockMetricDefinitions()) + intersection, difference := filterConfiguredMetrics(selectedRange, *MockMetricDefinitions()) assert.Equal(t, intersection, []string{"TotalRequests", "Capacity"}) assert.Equal(t, difference, []string{"CPUUsage"}) } From 6fdb4ba899438c9fbb0e748e1a9643be5dd46437 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Mon, 5 Oct 2020 12:58:03 +0200 Subject: [PATCH 065/156] Skip filestream flaky tests (#21490) --- filebeat/input/filestream/fswatch_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go index 4979c9275c8..d6286a273eb 100644 --- a/filebeat/input/filestream/fswatch_test.go +++ b/filebeat/input/filestream/fswatch_test.go @@ -38,6 +38,8 @@ var ( ) func TestFileScanner(t *testing.T) { + t.Skip("Flaky test: https://github.com/elastic/beats/issues/21489") + testCases := map[string]struct { paths []string excludedFiles []match.Matcher @@ -132,6 +134,8 @@ func checkIfSameContents(one, other []string) bool { } func TestFileWatchNewDeleteModified(t *testing.T) { + t.Skip("Flaky test: https://github.com/elastic/beats/issues/21489") + oldTs := time.Now() newTs := oldTs.Add(5 * time.Second) testCases := map[string]struct { From 7400f430128ef7aa309c5d9ec4c9e5331f046aa4 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Mon, 5 Oct 2020 07:29:25 -0600 Subject: [PATCH 066/156] [Metricbeat] Add latency config option into aws module (#20875) * Add latency config option into aws module --- CHANGELOG.next.asciidoc | 1 + metricbeat/docs/modules/aws.asciidoc | 11 +++++++++++ x-pack/metricbeat/module/aws/_meta/config.yml | 4 ++++ x-pack/metricbeat/module/aws/_meta/docs.asciidoc | 11 +++++++++++ x-pack/metricbeat/module/aws/aws.go | 3 +++ x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go | 3 ++- .../module/aws/cloudwatch/cloudwatch_test.go | 6 +++--- x-pack/metricbeat/module/aws/ec2/ec2.go | 3 ++- x-pack/metricbeat/module/aws/rds/rds.go | 3 ++- .../module/aws/s3_daily_storage/s3_daily_storage.go | 3 ++- x-pack/metricbeat/module/aws/s3_request/s3_request.go | 3 ++- x-pack/metricbeat/module/aws/sqs/sqs.go | 3 ++- x-pack/metricbeat/module/aws/utils.go | 7 ++++++- x-pack/metricbeat/module/aws/utils_test.go | 4 ++-- x-pack/metricbeat/modules.d/aws.yml.disabled | 4 ++++ 15 files changed, 57 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 2f956d70838..279eda229a7 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -724,6 +724,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add billing data collection from Cost Explorer into aws billing metricset. {pull}20527[20527] {issue}20103[20103] - Migrate `compute_vm` metricset to a light one, map `cloud.instance.id` field. {pull}20889[20889] - Request prometheus endpoints to be gzipped by default {pull}20766[20766] +- Add latency config parameter into aws module. {pull}20875[20875] - Release all kubernetes `state` metricsets as GA {pull}20901[20901] - Add billing metricset into googlecloud module. {pull}20812[20812] {issue}20738[20738] - Move `compute_vm_scaleset` to light metricset. {pull}21038[21038] {issue}20985[20985] diff --git a/metricbeat/docs/modules/aws.asciidoc b/metricbeat/docs/modules/aws.asciidoc index 42d24c65ccd..e02a7a81460 100644 --- a/metricbeat/docs/modules/aws.asciidoc +++ b/metricbeat/docs/modules/aws.asciidoc @@ -19,16 +19,27 @@ module. Please see <> for more details. [float] == Module-specific configuration notes +* *AWS Credentials* + The `aws` module requires AWS credentials configuration in order to make AWS API calls. Users can either use `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and/or `AWS_SESSION_TOKEN`, or use shared AWS credentials file. Please see <> for more details. +* *regions* + This module also accepts optional configuration `regions` to specify which AWS regions to query metrics from. If the `regions` parameter is not set in the config file, then by default, the `aws` module will query metrics from all available AWS regions. +* *latency* + +Some AWS services send monitoring metrics to CloudWatch with a latency to +process larger than Metricbeat collection period. This case, please specify a +`latency` parameter so collection start time and end time will be shifted by the +given latency amount. + The aws module comes with a predefined dashboard. For example: image::./images/metricbeat-aws-overview.png[] diff --git a/x-pack/metricbeat/module/aws/_meta/config.yml b/x-pack/metricbeat/module/aws/_meta/config.yml index 618ed4cd854..6f604138505 100644 --- a/x-pack/metricbeat/module/aws/_meta/config.yml +++ b/x-pack/metricbeat/module/aws/_meta/config.yml @@ -44,4 +44,8 @@ period: 24h metricsets: - s3_daily_storage +- module: aws + period: 1m + latency: 5m + metricsets: - s3_request diff --git a/x-pack/metricbeat/module/aws/_meta/docs.asciidoc b/x-pack/metricbeat/module/aws/_meta/docs.asciidoc index fe9aeea007f..e4e55e82136 100644 --- a/x-pack/metricbeat/module/aws/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/aws/_meta/docs.asciidoc @@ -11,16 +11,27 @@ module. Please see <> for more details. [float] == Module-specific configuration notes +* *AWS Credentials* + The `aws` module requires AWS credentials configuration in order to make AWS API calls. Users can either use `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and/or `AWS_SESSION_TOKEN`, or use shared AWS credentials file. Please see <> for more details. +* *regions* + This module also accepts optional configuration `regions` to specify which AWS regions to query metrics from. If the `regions` parameter is not set in the config file, then by default, the `aws` module will query metrics from all available AWS regions. +* *latency* + +Some AWS services send monitoring metrics to CloudWatch with a latency to +process larger than Metricbeat collection period. This case, please specify a +`latency` parameter so collection start time and end time will be shifted by the +given latency amount. + The aws module comes with a predefined dashboard. For example: image::./images/metricbeat-aws-overview.png[] diff --git a/x-pack/metricbeat/module/aws/aws.go b/x-pack/metricbeat/module/aws/aws.go index f7b744c27cb..9786c4f7b38 100644 --- a/x-pack/metricbeat/module/aws/aws.go +++ b/x-pack/metricbeat/module/aws/aws.go @@ -27,6 +27,7 @@ import ( type Config struct { Period time.Duration `config:"period" validate:"nonzero,required"` Regions []string `config:"regions"` + Latency time.Duration `config:"latency"` AWSConfig awscommon.ConfigAWS `config:",inline"` TagsFilter []Tag `config:"tags_filter"` } @@ -37,6 +38,7 @@ type MetricSet struct { RegionsList []string Endpoint string Period time.Duration + Latency time.Duration AwsConfig *awssdk.Config AccountName string AccountID string @@ -87,6 +89,7 @@ func NewMetricSet(base mb.BaseMetricSet) (*MetricSet, error) { metricSet := MetricSet{ BaseMetricSet: base, Period: config.Period, + Latency: config.Latency, AwsConfig: &awsConfig, TagsFilter: config.TagsFilter, } diff --git a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go index 42d68acb3af..07e1f09acef 100644 --- a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go +++ b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go @@ -141,7 +141,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // of an error set the Error field of mb.Event or simply call report.Error(). func (m *MetricSet) Fetch(report mb.ReporterV2) error { // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) + m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) // Check statistic method in config err := m.checkStatistics() diff --git a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go index 353ffd0e236..393ddecb07e 100644 --- a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go +++ b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go @@ -1357,7 +1357,7 @@ func TestCreateEventsWithIdentifier(t *testing.T) { Value: "test-ec2", }, } - startTime, endTime := aws.GetStartTimeEndTime(m.MetricSet.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.MetricSet.Period, m.MetricSet.Latency) events, err := m.createEvents(mockCloudwatchSvc, mockTaggingSvc, listMetricWithStatsTotal, resourceTypeTagFilters, regionName, startTime, endTime) assert.NoError(t, err) @@ -1399,7 +1399,7 @@ func TestCreateEventsWithoutIdentifier(t *testing.T) { } resourceTypeTagFilters := map[string][]aws.Tag{} - startTime, endTime := aws.GetStartTimeEndTime(m.MetricSet.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.MetricSet.Period, m.MetricSet.Latency) events, err := m.createEvents(mockCloudwatchSvc, mockTaggingSvc, listMetricWithStatsTotal, resourceTypeTagFilters, regionName, startTime, endTime) assert.NoError(t, err) @@ -1447,7 +1447,7 @@ func TestCreateEventsWithTagsFilter(t *testing.T) { Value: "foo", }, } - startTime, endTime := aws.GetStartTimeEndTime(m.MetricSet.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.MetricSet.Period, m.MetricSet.Latency) events, err := m.createEvents(mockCloudwatchSvc, mockTaggingSvc, listMetricWithStatsTotal, resourceTypeTagFilters, regionName, startTime, endTime) assert.NoError(t, err) diff --git a/x-pack/metricbeat/module/aws/ec2/ec2.go b/x-pack/metricbeat/module/aws/ec2/ec2.go index 36ad9a1ca02..4e0776072e6 100644 --- a/x-pack/metricbeat/module/aws/ec2/ec2.go +++ b/x-pack/metricbeat/module/aws/ec2/ec2.go @@ -88,7 +88,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // of an error set the Error field of mb.Event or simply call report.Error(). func (m *MetricSet) Fetch(report mb.ReporterV2) error { // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) + m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) for _, regionName := range m.MetricSet.RegionsList { awsConfig := m.MetricSet.AwsConfig.Copy() diff --git a/x-pack/metricbeat/module/aws/rds/rds.go b/x-pack/metricbeat/module/aws/rds/rds.go index f8bd907b3f6..b381dcac943 100644 --- a/x-pack/metricbeat/module/aws/rds/rds.go +++ b/x-pack/metricbeat/module/aws/rds/rds.go @@ -79,7 +79,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // of an error set the Error field of mb.Event or simply call report.Error(). func (m *MetricSet) Fetch(report mb.ReporterV2) error { // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) + m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) for _, regionName := range m.MetricSet.RegionsList { awsConfig := m.MetricSet.AwsConfig.Copy() diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go index 7c9d453baca..53248284d41 100644 --- a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go +++ b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go @@ -69,7 +69,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { namespace := "AWS/S3" // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) + m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) // GetMetricData for AWS S3 from Cloudwatch for _, regionName := range m.MetricSet.RegionsList { diff --git a/x-pack/metricbeat/module/aws/s3_request/s3_request.go b/x-pack/metricbeat/module/aws/s3_request/s3_request.go index afe53ac49ba..63b93f6cdf4 100644 --- a/x-pack/metricbeat/module/aws/s3_request/s3_request.go +++ b/x-pack/metricbeat/module/aws/s3_request/s3_request.go @@ -69,7 +69,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { namespace := "AWS/S3" // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) + m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) // GetMetricData for AWS S3 from Cloudwatch for _, regionName := range m.MetricSet.RegionsList { diff --git a/x-pack/metricbeat/module/aws/sqs/sqs.go b/x-pack/metricbeat/module/aws/sqs/sqs.go index 7bc6a8349d0..6dc0774f66d 100644 --- a/x-pack/metricbeat/module/aws/sqs/sqs.go +++ b/x-pack/metricbeat/module/aws/sqs/sqs.go @@ -67,7 +67,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { func (m *MetricSet) Fetch(report mb.ReporterV2) error { namespace := "AWS/SQS" // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) + m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) for _, regionName := range m.MetricSet.RegionsList { awsConfig := m.MetricSet.AwsConfig.Copy() diff --git a/x-pack/metricbeat/module/aws/utils.go b/x-pack/metricbeat/module/aws/utils.go index 67e5809bc8e..d1846083854 100644 --- a/x-pack/metricbeat/module/aws/utils.go +++ b/x-pack/metricbeat/module/aws/utils.go @@ -22,8 +22,13 @@ import ( ) // GetStartTimeEndTime function uses durationString to create startTime and endTime for queries. -func GetStartTimeEndTime(period time.Duration) (time.Time, time.Time) { +func GetStartTimeEndTime(period time.Duration, latency time.Duration) (time.Time, time.Time) { endTime := time.Now() + if latency != 0 { + // add latency if config is not 0 + endTime = endTime.Add(latency * -1) + } + // Set startTime double the period earlier than the endtime in order to // make sure GetMetricDataRequest gets the latest data point for each metric. return endTime.Add(period * -2), endTime diff --git a/x-pack/metricbeat/module/aws/utils_test.go b/x-pack/metricbeat/module/aws/utils_test.go index aef35f57e61..3c480d347db 100644 --- a/x-pack/metricbeat/module/aws/utils_test.go +++ b/x-pack/metricbeat/module/aws/utils_test.go @@ -176,7 +176,7 @@ func TestGetListMetricsOutputWithWildcard(t *testing.T) { } func TestGetMetricDataPerRegion(t *testing.T) { - startTime, endTime := GetStartTimeEndTime(10 * time.Minute) + startTime, endTime := GetStartTimeEndTime(10*time.Minute, 0) mockSvc := &MockCloudWatchClient{} var metricDataQueries []cloudwatch.MetricDataQuery @@ -205,7 +205,7 @@ func TestGetMetricDataPerRegion(t *testing.T) { } func TestGetMetricDataResults(t *testing.T) { - startTime, endTime := GetStartTimeEndTime(10 * time.Minute) + startTime, endTime := GetStartTimeEndTime(10*time.Minute, 0) mockSvc := &MockCloudWatchClient{} metricInfo := cloudwatch.Metric{ diff --git a/x-pack/metricbeat/modules.d/aws.yml.disabled b/x-pack/metricbeat/modules.d/aws.yml.disabled index d0053297885..cc3103643c7 100644 --- a/x-pack/metricbeat/modules.d/aws.yml.disabled +++ b/x-pack/metricbeat/modules.d/aws.yml.disabled @@ -47,4 +47,8 @@ period: 24h metricsets: - s3_daily_storage +- module: aws + period: 1m + latency: 5m + metricsets: - s3_request From d987d103ae888b46b3ae166fa7eebf99feb97a9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Mon, 5 Oct 2020 15:44:00 +0200 Subject: [PATCH 067/156] Implementation of fileProspector (#21479) ## What does this PR do? This PR adds the implementation of `fileProspector`. The prospector listens for events from the `FSWatcher` and processes them depending on the type of the event. Possible actions are starting a new Harvester to read from a file, removing an entry from the registry, etc. --- filebeat/input/filestream/identifier.go | 139 ++++++++++++++ .../filestream/identifier_inode_deviceid.go | 108 +++++++++++ .../identifier_inode_deviceid_windows.go | 30 +++ filebeat/input/filestream/input.go | 6 + filebeat/input/filestream/prospector.go | 176 +++++++++++++++++- 5 files changed, 457 insertions(+), 2 deletions(-) create mode 100644 filebeat/input/filestream/identifier.go create mode 100644 filebeat/input/filestream/identifier_inode_deviceid.go create mode 100644 filebeat/input/filestream/identifier_inode_deviceid_windows.go diff --git a/filebeat/input/filestream/identifier.go b/filebeat/input/filestream/identifier.go new file mode 100644 index 00000000000..736c66da2f0 --- /dev/null +++ b/filebeat/input/filestream/identifier.go @@ -0,0 +1,139 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package filestream + +import ( + "fmt" + "os" + + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/file" +) + +const ( + nativeName = "native" + pathName = "path" + inodeMarkerName = "inode_marker" + + DefaultIdentifierName = nativeName + identitySep = "::" +) + +var ( + identifierFactories = map[string]identifierFactory{ + nativeName: newINodeDeviceIdentifier, + pathName: newPathIdentifier, + inodeMarkerName: newINodeMarkerIdentifier, + } +) + +type identifierFactory func(*common.Config) (fileIdentifier, error) + +type fileIdentifier interface { + GetSource(loginp.FSEvent) fileSource + Name() string +} + +// fileSource implements the Source interface +// It is required to identify and manage file sources. +type fileSource struct { + info os.FileInfo + newPath string + oldPath string + + name string + identifierGenerator string +} + +// Name returns the registry identifier of the file. +func (f fileSource) Name() string { + return f.name +} + +// newFileIdentifier creates a new state identifier for a log input. +func newFileIdentifier(ns *common.ConfigNamespace) (fileIdentifier, error) { + if ns == nil { + return newINodeDeviceIdentifier(nil) + } + + identifierType := ns.Name() + f, ok := identifierFactories[identifierType] + if !ok { + return nil, fmt.Errorf("no such file_identity generator: %s", identifierType) + } + + return f(ns.Config()) +} + +type inodeDeviceIdentifier struct { + name string +} + +func newINodeDeviceIdentifier(_ *common.Config) (fileIdentifier, error) { + return &inodeDeviceIdentifier{ + name: nativeName, + }, nil +} + +func (i *inodeDeviceIdentifier) GetSource(e loginp.FSEvent) fileSource { + return fileSource{ + info: e.Info, + newPath: e.NewPath, + oldPath: e.OldPath, + name: pluginName + identitySep + i.name + identitySep + file.GetOSState(e.Info).String(), + identifierGenerator: i.name, + } +} + +func (i *inodeDeviceIdentifier) Name() string { + return i.name +} + +type pathIdentifier struct { + name string +} + +func newPathIdentifier(_ *common.Config) (fileIdentifier, error) { + return &pathIdentifier{ + name: pathName, + }, nil +} + +func (p *pathIdentifier) GetSource(e loginp.FSEvent) fileSource { + return fileSource{ + info: e.Info, + newPath: e.NewPath, + oldPath: e.OldPath, + name: pluginName + identitySep + p.name + identitySep + e.NewPath, + identifierGenerator: p.name, + } +} + +func (p *pathIdentifier) Name() string { + return p.name +} + +// mockIdentifier is used for testing +type MockIdentifier struct{} + +func (m *MockIdentifier) GetSource(e loginp.FSEvent) fileSource { + return fileSource{identifierGenerator: "mock"} +} + +func (m *MockIdentifier) Name() string { return "mock" } diff --git a/filebeat/input/filestream/identifier_inode_deviceid.go b/filebeat/input/filestream/identifier_inode_deviceid.go new file mode 100644 index 00000000000..25254d97fdc --- /dev/null +++ b/filebeat/input/filestream/identifier_inode_deviceid.go @@ -0,0 +1,108 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build !windows + +package filestream + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "time" + + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/file" + "github.com/elastic/beats/v7/libbeat/logp" +) + +type inodeMarkerIdentifier struct { + log *logp.Logger + name string + markerPath string + + markerFileLastModifitaion time.Time + markerTxt string +} + +func newINodeMarkerIdentifier(cfg *common.Config) (fileIdentifier, error) { + var config struct { + MarkerPath string `config:"path" validate:"required"` + } + err := cfg.Unpack(&config) + if err != nil { + return nil, fmt.Errorf("error while reading configuration of INode + marker file configuration: %v", err) + } + + fi, err := os.Stat(config.MarkerPath) + if err != nil { + return nil, fmt.Errorf("error while opening marker file at %s: %v", config.MarkerPath, err) + } + markerContent, err := ioutil.ReadFile(config.MarkerPath) + if err != nil { + return nil, fmt.Errorf("error while reading marker file at %s: %v", config.MarkerPath, err) + } + return &inodeMarkerIdentifier{ + log: logp.NewLogger("inode_marker_identifier_" + filepath.Base(config.MarkerPath)), + name: inodeMarkerName, + markerPath: config.MarkerPath, + markerFileLastModifitaion: fi.ModTime(), + markerTxt: string(markerContent), + }, nil +} + +func (i *inodeMarkerIdentifier) markerContents() string { + f, err := os.Open(i.markerPath) + if err != nil { + i.log.Errorf("Failed to open marker file %s: %v", i.markerPath, err) + return "" + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + i.log.Errorf("Failed to fetch file information for %s: %v", i.markerPath, err) + return "" + } + if i.markerFileLastModifitaion.Before(fi.ModTime()) { + contents, err := ioutil.ReadFile(i.markerPath) + if err != nil { + i.log.Errorf("Error while reading contents of marker file: %v", err) + return "" + } + i.markerTxt = string(contents) + } + + return i.markerTxt +} + +func (i *inodeMarkerIdentifier) GetSource(e loginp.FSEvent) fileSource { + osstate := file.GetOSState(e.Info) + return fileSource{ + info: e.Info, + newPath: e.NewPath, + oldPath: e.OldPath, + name: fmt.Sprintf("%s%s%s-%s", i.name, identitySep, osstate.InodeString(), i.markerContents()), + identifierGenerator: i.name, + } +} + +func (i *inodeMarkerIdentifier) Name() string { + return i.name +} diff --git a/filebeat/input/filestream/identifier_inode_deviceid_windows.go b/filebeat/input/filestream/identifier_inode_deviceid_windows.go new file mode 100644 index 00000000000..4ee8d866124 --- /dev/null +++ b/filebeat/input/filestream/identifier_inode_deviceid_windows.go @@ -0,0 +1,30 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build windows + +package filestream + +import ( + "fmt" + + "github.com/elastic/beats/v7/libbeat/common" +) + +func newINodeMarkerIdentifier(cfg *common.Config) (fileIdentifier, error) { + return nil, fmt.Errorf("inode_deviceid is not supported on Windows") +} diff --git a/filebeat/input/filestream/input.go b/filebeat/input/filestream/input.go index 487a5f01c2a..bcd143c1c5a 100644 --- a/filebeat/input/filestream/input.go +++ b/filebeat/input/filestream/input.go @@ -29,6 +29,12 @@ import ( // are actively written by other applications. type filestream struct{} +type state struct { + Source string `json:"source" struct:"source"` + Offset int64 `json:"offset" struct:"offset"` + IdentifierName string `json:"identifier_name" struct:"identifier_name"` +} + const pluginName = "filestream" // Plugin creates a new filestream input plugin for creating a stateful input. diff --git a/filebeat/input/filestream/prospector.go b/filebeat/input/filestream/prospector.go index 257574b9ca1..94670e18ce7 100644 --- a/filebeat/input/filestream/prospector.go +++ b/filebeat/input/filestream/prospector.go @@ -18,19 +18,191 @@ package filestream import ( + "os" + "strings" + "time" + + "github.com/urso/sderr" + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/logp" "github.com/elastic/beats/v7/libbeat/statestore" + "github.com/elastic/go-concert/unison" +) + +const ( + prospectorDebugKey = "file_prospector" ) // fileProspector implements the Prospector interface. // It contains a file scanner which returns file system events. // The FS events then trigger either new Harvester runs or updates // the statestore. -type fileProspector struct{} +type fileProspector struct { + filewatcher loginp.FSWatcher + identifier fileIdentifier + ignoreOlder time.Duration + cleanRemoved bool +} + +func newFileProspector( + paths []string, + ignoreOlder time.Duration, + fileWatcherNs, identifierNs *common.ConfigNamespace, +) (loginp.Prospector, error) { + + filewatcher, err := newFileWatcher(paths, fileWatcherNs) + if err != nil { + return nil, err + } + + identifier, err := newFileIdentifier(identifierNs) + if err != nil { + return nil, err + } + + return &fileProspector{ + filewatcher: filewatcher, + identifier: identifier, + ignoreOlder: ignoreOlder, + cleanRemoved: true, + }, nil +} +// Run starts the fileProspector which accepts FS events from a file watcher. func (p *fileProspector) Run(ctx input.Context, s *statestore.Store, hg *loginp.HarvesterGroup) { - panic("TODO: implement me") + log := ctx.Logger.With("prospector", prospectorDebugKey) + log.Debug("Starting prospector") + defer log.Debug("Prospector has stopped") + + if p.cleanRemoved { + p.cleanRemovedBetweenRuns(log, s) + } + + p.updateIdentifiersBetweenRuns(log, s) + + var tg unison.MultiErrGroup + + tg.Go(func() error { + p.filewatcher.Run(ctx.Cancelation) + return nil + }) + + tg.Go(func() error { + for ctx.Cancelation.Err() == nil { + fe := p.filewatcher.Event() + + if fe.Op == loginp.OpDone { + return nil + } + + src := p.identifier.GetSource(fe) + switch fe.Op { + case loginp.OpCreate: + log.Debugf("A new file %s has been found", fe.NewPath) + + if p.ignoreOlder > 0 { + now := time.Now() + if now.Sub(fe.Info.ModTime()) > p.ignoreOlder { + log.Debugf("Ignore file because ignore_older reached. File %s", fe.NewPath) + break + } + } + + hg.Run(ctx, src) + + case loginp.OpWrite: + log.Debugf("File %s has been updated", fe.NewPath) + + hg.Run(ctx, src) + + case loginp.OpDelete: + log.Debugf("File %s has been removed", fe.OldPath) + + if p.cleanRemoved { + log.Debugf("Remove state for file as file removed: %s", fe.OldPath) + + err := s.Remove(src.Name()) + if err != nil { + log.Errorf("Error while removing state from statestore: %v", err) + } + } + + case loginp.OpRename: + log.Debugf("File %s has been renamed to %s", fe.OldPath, fe.NewPath) + // TODO update state information in the store + + default: + log.Error("Unkown return value %v", fe.Op) + } + } + return nil + }) + + errs := tg.Wait() + if len(errs) > 0 { + log.Error("%s", sderr.WrapAll(errs, "running prospector failed")) + } +} + +func (p *fileProspector) cleanRemovedBetweenRuns(log *logp.Logger, s *statestore.Store) { + keyPrefix := pluginName + "::" + s.Each(func(key string, dec statestore.ValueDecoder) (bool, error) { + if !strings.HasPrefix(string(key), keyPrefix) { + return true, nil + } + + var st state + if err := dec.Decode(&st); err != nil { + log.Errorf("Failed to read regisry state for '%v', cursor state will be ignored. Error was: %+v", + key, err) + return true, nil + } + + _, err := os.Stat(st.Source) + if err != nil { + s.Remove(key) + } + + return true, nil + }) +} + +func (p *fileProspector) updateIdentifiersBetweenRuns(log *logp.Logger, s *statestore.Store) { + keyPrefix := pluginName + "::" + s.Each(func(key string, dec statestore.ValueDecoder) (bool, error) { + if !strings.HasPrefix(string(key), keyPrefix) { + return true, nil + } + + var st state + if err := dec.Decode(&st); err != nil { + log.Errorf("Failed to read regisry state for '%v', cursor state will be ignored. Error was: %+v", key, err) + return true, nil + } + + if st.IdentifierName == p.identifier.Name() { + return true, nil + } + + fi, err := os.Stat(st.Source) + if err != nil { + return true, nil + } + newKey := p.identifier.GetSource(loginp.FSEvent{NewPath: st.Source, Info: fi}).Name() + st.IdentifierName = p.identifier.Name() + + err = s.Set(newKey, st) + if err != nil { + log.Errorf("Failed to add updated state for '%v', cursor state will be ignored. Error was: %+v", key, err) + return true, nil + } + s.Remove(key) + + return true, nil + }) } func (p *fileProspector) Test() error { From eb119c95c1c6300960b203fdae28c92603ff8145 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Mon, 5 Oct 2020 16:09:20 +0200 Subject: [PATCH 068/156] [Ingest Manager] Download asc from artifact store specified in spec (#21488) [Ingest Manager] Download asc from artifact store specified in spec (#21488) --- .../pkg/agent/application/upgrade/step_download.go | 2 +- .../elastic-agent/pkg/agent/operation/common_test.go | 2 +- .../elastic-agent/pkg/agent/operation/monitoring.go | 2 +- .../pkg/agent/operation/operation_verify.go | 2 +- .../pkg/artifact/download/composed/verifier.go | 4 ++-- .../pkg/artifact/download/fs/verifier.go | 2 +- .../pkg/artifact/download/fs/verifier_test.go | 6 +++--- .../pkg/artifact/download/http/elastic_test.go | 2 +- .../pkg/artifact/download/http/verifier.go | 12 ++++++------ .../elastic-agent/pkg/artifact/download/verifier.go | 2 +- 10 files changed, 18 insertions(+), 18 deletions(-) diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go index 28e93949fbf..9db442d3655 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go @@ -31,7 +31,7 @@ func (u *Upgrader) downloadArtifact(ctx context.Context, version, sourceURI stri return "", errors.New(err, "failed upgrade of agent binary") } - matches, err := verifier.Verify(agentName, version) + matches, err := verifier.Verify(agentName, version, agentArtifactName) if err != nil { return "", errors.New(err, "failed verification of agent binary") } diff --git a/x-pack/elastic-agent/pkg/agent/operation/common_test.go b/x-pack/elastic-agent/pkg/agent/operation/common_test.go index cc17733c656..6e9b042fe92 100644 --- a/x-pack/elastic-agent/pkg/agent/operation/common_test.go +++ b/x-pack/elastic-agent/pkg/agent/operation/common_test.go @@ -143,7 +143,7 @@ var _ download.Downloader = &DummyDownloader{} type DummyVerifier struct{} -func (*DummyVerifier) Verify(p, v string) (bool, error) { +func (*DummyVerifier) Verify(p, v, _ string) (bool, error) { return true, nil } diff --git a/x-pack/elastic-agent/pkg/agent/operation/monitoring.go b/x-pack/elastic-agent/pkg/agent/operation/monitoring.go index fe33de852d1..c4d895eb6ee 100644 --- a/x-pack/elastic-agent/pkg/agent/operation/monitoring.go +++ b/x-pack/elastic-agent/pkg/agent/operation/monitoring.go @@ -161,7 +161,7 @@ func (o *Operator) generateMonitoringSteps(version string, output interface{}) [ ProgramSpec: program.Spec{ Name: metricsProcessName, Cmd: metricsProcessName, - Artifact: fmt.Sprintf("%s/%s", artifactPrefix, logsProcessName), + Artifact: fmt.Sprintf("%s/%s", artifactPrefix, metricsProcessName), }, Meta: map[string]interface{}{ configrequest.MetaConfigKey: mbConfig, diff --git a/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go b/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go index 289693ca373..97cf906cace 100644 --- a/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go +++ b/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go @@ -66,7 +66,7 @@ func (o *operationVerify) Run(_ context.Context, application Application) (err e } }() - isVerified, err := o.verifier.Verify(o.program.BinaryName(), o.program.Version()) + isVerified, err := o.verifier.Verify(o.program.BinaryName(), o.program.Version(), o.program.ArtifactName()) if err != nil { return errors.New(err, fmt.Sprintf("operation '%s' failed to verify %s.%s", o.Name(), o.program.BinaryName(), o.program.Version()), diff --git a/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go index 33397a87e1e..9d6c4477733 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go @@ -29,11 +29,11 @@ func NewVerifier(verifiers ...download.Verifier) *Verifier { } // Verify checks the package from configured source. -func (e *Verifier) Verify(programName, version string) (bool, error) { +func (e *Verifier) Verify(programName, version, artifactName string) (bool, error) { var err error for _, v := range e.vv { - b, e := v.Verify(programName, version) + b, e := v.Verify(programName, version, artifactName) if e == nil { return b, nil } diff --git a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go index d934b20faef..09462ef3f23 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go @@ -51,7 +51,7 @@ func NewVerifier(config *artifact.Config, allowEmptyPgp bool, pgp []byte) (*Veri // Verify checks downloaded package on preconfigured // location agains a key stored on elastic.co website. -func (v *Verifier) Verify(programName, version string) (bool, error) { +func (v *Verifier) Verify(programName, version, artifactName string) (bool, error) { filename, err := artifact.GetArtifactName(programName, version, v.config.OS(), v.config.Arch()) if err != nil { return false, errors.New(err, "retrieving package name") diff --git a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go index 4fd845482c5..975d9ecb14d 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go +++ b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go @@ -65,7 +65,7 @@ func TestFetchVerify(t *testing.T) { // first download verify should fail: // download skipped, as invalid package is prepared upfront // verify fails and cleans download - matches, err := verifier.Verify(programName, version) + matches, err := verifier.Verify(programName, version, artifactName) assert.NoError(t, err) assert.Equal(t, false, matches) @@ -88,7 +88,7 @@ func TestFetchVerify(t *testing.T) { _, err = os.Stat(hashTargetFilePath) assert.NoError(t, err) - matches, err = verifier.Verify(programName, version) + matches, err = verifier.Verify(programName, version, artifactName) assert.NoError(t, err) assert.Equal(t, true, matches) } @@ -162,7 +162,7 @@ func TestVerify(t *testing.T) { t.Fatal(err) } - isOk, err := testVerifier.Verify(beatName, version) + isOk, err := testVerifier.Verify(beatName, version, artifactName) if err != nil { t.Fatal(err) } diff --git a/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go b/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go index 0edb979a320..fec1d991c88 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go +++ b/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go @@ -110,7 +110,7 @@ func TestVerify(t *testing.T) { t.Fatal(err) } - isOk, err := testVerifier.Verify(beatName, version) + isOk, err := testVerifier.Verify(beatName, version, artifactName) if err != nil { t.Fatal(err) } diff --git a/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go index 9f2eacd9395..c0dfef9b30e 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go @@ -59,7 +59,7 @@ func NewVerifier(config *artifact.Config, allowEmptyPgp bool, pgp []byte) (*Veri // Verify checks downloaded package on preconfigured // location agains a key stored on elastic.co website. -func (v *Verifier) Verify(programName, version string) (bool, error) { +func (v *Verifier) Verify(programName, version, artifactName string) (bool, error) { // TODO: think about verifying asc for prepacked beats filename, err := artifact.GetArtifactName(programName, version, v.config.OS(), v.config.Arch()) @@ -81,7 +81,7 @@ func (v *Verifier) Verify(programName, version string) (bool, error) { return isMatch, err } - return v.verifyAsc(programName, version) + return v.verifyAsc(programName, version, artifactName) } func (v *Verifier) verifyHash(filename, fullPath string) (bool, error) { @@ -127,7 +127,7 @@ func (v *Verifier) verifyHash(filename, fullPath string) (bool, error) { return expectedHash == computedHash, nil } -func (v *Verifier) verifyAsc(programName, version string) (bool, error) { +func (v *Verifier) verifyAsc(programName, version, artifactName string) (bool, error) { if len(v.pgpBytes) == 0 { // no pgp available skip verification process return true, nil @@ -143,7 +143,7 @@ func (v *Verifier) verifyAsc(programName, version string) (bool, error) { return false, errors.New(err, "retrieving package path") } - ascURI, err := v.composeURI(programName, filename) + ascURI, err := v.composeURI(filename, artifactName) if err != nil { return false, errors.New(err, "composing URI for fetching asc file", errors.TypeNetwork) } @@ -177,7 +177,7 @@ func (v *Verifier) verifyAsc(programName, version string) (bool, error) { } -func (v *Verifier) composeURI(programName, filename string) (string, error) { +func (v *Verifier) composeURI(filename, artifactName string) (string, error) { upstream := v.config.SourceURI if !strings.HasPrefix(upstream, "http") && !strings.HasPrefix(upstream, "file") && !strings.HasPrefix(upstream, "/") { // always default to https @@ -190,7 +190,7 @@ func (v *Verifier) composeURI(programName, filename string) (string, error) { return "", errors.New(err, "invalid upstream URI", errors.TypeNetwork, errors.M(errors.MetaKeyURI, upstream)) } - uri.Path = path.Join(uri.Path, "beats", programName, filename+ascSuffix) + uri.Path = path.Join(uri.Path, artifactName, filename+ascSuffix) return uri.String(), nil } diff --git a/x-pack/elastic-agent/pkg/artifact/download/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/verifier.go index 6aa4dc4abe4..491979514ea 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/verifier.go @@ -6,5 +6,5 @@ package download // Verifier is an interface verifying GPG key of a downloaded artifact type Verifier interface { - Verify(programName, version string) (bool, error) + Verify(programName, version, artifactName string) (bool, error) } From 641d02f5feab7b959e8013821b2e1144c92a43dd Mon Sep 17 00:00:00 2001 From: Marius Iversen Date: Mon, 5 Oct 2020 16:52:50 +0200 Subject: [PATCH 069/156] [Filebeat][New Fileset] Cisco Umbrella support (#21504) * initial MVP push for cisco umbrella * Initial commit for Cisco Umbrella ready for review * updating some wording in the cisco docs for umbrella --- filebeat/docs/fields.asciidoc | 147 +++++++++++ filebeat/docs/modules/cisco.asciidoc | 59 ++++- .../filebeat/module/cisco/_meta/docs.asciidoc | 59 ++++- x-pack/filebeat/module/cisco/fields.go | 2 +- .../module/cisco/umbrella/_meta/fields.yml | 61 +++++ .../module/cisco/umbrella/config/input.yml | 23 ++ .../module/cisco/umbrella/ingest/pipeline.yml | 246 ++++++++++++++++++ .../module/cisco/umbrella/manifest.yml | 8 + .../test/umbrella-cloudfirewalllogs.log | 2 + ...brella-cloudfirewalllogs.log-expected.json | 74 ++++++ .../cisco/umbrella/test/umbrella-dnslogs.log | 2 + .../test/umbrella-dnslogs.log-expected.json | 92 +++++++ .../cisco/umbrella/test/umbrella-iplogs.log | 2 + .../test/umbrella-iplogs.log-expected.json | 60 +++++ .../umbrella/test/umbrella-proxylogs.log | 3 + .../test/umbrella-proxylogs.log-expected.json | 115 ++++++++ 16 files changed, 952 insertions(+), 3 deletions(-) create mode 100644 x-pack/filebeat/module/cisco/umbrella/_meta/fields.yml create mode 100644 x-pack/filebeat/module/cisco/umbrella/config/input.yml create mode 100644 x-pack/filebeat/module/cisco/umbrella/ingest/pipeline.yml create mode 100644 x-pack/filebeat/module/cisco/umbrella/manifest.yml create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log-expected.json create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log-expected.json create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log-expected.json create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log create mode 100644 x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log-expected.json diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index 8a145ff8724..b66c1163367 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -26581,6 +26581,153 @@ type: keyword -- This key captures values or decorators used within a registry entry +type: keyword + +-- + +[float] +=== cisco.umbrella + +Fields for Cisco Umbrella. + + + +*`cisco.umbrella.identities`*:: ++ +-- +An array of the different identities related to the event. + + +type: keyword + +-- + +*`cisco.umbrella.categories`*:: ++ +-- +The security or content categories that the destination matches. + + +type: keyword + +-- + +*`cisco.umbrella.policy_identity_type`*:: ++ +-- +The first identity type matched with this request. Available in version 3 and above. + + +type: keyword + +-- + +*`cisco.umbrella.identity_types`*:: ++ +-- +The type of identity that made the request. For example, Roaming Computer or Network. + + +type: keyword + +-- + +*`cisco.umbrella.blocked_categories`*:: ++ +-- +The categories that resulted in the destination being blocked. Available in version 4 and above. + + +type: keyword + +-- + +*`cisco.umbrella.content_type`*:: ++ +-- +The type of web content, typically text/html. + + +type: keyword + +-- + +*`cisco.umbrella.sha_sha256`*:: ++ +-- +Hex digest of the response content. + + +type: keyword + +-- + +*`cisco.umbrella.av_detections`*:: ++ +-- +The detection name according to the antivirus engine used in file inspection. + + +type: keyword + +-- + +*`cisco.umbrella.puas`*:: ++ +-- +A list of all potentially unwanted application (PUA) results for the proxied file as returned by the antivirus scanner. + + +type: keyword + +-- + +*`cisco.umbrella.amp_disposition`*:: ++ +-- +The status of the files proxied and scanned by Cisco Advanced Malware Protection (AMP) as part of the Umbrella File Inspection feature; can be Clean, Malicious or Unknown. + + +type: keyword + +-- + +*`cisco.umbrella.amp_malware_name`*:: ++ +-- +If Malicious, the name of the malware according to AMP. + + +type: keyword + +-- + +*`cisco.umbrella.amp_score`*:: ++ +-- +The score of the malware from AMP. This field is not currently used and will be blank. + + +type: keyword + +-- + +*`cisco.umbrella.datacenter`*:: ++ +-- +The name of the Umbrella Data Center that processed the user-generated traffic. + + +type: keyword + +-- + +*`cisco.umbrella.origin_id`*:: ++ +-- +The unique identity of the network tunnel. + + type: keyword -- diff --git a/filebeat/docs/modules/cisco.asciidoc b/filebeat/docs/modules/cisco.asciidoc index c12f818caca..d087826245e 100644 --- a/filebeat/docs/modules/cisco.asciidoc +++ b/filebeat/docs/modules/cisco.asciidoc @@ -10,13 +10,15 @@ This file is generated! See scripts/docs_collector.py == Cisco module -This is a module for Cisco network device's logs. It includes the following +This is a module for Cisco network device's logs and Cisco Umbrella. It includes the following filesets for receiving logs over syslog or read from a file: - `asa` fileset: supports Cisco ASA firewall logs. - `ftd` fileset: supports Cisco Firepower Threat Defense logs. - `ios` fileset: supports Cisco IOS router and switch logs. - `nexus` fileset: supports Cisco Nexus switch logs. +- `meraki` fileset: supports Cisco Meraki logs. +- `umbrella` fileset: supports Cisco Umbrella logs. Cisco ASA devices also support exporting flow records using NetFlow, which is supported by the {filebeat-ref}/filebeat-module-netflow.html[netflow module] in @@ -32,6 +34,8 @@ The module is by default configured to run via syslog on port 9001 for ASA and port 9002 for IOS. However it can also be configured to read from a file path. See the following example. +Cisco Umbrella publishes its logs in a compressed CSV format to a S3 bucket. + ["source","yaml",subs="attributes"] ----- - module: cisco @@ -379,6 +383,59 @@ will be found under `rsa.raw`. The default is false. :fileset_ex!: +[float] +==== `umbrella` fileset settings + +The Cisco Umbrella fileset primarily focuses on reading CSV files from an S3 bucket using the filebeat S3 input. + +To configure Cisco Umbrella to log to either your own S3 bucket or one that is managed by Cisco please follow the https://docs.umbrella.com/deployment-umbrella/docs/log-management[Cisco Umbrella User Guide.] + +This fileset supports all 4 log types: +- Proxy +- Cloud Firewall +- IP Logs +- DNS logs + +The Cisco Umbrella fileset depends on the original file path structure being followed. This structure is documented https://docs.umbrella.com/deployment-umbrella/docs/log-formats-and-versioning[Umbrella Log Formats and Versioning]: + +/--

/--
---.csv.gz +dnslogs/--/----.csv.gz + +When configuring the fileset, please ensure that the Queue URL is set to the root folder that includes each of these subfolders above. + +Example config: + +[source,yaml] +---- +- module: cisco + umbrella: + enabled: true + var.input: s3 + var.queue_url: https://sqs.us-east-1.amazonaws.com/ID/CiscoQueue + var.access_key_id: 123456 + var.secret_access_key: PASSWORD +---- + +*`var.input`*:: + +The input from which messages are read. Can be S3 or file. + +*`var.queue_url`*:: + +The URL to the SQS queue if the input type is S3. + +*`var.access_key_id`*:: + +The ID for the access key used to read from the SQS queue. + +*`var.secret_access_key`*:: + +The secret token used for authenticating to the SQS queue. + +:has-dashboards!: + +:fileset_ex!: + [float] === Example dashboard diff --git a/x-pack/filebeat/module/cisco/_meta/docs.asciidoc b/x-pack/filebeat/module/cisco/_meta/docs.asciidoc index 08dc160fab0..aaf285680e0 100644 --- a/x-pack/filebeat/module/cisco/_meta/docs.asciidoc +++ b/x-pack/filebeat/module/cisco/_meta/docs.asciidoc @@ -5,13 +5,15 @@ == Cisco module -This is a module for Cisco network device's logs. It includes the following +This is a module for Cisco network device's logs and Cisco Umbrella. It includes the following filesets for receiving logs over syslog or read from a file: - `asa` fileset: supports Cisco ASA firewall logs. - `ftd` fileset: supports Cisco Firepower Threat Defense logs. - `ios` fileset: supports Cisco IOS router and switch logs. - `nexus` fileset: supports Cisco Nexus switch logs. +- `meraki` fileset: supports Cisco Meraki logs. +- `umbrella` fileset: supports Cisco Umbrella logs. Cisco ASA devices also support exporting flow records using NetFlow, which is supported by the {filebeat-ref}/filebeat-module-netflow.html[netflow module] in @@ -27,6 +29,8 @@ The module is by default configured to run via syslog on port 9001 for ASA and port 9002 for IOS. However it can also be configured to read from a file path. See the following example. +Cisco Umbrella publishes its logs in a compressed CSV format to a S3 bucket. + ["source","yaml",subs="attributes"] ----- - module: cisco @@ -374,6 +378,59 @@ will be found under `rsa.raw`. The default is false. :fileset_ex!: +[float] +==== `umbrella` fileset settings + +The Cisco Umbrella fileset primarily focuses on reading CSV files from an S3 bucket using the filebeat S3 input. + +To configure Cisco Umbrella to log to either your own S3 bucket or one that is managed by Cisco please follow the https://docs.umbrella.com/deployment-umbrella/docs/log-management[Cisco Umbrella User Guide.] + +This fileset supports all 4 log types: +- Proxy +- Cloud Firewall +- IP Logs +- DNS logs + +The Cisco Umbrella fileset depends on the original file path structure being followed. This structure is documented https://docs.umbrella.com/deployment-umbrella/docs/log-formats-and-versioning[Umbrella Log Formats and Versioning]: + +/--
/--
---.csv.gz +dnslogs/--/----.csv.gz + +When configuring the fileset, please ensure that the Queue URL is set to the root folder that includes each of these subfolders above. + +Example config: + +[source,yaml] +---- +- module: cisco + umbrella: + enabled: true + var.input: s3 + var.queue_url: https://sqs.us-east-1.amazonaws.com/ID/CiscoQueue + var.access_key_id: 123456 + var.secret_access_key: PASSWORD +---- + +*`var.input`*:: + +The input from which messages are read. Can be S3 or file. + +*`var.queue_url`*:: + +The URL to the SQS queue if the input type is S3. + +*`var.access_key_id`*:: + +The ID for the access key used to read from the SQS queue. + +*`var.secret_access_key`*:: + +The secret token used for authenticating to the SQS queue. + +:has-dashboards!: + +:fileset_ex!: + [float] === Example dashboard diff --git a/x-pack/filebeat/module/cisco/fields.go b/x-pack/filebeat/module/cisco/fields.go index fac83c30f27..de57daee50f 100644 --- a/x-pack/filebeat/module/cisco/fields.go +++ b/x-pack/filebeat/module/cisco/fields.go @@ -19,5 +19,5 @@ func init() { // AssetCisco returns asset data. // This is the base64 encoded gzipped contents of module/cisco. func AssetCisco() string { - return "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" + return "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" } diff --git a/x-pack/filebeat/module/cisco/umbrella/_meta/fields.yml b/x-pack/filebeat/module/cisco/umbrella/_meta/fields.yml new file mode 100644 index 00000000000..e45d12ef732 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/_meta/fields.yml @@ -0,0 +1,61 @@ +- name: cisco.umbrella + type: group + description: > + Fields for Cisco Umbrella. + fields: + - name: identities + type: keyword + description: > + An array of the different identities related to the event. + - name: categories + type: keyword + description: > + The security or content categories that the destination matches. + - name: policy_identity_type + type: keyword + description: > + The first identity type matched with this request. Available in version 3 and above. + - name: identity_types + type: keyword + description: > + The type of identity that made the request. For example, Roaming Computer or Network. + - name: blocked_categories + type: keyword + description: > + The categories that resulted in the destination being blocked. Available in version 4 and above. + - name: content_type + type: keyword + description: > + The type of web content, typically text/html. + - name: sha_sha256 + type: keyword + description: > + Hex digest of the response content. + - name: av_detections + type: keyword + description: > + The detection name according to the antivirus engine used in file inspection. + - name: puas + type: keyword + description: > + A list of all potentially unwanted application (PUA) results for the proxied file as returned by the antivirus scanner. + - name: amp_disposition + type: keyword + description: > + The status of the files proxied and scanned by Cisco Advanced Malware Protection (AMP) as part of the Umbrella File Inspection feature; can be Clean, Malicious or Unknown. + - name: amp_malware_name + type: keyword + description: > + If Malicious, the name of the malware according to AMP. + - name: amp_score + type: keyword + description: > + The score of the malware from AMP. This field is not currently used and will be blank. + - name: datacenter + type: keyword + description: > + The name of the Umbrella Data Center that processed the user-generated traffic. + - name: origin_id + type: keyword + description: > + The unique identity of the network tunnel. diff --git a/x-pack/filebeat/module/cisco/umbrella/config/input.yml b/x-pack/filebeat/module/cisco/umbrella/config/input.yml new file mode 100644 index 00000000000..8b0ccde6e2e --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/config/input.yml @@ -0,0 +1,23 @@ +{{ if eq .input "s3" }} + +type: s3 +queue_url: {{ .queue_url }} +access_key_id: {{ .access_key_id }} +secret_access_key: {{ .secret_access_key }} + +{{ else if eq .input "file" }} + +type: log +paths: +{{ range $i, $path := .paths }} + - {{$path}} +{{ end }} +exclude_files: [".gz$"] + +{{ end }} + +processors: +- add_fields: + target: '' + fields: + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/cisco/umbrella/ingest/pipeline.yml b/x-pack/filebeat/module/cisco/umbrella/ingest/pipeline.yml new file mode 100644 index 00000000000..2a602ff2331 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/ingest/pipeline.yml @@ -0,0 +1,246 @@ +description: Pipeline for parsing cisco umbrella logs +processors: +- set: + field: observer.vendor + value: Cisco +- set: + field: observer.product + value: Umbrella +- set: + field: event.ingested + value: "{{_ingest.timestamp}}" +- set: + field: event.original + value: "{{message}}" +############ +# DNS Logs # +############ +- csv: + field: message + target_fields: + - cisco.umbrella._tmp_time + - source.user.name + - cisco.umbrella.identities + - source.address + - destination.address + - cisco.umbrella.action + - dns.question.type + - dns.response_code + - destination.domain + - cisco.umbrella.categories + - cisco.umbrella.policy_identity_type + - cisco.umbrella.identity_types + - cisco.umbrella.blocked_categories + if: ctx?.log?.file?.path.contains('dnslogs') + +- set: + field: observer.type + value: dns + if: ctx?.log?.file?.path.contains('dnslogs') +########### +# IP Logs # +########### +- csv: + field: message + target_fields: + - cisco.umbrella._tmp_time + - source.user.name + - source.address + - source.port + - destination.address + - destination.port + - cisco.umbrella.categories + if: ctx?.log?.file?.path.contains('iplogs') + +- set: + field: observer.type + value: firewall + if: ctx?.log?.file?.path.contains('iplogs') + +############## +# Proxy Logs # +############## +- csv: + field: message + target_fields: + - cisco.umbrella._tmp_time + - cisco.umbrella.identities + - source.address + - source.nat.ip + - destination.address + - cisco.umbrella.content_type + - cisco.umbrella.verdict + - url.full + - http.request.referrer + - user_agent.original + - http.response.status_code + - http.request.bytes + - http.response.bytes + - http.response.body.bytes + - cisco.umbrella.sha_sha256 + - cisco.umbrella.categories + - cisco.umbrella.av_detections + - cisco.umbrella.puas + - cisco.umbrella.amp_disposition + - cisco.umbrella.amp_malware_name + - cisco.umbrella.amp_score + - cisco.umbrella.identity_types + - cisco.umbrella.blocked_categories + if: ctx?.log?.file?.path.contains('proxylogs') + +- set: + field: observer.type + value: proxy + if: ctx?.log?.file?.path.contains('proxylogs') + +####################### +# Cloud Firewall Logs # +####################### +- csv: + field: message + target_fields: + - cisco.umbrella._tmp_time + - cisco.umbrella.origin_id + - source.user.name + - cisco.umbrella.identity_types + - cisco.umbrella.direction + - network.transport + - source.bytes + - source.address + - source.port + - destination.address + - destination.port + - cisco.umbrella.datacenter + - cisco.umbrella.ruleid + - cisco.umbrella.verdict + if: ctx?.log?.file?.path.contains('cloudfirewalllogs') + +- set: + field: observer.type + value: firewall + if: ctx?.log?.file?.path.contains('cloudfirewalllogs') + +# Identifies is a field that includes any sort of username, device or other asset that is included in the request. +# Converting this to an array to make it easier to use in searches and visualizations +- split: + field: cisco.umbrella.identities + separator: "," + preserve_trailing: false + if: "ctx?.log?.file?.path.contains('dnslogs') && ctx?.cisco?.umbrella?.identities != null" + +###################### +# General ECS Fields # +###################### +# This field is always in UTC, so no timezone should need to be set +- date: + field: cisco.umbrella._tmp_time + target_field: "@timestamp" + formats: + - "yyyy-MM-dd HH:mm:ss" + +################## +# DNS ECS Fields # +################## +- set: + field: dns.type + value: query + if: ctx?.cisco?.umbrella?.action != null + +###################### +# Network ECS Fields # +###################### +- lowercase: + field: cisco.umbrella.direction + target_field: network.direction + if: ctx?.cisco?.umbrella?.direction != null + +################### +# Rule ECS Fields # +################### +- rename: + field: cisco.umbrella.ruleid + target_field: rule.id + if: ctx?.cisco?.umbrella?.ruleid != null + +#################### +# Event ECS Fields # +#################### +- set: + field: event.action + value: "dns-request-{{cisco.umbrella.action}}" + if: ctx?.cisco?.umbrella?.action != null +- set: + field: event.category + value: network + if: ctx?.cisco?.umbrella?.action != null +- append: + field: event.type + value: allowed + if: "ctx?.cisco?.umbrella?.action == 'Allowed' || ctx?.cisco?.umbrella?.verdict == 'ALLOWED' || ctx?.cisco?.umbrella?.verdict == 'ALLOW'" +- append: + field: event.type + value: denied + if: "ctx?.cisco?.umbrella?.action == 'Blocked' || ctx?.cisco?.umbrella?.verdict == 'BLOCKED' || ctx?.cisco?.umbrella?.verdict == 'BLOCK'" +- append: + field: event.type + value: connection + if: ctx?.cisco?.umbrella?.action != null + +# Converting address fields to either ip or domain +- grok: + field: source.address + patterns: + - "(?:%{IP:source.ip}|%{GREEDYDATA:source.domain})" + ignore_failure: true +- grok: + field: destination.address + patterns: + - "(?:%{IP:destination.ip}|%{GREEDYDATA:destination.domain})" + ignore_failure: true + +###################### +# Related ECS Fields # +###################### +- append: + field: related.user + value: "{{source.user.name}}" + if: ctx?.source?.user?.name != null +- append: + field: related.ip + value: "{{source.ip}}" + if: ctx?.source?.ip != null +- append: + field: related.ip + value: "{{source.nat.ip}}" + if: ctx?.source?.nat?.ip != null +- append: + field: related.ip + value: "{{destination.ip}}" + if: ctx?.destination?.ip != null +- append: + field: related.hosts + value: "{{source.domain}}" + if: ctx?.source?.domain != null +- append: + field: related.hosts + value: "{{destination.domain}}" + if: ctx?.destination?.domain != null +- append: + field: related.hash + value: "{{cisco.umbrella.sha_sha256}}" + if: ctx?.cisco?.umbrella?.sha_sha256 != null + +########### +# Cleanup # +########### +- remove: + field: + - cisco.umbrella._tmp_time + - cisco.umbrella.direction + - cisco.umbrella.action + - cisco.umbrella.verdict + ignore_missing: true +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/cisco/umbrella/manifest.yml b/x-pack/filebeat/module/cisco/umbrella/manifest.yml new file mode 100644 index 00000000000..3a7150e714d --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/manifest.yml @@ -0,0 +1,8 @@ +module_version: "1.0" + +var: + - name: tags + default: [cisco-umbrella, forwarded] + +ingest_pipeline: ingest/pipeline.yml +input: config/input.yml diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log new file mode 100644 index 00000000000..3e5f23fced2 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log @@ -0,0 +1,2 @@ +2020-07-23 18:03:46,[211039844],Passive Monitor,CDFW Tunnel Device,OUTBOUND,1,84,172.17.3.4,,146.112.255.129,,ams1.edc,12,ALLOW +2020-07-23 18:03:46,[211039844],Passive Monitor,CDFW Tunnel Device,INBOUND,1,84,172.17.3.4,,146.112.255.129,,ams1.edc,12,BLOCK diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log-expected.json b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log-expected.json new file mode 100644 index 00000000000..65aabab5a88 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-cloudfirewalllogs.log-expected.json @@ -0,0 +1,74 @@ +[ + { + "@timestamp": "2020-07-23T18:03:46.000Z", + "cisco.umbrella.datacenter": "ams1.edc", + "cisco.umbrella.identity_types": "CDFW Tunnel Device", + "cisco.umbrella.origin_id": "[211039844]", + "destination.address": "146.112.255.129", + "destination.ip": "146.112.255.129", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "2020-07-23 18:03:46,[211039844],Passive Monitor,CDFW Tunnel Device,OUTBOUND,1,84,172.17.3.4,,146.112.255.129,,ams1.edc,12,ALLOW", + "event.type": [ + "allowed" + ], + "fileset.name": "umbrella", + "input.type": "log", + "log.offset": 0, + "message": "2020-07-23 18:03:46,[211039844],Passive Monitor,CDFW Tunnel Device,OUTBOUND,1,84,172.17.3.4,,146.112.255.129,,ams1.edc,12,ALLOW", + "network.direction": "outbound", + "network.transport": "1", + "observer.product": "Umbrella", + "observer.type": "firewall", + "observer.vendor": "Cisco", + "related.ip": [ + "172.17.3.4", + "146.112.255.129" + ], + "related.user": [ + "Passive Monitor" + ], + "rule.id": "12", + "service.type": "cisco", + "source.address": "172.17.3.4", + "source.bytes": "84", + "source.ip": "172.17.3.4", + "source.user.name": "Passive Monitor" + }, + { + "@timestamp": "2020-07-23T18:03:46.000Z", + "cisco.umbrella.datacenter": "ams1.edc", + "cisco.umbrella.identity_types": "CDFW Tunnel Device", + "cisco.umbrella.origin_id": "[211039844]", + "destination.address": "146.112.255.129", + "destination.ip": "146.112.255.129", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "2020-07-23 18:03:46,[211039844],Passive Monitor,CDFW Tunnel Device,INBOUND,1,84,172.17.3.4,,146.112.255.129,,ams1.edc,12,BLOCK", + "event.type": [ + "denied" + ], + "fileset.name": "umbrella", + "input.type": "log", + "log.offset": 128, + "message": "2020-07-23 18:03:46,[211039844],Passive Monitor,CDFW Tunnel Device,INBOUND,1,84,172.17.3.4,,146.112.255.129,,ams1.edc,12,BLOCK", + "network.direction": "inbound", + "network.transport": "1", + "observer.product": "Umbrella", + "observer.type": "firewall", + "observer.vendor": "Cisco", + "related.ip": [ + "172.17.3.4", + "146.112.255.129" + ], + "related.user": [ + "Passive Monitor" + ], + "rule.id": "12", + "service.type": "cisco", + "source.address": "172.17.3.4", + "source.bytes": "84", + "source.ip": "172.17.3.4", + "source.user.name": "Passive Monitor" + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log new file mode 100644 index 00000000000..403c1c9df33 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log @@ -0,0 +1,2 @@ +"2020-07-23 23:49:54","elasticuser","elasticuser2","some other identity","192.168.1.1","8.8.8.8","Allowed","1 (A)","NOERROR","elastic.co.","Software/Technology,Business Services,Application","Test Policy Name","SomeIdentityType","" +"2020-07-23 23:50:25","elasticuser","elasticuser2","some other identity","192.168.1.1","4.4.4.4","Blocked","1 (A)","NOERROR","elastic.co/something.","Chat,Instant Messaging,Block List,Application","Test Policy Name","SomeIdentityType","BlockedCategories" diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log-expected.json b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log-expected.json new file mode 100644 index 00000000000..81b1478da27 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-dnslogs.log-expected.json @@ -0,0 +1,92 @@ +[ + { + "@timestamp": "2020-07-23T23:49:54.000Z", + "cisco.umbrella.blocked_categories": "SomeIdentityType", + "cisco.umbrella.categories": "elastic.co.", + "cisco.umbrella.identities": [ + "elasticuser2" + ], + "cisco.umbrella.identity_types": "Test Policy Name", + "cisco.umbrella.policy_identity_type": "Software/Technology,Business Services,Application", + "destination.address": "192.168.1.1", + "destination.domain": "NOERROR", + "destination.ip": "192.168.1.1", + "dns.question.type": "Allowed", + "dns.response_code": "1 (A)", + "dns.type": "query", + "event.action": "dns-request-8.8.8.8", + "event.category": "network", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "\\\"2020-07-23 23:49:54\\\",\\\"elasticuser\\\",\\\"elasticuser2\\\",\\\"some other identity\\\",\\\"192.168.1.1\\\",\\\"8.8.8.8\\\",\\\"Allowed\\\",\\\"1 (A)\\\",\\\"NOERROR\\\",\\\"elastic.co.\\\",\\\"Software/Technology,Business Services,Application\\\",\\\"Test Policy Name\\\",\\\"SomeIdentityType\\\",\\\"\\\"", + "event.type": [ + "connection" + ], + "fileset.name": "umbrella", + "input.type": "log", + "log.offset": 0, + "message": "\"2020-07-23 23:49:54\",\"elasticuser\",\"elasticuser2\",\"some other identity\",\"192.168.1.1\",\"8.8.8.8\",\"Allowed\",\"1 (A)\",\"NOERROR\",\"elastic.co.\",\"Software/Technology,Business Services,Application\",\"Test Policy Name\",\"SomeIdentityType\",\"\"", + "observer.product": "Umbrella", + "observer.type": "dns", + "observer.vendor": "Cisco", + "related.hosts": [ + "some other identity", + "NOERROR" + ], + "related.ip": [ + "192.168.1.1" + ], + "related.user": [ + "elasticuser" + ], + "service.type": "cisco", + "source.address": "some other identity", + "source.domain": "some other identity", + "source.user.name": "elasticuser" + }, + { + "@timestamp": "2020-07-23T23:50:25.000Z", + "cisco.umbrella.blocked_categories": "SomeIdentityType", + "cisco.umbrella.categories": "elastic.co/something.", + "cisco.umbrella.identities": [ + "elasticuser2" + ], + "cisco.umbrella.identity_types": "Test Policy Name", + "cisco.umbrella.policy_identity_type": "Chat,Instant Messaging,Block List,Application", + "destination.address": "192.168.1.1", + "destination.domain": "NOERROR", + "destination.ip": "192.168.1.1", + "dns.question.type": "Blocked", + "dns.response_code": "1 (A)", + "dns.type": "query", + "event.action": "dns-request-4.4.4.4", + "event.category": "network", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "\\\"2020-07-23 23:50:25\\\",\\\"elasticuser\\\",\\\"elasticuser2\\\",\\\"some other identity\\\",\\\"192.168.1.1\\\",\\\"4.4.4.4\\\",\\\"Blocked\\\",\\\"1 (A)\\\",\\\"NOERROR\\\",\\\"elastic.co/something.\\\",\\\"Chat,Instant Messaging,Block List,Application\\\",\\\"Test Policy Name\\\",\\\"SomeIdentityType\\\",\\\"BlockedCategories\\\"", + "event.type": [ + "connection" + ], + "fileset.name": "umbrella", + "input.type": "log", + "log.offset": 232, + "message": "\"2020-07-23 23:50:25\",\"elasticuser\",\"elasticuser2\",\"some other identity\",\"192.168.1.1\",\"4.4.4.4\",\"Blocked\",\"1 (A)\",\"NOERROR\",\"elastic.co/something.\",\"Chat,Instant Messaging,Block List,Application\",\"Test Policy Name\",\"SomeIdentityType\",\"BlockedCategories\"", + "observer.product": "Umbrella", + "observer.type": "dns", + "observer.vendor": "Cisco", + "related.hosts": [ + "some other identity", + "NOERROR" + ], + "related.ip": [ + "192.168.1.1" + ], + "related.user": [ + "elasticuser" + ], + "service.type": "cisco", + "source.address": "some other identity", + "source.domain": "some other identity", + "source.user.name": "elasticuser" + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log new file mode 100644 index 00000000000..6200aeab3ae --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log @@ -0,0 +1,2 @@ +"2020-08-26 20:32:46","elasticuser","192.168.1.1","0","8.8.8.8","0","Test Category" +"2020-08-26 20:32:45","elasticuser","192.168.1.1","61095","8.8.8.8","445","Test Category" diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log-expected.json b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log-expected.json new file mode 100644 index 00000000000..4d25464cb61 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-iplogs.log-expected.json @@ -0,0 +1,60 @@ +[ + { + "@timestamp": "2020-08-26T20:32:46.000Z", + "cisco.umbrella.categories": "Test Category", + "destination.address": "8.8.8.8", + "destination.ip": "8.8.8.8", + "destination.port": "0", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "\\\"2020-08-26 20:32:46\\\",\\\"elasticuser\\\",\\\"192.168.1.1\\\",\\\"0\\\",\\\"8.8.8.8\\\",\\\"0\\\",\\\"Test Category\\\"", + "fileset.name": "umbrella", + "input.type": "log", + "log.offset": 0, + "message": "\"2020-08-26 20:32:46\",\"elasticuser\",\"192.168.1.1\",\"0\",\"8.8.8.8\",\"0\",\"Test Category\"", + "observer.product": "Umbrella", + "observer.type": "firewall", + "observer.vendor": "Cisco", + "related.ip": [ + "192.168.1.1", + "8.8.8.8" + ], + "related.user": [ + "elasticuser" + ], + "service.type": "cisco", + "source.address": "192.168.1.1", + "source.ip": "192.168.1.1", + "source.port": "0", + "source.user.name": "elasticuser" + }, + { + "@timestamp": "2020-08-26T20:32:45.000Z", + "cisco.umbrella.categories": "Test Category", + "destination.address": "8.8.8.8", + "destination.ip": "8.8.8.8", + "destination.port": "445", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "\\\"2020-08-26 20:32:45\\\",\\\"elasticuser\\\",\\\"192.168.1.1\\\",\\\"61095\\\",\\\"8.8.8.8\\\",\\\"445\\\",\\\"Test Category\\\"", + "fileset.name": "umbrella", + "input.type": "log", + "log.offset": 84, + "message": "\"2020-08-26 20:32:45\",\"elasticuser\",\"192.168.1.1\",\"61095\",\"8.8.8.8\",\"445\",\"Test Category\"", + "observer.product": "Umbrella", + "observer.type": "firewall", + "observer.vendor": "Cisco", + "related.ip": [ + "192.168.1.1", + "8.8.8.8" + ], + "related.user": [ + "elasticuser" + ], + "service.type": "cisco", + "source.address": "192.168.1.1", + "source.ip": "192.168.1.1", + "source.port": "61095", + "source.user.name": "elasticuser" + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log new file mode 100644 index 00000000000..bfe70c6839a --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log @@ -0,0 +1,3 @@ +"2020-07-23 23:48:56","elasticuser, someotheruser","192.168.1.1","1.1.1.1","8.8.8.8","","ALLOWED","https://elastic.co/blog/ext_id=Anyclip","https://google.com/elastic","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36","200","850","","","","Business Services","AVDetectionName","Malicious","MalwareName","","","Roaming Computers","" +"2020-07-23 23:48:56","elasticuser, someotheruser","192.168.1.1","1.1.1.1","8.8.8.8","","BLOCKED","https://elastic.co/blog/ext_id=Anyclip","https://google.com/elastic","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36","200","850","","","","Business Services","AVDetectionName","Malicious","MalwareName","","","Roaming Computers","" +"2017-10-02 23:52:53","elasticuser","ActiveDirectoryUserName,ADSite,Network","192.192.192.135","1.1.1.91","","ALLOWED","http://google.com/the.js","www.google.com","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36","200","562","1489","","","","","","","","Networks" diff --git a/x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log-expected.json b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log-expected.json new file mode 100644 index 00000000000..fd474d2d029 --- /dev/null +++ b/x-pack/filebeat/module/cisco/umbrella/test/umbrella-proxylogs.log-expected.json @@ -0,0 +1,115 @@ +[ + { + "@timestamp": "2020-07-23T23:48:56.000Z", + "cisco.umbrella.amp_disposition": "MalwareName", + "cisco.umbrella.av_detections": "AVDetectionName", + "cisco.umbrella.categories": "Business Services", + "cisco.umbrella.identities": "elasticuser, someotheruser", + "cisco.umbrella.identity_types": "Roaming Computers", + "cisco.umbrella.puas": "Malicious", + "destination.address": "8.8.8.8", + "destination.ip": "8.8.8.8", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "\\\"2020-07-23 23:48:56\\\",\\\"elasticuser, someotheruser\\\",\\\"192.168.1.1\\\",\\\"1.1.1.1\\\",\\\"8.8.8.8\\\",\\\"\\\",\\\"ALLOWED\\\",\\\"https://elastic.co/blog/ext_id=Anyclip\\\",\\\"https://google.com/elastic\\\",\\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36\\\",\\\"200\\\",\\\"850\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Business Services\\\",\\\"AVDetectionName\\\",\\\"Malicious\\\",\\\"MalwareName\\\",\\\"\\\",\\\"\\\",\\\"Roaming Computers\\\",\\\"\\\"", + "event.type": [ + "allowed" + ], + "fileset.name": "umbrella", + "http.request.bytes": "850", + "http.request.referrer": "https://google.com/elastic", + "http.response.status_code": "200", + "input.type": "log", + "log.offset": 0, + "message": "\"2020-07-23 23:48:56\",\"elasticuser, someotheruser\",\"192.168.1.1\",\"1.1.1.1\",\"8.8.8.8\",\"\",\"ALLOWED\",\"https://elastic.co/blog/ext_id=Anyclip\",\"https://google.com/elastic\",\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36\",\"200\",\"850\",\"\",\"\",\"\",\"Business Services\",\"AVDetectionName\",\"Malicious\",\"MalwareName\",\"\",\"\",\"Roaming Computers\",\"\"", + "observer.product": "Umbrella", + "observer.type": "proxy", + "observer.vendor": "Cisco", + "related.ip": [ + "192.168.1.1", + "1.1.1.1", + "8.8.8.8" + ], + "service.type": "cisco", + "source.address": "192.168.1.1", + "source.ip": "192.168.1.1", + "source.nat.ip": "1.1.1.1", + "url.full": "https://elastic.co/blog/ext_id=Anyclip", + "user_agent.original": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36" + }, + { + "@timestamp": "2020-07-23T23:48:56.000Z", + "cisco.umbrella.amp_disposition": "MalwareName", + "cisco.umbrella.av_detections": "AVDetectionName", + "cisco.umbrella.categories": "Business Services", + "cisco.umbrella.identities": "elasticuser, someotheruser", + "cisco.umbrella.identity_types": "Roaming Computers", + "cisco.umbrella.puas": "Malicious", + "destination.address": "8.8.8.8", + "destination.ip": "8.8.8.8", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "\\\"2020-07-23 23:48:56\\\",\\\"elasticuser, someotheruser\\\",\\\"192.168.1.1\\\",\\\"1.1.1.1\\\",\\\"8.8.8.8\\\",\\\"\\\",\\\"BLOCKED\\\",\\\"https://elastic.co/blog/ext_id=Anyclip\\\",\\\"https://google.com/elastic\\\",\\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36\\\",\\\"200\\\",\\\"850\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Business Services\\\",\\\"AVDetectionName\\\",\\\"Malicious\\\",\\\"MalwareName\\\",\\\"\\\",\\\"\\\",\\\"Roaming Computers\\\",\\\"\\\"", + "event.type": [ + "denied" + ], + "fileset.name": "umbrella", + "http.request.bytes": "850", + "http.request.referrer": "https://google.com/elastic", + "http.response.status_code": "200", + "input.type": "log", + "log.offset": 399, + "message": "\"2020-07-23 23:48:56\",\"elasticuser, someotheruser\",\"192.168.1.1\",\"1.1.1.1\",\"8.8.8.8\",\"\",\"BLOCKED\",\"https://elastic.co/blog/ext_id=Anyclip\",\"https://google.com/elastic\",\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36\",\"200\",\"850\",\"\",\"\",\"\",\"Business Services\",\"AVDetectionName\",\"Malicious\",\"MalwareName\",\"\",\"\",\"Roaming Computers\",\"\"", + "observer.product": "Umbrella", + "observer.type": "proxy", + "observer.vendor": "Cisco", + "related.ip": [ + "192.168.1.1", + "1.1.1.1", + "8.8.8.8" + ], + "service.type": "cisco", + "source.address": "192.168.1.1", + "source.ip": "192.168.1.1", + "source.nat.ip": "1.1.1.1", + "url.full": "https://elastic.co/blog/ext_id=Anyclip", + "user_agent.original": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36" + }, + { + "@timestamp": "2017-10-02T23:52:53.000Z", + "cisco.umbrella.amp_score": "Networks", + "cisco.umbrella.identities": "elasticuser", + "destination.address": "1.1.1.91", + "destination.ip": "1.1.1.91", + "event.dataset": "cisco.umbrella", + "event.module": "cisco", + "event.original": "\\\"2017-10-02 23:52:53\\\",\\\"elasticuser\\\",\\\"ActiveDirectoryUserName,ADSite,Network\\\",\\\"192.192.192.135\\\",\\\"1.1.1.91\\\",\\\"\\\",\\\"ALLOWED\\\",\\\"http://google.com/the.js\\\",\\\"www.google.com\\\",\\\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\\\",\\\"200\\\",\\\"562\\\",\\\"1489\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\",\\\"Networks\\\"", + "event.type": [ + "allowed" + ], + "fileset.name": "umbrella", + "http.request.bytes": "562", + "http.request.referrer": "www.google.com", + "http.response.bytes": "1489", + "http.response.status_code": "200", + "input.type": "log", + "log.offset": 798, + "message": "\"2017-10-02 23:52:53\",\"elasticuser\",\"ActiveDirectoryUserName,ADSite,Network\",\"192.192.192.135\",\"1.1.1.91\",\"\",\"ALLOWED\",\"http://google.com/the.js\",\"www.google.com\",\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36\",\"200\",\"562\",\"1489\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"Networks\"", + "observer.product": "Umbrella", + "observer.type": "proxy", + "observer.vendor": "Cisco", + "related.hosts": [ + "ActiveDirectoryUserName,ADSite,Network" + ], + "related.ip": [ + "192.192.192.135", + "1.1.1.91" + ], + "service.type": "cisco", + "source.address": "ActiveDirectoryUserName,ADSite,Network", + "source.domain": "ActiveDirectoryUserName,ADSite,Network", + "source.nat.ip": "192.192.192.135", + "url.full": "http://google.com/the.js", + "user_agent.original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" + } +] \ No newline at end of file From 84f6311f6d01af786b61667b729ee428d776a015 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Mon, 5 Oct 2020 17:33:58 +0200 Subject: [PATCH 070/156] [Ingest Manager] Send updating state (#21461) [Ingest Manager] Send updating state (#21461) --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../pkg/agent/application/managed_mode.go | 4 +- .../pkg/agent/application/upgrade/upgrade.go | 77 +++++++++++++++++-- x-pack/elastic-agent/pkg/core/state/state.go | 2 + x-pack/elastic-agent/pkg/reporter/reporter.go | 6 ++ 5 files changed, 81 insertions(+), 9 deletions(-) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 2ba08864ae8..278a9ea9cf4 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -28,3 +28,4 @@ - Add support for EQL based condition on inputs {pull}20994[20994] - Send `fleet.host.id` to Endpoint Security {pull}21042[21042] - Add `install` and `uninstall` subcommands {pull}21206[21206] +- Send updating state {pull}21461[21461] diff --git a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go index 12a9c242780..d1eaf197a88 100644 --- a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go +++ b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go @@ -200,11 +200,13 @@ func newManaged( } managedApplication.upgrader = upgrade.NewUpgrader( + agentInfo, cfg.Settings.DownloadConfig, log, []context.CancelFunc{managedApplication.cancelCtxFn}, reexec, - acker) + acker, + combinedReporter) actionDispatcher.MustRegister( &fleetapi.ActionPolicyChange{}, diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go index cac36ef7922..7aacf77ba63 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go @@ -20,6 +20,7 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/install" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/state" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/fleetapi" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" ) @@ -33,11 +34,13 @@ const ( // Upgrader performs an upgrade type Upgrader struct { + agentInfo *info.AgentInfo settings *artifact.Config log *logger.Logger closers []context.CancelFunc reexec reexecManager acker acker + reporter stateReporter upgradeable bool } @@ -50,14 +53,19 @@ type acker interface { Commit(ctx context.Context) error } +type stateReporter interface { + OnStateChange(id string, name string, s state.State) +} + // NewUpgrader creates an upgrader which is capable of performing upgrade operation -func NewUpgrader(settings *artifact.Config, log *logger.Logger, closers []context.CancelFunc, reexec reexecManager, a acker) *Upgrader { +func NewUpgrader(agentInfo *info.AgentInfo, settings *artifact.Config, log *logger.Logger, closers []context.CancelFunc, reexec reexecManager, a acker, r stateReporter) *Upgrader { return &Upgrader{ settings: settings, log: log, closers: closers, reexec: reexec, acker: a, + reporter: r, upgradeable: getUpgradable(), } } @@ -68,13 +76,22 @@ func (u *Upgrader) Upgradeable() bool { } // Upgrade upgrades running agent -func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) error { +func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) (err error) { + // report failed + defer func() { + if err != nil { + u.reportFailure(ctx, a, err) + } + }() + if !u.upgradeable { return fmt.Errorf( "cannot be upgraded; must be installed with install sub-command and " + "running under control of the systems supervisor") } + u.reportUpdating(a.Version) + sourceURI, err := u.sourceURI(a.Version, a.SourceURI) archivePath, err := u.downloadArtifact(ctx, a.Version, sourceURI) if err != nil { @@ -91,7 +108,10 @@ func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) error } if strings.HasPrefix(release.Commit(), newHash) { - return errors.New("upgrading to same version") + // not an error + u.ackAction(ctx, a) + u.log.Warn("upgrading to same version") + return nil } if err := copyActionStore(newHash); err != nil { @@ -132,11 +152,7 @@ func (u *Upgrader) Ack(ctx context.Context) error { return nil } - if err := u.acker.Ack(ctx, marker.Action); err != nil { - return err - } - - if err := u.acker.Commit(ctx); err != nil { + if err := u.ackAction(ctx, marker.Action); err != nil { return err } @@ -148,6 +164,7 @@ func (u *Upgrader) Ack(ctx context.Context) error { return ioutil.WriteFile(markerFile, markerBytes, 0600) } + func (u *Upgrader) sourceURI(version, retrievedURI string) (string, error) { if strings.HasSuffix(version, "-SNAPSHOT") && retrievedURI == "" { return "", errors.New("snapshot upgrade requires source uri", errors.TypeConfig) @@ -159,6 +176,50 @@ func (u *Upgrader) sourceURI(version, retrievedURI string) (string, error) { return u.settings.SourceURI, nil } +// ackAction is used for successful updates, it was either updated successfully or to the same version +// so we need to remove updating state and get prevent from receiving same update action again. +func (u *Upgrader) ackAction(ctx context.Context, action fleetapi.Action) error { + if err := u.acker.Ack(ctx, action); err != nil { + return err + } + + if err := u.acker.Commit(ctx); err != nil { + return err + } + + u.reporter.OnStateChange( + "", + agentName, + state.State{Status: state.Running}, + ) + + return nil +} + +// report failure is used when update process fails. action is acked so it won't be received again +// and state is changed to FAILED +func (u *Upgrader) reportFailure(ctx context.Context, action fleetapi.Action, err error) { + // ack action + u.acker.Ack(ctx, action) + + // report failure + u.reporter.OnStateChange( + "", + agentName, + state.State{Status: state.Failed, Message: err.Error()}, + ) +} + +// reportUpdating sets state of agent to updating. +func (u *Upgrader) reportUpdating(version string) { + // report failure + u.reporter.OnStateChange( + "", + agentName, + state.State{Status: state.Updating, Message: fmt.Sprintf("Update to version '%s' started", version)}, + ) +} + func rollbackInstall(hash string) { os.RemoveAll(filepath.Join(paths.Data(), fmt.Sprintf("%s-%s", agentName, hash))) } diff --git a/x-pack/elastic-agent/pkg/core/state/state.go b/x-pack/elastic-agent/pkg/core/state/state.go index 6b7c8bd53de..670cdc2a2f2 100644 --- a/x-pack/elastic-agent/pkg/core/state/state.go +++ b/x-pack/elastic-agent/pkg/core/state/state.go @@ -30,6 +30,8 @@ const ( Crashed // Restarting is status describing application is restarting. Restarting + // Updating is status describing application is updating. + Updating ) // State wraps the process state and application status. diff --git a/x-pack/elastic-agent/pkg/reporter/reporter.go b/x-pack/elastic-agent/pkg/reporter/reporter.go index c36708a837f..3b128841b2a 100644 --- a/x-pack/elastic-agent/pkg/reporter/reporter.go +++ b/x-pack/elastic-agent/pkg/reporter/reporter.go @@ -38,6 +38,8 @@ const ( EventSubTypeFailed = "FAILED" // EventSubTypeStopping is an event type indicating application is stopping. EventSubTypeStopping = "STOPPING" + // EventSubTypeUpdating is an event type indicating update process in progress. + EventSubTypeUpdating = "UPDATING" ) type agentInfo interface { @@ -127,6 +129,10 @@ func generateRecord(agentID string, id string, name string, s state.State) event case state.Restarting: subType = EventSubTypeStarting subTypeText = "RESTARTING" + case state.Updating: + subType = EventSubTypeUpdating + subTypeText = EventSubTypeUpdating + } err := errors.New( From 931e3cafe1beb6b99d0706d51d25f422f59ea260 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Mon, 5 Oct 2020 10:00:07 -0600 Subject: [PATCH 071/156] Fix billing.go aws.GetStartTimeEndTime (#21531) This PR is to fix this error introduced in https://github.com/elastic/beats/pull/20875: ``` # github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/billing ../x-pack/metricbeat/module/aws/billing/billing.go:119:47: not enough arguments in call to "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws".GetStartTimeEndTime have (time.Duration) want (time.Duration, time.Duration) Error: error getting default metricsets: Error running subcommand to get metricsets: running "go run /home/travis/gopath/src/github.com/elastic/beats/x-pack/metricbeat/scripts/msetlists/main.go" failed with exit code 2 ``` --- x-pack/metricbeat/module/aws/billing/billing.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/metricbeat/module/aws/billing/billing.go b/x-pack/metricbeat/module/aws/billing/billing.go index 2eb2bd2854a..b9b971e3d34 100644 --- a/x-pack/metricbeat/module/aws/billing/billing.go +++ b/x-pack/metricbeat/module/aws/billing/billing.go @@ -116,7 +116,7 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { startDate, endDate := getStartDateEndDate(m.Period) // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period) + startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) // get cost metrics from cost explorer awsConfig := m.MetricSet.AwsConfig.Copy() From 527ce19ca8fce4ff4dff6b04303768f460f72598 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Mon, 5 Oct 2020 17:03:02 +0100 Subject: [PATCH 072/156] [CI] fix 'no matches found within 10000' (#21466) --- Jenkinsfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 317a5c781e3..08853ab1453 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -74,7 +74,7 @@ pipeline { } steps { withGithubNotify(context: 'Lint') { - withBeatsEnv(archive: true) { + withBeatsEnv(archive: true, id: 'lint') { dumpVariables() cmd(label: 'make check', script: 'make check') } @@ -345,8 +345,13 @@ def archiveTestOutput(Map args = [:]) { } cmd(label: 'Prepare test output', script: 'python .ci/scripts/pre_archive_test.py') dir('build') { + if (isUnix()) { + cmd(label: 'Delete folders that are causing exceptions (See JENKINS-58421)', + returnStatus: true, + script: 'rm -rf ve || true; find . -type d -name vendor -exec rm -r {} \\;') + } else { log(level: 'INFO', text: 'Delete folders that are causing exceptions (See JENKINS-58421) is disabled for Windows.') } junitAndStore(allowEmptyResults: true, keepLongStdio: true, testResults: args.testResults, stashedTestReports: stashedTestReports, id: args.id) - archiveArtifacts(allowEmptyArchive: true, artifacts: args.artifacts) + tar(file: "test-build-artifacts-${args.id}.tgz", dir: '.', archive: true, allowMissing: true) } catchError(buildResult: 'SUCCESS', message: 'Failed to archive the build test results', stageResult: 'SUCCESS') { def folder = cmd(label: 'Find system-tests', returnStdout: true, script: 'python .ci/scripts/search_system_tests.py').trim() From 40b24dd2d00bb2a83b46449e452f4b7f86d59087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Mon, 5 Oct 2020 18:24:42 +0200 Subject: [PATCH 073/156] Add filestream input reader (#21481) ## What does this PR do? This PR adds the event reader and publisher functionality. This is mostly the refactoring of `Harvester` from `filebeat/input/log`. Two things are missing: metrics and special readers e.g. `multiline`. --- filebeat/input/filestream/config.go | 4 +- filebeat/input/filestream/filestream.go | 75 +++++- filebeat/input/filestream/input.go | 307 +++++++++++++++++++++++- 3 files changed, 365 insertions(+), 21 deletions(-) diff --git a/filebeat/input/filestream/config.go b/filebeat/input/filestream/config.go index 93b23232594..3ec076196f0 100644 --- a/filebeat/input/filestream/config.go +++ b/filebeat/input/filestream/config.go @@ -48,12 +48,12 @@ type closerConfig struct { type readerCloserConfig struct { AfterInterval time.Duration - Inactive time.Duration OnEOF bool } type stateChangeCloserConfig struct { CheckInterval time.Duration + Inactive time.Duration Removed bool Renamed bool } @@ -94,11 +94,11 @@ func defaultCloserConfig() closerConfig { OnStateChange: stateChangeCloserConfig{ CheckInterval: 5 * time.Second, Removed: true, // TODO check clean_removed option + Inactive: 0 * time.Second, Renamed: false, }, Reader: readerCloserConfig{ OnEOF: false, - Inactive: 0 * time.Second, AfterInterval: 0 * time.Second, }, } diff --git a/filebeat/input/filestream/filestream.go b/filebeat/input/filestream/filestream.go index 59f26ccca1b..4d42bbf6242 100644 --- a/filebeat/input/filestream/filestream.go +++ b/filebeat/input/filestream/filestream.go @@ -26,6 +26,7 @@ import ( input "github.com/elastic/beats/v7/filebeat/input/v2" "github.com/elastic/beats/v7/libbeat/common/backoff" + "github.com/elastic/beats/v7/libbeat/common/file" "github.com/elastic/beats/v7/libbeat/logp" "github.com/elastic/go-concert/ctxtool" "github.com/elastic/go-concert/unison" @@ -43,10 +44,14 @@ type logFile struct { ctx context.Context cancelReading context.CancelFunc - closeInactive time.Duration closeAfterInterval time.Duration closeOnEOF bool + checkInterval time.Duration + closeInactive time.Duration + closeRemoved bool + closeRenamed bool + offset int64 lastTimeRead time.Time backoff backoff.Backoff @@ -59,7 +64,7 @@ func newFileReader( canceler input.Canceler, f *os.File, config readerConfig, - closerConfig readerCloserConfig, + closerConfig closerConfig, ) (*logFile, error) { offset, err := f.Seek(0, os.SEEK_CUR) if err != nil { @@ -69,9 +74,12 @@ func newFileReader( l := &logFile{ file: f, log: log, - closeInactive: closerConfig.Inactive, - closeAfterInterval: closerConfig.AfterInterval, - closeOnEOF: closerConfig.OnEOF, + closeAfterInterval: closerConfig.Reader.AfterInterval, + closeOnEOF: closerConfig.Reader.OnEOF, + checkInterval: closerConfig.OnStateChange.CheckInterval, + closeInactive: closerConfig.OnStateChange.Inactive, + closeRemoved: closerConfig.OnStateChange.Removed, + closeRenamed: closerConfig.OnStateChange.Renamed, offset: offset, lastTimeRead: time.Now(), backoff: backoff.NewExpBackoff(canceler.Done(), config.Backoff.Init, config.Backoff.Max), @@ -143,7 +151,7 @@ func (f *logFile) startFileMonitoringIfNeeded() { if f.closeAfterInterval > 0 { f.tg.Go(func(ctx unison.Canceler) error { - f.closeIfInactive(ctx) + f.periodicStateCheck(ctx) return nil }) } @@ -164,10 +172,8 @@ func (f *logFile) closeIfTimeout(ctx unison.Canceler) { } } -func (f *logFile) closeIfInactive(ctx unison.Canceler) { - // This can be made configureble if users need a more flexible - // cheking for inactive files. - ticker := time.NewTicker(5 * time.Minute) +func (f *logFile) periodicStateCheck(ctx unison.Canceler) { + ticker := time.NewTicker(f.checkInterval) defer ticker.Stop() for { @@ -175,8 +181,7 @@ func (f *logFile) closeIfInactive(ctx unison.Canceler) { case <-ctx.Done(): return case <-ticker.C: - age := time.Since(f.lastTimeRead) - if age > f.closeInactive { + if f.shouldBeClosed() { f.cancelReading() return } @@ -184,6 +189,52 @@ func (f *logFile) closeIfInactive(ctx unison.Canceler) { } } +func (f *logFile) shouldBeClosed() bool { + if f.closeInactive > 0 { + if time.Since(f.lastTimeRead) > f.closeInactive { + return true + } + } + + if !f.closeRemoved && !f.closeRenamed { + return false + + } + + info, statErr := f.file.Stat() + if statErr != nil { + f.log.Errorf("Unexpected error reading from %s; error: %s", f.file.Name(), statErr) + return true + } + + if f.closeRenamed { + // Check if the file can still be found under the same path + if !isSameFile(f.file.Name(), info) { + f.log.Debugf("close_renamed is enabled and file %s has been renamed", f.file.Name()) + return true + } + } + + if f.closeRemoved { + // Check if the file name exists. See https://github.com/elastic/filebeat/issues/93 + if file.IsRemoved(f.file) { + f.log.Debugf("close_removed is enabled and file %s has been removed", f.file.Name()) + return true + } + } + + return false +} + +func isSameFile(path string, info os.FileInfo) bool { + fileInfo, err := os.Stat(path) + if err != nil { + return false + } + + return os.SameFile(fileInfo, info) +} + // errorChecks determines the cause for EOF errors, and how the EOF event should be handled // based on the config options. func (f *logFile) errorChecks(err error) error { diff --git a/filebeat/input/filestream/input.go b/filebeat/input/filestream/input.go index bcd143c1c5a..b6c6598c50b 100644 --- a/filebeat/input/filestream/input.go +++ b/filebeat/input/filestream/input.go @@ -18,16 +18,27 @@ package filestream import ( + "fmt" + "os" + + "golang.org/x/text/transform" + + "github.com/elastic/go-concert/ctxtool" + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/match" "github.com/elastic/beats/v7/libbeat/feature" "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/reader" + "github.com/elastic/beats/v7/libbeat/reader/debug" + "github.com/elastic/beats/v7/libbeat/reader/readfile" + "github.com/elastic/beats/v7/libbeat/reader/readfile/encoding" ) -// filestream is the input for reading from files which -// are actively written by other applications. -type filestream struct{} +const pluginName = "filestream" type state struct { Source string `json:"source" struct:"source"` @@ -35,7 +46,20 @@ type state struct { IdentifierName string `json:"identifier_name" struct:"identifier_name"` } -const pluginName = "filestream" +// filestream is the input for reading from files which +// are actively written by other applications. +type filestream struct { + readerConfig readerConfig + bufferSize int + tailFile bool // TODO + encodingFactory encoding.EncodingFactory + encoding encoding.Encoding + lineTerminator readfile.LineTerminator + excludeLines []match.Matcher + includeLines []match.Matcher + maxBytes int + closerConfig closerConfig +} // Plugin creates a new filestream input plugin for creating a stateful input. func Plugin(log *logp.Logger, store loginp.StateStore) input.Plugin { @@ -55,13 +79,46 @@ func Plugin(log *logp.Logger, store loginp.StateStore) input.Plugin { } func configure(cfg *common.Config) (loginp.Prospector, loginp.Harvester, error) { - panic("TODO: implement me") + config := defaultConfig() + if err := cfg.Unpack(&config); err != nil { + return nil, nil, err + } + + prospector, err := newFileProspector( + config.Paths, + config.IgnoreOlder, + config.FileWatcher, + config.FileIdentity, + ) + if err != nil { + return nil, nil, err + } + + encodingFactory, ok := encoding.FindEncoding(config.Reader.Encoding) + if !ok || encodingFactory == nil { + return nil, nil, fmt.Errorf("unknown encoding('%v')", config.Reader.Encoding) + } + + return prospector, &filestream{ + readerConfig: config.Reader, + bufferSize: config.Reader.BufferSize, + encodingFactory: encodingFactory, + lineTerminator: config.Reader.LineTerminator, + excludeLines: config.Reader.ExcludeLines, + includeLines: config.Reader.IncludeLines, + maxBytes: config.Reader.MaxBytes, + closerConfig: config.Close, + }, nil } func (inp *filestream) Name() string { return pluginName } func (inp *filestream) Test(src loginp.Source, ctx input.TestContext) error { - panic("TODO: implement me") + reader, err := inp.open(ctx.Logger, ctx.Cancelation, state{}) + if err != nil { + return err + } + return reader.Close() } func (inp *filestream) Run( @@ -70,5 +127,241 @@ func (inp *filestream) Run( cursor loginp.Cursor, publisher loginp.Publisher, ) error { - panic("TODO: implement me") + fs, ok := src.(fileSource) + if !ok { + return fmt.Errorf("not file source") + } + + log := ctx.Logger.With("path", fs.newPath).With("state-id", src.Name()) + state := initState(log, cursor, fs) + + r, err := inp.open(log, ctx.Cancelation, state) + if err != nil { + log.Errorf("File could not be opened for reading: %v", err) + return err + } + + _, streamCancel := ctxtool.WithFunc(ctxtool.FromCanceller(ctx.Cancelation), func() { + log.Debug("Closing reader of filestream") + err := r.Close() + if err != nil { + log.Errorf("Error stopping filestream reader %v", err) + } + }) + defer streamCancel() + + return inp.readFromSource(ctx, log, r, fs.newPath, state, publisher) +} + +func initState(log *logp.Logger, c loginp.Cursor, s fileSource) state { + state := state{Source: s.newPath, IdentifierName: s.identifierGenerator} + if c.IsNew() { + return state + } + + err := c.Unpack(&state) + if err != nil { + log.Error("Cannot serialize cursor data into file state: %+v", err) + } + + return state +} + +func (inp *filestream) open(log *logp.Logger, canceler input.Canceler, s state) (reader.Reader, error) { + f, err := inp.openFile(s.Source, s.Offset) + if err != nil { + return nil, err + } + + log.Debug("newLogFileReader with config.MaxBytes:", inp.maxBytes) + + // TODO: NewLineReader uses additional buffering to deal with encoding and testing + // for new lines in input stream. Simple 8-bit based encodings, or plain + // don't require 'complicated' logic. + logReader, err := newFileReader(log, canceler, f, inp.readerConfig, inp.closerConfig) + if err != nil { + return nil, err + } + + dbgReader, err := debug.AppendReaders(logReader) + if err != nil { + f.Close() + return nil, err + } + + // Configure MaxBytes limit for EncodeReader as multiplied by 4 + // for the worst case scenario where incoming UTF32 charchers are decoded to the single byte UTF-8 characters. + // This limit serves primarily to avoid memory bload or potential OOM with expectedly long lines in the file. + // The further size limiting is performed by LimitReader at the end of the readers pipeline as needed. + encReaderMaxBytes := inp.maxBytes * 4 + + var r reader.Reader + r, err = readfile.NewEncodeReader(dbgReader, readfile.Config{ + Codec: inp.encoding, + BufferSize: inp.bufferSize, + Terminator: inp.lineTerminator, + MaxBytes: encReaderMaxBytes, + }) + if err != nil { + f.Close() + return nil, err + } + + r = readfile.NewStripNewline(r, inp.lineTerminator) + r = readfile.NewLimitReader(r, inp.maxBytes) + + return r, nil +} + +// openFile opens a file and checks for the encoding. In case the encoding cannot be detected +// or the file cannot be opened because for example of failing read permissions, an error +// is returned and the harvester is closed. The file will be picked up again the next time +// the file system is scanned +func (inp *filestream) openFile(path string, offset int64) (*os.File, error) { + err := inp.checkFileBeforeOpening(path) + if err != nil { + return nil, err + } + + f, err := os.OpenFile(path, os.O_RDONLY, os.FileMode(0)) + if err != nil { + return nil, fmt.Errorf("failed opening %s: %s", path, err) + } + + err = inp.initFileOffset(f, offset) + if err != nil { + f.Close() + return nil, err + } + + inp.encoding, err = inp.encodingFactory(f) + if err != nil { + f.Close() + if err == transform.ErrShortSrc { + return nil, fmt.Errorf("initialising encoding for '%v' failed due to file being too short", f) + } + return nil, fmt.Errorf("initialising encoding for '%v' failed: %v", f, err) + } + + return f, nil +} + +func (inp *filestream) checkFileBeforeOpening(path string) error { + fi, err := os.Stat(path) + if err != nil { + return fmt.Errorf("failed to stat source file %s: %v", path, err) + } + + if !fi.Mode().IsRegular() { + return fmt.Errorf("tried to open non regular file: %q %s", fi.Mode(), fi.Name()) + } + + if fi.Mode()&os.ModeNamedPipe != 0 { + return fmt.Errorf("failed to open file %s, named pipes are not supported", path) + } + + return nil +} + +func (inp *filestream) initFileOffset(file *os.File, offset int64) error { + if offset > 0 { + _, err := file.Seek(offset, os.SEEK_SET) + return err + } + + // get offset from file in case of encoding factory was required to read some data. + _, err := file.Seek(0, os.SEEK_CUR) + return err +} + +func (inp *filestream) readFromSource( + ctx input.Context, + log *logp.Logger, + r reader.Reader, + path string, + s state, + p loginp.Publisher, +) error { + for ctx.Cancelation.Err() == nil { + message, err := r.Next() + if err != nil { + switch err { + case ErrFileTruncate: + log.Info("File was truncated. Begin reading file from offset 0.") + s.Offset = 0 + case ErrClosed: + log.Info("Reader was closed. Closing.") + case reader.ErrLineUnparsable: + log.Info("Skipping unparsable line in file.") + continue + default: + log.Errorf("Read line error: %v", err) + } + return nil + } + + if message.IsEmpty() || inp.isDroppedLine(log, string(message.Content)) { + continue + } + + event := inp.eventFromMessage(message, path) + s.Offset += int64(message.Bytes) + + if err := p.Publish(event, s); err != nil { + return err + } + } + return nil +} + +// isDroppedLine decides if the line is exported or not based on +// the include_lines and exclude_lines options. +func (inp *filestream) isDroppedLine(log *logp.Logger, line string) bool { + if len(inp.includeLines) > 0 { + if !matchAny(inp.includeLines, line) { + log.Debug("Drop line as it does not match any of the include patterns %s", line) + return true + } + } + if len(inp.excludeLines) > 0 { + if matchAny(inp.excludeLines, line) { + log.Debug("Drop line as it does match one of the exclude patterns%s", line) + return true + } + } + + return false +} + +func matchAny(matchers []match.Matcher, text string) bool { + for _, m := range matchers { + if m.MatchString(text) { + return true + } + } + return false +} + +func (inp *filestream) eventFromMessage(m reader.Message, path string) beat.Event { + fields := common.MapStr{ + "log": common.MapStr{ + "offset": m.Bytes, // Offset here is the offset before the starting char. + "file": common.MapStr{ + "path": path, + }, + }, + } + fields.DeepUpdate(m.Fields) + + if len(m.Content) > 0 { + if fields == nil { + fields = common.MapStr{} + } + fields["message"] = string(m.Content) + } + + return beat.Event{ + Timestamp: m.Ts, + Fields: fields, + } } From f4ebcf0dfc1a64bdd3ab5e2b70fa49bb4c1517b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Mon, 5 Oct 2020 19:18:35 +0200 Subject: [PATCH 074/156] Enable filestream input (#21533) The feature is enabled, but it is not yet documented. --- filebeat/input/default-inputs/inputs.go | 6 ++++-- filebeat/input/filestream/fswatch.go | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/filebeat/input/default-inputs/inputs.go b/filebeat/input/default-inputs/inputs.go index 52338a0af98..881f3664efd 100644 --- a/filebeat/input/default-inputs/inputs.go +++ b/filebeat/input/default-inputs/inputs.go @@ -19,6 +19,7 @@ package inputs import ( "github.com/elastic/beats/v7/filebeat/beater" + "github.com/elastic/beats/v7/filebeat/input/filestream" "github.com/elastic/beats/v7/filebeat/input/unix" v2 "github.com/elastic/beats/v7/filebeat/input/v2" "github.com/elastic/beats/v7/libbeat/beat" @@ -27,13 +28,14 @@ import ( func Init(info beat.Info, log *logp.Logger, components beater.StateStore) []v2.Plugin { return append( - genericInputs(), + genericInputs(log, components), osInputs(info, log, components)..., ) } -func genericInputs() []v2.Plugin { +func genericInputs(log *logp.Logger, components beater.StateStore) []v2.Plugin { return []v2.Plugin{ + filestream.Plugin(log, components), unix.Plugin(), } } diff --git a/filebeat/input/filestream/fswatch.go b/filebeat/input/filestream/fswatch.go index d4bc1b5ea08..1b80971d835 100644 --- a/filebeat/input/filestream/fswatch.go +++ b/filebeat/input/filestream/fswatch.go @@ -74,7 +74,7 @@ type fileWatcher struct { func newFileWatcher(paths []string, ns *common.ConfigNamespace) (loginp.FSWatcher, error) { if ns == nil { - return newScannerWatcher(paths, nil) + return newScannerWatcher(paths, common.NewConfig()) } watcherType := ns.Name() From c858dd0f3188793ffd52d8975c8120ce0f442ff8 Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Mon, 5 Oct 2020 14:38:56 -0400 Subject: [PATCH 075/156] [Elastic Agent] Add upgrade CLI to initiate upgrade of Agent locally (#21425) * Add new upgrade command to initiate a local upgrade of Elastic Agent. * Update drop path with file:// prefix is defined. * Add comment. * Add missing new line. * Add changelog. * Prevent upgrading of Agent locally when connected to Fleet. * Fixes from rebase. --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../pkg/agent/application/application.go | 12 +++- .../application/handler_action_upgrade.go | 18 ++++- .../pkg/agent/application/local_mode.go | 14 ++++ .../application/upgrade/step_download.go | 9 ++- .../agent/application/upgrade/step_mark.go | 4 +- .../pkg/agent/application/upgrade/upgrade.go | 37 ++++++++--- x-pack/elastic-agent/pkg/agent/cmd/common.go | 1 + x-pack/elastic-agent/pkg/agent/cmd/run.go | 4 +- x-pack/elastic-agent/pkg/agent/cmd/upgrade.go | 56 ++++++++++++++++ .../pkg/agent/control/control_test.go | 2 +- .../pkg/agent/control/server/server.go | 65 +++++++++++++++++-- .../pkg/basecmd/version/cmd_test.go | 4 +- 13 files changed, 198 insertions(+), 29 deletions(-) create mode 100644 x-pack/elastic-agent/pkg/agent/cmd/upgrade.go diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 278a9ea9cf4..7d6870328c7 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -29,3 +29,4 @@ - Send `fleet.host.id` to Endpoint Security {pull}21042[21042] - Add `install` and `uninstall` subcommands {pull}21206[21206] - Send updating state {pull}21461[21461] +- Add `upgrade` subcommand to perform upgrade of installed Elastic Agent {pull}21425[21425] diff --git a/x-pack/elastic-agent/pkg/agent/application/application.go b/x-pack/elastic-agent/pkg/agent/application/application.go index e003eed61a6..d721a8aa148 100644 --- a/x-pack/elastic-agent/pkg/agent/application/application.go +++ b/x-pack/elastic-agent/pkg/agent/application/application.go @@ -8,6 +8,7 @@ import ( "context" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/upgrade" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configuration" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/warn" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/config" @@ -25,8 +26,12 @@ type reexecManager interface { ReExec(argOverrides ...string) } +type upgraderControl interface { + SetUpgrader(upgrader *upgrade.Upgrader) +} + // New creates a new Agent and bootstrap the required subsystem. -func New(log *logger.Logger, pathConfigFile string, reexec reexecManager) (Application, error) { +func New(log *logger.Logger, pathConfigFile string, reexec reexecManager, uc upgraderControl) (Application, error) { // Load configuration from disk to understand in which mode of operation // we must start the elastic-agent, the mode of operation cannot be changed without restarting the // elastic-agent. @@ -39,7 +44,7 @@ func New(log *logger.Logger, pathConfigFile string, reexec reexecManager) (Appli return nil, err } - return createApplication(log, pathConfigFile, rawConfig, reexec) + return createApplication(log, pathConfigFile, rawConfig, reexec, uc) } func createApplication( @@ -47,6 +52,7 @@ func createApplication( pathConfigFile string, rawConfig *config.Config, reexec reexecManager, + uc upgraderControl, ) (Application, error) { warn.LogNotGA(log) log.Info("Detecting execution mode") @@ -59,7 +65,7 @@ func createApplication( if isStandalone(cfg.Fleet) { log.Info("Agent is managed locally") - return newLocal(ctx, log, pathConfigFile, rawConfig) + return newLocal(ctx, log, pathConfigFile, rawConfig, reexec, uc) } log.Info("Agent is managed by Fleet") diff --git a/x-pack/elastic-agent/pkg/agent/application/handler_action_upgrade.go b/x-pack/elastic-agent/pkg/agent/application/handler_action_upgrade.go index 4d0026d4d79..a4940cfe55b 100644 --- a/x-pack/elastic-agent/pkg/agent/application/handler_action_upgrade.go +++ b/x-pack/elastic-agent/pkg/agent/application/handler_action_upgrade.go @@ -27,5 +27,21 @@ func (h *handlerUpgrade) Handle(ctx context.Context, a action, acker fleetAcker) return fmt.Errorf("invalid type, expected ActionUpgrade and received %T", a) } - return h.upgrader.Upgrade(ctx, action) + return h.upgrader.Upgrade(ctx, &upgradeAction{action}, true) +} + +type upgradeAction struct { + *fleetapi.ActionUpgrade +} + +func (a *upgradeAction) Version() string { + return a.ActionUpgrade.Version +} + +func (a *upgradeAction) SourceURI() string { + return a.ActionUpgrade.SourceURI +} + +func (a *upgradeAction) FleetAction() *fleetapi.ActionUpgrade { + return a.ActionUpgrade } diff --git a/x-pack/elastic-agent/pkg/agent/application/local_mode.go b/x-pack/elastic-agent/pkg/agent/application/local_mode.go index 5559089404e..f8eed0f5792 100644 --- a/x-pack/elastic-agent/pkg/agent/application/local_mode.go +++ b/x-pack/elastic-agent/pkg/agent/application/local_mode.go @@ -9,6 +9,7 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/filters" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/upgrade" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configrequest" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configuration" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" @@ -60,6 +61,8 @@ func newLocal( log *logger.Logger, pathConfigFile string, rawConfig *config.Config, + reexec reexecManager, + uc upgraderControl, ) (*Local, error) { cfg, err := configuration.NewFromConfig(rawConfig) if err != nil { @@ -135,6 +138,17 @@ func newLocal( localApplication.source = cfgSource + // create a upgrader to use in local mode + upgrader := upgrade.NewUpgrader( + agentInfo, + cfg.Settings.DownloadConfig, + log, + []context.CancelFunc{localApplication.cancelCtxFn}, + reexec, + newNoopAcker(), + reporter) + uc.SetUpgrader(upgrader) + return localApplication, nil } diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go index 9db442d3655..cf3a3656724 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go @@ -6,6 +6,7 @@ package upgrade import ( "context" + "strings" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" downloader "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact/download/localremote" @@ -16,7 +17,13 @@ func (u *Upgrader) downloadArtifact(ctx context.Context, version, sourceURI stri // do not update source config settings := *u.settings if sourceURI != "" { - settings.SourceURI = sourceURI + if strings.HasPrefix(sourceURI, "file://") { + // update the DropPath so the fs.Downloader can download from this + // path instead of looking into the installed downloads directory + settings.DropPath = strings.TrimPrefix(sourceURI, "file://") + } else { + settings.SourceURI = sourceURI + } } allowEmptyPgp, pgp := release.PGP() diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go index 53920e6ecff..8d03fec3ff6 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go @@ -37,7 +37,7 @@ type updateMarker struct { } // markUpgrade marks update happened so we can handle grace period -func (h *Upgrader) markUpgrade(ctx context.Context, hash string, action *fleetapi.ActionUpgrade) error { +func (h *Upgrader) markUpgrade(ctx context.Context, hash string, action Action) error { prevVersion := release.Version() prevHash := release.Commit() if len(prevHash) > hashLen { @@ -49,7 +49,7 @@ func (h *Upgrader) markUpgrade(ctx context.Context, hash string, action *fleetap UpdatedOn: time.Now(), PrevVersion: prevVersion, PrevHash: prevHash, - Action: action, + Action: action.FleetAction(), } markerBytes, err := yaml.Marshal(marker) diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go index 7aacf77ba63..1a21bc154a1 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go @@ -44,6 +44,16 @@ type Upgrader struct { upgradeable bool } +// Action is the upgrade action state. +type Action interface { + // Version to upgrade to. + Version() string + // SourceURI for download. + SourceURI() string + // FleetAction is the action from fleet that started the action (optional). + FleetAction() *fleetapi.ActionUpgrade +} + type reexecManager interface { ReExec(argOverrides ...string) } @@ -60,13 +70,14 @@ type stateReporter interface { // NewUpgrader creates an upgrader which is capable of performing upgrade operation func NewUpgrader(agentInfo *info.AgentInfo, settings *artifact.Config, log *logger.Logger, closers []context.CancelFunc, reexec reexecManager, a acker, r stateReporter) *Upgrader { return &Upgrader{ + agentInfo: agentInfo, settings: settings, log: log, closers: closers, reexec: reexec, acker: a, reporter: r, - upgradeable: getUpgradable(), + upgradeable: getUpgradeable(), } } @@ -76,11 +87,13 @@ func (u *Upgrader) Upgradeable() bool { } // Upgrade upgrades running agent -func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) (err error) { +func (u *Upgrader) Upgrade(ctx context.Context, a Action, reexecNow bool) (err error) { // report failed defer func() { if err != nil { - u.reportFailure(ctx, a, err) + if action := a.FleetAction(); action != nil { + u.reportFailure(ctx, action, err) + } } }() @@ -90,15 +103,15 @@ func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) (err "running under control of the systems supervisor") } - u.reportUpdating(a.Version) + u.reportUpdating(a.Version()) - sourceURI, err := u.sourceURI(a.Version, a.SourceURI) - archivePath, err := u.downloadArtifact(ctx, a.Version, sourceURI) + sourceURI, err := u.sourceURI(a.Version(), a.SourceURI()) + archivePath, err := u.downloadArtifact(ctx, a.Version(), sourceURI) if err != nil { return err } - newHash, err := u.unpack(ctx, a.Version, archivePath) + newHash, err := u.unpack(ctx, a.Version(), archivePath) if err != nil { return err } @@ -109,7 +122,9 @@ func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) (err if strings.HasPrefix(release.Commit(), newHash) { // not an error - u.ackAction(ctx, a) + if action := a.FleetAction(); action != nil { + u.ackAction(ctx, action) + } u.log.Warn("upgrading to same version") return nil } @@ -128,7 +143,9 @@ func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) (err return err } - u.reexec.ReExec() + if reexecNow { + u.reexec.ReExec() + } return nil } @@ -224,7 +241,7 @@ func rollbackInstall(hash string) { os.RemoveAll(filepath.Join(paths.Data(), fmt.Sprintf("%s-%s", agentName, hash))) } -func getUpgradable() bool { +func getUpgradeable() bool { // only upgradeable if running from Agent installer and running under the // control of the system supervisor (or built specifically with upgrading enabled) return release.Upgradeable() || (install.RunningInstalled() && install.RunningUnderSupervisor()) diff --git a/x-pack/elastic-agent/pkg/agent/cmd/common.go b/x-pack/elastic-agent/pkg/agent/cmd/common.go index 8ca5700f3c6..39093be71b6 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/common.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/common.go @@ -68,6 +68,7 @@ func NewCommandWithArgs(args []string, streams *cli.IOStreams) *cobra.Command { cmd.AddCommand(run) cmd.AddCommand(newInstallCommandWithArgs(flags, args, streams)) cmd.AddCommand(newUninstallCommandWithArgs(flags, args, streams)) + cmd.AddCommand(newUpgradeCommandWithArgs(flags, args, streams)) cmd.AddCommand(newEnrollCommandWithArgs(flags, args, streams)) cmd.AddCommand(newInspectCommandWithArgs(flags, args, streams)) diff --git a/x-pack/elastic-agent/pkg/agent/cmd/run.go b/x-pack/elastic-agent/pkg/agent/cmd/run.go index 77beeb6fe1a..84dd8bd8a9a 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/run.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/run.go @@ -95,13 +95,13 @@ func run(flags *globalFlags, streams *cli.IOStreams) error { // Windows: Mark se rex := reexec.NewManager(rexLogger, execPath) // start the control listener - control := server.New(logger.Named("control"), rex) + control := server.New(logger.Named("control"), rex, nil) if err := control.Start(); err != nil { return err } defer control.Stop() - app, err := application.New(logger, pathConfigFile, rex) + app, err := application.New(logger, pathConfigFile, rex, control) if err != nil { return err } diff --git a/x-pack/elastic-agent/pkg/agent/cmd/upgrade.go b/x-pack/elastic-agent/pkg/agent/cmd/upgrade.go new file mode 100644 index 00000000000..81a5c82b4ab --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/cmd/upgrade.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package cmd + +import ( + "context" + "fmt" + "os" + + "github.com/spf13/cobra" + + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/control" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/control/client" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/cli" +) + +func newUpgradeCommandWithArgs(flags *globalFlags, _ []string, streams *cli.IOStreams) *cobra.Command { + cmd := &cobra.Command{ + Use: "upgrade ", + Short: "Upgrade the currently running Elastic Agent to the specified version", + Args: cobra.ExactArgs(1), + Run: func(c *cobra.Command, args []string) { + if err := upgradeCmd(streams, c, flags, args); err != nil { + fmt.Fprintf(streams.Err, "%v\n", err) + os.Exit(1) + } + }, + } + + cmd.Flags().StringP("source-uri", "s", "", "Source URI to download the new version from") + + return cmd +} + +func upgradeCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args []string) error { + fmt.Fprintln(streams.Out, "The upgrade process of Elastic Agent is currently EXPERIMENTAL and should not be used in production") + + version := args[0] + sourceURI, _ := cmd.Flags().GetString("source-uri") + + c := client.New() + err := c.Connect(context.Background()) + if err != nil { + return errors.New(err, "Failed communicating to running daemon", errors.TypeNetwork, errors.M("socket", control.Address())) + } + defer c.Disconnect() + version, err = c.Upgrade(context.Background(), version, sourceURI) + if err != nil { + return errors.New(err, "Failed trigger upgrade of daemon") + } + fmt.Fprintf(streams.Out, "Upgrade triggered to version %s, Elastic Agent is currently restarting\n", version) + return nil +} diff --git a/x-pack/elastic-agent/pkg/agent/control/control_test.go b/x-pack/elastic-agent/pkg/agent/control/control_test.go index 9454179ae60..5c56aed4691 100644 --- a/x-pack/elastic-agent/pkg/agent/control/control_test.go +++ b/x-pack/elastic-agent/pkg/agent/control/control_test.go @@ -20,7 +20,7 @@ import ( ) func TestServerClient_Version(t *testing.T) { - srv := server.New(newErrorLogger(t), nil) + srv := server.New(newErrorLogger(t), nil, nil) err := srv.Start() require.NoError(t, err) defer srv.Stop() diff --git a/x-pack/elastic-agent/pkg/agent/control/server/server.go b/x-pack/elastic-agent/pkg/agent/control/server/server.go index faa7982c814..0ce970c9256 100644 --- a/x-pack/elastic-agent/pkg/agent/control/server/server.go +++ b/x-pack/elastic-agent/pkg/agent/control/server/server.go @@ -7,14 +7,17 @@ package server import ( "context" "net" - - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/reexec" + "sync" + "time" "google.golang.org/grpc" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/reexec" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/upgrade" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/control" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/control/proto" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/fleetapi" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" ) @@ -22,18 +25,28 @@ import ( type Server struct { logger *logger.Logger rex reexec.ExecManager + up *upgrade.Upgrader listener net.Listener server *grpc.Server + lock sync.RWMutex } // New creates a new control protocol server. -func New(log *logger.Logger, rex reexec.ExecManager) *Server { +func New(log *logger.Logger, rex reexec.ExecManager, up *upgrade.Upgrader) *Server { return &Server{ logger: log, rex: rex, + up: up, } } +// SetUpgrader changes the upgrader. +func (s *Server) SetUpgrader(up *upgrade.Upgrader) { + s.lock.Lock() + defer s.lock.Unlock() + s.up = up +} + // Start starts the GRPC endpoint and accepts new connections. func (s *Server) Start() error { if s.server != nil { @@ -100,10 +113,48 @@ func (s *Server) Restart(_ context.Context, _ *proto.Empty) (*proto.RestartRespo // Upgrade performs the upgrade operation. func (s *Server) Upgrade(ctx context.Context, request *proto.UpgradeRequest) (*proto.UpgradeResponse, error) { - // not implemented + s.lock.RLock() + u := s.up + s.lock.RUnlock() + if u == nil { + // not running with upgrader (must be controlled by Fleet) + return &proto.UpgradeResponse{ + Status: proto.ActionStatus_FAILURE, + Error: "cannot be upgraded; perform upgrading using Fleet", + }, nil + } + err := u.Upgrade(ctx, &upgradeRequest{request}, false) + if err != nil { + return &proto.UpgradeResponse{ + Status: proto.ActionStatus_FAILURE, + Error: err.Error(), + }, nil + } + // perform the re-exec after a 1 second delay + // this ensures that the upgrade response over GRPC is returned + go func() { + <-time.After(time.Second) + s.rex.ReExec() + }() return &proto.UpgradeResponse{ - Status: proto.ActionStatus_FAILURE, - Version: "", - Error: "not implemented", + Status: proto.ActionStatus_SUCCESS, + Version: request.Version, }, nil } + +type upgradeRequest struct { + *proto.UpgradeRequest +} + +func (r *upgradeRequest) Version() string { + return r.GetVersion() +} + +func (r *upgradeRequest) SourceURI() string { + return r.GetSourceURI() +} + +func (r *upgradeRequest) FleetAction() *fleetapi.ActionUpgrade { + // upgrade request not from Fleet + return nil +} diff --git a/x-pack/elastic-agent/pkg/basecmd/version/cmd_test.go b/x-pack/elastic-agent/pkg/basecmd/version/cmd_test.go index 119809338d6..6c656839820 100644 --- a/x-pack/elastic-agent/pkg/basecmd/version/cmd_test.go +++ b/x-pack/elastic-agent/pkg/basecmd/version/cmd_test.go @@ -52,7 +52,7 @@ func TestCmdBinaryOnlyYAML(t *testing.T) { } func TestCmdDaemon(t *testing.T) { - srv := server.New(newErrorLogger(t), nil) + srv := server.New(newErrorLogger(t), nil, nil) require.NoError(t, srv.Start()) defer srv.Stop() @@ -67,7 +67,7 @@ func TestCmdDaemon(t *testing.T) { } func TestCmdDaemonYAML(t *testing.T) { - srv := server.New(newErrorLogger(t), nil) + srv := server.New(newErrorLogger(t), nil, nil) require.NoError(t, srv.Start()) defer srv.Stop() From 889854e5f0ca01519487948a466177b897d46a82 Mon Sep 17 00:00:00 2001 From: Marc Guasch Date: Tue, 6 Oct 2020 09:38:30 +0200 Subject: [PATCH 076/156] Add missing changelog entry for cisco umbrella (#21550) --- CHANGELOG.next.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 279eda229a7..779272dc219 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -605,6 +605,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add related.hosts ecs field to all modules {pull}21160[21160] - Keep cursor state between httpjson input restarts {pull}20751[20751] - Convert aws s3 to v2 input {pull}20005[20005] +- New Cisco Umbrella dataset {pull}21504[21504] *Heartbeat* From 76905a2e2f3bbd966fa5cffa1fe7ce7da1dd7b44 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Tue, 6 Oct 2020 10:41:47 +0200 Subject: [PATCH 077/156] Add a persistent cache for cloudfoundry metadata based on badger (#20775) Cache on disk is used by add_cloudfoundry_metadata. Cache is written into the beats data directory. Objects in cache are serialized using CBOR encoding. Badger DB is added as dependency. --- CHANGELOG.next.asciidoc | 1 + NOTICE.txt | 6521 +++++++++++------ go.mod | 6 +- go.sum | 66 +- libbeat/tests/system/test_cmd_completion.py | 2 +- x-pack/libbeat/common/cloudfoundry/cache.go | 109 +- .../cloudfoundry/cache_integration_test.go | 11 +- .../libbeat/common/cloudfoundry/cache_test.go | 27 +- x-pack/libbeat/common/cloudfoundry/hub.go | 75 +- .../libbeat/common/cloudfoundry/main_test.go | 29 + x-pack/libbeat/persistentcache/encoding.go | 55 + .../persistentcache/persistentcache.go | 112 + .../persistentcache/persistentcache_test.go | 436 ++ x-pack/libbeat/persistentcache/store.go | 141 + x-pack/libbeat/persistentcache/store_test.go | 43 + .../add_cloudfoundry_metadata.go | 30 +- .../add_cloudfoundry_metadata_test.go | 46 +- 17 files changed, 5487 insertions(+), 2223 deletions(-) create mode 100644 x-pack/libbeat/common/cloudfoundry/main_test.go create mode 100644 x-pack/libbeat/persistentcache/encoding.go create mode 100644 x-pack/libbeat/persistentcache/persistentcache.go create mode 100644 x-pack/libbeat/persistentcache/persistentcache_test.go create mode 100644 x-pack/libbeat/persistentcache/store.go create mode 100644 x-pack/libbeat/persistentcache/store_test.go diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 779272dc219..5676634d637 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -448,6 +448,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Added experimental dataset `juniper/netscreen`. {pull}20820[20820] - Added experimental dataset `sophos/utm`. {pull}20820[20820] - Add Cloud Foundry tags in related events. {pull}21177[21177] +- Cloud Foundry metadata is cached to disk. {pull}20775[20775] - Add option to select the type of index template to load: legacy, component, index. {pull}21212[21212] *Auditbeat* diff --git a/NOTICE.txt b/NOTICE.txt index 527c1304379..0017abeba1a 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -4472,6 +4472,192 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +Dependency : github.com/dgraph-io/badger/v2 +Version: v2.2007.2 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/dgraph-io/badger/v2@v2.2007.2/LICENSE: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + -------------------------------------------------------------------------------- Dependency : github.com/digitalocean/go-libvirt Version: v0.0.0-20180301200012-6075ea3c39a1 @@ -5542,11 +5728,11 @@ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -------------------------------------------------------------------------------- Dependency : github.com/dustin/go-humanize -Version: v0.0.0-20171111073723-bb3d318650d4 +Version: v1.0.0 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/dustin/go-humanize@v0.0.0-20171111073723-bb3d318650d4/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/dustin/go-humanize@v1.0.0/LICENSE: Copyright (c) 2005-2008 Dustin Sallings @@ -13066,11 +13252,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- Dependency : github.com/spf13/cobra -Version: v0.0.3 +Version: v0.0.5 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/spf13/cobra@v0.0.3/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/spf13/cobra@v0.0.5/LICENSE.txt: Apache License Version 2.0, January 2004 @@ -13393,224 +13579,256 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/urso/sderr -Version: v0.0.0-20200210124243-c2a16f3d43ec -Licence type (autodetected): Apache-2.0 +Dependency : github.com/ugorji/go/codec +Version: v1.1.8 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/urso/sderr@v0.0.0-20200210124243-c2a16f3d43ec/LICENSE: - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +Contents of probable licence file $GOMODCACHE/github.com/ugorji/go/codec@v1.1.8/LICENSE: - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +The MIT License (MIT) - Copyright [yyyy] [name of copyright owner] +Copyright (c) 2012-2015 Ugorji Nwoke. +All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/vmware/govmomi -Version: v0.0.0-20170802214208-2cad15190b41 +Dependency : github.com/urso/sderr +Version: v0.0.0-20200210124243-c2a16f3d43ec Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/vmware/govmomi@v0.0.0-20170802214208-2cad15190b41/LICENSE.txt: - +Contents of probable licence file $GOMODCACHE/github.com/urso/sderr@v0.0.0-20200210124243-c2a16f3d43ec/LICENSE: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/vmware/govmomi +Version: v0.0.0-20170802214208-2cad15190b41 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/vmware/govmomi@v0.0.0-20170802214208-2cad15190b41/LICENSE.txt: + Apache License Version 2.0, January 2004 @@ -19482,6 +19700,43 @@ Contents of probable licence file $GOMODCACHE/github.com/!burnt!sushi/xgb@v0.0.0 // such litigation is filed. +-------------------------------------------------------------------------------- +Dependency : github.com/DataDog/zstd +Version: v1.4.1 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/!data!dog/zstd@v1.4.1/LICENSE: + +Simplified BSD License + +Copyright (c) 2016, Datadog +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + -------------------------------------------------------------------------------- Dependency : github.com/Masterminds/semver Version: v1.4.2 @@ -19565,6 +19820,203 @@ See the License for the specific language governing permissions and limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/OneOfOne/xxhash +Version: v1.2.2 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/!one!of!one/xxhash@v1.2.2/LICENSE: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + -------------------------------------------------------------------------------- Dependency : github.com/PuerkitoBio/purell Version: v1.0.0 @@ -19802,6 +20254,377 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +Dependency : github.com/armon/consul-api +Version: v0.0.0-20180202201655-eb2c6b5be1b6 +Licence type (autodetected): MPL-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/armon/consul-api@v0.0.0-20180202201655-eb2c6b5be1b6/LICENSE: + +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + -------------------------------------------------------------------------------- Dependency : github.com/armon/go-radix Version: v1.0.0 @@ -20546,6 +21369,38 @@ Contents of probable licence file $GOMODCACHE/github.com/census-instrumentation/ limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/cespare/xxhash +Version: v1.1.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/cespare/xxhash@v1.1.0/LICENSE.txt: + +Copyright (c) 2016 Caleb Spare + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + -------------------------------------------------------------------------------- Dependency : github.com/chzyer/logex Version: v1.1.10 @@ -22348,378 +23203,13 @@ Contents of probable licence file $GOMODCACHE/github.com/containerd/typeurl@v0.0 -------------------------------------------------------------------------------- -Dependency : github.com/coreos/go-systemd -Version: v0.0.0-20190321100706-95778dfbb74e +Dependency : github.com/coreos/etcd +Version: v3.3.10+incompatible Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/coreos/go-systemd@v0.0.0-20190321100706-95778dfbb74e/LICENSE: - -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - --------------------------------------------------------------------------------- -Dependency : github.com/cucumber/godog -Version: v0.8.1 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/cucumber/godog@v0.8.1/LICENSE: - -The MIT License (MIT) - -Copyright (c) SmartBear - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/cyphar/filepath-securejoin -Version: v0.2.2 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/cyphar/filepath-securejoin@v0.2.2/LICENSE: - -Copyright (C) 2014-2015 Docker Inc & Go Authors. All rights reserved. -Copyright (C) 2017 SUSE LLC. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - +Contents of probable licence file $GOMODCACHE/github.com/coreos/etcd@v3.3.10+incompatible/LICENSE: --------------------------------------------------------------------------------- -Dependency : github.com/davecgh/go-spew -Version: v1.1.1 -Licence type (autodetected): ISC --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/davecgh/go-spew@v1.1.1/LICENSE: - -ISC License - -Copyright (c) 2012-2016 Dave Collins - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/davecgh/go-xdr -Version: v0.0.0-20161123171359-e6a2ba005892 -Licence type (autodetected): ISC --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/davecgh/go-xdr@v0.0.0-20161123171359-e6a2ba005892/LICENSE: - -Copyright (c) 2012-2014 Dave Collins - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - --------------------------------------------------------------------------------- -Dependency : github.com/devigned/tab -Version: v0.1.2-0.20190607222403-0c15cf42f9a2 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/devigned/tab@v0.1.2-0.20190607222403-0c15cf42f9a2/LICENSE: - -MIT License - -Copyright (c) 2019 David Justice - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/dgrijalva/jwt-go -Version: v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/dgrijalva/jwt-go@v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible/LICENSE: - -Copyright (c) 2012 Dave Grijalva - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - - --------------------------------------------------------------------------------- -Dependency : github.com/dimchansky/utfbom -Version: v1.1.0 -Licence type (autodetected): Apache-2.0 --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/dimchansky/utfbom@v1.1.0/LICENSE: Apache License Version 2.0, January 2004 @@ -22901,7 +23391,7 @@ Contents of probable licence file $GOMODCACHE/github.com/dimchansky/utfbom@v1.1. APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -22909,7 +23399,7 @@ Contents of probable licence file $GOMODCACHE/github.com/dimchansky/utfbom@v1.1. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -22925,45 +23415,15 @@ Contents of probable licence file $GOMODCACHE/github.com/dimchansky/utfbom@v1.1. -------------------------------------------------------------------------------- -Dependency : github.com/dlclark/regexp2 -Version: v1.1.7-0.20171009020623-7632a260cbaf -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/dlclark/regexp2@v1.1.7-0.20171009020623-7632a260cbaf/LICENSE: - -The MIT License (MIT) - -Copyright (c) Doug Clark - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/docker/distribution -Version: v2.7.1+incompatible +Dependency : github.com/coreos/go-etcd +Version: v2.0.0+incompatible Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/docker/distribution@v2.7.1+incompatible/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/coreos/go-etcd@v2.0.0+incompatible/LICENSE: -Apache License + + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -23143,7 +23603,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -23151,7 +23611,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -23166,19 +23626,18 @@ Apache License limitations under the License. - -------------------------------------------------------------------------------- -Dependency : github.com/docker/go-metrics -Version: v0.0.1 +Dependency : github.com/coreos/go-semver +Version: v0.2.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/docker/go-metrics@v0.0.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/coreos/go-semver@v0.2.0/LICENSE: Apache License Version 2.0, January 2004 - https://www.apache.org/licenses/ + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -23353,13 +23812,24 @@ Contents of probable licence file $GOMODCACHE/github.com/docker/go-metrics@v0.0. END OF TERMS AND CONDITIONS - Copyright 2013-2016 Docker, Inc. + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -23369,198 +23839,198 @@ Contents of probable licence file $GOMODCACHE/github.com/docker/go-metrics@v0.0. -------------------------------------------------------------------------------- -Dependency : github.com/docker/spdystream -Version: v0.0.0-20160310174837-449fdfce4d96 +Dependency : github.com/coreos/go-systemd +Version: v0.0.0-20190321100706-95778dfbb74e Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/docker/spdystream@v0.0.0-20160310174837-449fdfce4d96/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/coreos/go-systemd@v0.0.0-20190321100706-95778dfbb74e/LICENSE: +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. - 1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +2. Grant of Copyright License. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. Grant of Patent License. - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +4. Redistribution. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +5. Submission of Contributions. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +6. Trademarks. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +8. Limitation of Liability. - END OF TERMS AND CONDITIONS +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. - Copyright 2014-2015 Docker, Inc. +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -23570,16 +24040,16 @@ Contents of probable licence file $GOMODCACHE/github.com/docker/spdystream@v0.0. -------------------------------------------------------------------------------- -Dependency : github.com/eapache/go-resiliency -Version: v1.2.0 +Dependency : github.com/cpuguy83/go-md2man +Version: v1.0.10 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/eapache/go-resiliency@v1.2.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cpuguy83/go-md2man@v1.0.10/LICENSE.md: The MIT License (MIT) -Copyright (c) 2014 Evan Huus +Copyright (c) 2014 Brian Goff Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23600,18 +24070,17 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -------------------------------------------------------------------------------- -Dependency : github.com/eapache/go-xerial-snappy -Version: v0.0.0-20180814174437-776d5712da21 +Dependency : github.com/cucumber/godog +Version: v0.8.1 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/eapache/go-xerial-snappy@v0.0.0-20180814174437-776d5712da21/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cucumber/godog@v0.8.1/LICENSE: The MIT License (MIT) -Copyright (c) 2016 Evan Huus +Copyright (c) SmartBear Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23633,16 +24102,101 @@ SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/eapache/queue -Version: v1.1.0 +Dependency : github.com/cyphar/filepath-securejoin +Version: v0.2.2 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/cyphar/filepath-securejoin@v0.2.2/LICENSE: + +Copyright (C) 2014-2015 Docker Inc & Go Authors. All rights reserved. +Copyright (C) 2017 SUSE LLC. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/davecgh/go-spew +Version: v1.1.1 +Licence type (autodetected): ISC +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/davecgh/go-spew@v1.1.1/LICENSE: + +ISC License + +Copyright (c) 2012-2016 Dave Collins + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/davecgh/go-xdr +Version: v0.0.0-20161123171359-e6a2ba005892 +Licence type (autodetected): ISC +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/davecgh/go-xdr@v0.0.0-20161123171359-e6a2ba005892/LICENSE: + +Copyright (c) 2012-2014 Dave Collins + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +-------------------------------------------------------------------------------- +Dependency : github.com/devigned/tab +Version: v0.1.2-0.20190607222403-0c15cf42f9a2 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/eapache/queue@v1.1.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/devigned/tab@v0.1.2-0.20190607222403-0c15cf42f9a2/LICENSE: -The MIT License (MIT) +MIT License -Copyright (c) 2014 Evan Huus +Copyright (c) 2019 David Justice Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23662,14 +24216,14 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + -------------------------------------------------------------------------------- -Dependency : github.com/elastic/go-windows -Version: v1.0.1 +Dependency : github.com/dgraph-io/ristretto +Version: v0.0.3-0.20200630154024-f66de99634de Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-windows@v1.0.1/LICENSE.txt: - +Contents of probable licence file $GOMODCACHE/github.com/dgraph-io/ristretto@v0.0.3-0.20200630154024-f66de99634de/LICENSE: Apache License Version 2.0, January 2004 @@ -23848,107 +24402,65 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-windows@v1.0 END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +-------------------------------------------------------------------------------- +Dependency : github.com/dgrijalva/jwt-go +Version: v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - Copyright [yyyy] [name of copyright owner] +Contents of probable licence file $GOMODCACHE/github.com/dgrijalva/jwt-go@v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible/LICENSE: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Copyright (c) 2012 Dave Grijalva - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - --------------------------------------------------------------------------------- -Dependency : github.com/elazarl/goproxy -Version: v0.0.0-20180725130230-947c36da3153 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/elazarl/goproxy@v0.0.0-20180725130230-947c36da3153/LICENSE: - -Copyright (c) 2012 Elazar Leibovich. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Elazar Leibovich. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/emicklei/go-restful -Version: v0.0.0-20170410110728-ff4f55a20633 +Dependency : github.com/dgryski/go-farm +Version: v0.0.0-20190423205320-6a90982ecee2 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/emicklei/go-restful@v0.0.0-20170410110728-ff4f55a20633/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/dgryski/go-farm@v0.0.0-20190423205320-6a90982ecee2/LICENSE: -Copyright (c) 2012,2013 Ernest Micklei +As this is a highly derivative work, I have placed it under the same license as the original implementation: -MIT License +Copyright (c) 2014-2017 Damian Gryski +Copyright (c) 2016-2017 Nicola Asuni - Tecnick.com -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/envoyproxy/go-control-plane -Version: v0.9.4 +Dependency : github.com/dimchansky/utfbom +Version: v1.1.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/go-control-plane@v0.9.4/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/dimchansky/utfbom@v1.1.0/LICENSE: Apache License Version 2.0, January 2004 @@ -24154,15 +24666,45 @@ Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/go-control-p -------------------------------------------------------------------------------- -Dependency : github.com/envoyproxy/protoc-gen-validate -Version: v0.1.0 -Licence type (autodetected): Apache-2.0 +Dependency : github.com/dlclark/regexp2 +Version: v1.1.7-0.20171009020623-7632a260cbaf +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/protoc-gen-validate@v0.1.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/dlclark/regexp2@v1.1.7-0.20171009020623-7632a260cbaf/LICENSE: + +The MIT License (MIT) +Copyright (c) Doug Clark - Apache License +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/docker/distribution +Version: v2.7.1+incompatible +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/docker/distribution@v2.7.1+incompatible/LICENSE: + +Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -24342,7 +24884,7 @@ Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/protoc-gen-v APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -24350,7 +24892,7 @@ Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/protoc-gen-v same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24365,281 +24907,19 @@ Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/protoc-gen-v limitations under the License. --------------------------------------------------------------------------------- -Dependency : github.com/evanphx/json-patch -Version: v4.2.0+incompatible -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/evanphx/json-patch@v4.2.0+incompatible/LICENSE: - -Copyright (c) 2014, Evan Phoenix -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -* Neither the name of the Evan Phoenix nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/fortytw2/leaktest -Version: v1.3.0 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/fortytw2/leaktest@v1.3.0/LICENSE: - -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/frankban/quicktest -Version: v1.7.2 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/frankban/quicktest@v1.7.2/LICENSE: - -MIT License - -Copyright (c) 2017 Canonical Ltd. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/ghodss/yaml -Version: v1.0.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/ghodss/yaml@v1.0.0/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2014 Sam Ghods - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/go-gl/glfw/v3.3/glfw -Version: v0.0.0-20191125211704-12ad95a8df72 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20191125211704-12ad95a8df72/LICENSE: - -Copyright (c) 2012 The glfw3-go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/go-kit/kit -Version: v0.9.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-kit/kit@v0.9.0/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2015 Peter Bourgon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - - --------------------------------------------------------------------------------- -Dependency : github.com/go-logfmt/logfmt -Version: v0.4.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-logfmt/logfmt@v0.4.0/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2015 go-logfmt - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -------------------------------------------------------------------------------- -Dependency : github.com/go-logr/logr -Version: v0.1.0 +Dependency : github.com/docker/go-metrics +Version: v0.0.1 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v0.1.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/docker/go-metrics@v0.0.1/LICENSE: + Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -24814,24 +25094,13 @@ Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v0.1.0/LIC END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} + Copyright 2013-2016 Docker, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -24841,73 +25110,12 @@ Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v0.1.0/LIC -------------------------------------------------------------------------------- -Dependency : github.com/go-martini/martini -Version: v0.0.0-20170121215854-22fa46961aab -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-martini/martini@v0.0.0-20170121215854-22fa46961aab/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2015 Jeremy Saenz - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/go-ole/go-ole -Version: v1.2.5-0.20190920104607-14974a1cf647 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-ole/go-ole@v1.2.5-0.20190920104607-14974a1cf647/LICENSE: - -The MIT License (MIT) - -Copyright © 2013-2017 Yasuhiro Matsumoto, - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the “Software”), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/go-openapi/jsonpointer -Version: v0.0.0-20160704185906-46af16f9f7b1 +Dependency : github.com/docker/spdystream +Version: v0.0.0-20160310174837-449fdfce4d96 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-openapi/jsonpointer@v0.0.0-20160704185906-46af16f9f7b1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/docker/spdystream@v0.0.0-20160310174837-449fdfce4d96/LICENSE: Apache License @@ -25087,18 +25295,7 @@ Contents of probable licence file $GOMODCACHE/github.com/go-openapi/jsonpointer@ END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] + Copyright 2014-2015 Docker, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -25114,19 +25311,112 @@ Contents of probable licence file $GOMODCACHE/github.com/go-openapi/jsonpointer@ -------------------------------------------------------------------------------- -Dependency : github.com/go-openapi/jsonreference -Version: v0.0.0-20160704190145-13c6e3589ad9 -Licence type (autodetected): Apache-2.0 +Dependency : github.com/eapache/go-resiliency +Version: v1.2.0 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-openapi/jsonreference@v0.0.0-20160704190145-13c6e3589ad9/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/eapache/go-resiliency@v1.2.0/LICENSE: +The MIT License (MIT) - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright (c) 2014 Evan Huus - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/eapache/go-xerial-snappy +Version: v0.0.0-20180814174437-776d5712da21 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/eapache/go-xerial-snappy@v0.0.0-20180814174437-776d5712da21/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2016 Evan Huus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/eapache/queue +Version: v1.1.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/eapache/queue@v1.1.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2014 Evan Huus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- +Dependency : github.com/elastic/go-windows +Version: v1.0.1 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-windows@v1.0.1/LICENSE.txt: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. @@ -25326,13 +25616,80 @@ Contents of probable licence file $GOMODCACHE/github.com/go-openapi/jsonreferenc -------------------------------------------------------------------------------- -Dependency : github.com/go-openapi/spec -Version: v0.0.0-20160808142527-6aced65f8501 -Licence type (autodetected): Apache-2.0 +Dependency : github.com/elazarl/goproxy +Version: v0.0.0-20180725130230-947c36da3153 +Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-openapi/spec@v0.0.0-20160808142527-6aced65f8501/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elazarl/goproxy@v0.0.0-20180725130230-947c36da3153/LICENSE: +Copyright (c) 2012 Elazar Leibovich. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Elazar Leibovich. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/emicklei/go-restful +Version: v0.0.0-20170410110728-ff4f55a20633 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/emicklei/go-restful@v0.0.0-20170410110728-ff4f55a20633/LICENSE: + +Copyright (c) 2012,2013 Ernest Micklei + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- +Dependency : github.com/envoyproxy/go-control-plane +Version: v0.9.4 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/go-control-plane@v0.9.4/LICENSE: Apache License Version 2.0, January 2004 @@ -25514,7 +25871,7 @@ Contents of probable licence file $GOMODCACHE/github.com/go-openapi/spec@v0.0.0- APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -25522,7 +25879,7 @@ Contents of probable licence file $GOMODCACHE/github.com/go-openapi/spec@v0.0.0- same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -25538,12 +25895,12 @@ Contents of probable licence file $GOMODCACHE/github.com/go-openapi/spec@v0.0.0- -------------------------------------------------------------------------------- -Dependency : github.com/go-openapi/swag -Version: v0.0.0-20160704191624-1d0bd113de87 +Dependency : github.com/envoyproxy/protoc-gen-validate +Version: v0.1.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-openapi/swag@v0.0.0-20160704191624-1d0bd113de87/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/envoyproxy/protoc-gen-validate@v0.1.0/LICENSE: Apache License @@ -25750,16 +26107,50 @@ Contents of probable licence file $GOMODCACHE/github.com/go-openapi/swag@v0.0.0- -------------------------------------------------------------------------------- -Dependency : github.com/go-sourcemap/sourcemap -Version: v2.1.2+incompatible -Licence type (autodetected): BSD-2-Clause +Dependency : github.com/evanphx/json-patch +Version: v4.2.0+incompatible +Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-sourcemap/sourcemap@v2.1.2+incompatible/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/evanphx/json-patch@v4.2.0+incompatible/LICENSE: -Copyright (c) 2016 The github.com/go-sourcemap/sourcemap Contributors. +Copyright (c) 2014, Evan Phoenix All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the Evan Phoenix nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/fortytw2/leaktest +Version: v1.3.0 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/fortytw2/leaktest@v1.3.0/LICENSE: + +Copyright (c) 2012 The Go Authors. All rights reserved. + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -25770,6 +26161,9 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -25785,16 +26179,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/go-stack/stack -Version: v1.8.0 +Dependency : github.com/frankban/quicktest +Version: v1.7.2 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-stack/stack@v1.8.0/LICENSE.md: +Contents of probable licence file $GOMODCACHE/github.com/frankban/quicktest@v1.7.2/LICENSE: -The MIT License (MIT) +MIT License -Copyright (c) 2014 Chris Hines +Copyright (c) 2017 Canonical Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25816,16 +26210,16 @@ SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/gobuffalo/here -Version: v0.6.0 +Dependency : github.com/ghodss/yaml +Version: v1.0.0 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/gobuffalo/here@v0.6.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/ghodss/yaml@v1.0.0/LICENSE: The MIT License (MIT) -Copyright (c) 2019 Mark Bates +Copyright (c) 2014 Sam Ghods Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -25846,48 +26240,1395 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + -------------------------------------------------------------------------------- -Dependency : github.com/godbus/dbus/v5 -Version: v5.0.3 -Licence type (autodetected): BSD-2-Clause +Dependency : github.com/go-gl/glfw/v3.3/glfw +Version: v0.0.0-20191125211704-12ad95a8df72 +Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/godbus/dbus/v5@v5.0.3/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/go-gl/glfw/v3.3/glfw@v0.0.0-20191125211704-12ad95a8df72/LICENSE: -Copyright (c) 2013, Georg Reinke (), Google -All rights reserved. +Copyright (c) 2012 The glfw3-go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. +modification, are permitted provided that the following conditions are +met: -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/golang-sql/civil -Version: v0.0.0-20190719163853-cb61b32ac6fe -Licence type (autodetected): Apache-2.0 +Dependency : github.com/go-kit/kit +Version: v0.9.0 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/golang-sql/civil@v0.0.0-20190719163853-cb61b32ac6fe/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/go-kit/kit@v0.9.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2015 Peter Bourgon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-logfmt/logfmt +Version: v0.4.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-logfmt/logfmt@v0.4.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2015 go-logfmt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-logr/logr +Version: v0.1.0 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v0.1.0/LICENSE: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-martini/martini +Version: v0.0.0-20170121215854-22fa46961aab +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-martini/martini@v0.0.0-20170121215854-22fa46961aab/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2015 Jeremy Saenz + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-ole/go-ole +Version: v1.2.5-0.20190920104607-14974a1cf647 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-ole/go-ole@v1.2.5-0.20190920104607-14974a1cf647/LICENSE: + +The MIT License (MIT) + +Copyright © 2013-2017 Yasuhiro Matsumoto, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-openapi/jsonpointer +Version: v0.0.0-20160704185906-46af16f9f7b1 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-openapi/jsonpointer@v0.0.0-20160704185906-46af16f9f7b1/LICENSE: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-openapi/jsonreference +Version: v0.0.0-20160704190145-13c6e3589ad9 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-openapi/jsonreference@v0.0.0-20160704190145-13c6e3589ad9/LICENSE: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-openapi/spec +Version: v0.0.0-20160808142527-6aced65f8501 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-openapi/spec@v0.0.0-20160808142527-6aced65f8501/LICENSE: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-openapi/swag +Version: v0.0.0-20160704191624-1d0bd113de87 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-openapi/swag@v0.0.0-20160704191624-1d0bd113de87/LICENSE: + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-sourcemap/sourcemap +Version: v2.1.2+incompatible +Licence type (autodetected): BSD-2-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-sourcemap/sourcemap@v2.1.2+incompatible/LICENSE: + +Copyright (c) 2016 The github.com/go-sourcemap/sourcemap Contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-stack/stack +Version: v1.8.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-stack/stack@v1.8.0/LICENSE.md: + +The MIT License (MIT) + +Copyright (c) 2014 Chris Hines + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/gobuffalo/here +Version: v0.6.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/gobuffalo/here@v0.6.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2019 Mark Bates + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/godbus/dbus/v5 +Version: v5.0.3 +Licence type (autodetected): BSD-2-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/godbus/dbus/v5@v5.0.3/LICENSE: + +Copyright (c) 2013, Georg Reinke (), Google +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/golang-sql/civil +Version: v0.0.0-20190719163853-cb61b32ac6fe +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/golang-sql/civil@v0.0.0-20190719163853-cb61b32ac6fe/LICENSE: Apache License @@ -30822,6 +32563,370 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice the Mozilla Public License, v. 2.0. +-------------------------------------------------------------------------------- +Dependency : github.com/hashicorp/hcl +Version: v1.0.0 +Licence type (autodetected): MPL-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/hashicorp/hcl@v1.0.0/LICENSE: + +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. “Contributor” + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. “Contributor Version” + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution” + + means Covered Software of a particular Contributor. + +1.4. “Covered Software” + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. “Incompatible With Secondary Licenses” + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. + +1.6. “Executable Form” + + means any form of the work other than Source Code Form. + +1.7. “Larger Work” + + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. + +1.8. “License” + + means this document. + +1.9. “Licensable” + + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. + +1.10. “Modifications” + + means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims” of a Contributor + + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. + +1.12. “Secondary License” + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form” + + means the form of the work preferred for making modifications. + +1.14. “You” (or “Your”) + + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control” means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. + + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is” basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. + + + -------------------------------------------------------------------------------- Dependency : github.com/haya14busa/go-actions-toolkit Version: v0.0.0-20200105081403-ca0307860f01 @@ -31829,6 +33934,41 @@ Contents of probable licence file $GOMODCACHE/github.com/kylelemons/godebug@v1.1 limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/magiconair/properties +Version: v1.8.0 +Licence type (autodetected): BSD-2-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/magiconair/properties@v1.8.0/LICENSE: + +goproperties - properties file decoder for Go + +Copyright (c) 2013-2018 - Frank Schroeder + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + -------------------------------------------------------------------------------- Dependency : github.com/mailru/easyjson Version: v0.7.1 @@ -32693,7 +34833,257 @@ Contents of probable licence file $GOMODCACHE/github.com/modern-go/reflect2@v1.0 APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +-------------------------------------------------------------------------------- +Dependency : github.com/morikuni/aec +Version: v1.0.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/morikuni/aec@v1.0.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2016 Taihei Morikuni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/munnerz/goautoneg +Version: v0.0.0-20120707110453-a547fc61f48d +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +No licence file provided. + +-------------------------------------------------------------------------------- +Dependency : github.com/mwitkow/go-conntrack +Version: v0.0.0-20161129095857-cc309e4a2223 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/mwitkow/go-conntrack@v0.0.0-20161129095857-cc309e4a2223/LICENSE: + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -32701,7 +35091,7 @@ Contents of probable licence file $GOMODCACHE/github.com/modern-go/reflect2@v1.0 same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32717,55 +35107,116 @@ Contents of probable licence file $GOMODCACHE/github.com/modern-go/reflect2@v1.0 -------------------------------------------------------------------------------- -Dependency : github.com/morikuni/aec -Version: v1.0.0 -Licence type (autodetected): MIT +Dependency : github.com/mxk/go-flowrate +Version: v0.0.0-20140419014527-cca7078d478f +Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/morikuni/aec@v1.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/mxk/go-flowrate@v0.0.0-20140419014527-cca7078d478f/LICENSE: -The MIT License (MIT) +Copyright (c) 2014 The Go-FlowRate Authors. All rights reserved. -Copyright (c) 2016 Taihei Morikuni +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + * Neither the name of the go-flowrate project nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/munnerz/goautoneg -Version: v0.0.0-20120707110453-a547fc61f48d -Licence type (autodetected): BSD-3-Clause +Dependency : github.com/onsi/ginkgo +Version: v1.11.0 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -No licence file provided. +Contents of probable licence file $GOMODCACHE/github.com/onsi/ginkgo@v1.11.0/LICENSE: + +Copyright (c) 2013-2014 Onsi Fakhouri + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + -------------------------------------------------------------------------------- -Dependency : github.com/mwitkow/go-conntrack -Version: v0.0.0-20161129095857-cc309e4a2223 +Dependency : github.com/onsi/gomega +Version: v1.7.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/onsi/gomega@v1.7.0/LICENSE: + +Copyright (c) 2013-2014 Onsi Fakhouri + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/opencontainers/go-digest +Version: v1.0.0-rc1.0.20190228220655-ac19fd6e7483 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/mwitkow/go-conntrack@v0.0.0-20161129095857-cc309e4a2223/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/opencontainers/go-digest@v1.0.0-rc1.0.20190228220655-ac19fd6e7483/LICENSE: + Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -32940,24 +35391,13 @@ Contents of probable licence file $GOMODCACHE/github.com/mwitkow/go-conntrack@v0 END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} + Copyright 2016 Docker, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -32967,116 +35407,17 @@ Contents of probable licence file $GOMODCACHE/github.com/mwitkow/go-conntrack@v0 -------------------------------------------------------------------------------- -Dependency : github.com/mxk/go-flowrate -Version: v0.0.0-20140419014527-cca7078d478f -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/mxk/go-flowrate@v0.0.0-20140419014527-cca7078d478f/LICENSE: - -Copyright (c) 2014 The Go-FlowRate Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the - distribution. - - * Neither the name of the go-flowrate project nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/onsi/ginkgo -Version: v1.11.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/onsi/ginkgo@v1.11.0/LICENSE: - -Copyright (c) 2013-2014 Onsi Fakhouri - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/onsi/gomega -Version: v1.7.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/onsi/gomega@v1.7.0/LICENSE: - -Copyright (c) 2013-2014 Onsi Fakhouri - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/opencontainers/go-digest -Version: v1.0.0-rc1.0.20190228220655-ac19fd6e7483 +Dependency : github.com/opencontainers/image-spec +Version: v1.0.2-0.20190823105129-775207bd45b6 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/opencontainers/go-digest@v1.0.0-rc1.0.20190228220655-ac19fd6e7483/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/opencontainers/image-spec@v1.0.2-0.20190823105129-775207bd45b6/LICENSE: Apache License Version 2.0, January 2004 - https://www.apache.org/licenses/ + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -33251,13 +35592,13 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/go-diges END OF TERMS AND CONDITIONS - Copyright 2016 Docker, Inc. + Copyright 2016 The Linux Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - https://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -33267,12 +35608,12 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/go-diges -------------------------------------------------------------------------------- -Dependency : github.com/opencontainers/image-spec -Version: v1.0.2-0.20190823105129-775207bd45b6 +Dependency : github.com/opencontainers/runc +Version: v1.0.0-rc9 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/opencontainers/image-spec@v1.0.2-0.20190823105129-775207bd45b6/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runc@v1.0.0-rc9/LICENSE: Apache License @@ -33452,7 +35793,7 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/image-sp END OF TERMS AND CONDITIONS - Copyright 2016 The Linux Foundation. + Copyright 2014 Docker, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -33468,12 +35809,12 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/image-sp -------------------------------------------------------------------------------- -Dependency : github.com/opencontainers/runc -Version: v1.0.0-rc9 +Dependency : github.com/opencontainers/runtime-spec +Version: v1.0.1 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runc@v1.0.0-rc9/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime-spec@v1.0.1/LICENSE: Apache License @@ -33653,7 +35994,7 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runc@v1. END OF TERMS AND CONDITIONS - Copyright 2014 Docker, Inc. + Copyright 2015 The Linux Foundation. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -33669,12 +36010,12 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runc@v1. -------------------------------------------------------------------------------- -Dependency : github.com/opencontainers/runtime-spec -Version: v1.0.1 +Dependency : github.com/opencontainers/runtime-tools +Version: v0.0.0-20181011054405-1d69bd0f9c39 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime-spec@v1.0.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime-tools@v0.0.0-20181011054405-1d69bd0f9c39/LICENSE: Apache License @@ -33870,12 +36211,60 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime- -------------------------------------------------------------------------------- -Dependency : github.com/opencontainers/runtime-tools -Version: v0.0.0-20181011054405-1d69bd0f9c39 +Dependency : github.com/otiai10/curr +Version: v1.0.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/otiai10/curr@v1.0.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2020 Hiromu Ochiai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/otiai10/mint +Version: v1.3.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/otiai10/mint@v1.3.1/LICENSE: + +Copyright 2017 otiai10 (Hiromu OCHIAI) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/oxtoacart/bpool +Version: v0.0.0-20150712133111-4e1c5567d7c2 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime-tools@v0.0.0-20181011054405-1d69bd0f9c39/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/oxtoacart/bpool@v0.0.0-20150712133111-4e1c5567d7c2/LICENSE: Apache License @@ -34055,7 +36444,18 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime- END OF TERMS AND CONDITIONS - Copyright 2015 The Linux Foundation. + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014 Percy Wegmann Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -34071,16 +36471,45 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime- -------------------------------------------------------------------------------- -Dependency : github.com/otiai10/curr -Version: v1.0.0 +Dependency : github.com/pelletier/go-toml +Version: v1.2.0 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/otiai10/curr@v1.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/pelletier/go-toml@v1.2.0/LICENSE: The MIT License (MIT) -Copyright (c) 2020 Hiromu Ochiai +Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/peterbourgon/diskv +Version: v2.0.1+incompatible +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/peterbourgon/diskv@v2.0.1+incompatible/LICENSE: + +Copyright (c) 2011-2012 Peter Bourgon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34102,30 +36531,81 @@ THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/otiai10/mint -Version: v1.3.1 +Dependency : github.com/pierrec/lz4 +Version: v2.4.1+incompatible +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4@v2.4.1+incompatible/LICENSE: + +Copyright (c) 2015, Pierre Curto +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of xxHash nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/poy/eachers +Version: v0.0.0-20181020210610-23942921fe77 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/otiai10/mint@v1.3.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/poy/eachers@v0.0.0-20181020210610-23942921fe77/LICENSE.md: -Copyright 2017 otiai10 (Hiromu OCHIAI) +The MIT License (MIT) -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright (c) 2016 Andrew Poydence -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/oxtoacart/bpool -Version: v0.0.0-20150712133111-4e1c5567d7c2 +Dependency : github.com/prometheus/client_golang +Version: v1.1.1-0.20190913103102-20428fa0bffc Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/oxtoacart/bpool@v0.0.0-20150712133111-4e1c5567d7c2/LICENSE: - +Contents of probable licence file $GOMODCACHE/github.com/prometheus/client_golang@v1.1.1-0.20190913103102-20428fa0bffc/LICENSE: Apache License Version 2.0, January 2004 @@ -34262,179 +36742,82 @@ Contents of probable licence file $GOMODCACHE/github.com/oxtoacart/bpool@v0.0.0- this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2014 Percy Wegmann - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - --------------------------------------------------------------------------------- -Dependency : github.com/peterbourgon/diskv -Version: v2.0.1+incompatible -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/peterbourgon/diskv@v2.0.1+incompatible/LICENSE: - -Copyright (c) 2011-2012 Peter Bourgon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/pierrec/lz4 -Version: v2.4.1+incompatible -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4@v2.4.1+incompatible/LICENSE: - -Copyright (c) 2015, Pierre Curto -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + with Licensor regarding such Contributions. -* Neither the name of xxHash nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. --------------------------------------------------------------------------------- -Dependency : github.com/poy/eachers -Version: v0.0.0-20181020210610-23942921fe77 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- + END OF TERMS AND CONDITIONS -Contents of probable licence file $GOMODCACHE/github.com/poy/eachers@v0.0.0-20181020210610-23942921fe77/LICENSE.md: + APPENDIX: How to apply the Apache License to your work. -The MIT License (MIT) + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2016 Andrew Poydence + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -------------------------------------------------------------------------------- -Dependency : github.com/prometheus/client_golang -Version: v1.1.1-0.20190913103102-20428fa0bffc +Dependency : github.com/rakyll/statik +Version: v0.1.6 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/prometheus/client_golang@v1.1.1-0.20190913103102-20428fa0bffc/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/rakyll/statik@v0.1.6/LICENSE: + Apache License Version 2.0, January 2004 @@ -34624,7 +37007,7 @@ Contents of probable licence file $GOMODCACHE/github.com/prometheus/client_golan same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2014 Google Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -34640,13 +37023,163 @@ Contents of probable licence file $GOMODCACHE/github.com/prometheus/client_golan -------------------------------------------------------------------------------- -Dependency : github.com/rakyll/statik -Version: v0.1.6 -Licence type (autodetected): Apache-2.0 +Dependency : github.com/reviewdog/errorformat +Version: v0.0.0-20200109134752-8983be9bc7dd +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/rakyll/statik@v0.1.6/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/reviewdog/errorformat@v0.0.0-20200109134752-8983be9bc7dd/LICENSE: + +MIT License + +Copyright (c) 2016 haya14busa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/rogpeppe/fastuuid +Version: v1.2.0 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/rogpeppe/fastuuid@v1.2.0/LICENSE: + +Copyright © 2014, Roger Peppe +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of this project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/rogpeppe/go-internal +Version: v1.3.0 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/rogpeppe/go-internal@v1.3.0/LICENSE: + +Copyright (c) 2018 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/russross/blackfriday +Version: v1.5.2 +Licence type (autodetected): BSD-2-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/russross/blackfriday@v1.5.2/LICENSE.txt: + +Blackfriday is distributed under the Simplified BSD License: + +> Copyright © 2011 Russ Ross +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions +> are met: +> +> 1. Redistributions of source code must retain the above copyright +> notice, this list of conditions and the following disclaimer. +> +> 2. Redistributions in binary form must reproduce the above +> copyright notice, this list of conditions and the following +> disclaimer in the documentation and/or other materials provided with +> the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +> POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- +Dependency : github.com/samuel/go-parser +Version: v0.0.0-20130731160455-ca8abbf65d0e +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +No licence file provided. + +-------------------------------------------------------------------------------- +Dependency : github.com/sanathkr/go-yaml +Version: v0.0.0-20170819195128-ed9d249f429b +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/sanathkr/go-yaml@v0.0.0-20170819195128-ed9d249f429b/LICENSE: Apache License Version 2.0, January 2004 @@ -34828,7 +37361,7 @@ Contents of probable licence file $GOMODCACHE/github.com/rakyll/statik@v0.1.6/LI APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -34836,7 +37369,7 @@ Contents of probable licence file $GOMODCACHE/github.com/rakyll/statik@v0.1.6/LI same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2014 Google Inc. + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -34852,16 +37385,16 @@ Contents of probable licence file $GOMODCACHE/github.com/rakyll/statik@v0.1.6/LI -------------------------------------------------------------------------------- -Dependency : github.com/reviewdog/errorformat -Version: v0.0.0-20200109134752-8983be9bc7dd +Dependency : github.com/sanathkr/yaml +Version: v1.0.1-0.20170819201035-0056894fa522 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/reviewdog/errorformat@v0.0.0-20200109134752-8983be9bc7dd/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/sanathkr/yaml@v1.0.1-0.20170819201035-0056894fa522/LICENSE: -MIT License +The MIT License (MIT) -Copyright (c) 2016 haya14busa +Copyright (c) 2014 Sam Ghods Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34882,51 +37415,44 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --------------------------------------------------------------------------------- -Dependency : github.com/rogpeppe/fastuuid -Version: v1.2.0 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/rogpeppe/fastuuid@v1.2.0/LICENSE: - -Copyright © 2014, Roger Peppe -All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of this project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/rogpeppe/go-internal -Version: v1.3.0 +Dependency : github.com/santhosh-tekuri/jsonschema +Version: v1.2.4 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/rogpeppe/go-internal@v1.3.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/santhosh-tekuri/jsonschema@v1.2.4/LICENSE: -Copyright (c) 2018 The Go Authors. All rights reserved. +Copyright (c) 2017 Santhosh Kumar Tekuri. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -34954,24 +37480,206 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +Dependency : github.com/satori/go.uuid +Version: v1.2.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/satori/go.uuid@v1.2.0/LICENSE: + +Copyright (C) 2013-2018 by Maxim Bublis + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + -------------------------------------------------------------------------------- -Dependency : github.com/samuel/go-parser -Version: v0.0.0-20130731160455-ca8abbf65d0e +Dependency : github.com/sergi/go-diff +Version: v1.1.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/sergi/go-diff@v1.1.0/LICENSE: + +Copyright (c) 2012-2016 The go-diff Authors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/sirupsen/logrus +Version: v1.4.2 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/sirupsen/logrus@v1.4.2/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2014 Simon Eskildsen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/smartystreets/assertions +Version: v0.0.0-20180927180507-b2de0cb4f26d +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/smartystreets/assertions@v0.0.0-20180927180507-b2de0cb4f26d/LICENSE.md: + +Copyright (c) 2016 SmartyStreets, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +NOTE: Various optional and subordinate components carry their own licensing +requirements and restrictions. Use of those components is subject to the terms +and conditions outlined the respective license of each component. + + +-------------------------------------------------------------------------------- +Dependency : github.com/smartystreets/goconvey +Version: v0.0.0-20190330032615-68dc04aab96a +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/smartystreets/goconvey@v0.0.0-20190330032615-68dc04aab96a/LICENSE.md: + +Copyright (c) 2016 SmartyStreets, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +NOTE: Various optional and subordinate components carry their own licensing +requirements and restrictions. Use of those components is subject to the terms +and conditions outlined the respective license of each component. + + +-------------------------------------------------------------------------------- +Dependency : github.com/spaolacci/murmur3 +Version: v1.1.0 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -No licence file provided. +Contents of probable licence file $GOMODCACHE/github.com/spaolacci/murmur3@v1.1.0/LICENSE: + +Copyright 2013, Sébastien Paolacci. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the library nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + -------------------------------------------------------------------------------- -Dependency : github.com/sanathkr/go-yaml -Version: v0.0.0-20170819195128-ed9d249f429b +Dependency : github.com/spf13/afero +Version: v1.2.2 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/sanathkr/go-yaml@v0.0.0-20170819195128-ed9d249f429b/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/spf13/afero@v1.2.2/LICENSE.txt: - Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -35146,45 +37854,18 @@ Contents of probable licence file $GOMODCACHE/github.com/sanathkr/go-yaml@v0.0.0 incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -------------------------------------------------------------------------------- -Dependency : github.com/sanathkr/yaml -Version: v1.0.1-0.20170819201035-0056894fa522 +Dependency : github.com/spf13/cast +Version: v1.3.0 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/sanathkr/yaml@v1.0.1-0.20170819201035-0056894fa522/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/spf13/cast@v1.3.0/LICENSE: The MIT License (MIT) -Copyright (c) 2014 Sam Ghods +Copyright (c) 2014 Steve Francia Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -35204,143 +37885,17 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/santhosh-tekuri/jsonschema -Version: v1.2.4 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/santhosh-tekuri/jsonschema@v1.2.4/LICENSE: - -Copyright (c) 2017 Santhosh Kumar Tekuri. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -------------------------------------------------------------------------------- -Dependency : github.com/satori/go.uuid -Version: v1.2.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/satori/go.uuid@v1.2.0/LICENSE: - -Copyright (C) 2013-2018 by Maxim Bublis - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/sergi/go-diff -Version: v1.1.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/sergi/go-diff@v1.1.0/LICENSE: - -Copyright (c) 2012-2016 The go-diff Authors. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - - --------------------------------------------------------------------------------- -Dependency : github.com/sirupsen/logrus -Version: v1.4.2 +Dependency : github.com/spf13/jwalterweatherman +Version: v1.0.0 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/sirupsen/logrus@v1.4.2/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/spf13/jwalterweatherman@v1.0.0/LICENSE: The MIT License (MIT) -Copyright (c) 2014 Simon Eskildsen +Copyright (c) 2014 Steve Francia Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -35349,60 +37904,28 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/smartystreets/assertions -Version: v0.0.0-20180927180507-b2de0cb4f26d -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/smartystreets/assertions@v0.0.0-20180927180507-b2de0cb4f26d/LICENSE.md: - -Copyright (c) 2016 SmartyStreets, LLC - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -NOTE: Various optional and subordinate components carry their own licensing -requirements and restrictions. Use of those components is subject to the terms -and conditions outlined the respective license of each component. - - -------------------------------------------------------------------------------- -Dependency : github.com/smartystreets/goconvey -Version: v0.0.0-20190330032615-68dc04aab96a +Dependency : github.com/spf13/viper +Version: v1.3.2 Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/smartystreets/goconvey@v0.0.0-20190330032615-68dc04aab96a/LICENSE.md: +Contents of probable licence file $GOMODCACHE/github.com/spf13/viper@v1.3.2/LICENSE: -Copyright (c) 2016 SmartyStreets, LLC +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -35422,195 +37945,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -NOTE: Various optional and subordinate components carry their own licensing -requirements and restrictions. Use of those components is subject to the terms -and conditions outlined the respective license of each component. - - --------------------------------------------------------------------------------- -Dependency : github.com/spf13/afero -Version: v1.2.2 -Licence type (autodetected): Apache-2.0 --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/spf13/afero@v1.2.2/LICENSE.txt: - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - -------------------------------------------------------------------------------- Dependency : github.com/stretchr/objx Version: v0.2.0 @@ -35677,6 +38011,38 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +Dependency : github.com/ugorji/go +Version: v1.1.8 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/ugorji/go@v1.1.8/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2012-2015 Ugorji Nwoke. +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + -------------------------------------------------------------------------------- Dependency : github.com/urfave/cli Version: v0.0.0-20171014202726-7bc6a0acffa5 @@ -37420,6 +39786,25 @@ Contents of probable licence file $GOMODCACHE/github.com/xeipuuv/gojsonschema@v0 limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/xordataexchange/crypt +Version: v0.0.3-0.20170626215501-b2862e3d0a77 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/xordataexchange/crypt@v0.0.3-0.20170626215501-b2862e3d0a77/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2014 XOR Data Exchange, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + -------------------------------------------------------------------------------- Dependency : github.com/yuin/gopher-lua Version: v0.0.0-20170403160031-b402f3114ec7 diff --git a/go.mod b/go.mod index 09cd086cbee..bb31374384a 100644 --- a/go.mod +++ b/go.mod @@ -45,6 +45,7 @@ require ( github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 // indirect github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2 // indirect + github.com/dgraph-io/badger/v2 v2.2007.2 github.com/dgrijalva/jwt-go v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible // indirect github.com/digitalocean/go-libvirt v0.0.0-20180301200012-6075ea3c39a1 github.com/dlclark/regexp2 v1.1.7-0.20171009020623-7632a260cbaf // indirect @@ -55,7 +56,7 @@ require ( github.com/docker/go-units v0.4.0 github.com/dop251/goja v0.0.0-20200831102558-9af81ddcf0e1 github.com/dop251/goja_nodejs v0.0.0-20171011081505-adff31b136e6 - github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4 + github.com/dustin/go-humanize v1.0.0 github.com/eclipse/paho.mqtt.golang v1.2.1-0.20200121105743-0d940dd29fd2 github.com/elastic/ecs v1.6.0 github.com/elastic/elastic-agent-client/v7 v7.0.0-20200709172729-d43b7ad5833a @@ -142,12 +143,13 @@ require ( github.com/satori/go.uuid v1.2.0 // indirect github.com/shirou/gopsutil v2.19.11+incompatible github.com/shopspring/decimal v1.2.0 - github.com/spf13/cobra v0.0.3 + github.com/spf13/cobra v0.0.5 github.com/spf13/pflag v1.0.5 github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.6.1 github.com/tsg/go-daemon v0.0.0-20200207173439-e704b93fd89b github.com/tsg/gopacket v0.0.0-20200626092518-2ab8e397a786 + github.com/ugorji/go/codec v1.1.8 github.com/urso/sderr v0.0.0-20200210124243-c2a16f3d43ec github.com/vmware/govmomi v0.0.0-20170802214208-2cad15190b41 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c diff --git a/go.sum b/go.sum index 031f1faa095..8113d42f321 100644 --- a/go.sum +++ b/go.sum @@ -76,6 +76,8 @@ github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbt github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= +github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA= @@ -83,6 +85,8 @@ github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tT github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= @@ -112,6 +116,7 @@ github.com/antlr/antlr4 v0.0.0-20200820155224-be881fa6b91d h1:OE3kzLBpy7pOJEzE55 github.com/antlr/antlr4 v0.0.0-20200820155224-be881fa6b91d/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= github.com/apoydence/eachers v0.0.0-20181020210610-23942921fe77 h1:afT88tB6u9JCKQZVAAaa9ICz/uGn5Uw9ekn6P22mYKM= github.com/apoydence/eachers v0.0.0-20181020210610-23942921fe77/go.mod h1:bXvGk6IkT1Agy7qzJ+DjIw/SJ1AaB3AvAuMDVV+Vkoo= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -141,6 +146,8 @@ github.com/cavaliercoder/badio v0.0.0-20160213150051-ce5280129e9e/go.mod h1:V284 github.com/cavaliercoder/go-rpm v0.0.0-20190131055624-7a9c54e3d83e h1:Gbx+iVCXG/1m5WSnidDGuHgN+vbIwl+6fR092ANU+Y8= github.com/cavaliercoder/go-rpm v0.0.0-20190131055624-7a9c54e3d83e/go.mod h1:AZIh1CCnMrcVm6afFf96PBvE2MRpWFco91z8ObJtgDY= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -170,12 +177,16 @@ github.com/containerd/fifo v0.0.0-20190816180239-bda0ff6ed73c/go.mod h1:ODA38xgv github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea h1:n2Ltr3SrfQlf/9nOna1DoGKxLx3qTSI8Ttl6Xrqp6mw= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cucumber/godog v0.8.1 h1:lVb+X41I4YDreE+ibZ50bdXmySxgRviYFgKY6Aw4XE8= github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= @@ -190,9 +201,15 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e/go.mod h1:xb github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2 h1:6+hM8KeYKV0Z9EIINNqIEDyyIRAcNc2FW+/TUYNmWyw= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= +github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible h1:4jGdduO4ceTJFKf0IhgaB8NJapGqKHwC2b4xQ/cXujM= github.com/dgrijalva/jwt-go v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/digitalocean/go-libvirt v0.0.0-20180301200012-6075ea3c39a1 h1:eG5K5GNAAHvQlFmfIuy0Ocjg5dvyX22g/KknwTpmBko= github.com/digitalocean/go-libvirt v0.0.0-20180301200012-6075ea3c39a1/go.mod h1:PRcPVAAma6zcLpFd4GZrjR/MRpood3TamjKI2m/z/Uw= github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= @@ -213,8 +230,9 @@ github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QL github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/dop251/goja_nodejs v0.0.0-20171011081505-adff31b136e6 h1:RrkoB0pT3gnjXhL/t10BSP1mcr/0Ldea2uMyuBr2SWk= github.com/dop251/goja_nodejs v0.0.0-20171011081505-adff31b136e6/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4 h1:qk/FSDDxo05wdJH28W+p5yivv7LuLYLRXPPD8KQCtZs= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= @@ -327,7 +345,6 @@ github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -339,7 +356,6 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= @@ -366,7 +382,6 @@ github.com/google/go-github/v29 v29.0.2 h1:opYN6Wc7DOz7Ku3Oh4l7prmkOMwEcQxpFtxdU github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -403,7 +418,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.13.0 h1:sBDQoHXrOlfPobnKw69FIKa1wg9qsL github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/h2non/filetype v1.0.12 h1:yHCsIe0y2cvbDARtJhGBTD2ecvqMSTvlIcph9En/Zao= github.com/h2non/filetype v1.0.12/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -424,6 +438,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.2-0.20190520140433-59383c442f7d h1:Ft6PtvobE9vwkCsuoNO5DZDbhKkKuktAlSsiOi1X5NA= github.com/hashicorp/golang-lru v0.5.2-0.20190520140433-59383c442f7d/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/haya14busa/go-actions-toolkit v0.0.0-20200105081403-ca0307860f01 h1:HiJF8Mek+I7PY0Bm+SuhkwaAZSZP83sw6rrTMrgZ0io= github.com/haya14busa/go-actions-toolkit v0.0.0-20200105081403-ca0307860f01/go.mod h1:1DWDZmeYf0LX30zscWb7K9rUMeirNeBMd5Dum+seUhc= github.com/haya14busa/go-checkstyle v0.0.0-20170303121022-5e9d09f51fa1/go.mod h1:RsN5RGgVYeXpcXNtWyztD5VIe7VNSEqpJvF2iEH7QvI= @@ -455,7 +470,6 @@ github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgb github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -478,7 +492,6 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -490,10 +503,10 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.2-0.20190507191818-2ff3cb3adc01 h1:EPw7R3OAyxHBCyl0oqh3lUZqS5lu3KSxzzGasE0opXQ= github.com/lib/pq v1.1.2-0.20190507191818-2ff3cb3adc01/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/magefile/mage v1.9.0 h1:t3AU2wNwehMCW97vuqQLtw6puppWXHO+O2MHo5a50XE= github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g= github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= @@ -543,7 +556,6 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.5.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -575,6 +587,7 @@ github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 h1:CXwSGu/LYmbjEab5aMCs5usQRVBGThelUKBNnoSOuso= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v2.4.1+incompatible h1:mFe7ttWaflA46Mhqh+jUfjp2qTbPYxLB2/OyBppH9dg= github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -621,6 +634,7 @@ github.com/reviewdog/reviewdog v0.9.17 h1:MKb3rlQZgkEXr3d85iqtYNITXn7gDJr2kT0Ihg github.com/reviewdog/reviewdog v0.9.17/go.mod h1:Y0yPFDTi9L5ohkoecJdgbvAhq+dUXp+zI7atqVibwKg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/samuel/go-parser v0.0.0-20130731160455-ca8abbf65d0e h1:hUGyBE/4CXRPThr4b6kt+f1CN90no4Fs5CNrYOKYSIg= github.com/samuel/go-parser v0.0.0-20130731160455-ca8abbf65d0e/go.mod h1:Sb6li54lXV0yYEjI4wX8cucdQ9gqUJV3+Ngg3l9g30I= github.com/samuel/go-thrift v0.0.0-20140522043831-2187045faa54 h1:jbchLJWyhKcmOjkbC4zDvT/n5EEd7g6hnnF760rEyRA= @@ -650,14 +664,22 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= @@ -666,9 +688,7 @@ github.com/stretchr/testify v1.1.5-0.20170601210322-f6abca593680/go.mod h1:a8OnR github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.0 h1:DMOzIV76tmoDNE9pX6RSN0aDtCYeCg5VueieJaAo1uw= github.com/stretchr/testify v1.5.0/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -677,6 +697,11 @@ github.com/tsg/go-daemon v0.0.0-20200207173439-e704b93fd89b h1:X/8hkb4rQq3+QuOxp github.com/tsg/go-daemon v0.0.0-20200207173439-e704b93fd89b/go.mod h1:jAqhj/JBVC1PwcLTWd6rjQyGyItxxrhpiBl8LSuAGmw= github.com/tsg/gopacket v0.0.0-20200626092518-2ab8e397a786 h1:B/IVHYiI0d04dudYw+CvCAGqSMq8d0yWy56eD6p85BQ= github.com/tsg/gopacket v0.0.0-20200626092518-2ab8e397a786/go.mod h1:RIkfovP3Y7my19aXEjjbNd9E5TlHozzAyt7B8AaEcwg= +github.com/ugorji/go v1.1.8 h1:/D9x7IRpfMHDlizVOgxrag5Fh+/NY+LtI8bsr+AswRA= +github.com/ugorji/go v1.1.8/go.mod h1:0lNM99SwWUIRhCXnigEMClngXBk/EmpTXa7mgiewYWA= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.8 h1:4dryPvxMP9OtkjIbuNeK2nb27M38XMHLGlfNSNph/5s= +github.com/ugorji/go/codec v1.1.8/go.mod h1:X00B19HDtwvKbQY2DcYjvZxKQp8mzrJoQ6EgoIY/D2E= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urso/diag v0.0.0-20200210123136-21b3cc8eb797 h1:OHNw/6pXODJAB32NujjdQO/KIYQ3KAbHQfCzH81XdCs= github.com/urso/diag v0.0.0-20200210123136-21b3cc8eb797/go.mod h1:pNWFTeQ+V1OYT/TzWpnWb6eQBdoXpdx+H+lrH97/Oyo= @@ -705,9 +730,9 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56 h1:yhqBHs09SmmUoNOHc9jgK4a60T3XFRtPAkYxVnqgY50= github.com/xeipuuv/gojsonschema v0.0.0-20181112162635-ac52e6811b56/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/gopher-lua v0.0.0-20170403160031-b402f3114ec7 h1:0gYLpmzecnaDCoeWxSfEJ7J1b6B/67+NV++4HKQXx+Y= github.com/yuin/gopher-lua v0.0.0-20170403160031-b402f3114ec7/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= -go.elastic.co/apm v1.7.2 h1:0nwzVIPp4PDBXSYYtN19+1W5V+sj+C25UjqxDVoKcA8= go.elastic.co/apm v1.7.2/go.mod h1:tCw6CkOJgkWnzEthFN9HUP1uL3Gjc/Ur6m7gRPLaoH0= go.elastic.co/apm v1.8.1-0.20200909061013-2aef45b9cf4b h1:Sf+V3eV91ZuXjF3824SABFgXU+z4ZEuIX5ikDvt2lCE= go.elastic.co/apm v1.8.1-0.20200909061013-2aef45b9cf4b/go.mod h1:qoOSi09pnzJDh5fKnfY7bPmQgl8yl2tULdOu03xhui0= @@ -717,7 +742,6 @@ go.elastic.co/apm/module/apmhttp v1.7.2 h1:2mRh7SwBuEVLmJlX+hsMdcSg9xaielCLElaPn go.elastic.co/apm/module/apmhttp v1.7.2/go.mod h1:sTFWiWejnhSdZv6+dMgxGec2Nxe/ZKfHfz/xtRM+cRY= go.elastic.co/ecszap v0.1.1-0.20200424093508-cdd95a104193 h1:NjYJ/beChqugXSavTkH5tF6shvr/is8jdgJ331wfwT8= go.elastic.co/ecszap v0.1.1-0.20200424093508-cdd95a104193/go.mod h1:HTUi+QRmr3EuZMqxPX+5fyOdMNfUu5iPebgfhgsTJYQ= -go.elastic.co/fastjson v1.0.0 h1:ooXV/ABvf+tBul26jcVViPT3sBir0PvXgibYB1IQQzg= go.elastic.co/fastjson v1.0.0/go.mod h1:PmeUOMMtLHQr9ZS9J9owrAVg0FkaZDRZJEFTTGHtchs= go.elastic.co/fastjson v1.1.0 h1:3MrGBWWVIxe/xvsbpghtkFoPciPhOCmjsR/HfwEeQR4= go.elastic.co/fastjson v1.1.0/go.mod h1:boNGISWMjQsUPy/t6yqt2/1Wx4YNPSe+mZjlyw9vKKI= @@ -741,6 +765,7 @@ go.uber.org/zap v1.14.0 h1:/pduUoebOeeJzTDFuoMgC6nRkiasr1sBCIEorly7m4o= go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -767,7 +792,6 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367 h1:0IiAsCRByjO2QjX7ZPkw5oU9x+n1YqRL802rjC0c3Aw= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -801,7 +825,6 @@ golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -818,7 +841,6 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -827,6 +849,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -840,6 +863,7 @@ golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190529164535-6a60838ec259/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -848,12 +872,9 @@ golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200102141924-c96a22e43c9c h1:OYFUffxXPezb7BVTx9AaD4Vl0qtxmklBIkwCKH1YwDY= golang.org/x/sys v0.0.0-20200102141924-c96a22e43c9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e h1:LwyF2AFISC9nVbS6MgzsaQNSUsRXI49GS+YQ5KX/QH0= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -904,7 +925,6 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= @@ -916,7 +936,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -948,7 +967,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/libbeat/tests/system/test_cmd_completion.py b/libbeat/tests/system/test_cmd_completion.py index 2e523c0831d..a06259a5046 100644 --- a/libbeat/tests/system/test_cmd_completion.py +++ b/libbeat/tests/system/test_cmd_completion.py @@ -17,7 +17,7 @@ def test_bash_completion(self): def test_zsh_completion(self): exit_code = self.run_beat(extra_args=["completion", "zsh"]) assert exit_code == 0 - assert self.log_contains("#compdef mockbeat") + assert self.log_contains("#compdef _mockbeat mockbeat") def test_unknown_completion(self): exit_code = self.run_beat(extra_args=["completion", "awesomeshell"]) diff --git a/x-pack/libbeat/common/cloudfoundry/cache.go b/x-pack/libbeat/common/cloudfoundry/cache.go index 22f41f3b23c..0f19818666e 100644 --- a/x-pack/libbeat/common/cloudfoundry/cache.go +++ b/x-pack/libbeat/common/cloudfoundry/cache.go @@ -5,13 +5,16 @@ package cloudfoundry import ( + "crypto/sha1" + "encoding/base64" "fmt" "time" "github.com/cloudfoundry-community/go-cfclient" + "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/x-pack/libbeat/persistentcache" ) // cfClient interface is provided so unit tests can mock the actual client. @@ -22,65 +25,113 @@ type cfClient interface { // clientCacheWrap wraps the cloudfoundry client to add a cache in front of GetAppByGuid. type clientCacheWrap struct { - cache *common.Cache + cache *persistentcache.PersistentCache client cfClient log *logp.Logger errorTTL time.Duration } // newClientCacheWrap creates a new cache for application data. -func newClientCacheWrap(client cfClient, ttl time.Duration, errorTTL time.Duration, log *logp.Logger) *clientCacheWrap { +func newClientCacheWrap(client cfClient, cacheName string, ttl time.Duration, errorTTL time.Duration, log *logp.Logger) (*clientCacheWrap, error) { + options := persistentcache.Options{ + Timeout: ttl, + } + + name := "cloudfoundry" + if cacheName != "" { + name = name + "-" + sanitizeCacheName(cacheName) + } + + cache, err := persistentcache.New(name, options) + if err != nil { + return nil, fmt.Errorf("creating metadata cache: %w", err) + } + return &clientCacheWrap{ - cache: common.NewCacheWithExpireOnAdd(ttl, 100), + cache: cache, client: client, errorTTL: errorTTL, log: log, - } + }, nil } type appResponse struct { - app *cfclient.App - err error + App AppMeta `json:"a"` + Error cfclient.CloudFoundryError `json:"e,omitempty"` + ErrorMessage string `json:"em,omitempty"` +} + +func (r *appResponse) fromStructs(app cfclient.App, err error) { + if err != nil { + cause := errors.Cause(err) + if cferr, ok := cause.(cfclient.CloudFoundryError); ok { + r.Error = cferr + } + r.ErrorMessage = err.Error() + return + } + r.App = AppMeta{ + Name: app.Name, + Guid: app.Guid, + SpaceName: app.SpaceData.Entity.Name, + SpaceGuid: app.SpaceData.Meta.Guid, + OrgName: app.SpaceData.Entity.OrgData.Entity.Name, + OrgGuid: app.SpaceData.Entity.OrgData.Meta.Guid, + } +} + +func (r *appResponse) toStructs() (*AppMeta, error) { + var empty cfclient.CloudFoundryError + if r.Error != empty { + // Wrapping the error so cfclient.IsAppNotFoundError can identify it + return nil, errors.Wrap(r.Error, r.ErrorMessage) + } + if len(r.ErrorMessage) > 0 { + return nil, errors.New(r.ErrorMessage) + } + return &r.App, nil } // fetchApp uses the cfClient to retrieve an App entity and // stores it in the internal cache -func (c *clientCacheWrap) fetchAppByGuid(guid string) (*cfclient.App, error) { +func (c *clientCacheWrap) fetchAppByGuid(guid string) (*AppMeta, error) { app, err := c.client.GetAppByGuid(guid) - resp := appResponse{ - app: &app, - err: err, - } + var resp appResponse + resp.fromStructs(app, err) timeout := time.Duration(0) if err != nil { // Cache nil, because is what we want to return when there was an error - resp.app = nil timeout = c.errorTTL } - c.cache.PutWithTimeout(guid, &resp, timeout) - return resp.app, resp.err + err = c.cache.PutWithTimeout(guid, resp, timeout) + if err != nil { + return nil, fmt.Errorf("storing app response in cache: %w", err) + } + return resp.toStructs() } // GetApp returns CF Application info, either from the cache or // using the CF client. -func (c *clientCacheWrap) GetAppByGuid(guid string) (*cfclient.App, error) { - cachedResp := c.cache.Get(guid) - if cachedResp == nil { +func (c *clientCacheWrap) GetAppByGuid(guid string) (*AppMeta, error) { + var resp appResponse + err := c.cache.Get(guid, &resp) + if err != nil { return c.fetchAppByGuid(guid) } - resp, ok := cachedResp.(*appResponse) - if !ok { - return nil, fmt.Errorf("error converting cached app response (of type %T), this is likely a bug", cachedResp) - } - return resp.app, resp.err + return resp.toStructs() } -// StartJanitor starts a goroutine that will periodically clean the applications cache. -func (c *clientCacheWrap) StartJanitor(interval time.Duration) { - c.cache.StartJanitor(interval) +// Close release resources associated with this client +func (c *clientCacheWrap) Close() error { + err := c.cache.Close() + if err != nil { + return fmt.Errorf("closing cache: %w", err) + } + return nil } -// StopJanitor stops the goroutine that periodically clean the applications cache. -func (c *clientCacheWrap) StopJanitor() { - c.cache.StopJanitor() +// sanitizeCacheName returns a unique string that can be used safely as part of a file name +func sanitizeCacheName(name string) string { + hash := sha1.Sum([]byte(name)) + return base64.RawURLEncoding.EncodeToString(hash[:]) } diff --git a/x-pack/libbeat/common/cloudfoundry/cache_integration_test.go b/x-pack/libbeat/common/cloudfoundry/cache_integration_test.go index f6af11787c9..f799cc0615f 100644 --- a/x-pack/libbeat/common/cloudfoundry/cache_integration_test.go +++ b/x-pack/libbeat/common/cloudfoundry/cache_integration_test.go @@ -31,7 +31,7 @@ func TestGetApps(t *testing.T) { client, err := hub.Client() require.NoError(t, err) - apps, err := client.(*clientCacheWrap).client.(*cfclient.Client).ListApps() + apps, err := client.ListApps() require.NoError(t, err) t.Logf("%d applications available", len(apps)) @@ -40,8 +40,9 @@ func TestGetApps(t *testing.T) { if len(apps) == 0 { t.Skip("no apps in account?") } - client, err := hub.Client() + client, err := hub.ClientWithCache() require.NoError(t, err) + defer client.Close() guid := apps[0].Guid app, err := client.GetAppByGuid(guid) @@ -50,13 +51,15 @@ func TestGetApps(t *testing.T) { }) t.Run("handle error when application is not available", func(t *testing.T) { - client, err := hub.Client() + client, err := hub.ClientWithCache() require.NoError(t, err) + defer client.Close() testNotExists := func(t *testing.T) { app, err := client.GetAppByGuid("notexists") assert.Nil(t, app) - assert.True(t, cfclient.IsAppNotFoundError(err)) + assert.Error(t, err) + assert.True(t, cfclient.IsAppNotFoundError(err), "Error found: %v", err) } var firstTimeDuration time.Duration diff --git a/x-pack/libbeat/common/cloudfoundry/cache_test.go b/x-pack/libbeat/common/cloudfoundry/cache_test.go index 9e18a5ac86e..b345beff226 100644 --- a/x-pack/libbeat/common/cloudfoundry/cache_test.go +++ b/x-pack/libbeat/common/cloudfoundry/cache_test.go @@ -13,19 +13,25 @@ import ( "github.com/cloudfoundry-community/go-cfclient" "github.com/gofrs/uuid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/elastic/beats/v7/libbeat/logp" ) func TestClientCacheWrap(t *testing.T) { - ttl := 500 * time.Millisecond + if testing.Short() { + t.Skip("skipping in short mode") + } + + ttl := 2 * time.Second guid := mustCreateFakeGuid() app := cfclient.App{ - Guid: guid, - Memory: 1, // use this field to track if from cache or from client + Guid: guid, + Name: "Foo", // use this field to track if from cache or from client } fakeClient := &fakeCFClient{app, 0} - cache := newClientCacheWrap(fakeClient, ttl, ttl, logp.NewLogger("cloudfoundry")) + cache, err := newClientCacheWrap(fakeClient, "test", ttl, ttl, logp.NewLogger("cloudfoundry")) + require.NoError(t, err) missingAppGuid := mustCreateFakeGuid() @@ -44,25 +50,28 @@ func TestClientCacheWrap(t *testing.T) { // fetched from client for the first time one, err = cache.GetAppByGuid(guid) assert.NoError(t, err) - assert.Equal(t, app, *one) + assert.Equal(t, app.Guid, one.Guid) + assert.Equal(t, app.Name, one.Name) assert.Equal(t, 2, fakeClient.callCount) // updated app in fake client, new fetch should not have updated app updatedApp := cfclient.App{ - Guid: guid, - Memory: 2, + Guid: guid, + Name: "Bar", } fakeClient.app = updatedApp two, err := cache.GetAppByGuid(guid) assert.NoError(t, err) - assert.Equal(t, app, *two) + assert.Equal(t, app.Guid, two.Guid) + assert.Equal(t, app.Name, two.Name) assert.Equal(t, 2, fakeClient.callCount) // wait the ttl, then it should have updated app time.Sleep(ttl) three, err := cache.GetAppByGuid(guid) assert.NoError(t, err) - assert.Equal(t, updatedApp, *three) + assert.Equal(t, updatedApp.Guid, three.Guid) + assert.Equal(t, updatedApp.Name, three.Name) assert.Equal(t, 3, fakeClient.callCount) } diff --git a/x-pack/libbeat/common/cloudfoundry/hub.go b/x-pack/libbeat/common/cloudfoundry/hub.go index 4bb7fce1eec..4cf9757c278 100644 --- a/x-pack/libbeat/common/cloudfoundry/hub.go +++ b/x-pack/libbeat/common/cloudfoundry/hub.go @@ -5,10 +5,8 @@ package cloudfoundry import ( - "fmt" "net/http" "strings" - "time" "github.com/cloudfoundry-community/go-cfclient" "github.com/pkg/errors" @@ -19,11 +17,20 @@ import ( // Client interface exposed by Hub.Client. type Client interface { // GetAppByGuid returns the application from cloudfoundry. - GetAppByGuid(guid string) (*cfclient.App, error) - // StartJanitor keeps the cache of applications clean. - StartJanitor(interval time.Duration) - // StopJanitor stops the running janitor. - StopJanitor() + GetAppByGuid(guid string) (*AppMeta, error) + + // Close releases resources associated with this client. + Close() error +} + +// AppMeta is the metadata associated with a cloudfoundry application +type AppMeta struct { + Guid string `json:"guid"` + Name string `json:"name"` + SpaceGuid string `json:"space_guid"` + SpaceName string `json:"space_name"` + OrgGuid string `json:"org_guid"` + OrgName string `json:"org_name"` } // Hub is central place to get all the required clients to communicate with cloudfoundry. @@ -39,7 +46,7 @@ func NewHub(cfg *Config, userAgent string, log *logp.Logger) *Hub { } // Client returns the cloudfoundry client. -func (h *Hub) Client() (Client, error) { +func (h *Hub) Client() (*cfclient.Client, error) { httpClient, insecure, err := h.httpClient() if err != nil { return nil, err @@ -67,7 +74,15 @@ func (h *Hub) Client() (Client, error) { if h.cfg.UaaAddress != "" { cf.Endpoint.AuthEndpoint = h.cfg.UaaAddress } - return newClientCacheWrap(cf, h.cfg.CacheDuration, h.cfg.CacheRetryDelay, h.log), nil + return cf, nil +} + +func (h *Hub) ClientWithCache() (Client, error) { + c, err := h.Client() + if err != nil { + return nil, err + } + return newClientCacheWrap(c, h.cfg.APIAddress, h.cfg.CacheDuration, h.cfg.CacheRetryDelay, h.log) } // RlpListener returns a listener client that calls the passed callback when the provided events are streamed through @@ -85,7 +100,7 @@ func (h *Hub) RlpListener(callbacks RlpListenerCallbacks) (*RlpListener, error) // // In the case that the cloudfoundry client was already needed by the code path, call this method // as not to create a intermediate client that will not be used. -func (h *Hub) RlpListenerFromClient(client Client, callbacks RlpListenerCallbacks) (*RlpListener, error) { +func (h *Hub) RlpListenerFromClient(client *cfclient.Client, callbacks RlpListenerCallbacks) (*RlpListener, error) { var rlpAddress string if h.cfg.RlpAddress != "" { rlpAddress = h.cfg.RlpAddress @@ -107,47 +122,29 @@ func (h *Hub) DopplerConsumer(callbacks DopplerCallbacks) (*DopplerConsumer, err return h.DopplerConsumerFromClient(client, callbacks) } -func (h *Hub) DopplerConsumerFromClient(client Client, callbacks DopplerCallbacks) (*DopplerConsumer, error) { +func (h *Hub) DopplerConsumerFromClient(client *cfclient.Client, callbacks DopplerCallbacks) (*DopplerConsumer, error) { dopplerAddress := h.cfg.DopplerAddress if dopplerAddress == "" { - endpoint, err := cfEndpoint(client) - if err != nil { - return nil, errors.Wrap(err, "getting endpoints from client") - } - dopplerAddress = endpoint.DopplerEndpoint + dopplerAddress = client.Endpoint.DopplerEndpoint } httpClient, _, err := h.httpClient() if err != nil { return nil, errors.Wrap(err, "getting http client") } - // TODO: Refactor Client so it is easier to access the cfclient - ccw, ok := client.(*clientCacheWrap) - if !ok { - return nil, fmt.Errorf("client without cache wrap") - } - cfc, ok := ccw.client.(*cfclient.Client) - if !ok { - return nil, fmt.Errorf("client is not a cloud foundry client") - } - - tr := TokenRefresherFromCfClient(cfc) + tr := TokenRefresherFromCfClient(client) return newDopplerConsumer(dopplerAddress, h.cfg.ShardID, h.log, httpClient, tr, callbacks) } // doerFromClient returns an auth token doer using uaa. -func (h *Hub) doerFromClient(client Client) (*authTokenDoer, error) { +func (h *Hub) doerFromClient(client *cfclient.Client) (*authTokenDoer, error) { httpClient, _, err := h.httpClient() if err != nil { return nil, err } url := h.cfg.UaaAddress if url == "" { - endpoint, err := cfEndpoint(client) - if err != nil { - return nil, errors.Wrap(err, "getting endpoints from client") - } - url = endpoint.AuthEndpoint + url = client.Endpoint.AuthEndpoint } return newAuthTokenDoer(url, h.cfg.ClientID, h.cfg.ClientSecret, httpClient, h.log), nil } @@ -165,18 +162,6 @@ func (h *Hub) httpClient() (*http.Client, bool, error) { return httpClient, tls.InsecureSkipVerify, nil } -func cfEndpoint(client Client) (cfclient.Endpoint, error) { - ccw, ok := client.(*clientCacheWrap) - if !ok { - return cfclient.Endpoint{}, fmt.Errorf("client without cache wrap") - } - cfc, ok := ccw.client.(*cfclient.Client) - if !ok { - return cfclient.Endpoint{}, fmt.Errorf("client is not a cloud foundry client") - } - return cfc.Endpoint, nil -} - // defaultTransport returns a new http.Transport for http.Client func defaultTransport() *http.Transport { defaultTransport := http.DefaultTransport.(*http.Transport) diff --git a/x-pack/libbeat/common/cloudfoundry/main_test.go b/x-pack/libbeat/common/cloudfoundry/main_test.go new file mode 100644 index 00000000000..ec352def825 --- /dev/null +++ b/x-pack/libbeat/common/cloudfoundry/main_test.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package cloudfoundry + +import ( + "fmt" + "io/ioutil" + "os" + "testing" + + "github.com/elastic/beats/v7/libbeat/paths" +) + +func TestMain(m *testing.M) { + // Override global beats data dir to avoid creating directories in the working copy. + tmpdir, err := ioutil.TempDir("", "beats-data-dir") + if err != nil { + fmt.Printf("Failed to create temporal data directory: %v\n", err) + os.Exit(1) + } + paths.Paths.Data = tmpdir + + result := m.Run() + os.RemoveAll(tmpdir) + + os.Exit(result) +} diff --git a/x-pack/libbeat/persistentcache/encoding.go b/x-pack/libbeat/persistentcache/encoding.go new file mode 100644 index 00000000000..60b2058ebf4 --- /dev/null +++ b/x-pack/libbeat/persistentcache/encoding.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package persistentcache + +import ( + "bytes" + "encoding/json" + + ugorjicodec "github.com/ugorji/go/codec" +) + +type codec interface { + Decode([]byte, interface{}) error + Encode(interface{}) ([]byte, error) +} + +type jsonCodec struct{} + +func newJSONCodec() *jsonCodec { + return &jsonCodec{} +} + +// Encode encodes an object in json format. +func (*jsonCodec) Encode(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +// Decode decodes an object from its json representation. +func (*jsonCodec) Decode(d []byte, v interface{}) error { + return json.Unmarshal(d, v) +} + +type cborCodec struct { + handle ugorjicodec.CborHandle +} + +func newCBORCodec() *cborCodec { + return &cborCodec{} +} + +// Encode encodes an object in cbor format. +func (c *cborCodec) Encode(v interface{}) ([]byte, error) { + var buf bytes.Buffer + enc := ugorjicodec.NewEncoder(&buf, &c.handle) + err := enc.Encode(v) + return buf.Bytes(), err +} + +// Decode decodes an object from its cbor representation. +func (c *cborCodec) Decode(d []byte, v interface{}) error { + dec := ugorjicodec.NewDecoder(bytes.NewReader(d), &c.handle) + return dec.Decode(v) +} diff --git a/x-pack/libbeat/persistentcache/persistentcache.go b/x-pack/libbeat/persistentcache/persistentcache.go new file mode 100644 index 00000000000..39721095b86 --- /dev/null +++ b/x-pack/libbeat/persistentcache/persistentcache.go @@ -0,0 +1,112 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package persistentcache + +import ( + "fmt" + "time" + + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/paths" +) + +const ( + cacheFile = "cache" + gcPeriod = 5 * time.Minute +) + +// PersistentCache is a persistent map of keys to values. Elements added to the +// cache are stored until they are explicitly deleted or are expired due to time-based +// eviction based on last access or add time. +type PersistentCache struct { + log *logp.Logger + + store *Store + codec codec + + refreshOnAccess bool + timeout time.Duration +} + +// Options are the options that can be used to customize persistent caches +type Options struct { + // Length of time before cache elements expire + Timeout time.Duration + + // If set to true, expiration time of an entry is updated + // when the object is accessed. + RefreshOnAccess bool + + // If empty, beats data path is used. + RootPath string +} + +// New creates and returns a new persistent cache. +// Cache returned by this method must be closed with Close() when +// not needed anymore. +func New(name string, opts Options) (*PersistentCache, error) { + logger := logp.NewLogger("persistentcache") + + rootPath := opts.RootPath + if rootPath == "" { + rootPath = paths.Resolve(paths.Data, cacheFile) + } + store, err := newStore(logger, rootPath, name) + if err != nil { + return nil, err + } + + return &PersistentCache{ + log: logger, + store: store, + codec: newCBORCodec(), + + refreshOnAccess: opts.RefreshOnAccess, + timeout: opts.Timeout, + }, nil +} + +// Put writes the given key and value to the map replacing any +// existing value if it exists. +func (c *PersistentCache) Put(k string, v interface{}) error { + return c.PutWithTimeout(k, v, 0) +} + +// PutWithTimeout writes the given key and value to the map replacing any +// existing value if it exists. +// The cache expiration time will be overwritten by timeout of the key being +// inserted. +func (c *PersistentCache) PutWithTimeout(k string, v interface{}, timeout time.Duration) error { + d, err := c.codec.Encode(v) + if err != nil { + return fmt.Errorf("encoding item to store in cache: %w", err) + } + if timeout == 0 { + timeout = c.timeout + } + return c.store.Set([]byte(k), d, timeout) +} + +// Get the current value associated with a key or nil if the key is not +// present. The last access time of the element is updated. +func (c *PersistentCache) Get(k string, v interface{}) error { + d, err := c.store.Get([]byte(k)) + if err != nil { + return err + } + if c.refreshOnAccess && c.timeout > 0 { + c.store.Set([]byte(k), d, c.timeout) + } + err = c.codec.Decode(d, v) + if err != nil { + return fmt.Errorf("decoding item stored in cache: %w", err) + } + return nil +} + +// Close releases all resources associated with this cache. +func (c *PersistentCache) Close() error { + return c.store.Close() +} diff --git a/x-pack/libbeat/persistentcache/persistentcache_test.go b/x-pack/libbeat/persistentcache/persistentcache_test.go new file mode 100644 index 00000000000..f6f28d73b75 --- /dev/null +++ b/x-pack/libbeat/persistentcache/persistentcache_test.go @@ -0,0 +1,436 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package persistentcache + +import ( + "fmt" + "io/ioutil" + "math/rand" + "os" + "path/filepath" + "strconv" + "testing" + "time" + + "github.com/gofrs/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/logp" +) + +func TestPutGet(t *testing.T) { + logp.TestingSetup() + t.Parallel() + + cache, err := New("test", testOptions(t)) + require.NoError(t, err) + defer cache.Close() + + type valueType struct { + Something string + } + + var key = "somekey" + var value = valueType{Something: "foo"} + + err = cache.Put(key, value) + assert.NoError(t, err) + + var result valueType + err = cache.Get(key, &result) + assert.NoError(t, err) + assert.Equal(t, value, result) + + err = cache.Get("notexist", &result) + assert.Error(t, err) +} + +func TestPersist(t *testing.T) { + logp.TestingSetup() + t.Parallel() + + options := testOptions(t) + + cache, err := New("test", options) + require.NoError(t, err) + + type valueType struct { + Something string + } + + var key = "somekey" + var value = valueType{Something: "foo"} + + err = cache.Put(key, value) + assert.NoError(t, err) + + err = cache.Close() + assert.NoError(t, err) + + cache, err = New("test", options) + require.NoError(t, err) + defer cache.Close() + + var result valueType + err = cache.Get(key, &result) + assert.NoError(t, err) + assert.Equal(t, value, result) +} + +func TestExpired(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + logp.TestingSetup() + t.Parallel() + + options := testOptions(t) + cache, err := New("test", options) + require.NoError(t, err) + defer cache.Close() + + type valueType struct { + Something string + } + + var key = "somekey" + var value = valueType{Something: "foo"} + + // Badger TTL is not reliable on sub-second durations. + err = cache.PutWithTimeout(key, value, 2*time.Second) + assert.NoError(t, err) + + var result valueType + err = cache.Get(key, &result) + assert.NoError(t, err) + assert.Equal(t, value, result) + + time.Sleep(2 * time.Second) + err = cache.Get(key, &result) + assert.Error(t, err) +} + +func TestRefreshOnAccess(t *testing.T) { + t.Skip("flaky test") + + if testing.Short() { + t.Skip("skipping in short mode") + } + + logp.TestingSetup() + t.Parallel() + + // Badger TTL is not reliable on sub-second durations. + options := testOptions(t) + options.Timeout = 2 * time.Second + options.RefreshOnAccess = true + + cache, err := New("test", options) + require.NoError(t, err) + defer cache.Close() + + type valueType struct { + Something string + } + + var key1 = "somekey" + var value1 = valueType{Something: "foo"} + var key2 = "otherkey" + var value2 = valueType{Something: "bar"} + + err = cache.Put(key1, value1) + assert.NoError(t, err) + err = cache.Put(key2, value2) + assert.NoError(t, err) + + time.Sleep(1 * time.Second) + + var result valueType + err = cache.Get(key1, &result) + assert.NoError(t, err) + assert.Equal(t, value1, result) + + time.Sleep(1 * time.Second) + + err = cache.Get(key1, &result) + assert.NoError(t, err) + assert.Equal(t, value1, result) + err = cache.Get(key2, &result) + assert.Error(t, err) +} + +var benchmarkCacheSizes = []int{10, 100, 1000, 10000, 100000} + +func BenchmarkPut(b *testing.B) { + type cache interface { + Put(key string, value interface{}) error + Close() error + } + + options := testOptions(b) + newPersistentCache := func(tb testing.TB, name string) cache { + cache, err := New(name, options) + require.NoError(tb, err) + return cache + } + + caches := []struct { + name string + factory func(t testing.TB, name string) cache + }{ + {name: "badger", factory: newPersistentCache}, + } + + b.Run("random strings", func(b *testing.B) { + for _, c := range caches { + b.Run(c.name, func(b *testing.B) { + b.ReportAllocs() + + cache := c.factory(b, b.Name()) + defer cache.Close() + + value := uuid.Must(uuid.NewV4()).String() + + b.ResetTimer() + for i := 0; i < b.N; i++ { + err := cache.Put(strconv.Itoa(i), value) + if err != nil { + b.Fatal(err) + } + } + b.StopTimer() + }) + } + }) + + b.Run("objects", func(b *testing.B) { + for _, c := range caches { + type entry struct { + ID string + Data [128]byte + } + + b.Run(c.name, func(b *testing.B) { + b.ReportAllocs() + + cache := c.factory(b, b.Name()) + defer cache.Close() + + value := entry{ID: uuid.Must(uuid.NewV4()).String()} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + err := cache.Put(strconv.Itoa(i), value) + if err != nil { + b.Fatal(err) + } + } + b.StopTimer() + }) + } + }) + + b.Run("maps", func(b *testing.B) { + for _, c := range caches { + b.Run(c.name, func(b *testing.B) { + b.ReportAllocs() + + cache := c.factory(b, b.Name()) + defer cache.Close() + + value := map[string]string{ + "id": uuid.Must(uuid.NewV4()).String(), + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + err := cache.Put(strconv.Itoa(i), value) + if err != nil { + b.Fatal(err) + } + } + b.StopTimer() + }) + } + }) + + for _, size := range benchmarkCacheSizes { + b.Run(fmt.Sprintf("%d objects", size), func(b *testing.B) { + type entry struct { + ID string + Data [128]byte + } + objects := make([]entry, size) + for i := 0; i < size; i++ { + objects[i] = entry{ + ID: uuid.Must(uuid.NewV4()).String(), + } + } + + for _, c := range caches { + b.Run(c.name, func(b *testing.B) { + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + cache := c.factory(b, b.Name()) + for _, object := range objects { + cache.Put(object.ID, object) + } + cache.Close() + } + }) + } + }) + } +} + +func BenchmarkOpen(b *testing.B) { + type cache interface { + Put(key string, value interface{}) error + Close() error + } + + options := testOptions(b) + newPersistentCache := func(tb testing.TB, name string) cache { + cache, err := New(name, options) + require.NoError(tb, err) + return cache + } + + caches := []struct { + name string + factory func(t testing.TB, name string) cache + }{ + {name: "badger", factory: newPersistentCache}, + } + + for _, size := range benchmarkCacheSizes { + b.Run(fmt.Sprintf("%d objects", size), func(b *testing.B) { + type entry struct { + ID string + Data [128]byte + } + + for _, c := range caches { + cacheName := b.Name() + cache := c.factory(b, cacheName) + for i := 0; i < size; i++ { + e := entry{ + ID: uuid.Must(uuid.NewV4()).String(), + } + err := cache.Put(e.ID, e) + require.NoError(b, err) + } + cache.Close() + + b.Run(c.name, func(b *testing.B) { + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + cache := c.factory(b, cacheName) + cache.Close() + } + }) + } + }) + } +} + +func BenchmarkGet(b *testing.B) { + type cache interface { + Put(key string, value interface{}) error + Get(key string, value interface{}) error + Close() error + } + + options := testOptions(b) + newPersistentCache := func(tb testing.TB, name string) cache { + cache, err := New(name, options) + require.NoError(tb, err) + return cache + } + + caches := []struct { + name string + factory func(t testing.TB, name string) cache + }{ + {name: "badger", factory: newPersistentCache}, + } + + for _, size := range benchmarkCacheSizes { + b.Run(fmt.Sprintf("%d objects", size), func(b *testing.B) { + for _, c := range caches { + type entry struct { + ID string + Data [128]byte + } + + cacheName := b.Name() + + objects := make([]entry, size) + cache := c.factory(b, cacheName) + for i := 0; i < size; i++ { + e := entry{ + ID: uuid.Must(uuid.NewV4()).String(), + } + objects[i] = e + err := cache.Put(e.ID, e) + require.NoError(b, err) + } + cache.Close() + + b.Run(c.name, func(b *testing.B) { + b.ReportAllocs() + + cache := c.factory(b, cacheName) + + var result entry + + b.ResetTimer() + for i := 0; i < b.N; i++ { + expected := objects[rand.Intn(size)] + cache.Get(expected.ID, &result) + if expected.ID != result.ID { + b.Fatalf("%s != %s", expected.ID, result.ID) + } + } + b.StopTimer() + cache.Close() + }) + } + }) + } +} + +func testOptions(t testing.TB) Options { + t.Helper() + + tempDir, err := ioutil.TempDir("", "beat-data-dir-") + require.NoError(t, err) + + t.Cleanup(func() { os.RemoveAll(tempDir) }) + + return Options{ + RootPath: filepath.Join(tempDir, cacheFile), + } +} + +func dirSize(tb testing.TB, path string) int64 { + var size int64 + + err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + size += info.Size() + } + return nil + }) + require.NoError(tb, err) + + return size +} diff --git a/x-pack/libbeat/persistentcache/store.go b/x-pack/libbeat/persistentcache/store.go new file mode 100644 index 00000000000..589fc724e01 --- /dev/null +++ b/x-pack/libbeat/persistentcache/store.go @@ -0,0 +1,141 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package persistentcache + +import ( + "fmt" + "os" + "path/filepath" + "time" + + badger "github.com/dgraph-io/badger/v2" + + "github.com/elastic/beats/v7/libbeat/logp" +) + +// Store is a store for a persistent cache. It can be shared between consumers. +type Store struct { + logger *logp.Logger + name string + + gcQuit chan struct{} + db *badger.DB +} + +// newStore opens a store persisted on the specified directory, with the specified name. +// If succeeds, returned store must be closed. +func newStore(logger *logp.Logger, dir, name string) (*Store, error) { + dbPath := filepath.Join(dir, name) + err := os.MkdirAll(dbPath, 0750) + if err != nil { + return nil, fmt.Errorf("creating directory for cache store: %w", err) + } + + // Opinionated options for the use of badger as a store for metadata caches in Beats. + options := badger.DefaultOptions(dbPath) + options.Logger = badgerLogger{logger.Named("badger")} + // TODO: Disabling sync writes gives better performance, and data loss wouldn't + // be a problem for caches. But we are not properly closing processors yet, so let + // sync on writes by now. + // options.SyncWrites = false + + db, err := badger.Open(options) + if err != nil { + return nil, fmt.Errorf("opening database for cache store: %w", err) + } + + store := Store{ + db: db, + logger: logger, + name: name, + gcQuit: make(chan struct{}), + } + go store.runGC(gcPeriod) + return &store, nil +} + +// Close closes the store. +func (s *Store) Close() error { + s.stopGC() + err := s.db.Close() + if err != nil { + return fmt.Errorf("closing database of cache store: %w", err) + } + return nil +} + +// Set sets a value with a ttl in the store. If ttl is zero, it is ignored. +func (s *Store) Set(k, v []byte, ttl time.Duration) error { + entry := badger.Entry{ + Key: []byte(k), + Value: v, + } + if ttl > 0 { + entry.WithTTL(ttl) + } + err := s.db.Update(func(txn *badger.Txn) error { + return txn.SetEntry(&entry) + }) + if err != nil { + return fmt.Errorf("setting value in cache store: %w", err) + } + return err +} + +// Get gets a value from the store. +func (s *Store) Get(k []byte) ([]byte, error) { + var result []byte + err := s.db.View(func(txn *badger.Txn) error { + item, err := txn.Get(k) + if err != nil { + return err + } + result, err = item.ValueCopy(nil) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, fmt.Errorf("getting value from cache store: %w", err) + } + return result, nil +} + +// runGC starts garbage collection in the store. +func (s *Store) runGC(period time.Duration) { + ticker := time.NewTicker(period) + defer ticker.Stop() + for { + select { + case <-ticker.C: + var err error + count := 0 + for err == nil { + err = s.db.RunValueLogGC(0.5) + count++ + } + s.logger.Debugf("Result of garbage collector after running %d times: %s", count, err) + case <-s.gcQuit: + return + } + } + +} + +// stopGC stops garbage collection in the store. +func (s *Store) stopGC() { + close(s.gcQuit) +} + +// badgerLogger is an adapter between a logp logger and the loggers expected by badger. +type badgerLogger struct { + *logp.Logger +} + +// Warningf logs a message at the warning level. +func (l badgerLogger) Warningf(format string, args ...interface{}) { + l.Warnf(format, args...) +} diff --git a/x-pack/libbeat/persistentcache/store_test.go b/x-pack/libbeat/persistentcache/store_test.go new file mode 100644 index 00000000000..efa51f24b7f --- /dev/null +++ b/x-pack/libbeat/persistentcache/store_test.go @@ -0,0 +1,43 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package persistentcache + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/logp" +) + +func TestStandaloneStore(t *testing.T) { + type valueType struct { + Something string + } + + var key = []byte("somekey") + var value = []byte("somevalue") + + tempDir, err := ioutil.TempDir("", "beat-data-dir-") + require.NoError(t, err) + t.Cleanup(func() { os.RemoveAll(tempDir) }) + + store, err := newStore(logp.NewLogger("test"), tempDir, "store-cache") + require.NoError(t, err) + + err = store.Set(key, value, 0) + assert.NoError(t, err) + + result, err := store.Get(key) + if assert.NoError(t, err) { + assert.Equal(t, value, result) + } + + err = store.Close() + assert.NoError(t, err) +} diff --git a/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go b/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go index d18a04ca979..c178ea04325 100644 --- a/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go +++ b/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go @@ -5,8 +5,6 @@ package add_cloudfoundry_metadata import ( - "time" - "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/beat" @@ -40,14 +38,11 @@ func New(cfg *common.Config) (processors.Processor, error) { log := logp.NewLogger(selector) hub := cloudfoundry.NewHub(&config, "add_cloudfoundry_metadata", log) - client, err := hub.Client() + client, err := hub.ClientWithCache() if err != nil { - log.Debugf("%s: failed to created cloudfoundry client: %+v", processorName, err) + return nil, errors.Wrapf(err, "%s: creating cloudfoundry client", processorName) } - // Janitor run every 5 minutes to clean up the client cache. - client.StartJanitor(5 * time.Minute) - return &addCloudFoundryMetadata{ log: log, client: client, @@ -79,18 +74,31 @@ func (d *addCloudFoundryMetadata) Run(event *beat.Event) (*beat.Event, error) { "name": app.Name, }, "space": common.MapStr{ - "id": app.SpaceData.Meta.Guid, - "name": app.SpaceData.Entity.Name, + "id": app.SpaceGuid, + "name": app.SpaceName, }, "org": common.MapStr{ - "id": app.SpaceData.Entity.OrgData.Meta.Guid, - "name": app.SpaceData.Entity.OrgData.Entity.Name, + "id": app.OrgGuid, + "name": app.OrgName, }, }, }) return event, nil } +// String returns this processor name. func (d *addCloudFoundryMetadata) String() string { return processorName } + +// Close closes the underlying client and releases its resources. +func (d *addCloudFoundryMetadata) Close() error { + if d.client == nil { + return nil + } + err := d.client.Close() + if err != nil { + return errors.Wrap(err, "closing client") + } + return nil +} diff --git a/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata_test.go b/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata_test.go index 1aff4cb2df8..95a7073321e 100644 --- a/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata_test.go +++ b/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata_test.go @@ -6,7 +6,6 @@ package add_cloudfoundry_metadata import ( "testing" - "time" "github.com/cloudfoundry-community/go-cfclient" "github.com/gofrs/uuid" @@ -15,6 +14,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/x-pack/libbeat/common/cloudfoundry" ) func TestNoClient(t *testing.T) { @@ -84,25 +84,13 @@ func TestCFAppNotFound(t *testing.T) { func TestCFAppUpdated(t *testing.T) { guid := mustCreateFakeGuid() - app := cfclient.App{ - Guid: guid, - Name: "My Fake App", - SpaceData: cfclient.SpaceResource{ - Meta: cfclient.Meta{ - Guid: mustCreateFakeGuid(), - }, - Entity: cfclient.Space{ - Name: "My Fake Space", - OrgData: cfclient.OrgResource{ - Meta: cfclient.Meta{ - Guid: mustCreateFakeGuid(), - }, - Entity: cfclient.Org{ - Name: "My Fake Org", - }, - }, - }, - }, + app := cloudfoundry.AppMeta{ + Guid: guid, + Name: "My Fake App", + SpaceGuid: mustCreateFakeGuid(), + SpaceName: "My Fake Space", + OrgGuid: mustCreateFakeGuid(), + OrgName: "My Fake Org", } p := addCloudFoundryMetadata{ log: logp.NewLogger("add_cloudfoundry_metadata"), @@ -126,12 +114,12 @@ func TestCFAppUpdated(t *testing.T) { "name": app.Name, }, "space": common.MapStr{ - "id": app.SpaceData.Meta.Guid, - "name": app.SpaceData.Entity.Name, + "id": app.SpaceGuid, + "name": app.SpaceName, }, "org": common.MapStr{ - "id": app.SpaceData.Entity.OrgData.Meta.Guid, - "name": app.SpaceData.Entity.OrgData.Entity.Name, + "id": app.OrgGuid, + "name": app.OrgName, }, }, }, @@ -142,20 +130,18 @@ func TestCFAppUpdated(t *testing.T) { } type fakeClient struct { - app cfclient.App + app cloudfoundry.AppMeta } -func (c *fakeClient) GetAppByGuid(guid string) (*cfclient.App, error) { +func (c *fakeClient) GetAppByGuid(guid string) (*cloudfoundry.AppMeta, error) { if c.app.Guid != guid { return nil, cfclient.CloudFoundryError{Code: 100004} } return &c.app, nil } -func (c *fakeClient) StartJanitor(_ time.Duration) { -} - -func (c *fakeClient) StopJanitor() { +func (c *fakeClient) Close() error { + return nil } func mustCreateFakeGuid() string { From 6c0a78617bbc9bfb1b0b5f0353adb797fb27701b Mon Sep 17 00:00:00 2001 From: StefanSa <6105075+StefanSa@users.noreply.github.com> Date: Tue, 6 Oct 2020 10:45:48 +0200 Subject: [PATCH 078/156] junipersrx-module initial release (#20017) * junipersrx-module initial release * stashing changes for later * Initial MVP release ready for review * updating a comment in pipeline.yml * updating filebeat.reference.yml * Small fix for docs * Fix parsing of juniper.srx.timestamp * Fix bad samples * Remove some fields to make the index-pattern smaller * Missing update * Fix var.tags and disable_host when forwarded * Add related fields * Add changelog entry * Remove unused file Co-authored-by: StefanSa Co-authored-by: P1llus Co-authored-by: Adrian Serrano Co-authored-by: Marc Guasch --- CHANGELOG.next.asciidoc | 1 + filebeat/docs/fields.asciidoc | 967 ++++++++ filebeat/docs/modules/juniper.asciidoc | 121 +- x-pack/filebeat/filebeat.reference.yml | 13 + .../filebeat/module/juniper/_meta/config.yml | 13 + .../module/juniper/_meta/docs.asciidoc | 121 +- x-pack/filebeat/module/juniper/fields.go | 2 +- .../test/generated.log-expected.json | 4 +- .../module/juniper/srx/_meta/fields.yml | 488 ++++ .../module/juniper/srx/config/srx.yml | 31 + .../module/juniper/srx/ingest/atp.yml | 363 +++ .../module/juniper/srx/ingest/flow.yml | 360 +++ .../module/juniper/srx/ingest/idp.yml | 287 +++ .../module/juniper/srx/ingest/ids.yml | 363 +++ .../module/juniper/srx/ingest/pipeline.yml | 275 +++ .../module/juniper/srx/ingest/secintel.yml | 349 +++ .../module/juniper/srx/ingest/utm.yml | 388 ++++ .../filebeat/module/juniper/srx/manifest.yml | 26 + .../filebeat/module/juniper/srx/test/atp.log | 4 + .../juniper/srx/test/atp.log-expected.json | 240 ++ .../filebeat/module/juniper/srx/test/flow.log | 25 + .../juniper/srx/test/flow.log-expected.json | 2013 +++++++++++++++++ .../filebeat/module/juniper/srx/test/idp.log | 7 + .../juniper/srx/test/idp.log-expected.json | 537 +++++ .../filebeat/module/juniper/srx/test/ids.log | 12 + .../juniper/srx/test/ids.log-expected.json | 699 ++++++ .../module/juniper/srx/test/secintel.log | 2 + .../srx/test/secintel.log-expected.json | 140 ++ .../filebeat/module/juniper/srx/test/utm.log | 12 + .../juniper/srx/test/utm.log-expected.json | 698 ++++++ .../filebeat/modules.d/juniper.yml.disabled | 13 + 31 files changed, 8563 insertions(+), 11 deletions(-) create mode 100644 x-pack/filebeat/module/juniper/srx/_meta/fields.yml create mode 100644 x-pack/filebeat/module/juniper/srx/config/srx.yml create mode 100644 x-pack/filebeat/module/juniper/srx/ingest/atp.yml create mode 100644 x-pack/filebeat/module/juniper/srx/ingest/flow.yml create mode 100644 x-pack/filebeat/module/juniper/srx/ingest/idp.yml create mode 100644 x-pack/filebeat/module/juniper/srx/ingest/ids.yml create mode 100644 x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml create mode 100644 x-pack/filebeat/module/juniper/srx/ingest/secintel.yml create mode 100644 x-pack/filebeat/module/juniper/srx/ingest/utm.yml create mode 100644 x-pack/filebeat/module/juniper/srx/manifest.yml create mode 100644 x-pack/filebeat/module/juniper/srx/test/atp.log create mode 100644 x-pack/filebeat/module/juniper/srx/test/atp.log-expected.json create mode 100644 x-pack/filebeat/module/juniper/srx/test/flow.log create mode 100644 x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json create mode 100644 x-pack/filebeat/module/juniper/srx/test/idp.log create mode 100644 x-pack/filebeat/module/juniper/srx/test/idp.log-expected.json create mode 100644 x-pack/filebeat/module/juniper/srx/test/ids.log create mode 100644 x-pack/filebeat/module/juniper/srx/test/ids.log-expected.json create mode 100644 x-pack/filebeat/module/juniper/srx/test/secintel.log create mode 100644 x-pack/filebeat/module/juniper/srx/test/secintel.log-expected.json create mode 100644 x-pack/filebeat/module/juniper/srx/test/utm.log create mode 100644 x-pack/filebeat/module/juniper/srx/test/utm.log-expected.json diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 5676634d637..07e7bc4be0d 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -607,6 +607,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Keep cursor state between httpjson input restarts {pull}20751[20751] - Convert aws s3 to v2 input {pull}20005[20005] - New Cisco Umbrella dataset {pull}21504[21504] +- New juniper.srx dataset for Juniper SRX logs. {pull}20017[20017] *Heartbeat* diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index b66c1163367..a2f19000095 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -88076,6 +88076,973 @@ type: keyword -- This key captures values or decorators used within a registry entry +type: keyword + +-- + +[float] +=== juniper.srx + +Module for parsing junipersrx syslog. + + + +*`juniper.srx.reason`*:: ++ +-- +reason + + +type: keyword + +-- + +*`juniper.srx.connection_tag`*:: ++ +-- +connection tag + + +type: keyword + +-- + +*`juniper.srx.service_name`*:: ++ +-- +service name + + +type: keyword + +-- + +*`juniper.srx.nat_connection_tag`*:: ++ +-- +nat connection tag + + +type: keyword + +-- + +*`juniper.srx.src_nat_rule_type`*:: ++ +-- +src nat rule type + + +type: keyword + +-- + +*`juniper.srx.src_nat_rule_name`*:: ++ +-- +src nat rule name + + +type: keyword + +-- + +*`juniper.srx.dst_nat_rule_type`*:: ++ +-- +dst nat rule type + + +type: keyword + +-- + +*`juniper.srx.dst_nat_rule_name`*:: ++ +-- +dst nat rule name + + +type: keyword + +-- + +*`juniper.srx.protocol_id`*:: ++ +-- +protocol id + + +type: keyword + +-- + +*`juniper.srx.policy_name`*:: ++ +-- +policy name + + +type: keyword + +-- + +*`juniper.srx.session_id_32`*:: ++ +-- +session id 32 + + +type: keyword + +-- + +*`juniper.srx.session_id`*:: ++ +-- +session id + + +type: keyword + +-- + +*`juniper.srx.outbound_packets`*:: ++ +-- +packets from client + + +type: integer + +-- + +*`juniper.srx.outbound_bytes`*:: ++ +-- +bytes from client + + +type: integer + +-- + +*`juniper.srx.inbound_packets`*:: ++ +-- +packets from server + + +type: integer + +-- + +*`juniper.srx.inbound_bytes`*:: ++ +-- +bytes from server + + +type: integer + +-- + +*`juniper.srx.elapsed_time`*:: ++ +-- +elapsed time + + +type: date + +-- + +*`juniper.srx.application`*:: ++ +-- +application + + +type: keyword + +-- + +*`juniper.srx.nested_application`*:: ++ +-- +nested application + + +type: keyword + +-- + +*`juniper.srx.username`*:: ++ +-- +username + + +type: keyword + +-- + +*`juniper.srx.roles`*:: ++ +-- +roles + + +type: keyword + +-- + +*`juniper.srx.encrypted`*:: ++ +-- +encrypted + + +type: keyword + +-- + +*`juniper.srx.application_category`*:: ++ +-- +application category + + +type: keyword + +-- + +*`juniper.srx.application_sub_category`*:: ++ +-- +application sub category + + +type: keyword + +-- + +*`juniper.srx.application_characteristics`*:: ++ +-- +application characteristics + + +type: keyword + +-- + +*`juniper.srx.secure_web_proxy_session_type`*:: ++ +-- +secure web proxy session type + + +type: keyword + +-- + +*`juniper.srx.peer_session_id`*:: ++ +-- +peer session id + + +type: keyword + +-- + +*`juniper.srx.peer_source_address`*:: ++ +-- +peer source address + + +type: ip + +-- + +*`juniper.srx.peer_source_port`*:: ++ +-- +peer source port + + +type: integer + +-- + +*`juniper.srx.peer_destination_address`*:: ++ +-- +peer destination address + + +type: ip + +-- + +*`juniper.srx.peer_destination_port`*:: ++ +-- +peer destination port + + +type: integer + +-- + +*`juniper.srx.hostname`*:: ++ +-- +hostname + + +type: keyword + +-- + +*`juniper.srx.src_vrf_grp`*:: ++ +-- +src_vrf_grp + + +type: keyword + +-- + +*`juniper.srx.dst_vrf_grp`*:: ++ +-- +dst_vrf_grp + + +type: keyword + +-- + +*`juniper.srx.icmp_type`*:: ++ +-- +icmp type + + +type: integer + +-- + +*`juniper.srx.process`*:: ++ +-- +process that generated the message + + +type: keyword + +-- + +*`juniper.srx.apbr_rule_type`*:: ++ +-- +apbr rule type + + +type: keyword + +-- + +*`juniper.srx.dscp_value`*:: ++ +-- +apbr rule type + + +type: integer + +-- + +*`juniper.srx.logical_system_name`*:: ++ +-- +logical system name + + +type: keyword + +-- + +*`juniper.srx.profile_name`*:: ++ +-- +profile name + + +type: keyword + +-- + +*`juniper.srx.routing_instance`*:: ++ +-- +routing instance + + +type: keyword + +-- + +*`juniper.srx.rule_name`*:: ++ +-- +rule name + + +type: keyword + +-- + +*`juniper.srx.uplink_tx_bytes`*:: ++ +-- +uplink tx bytes + + +type: integer + +-- + +*`juniper.srx.uplink_rx_bytes`*:: ++ +-- +uplink rx bytes + + +type: integer + +-- + +*`juniper.srx.obj`*:: ++ +-- +url path + + +type: keyword + +-- + +*`juniper.srx.url`*:: ++ +-- +url domain + + +type: keyword + +-- + +*`juniper.srx.profile`*:: ++ +-- +filter profile + + +type: keyword + +-- + +*`juniper.srx.category`*:: ++ +-- +filter category + + +type: keyword + +-- + +*`juniper.srx.filename`*:: ++ +-- +filename + + +type: keyword + +-- + +*`juniper.srx.temporary_filename`*:: ++ +-- +temporary_filename + + +type: keyword + +-- + +*`juniper.srx.name`*:: ++ +-- +name + + +type: keyword + +-- + +*`juniper.srx.error_message`*:: ++ +-- +error_message + + +type: keyword + +-- + +*`juniper.srx.error_code`*:: ++ +-- +error_code + + +type: keyword + +-- + +*`juniper.srx.action`*:: ++ +-- +action + + +type: keyword + +-- + +*`juniper.srx.protocol`*:: ++ +-- +protocol + + +type: keyword + +-- + +*`juniper.srx.protocol_name`*:: ++ +-- +protocol name + + +type: keyword + +-- + +*`juniper.srx.type`*:: ++ +-- +type + + +type: keyword + +-- + +*`juniper.srx.repeat_count`*:: ++ +-- +repeat count + + +type: integer + +-- + +*`juniper.srx.alert`*:: ++ +-- +repeat alert + + +type: keyword + +-- + +*`juniper.srx.message_type`*:: ++ +-- +message type + + +type: keyword + +-- + +*`juniper.srx.threat_severity`*:: ++ +-- +threat severity + + +type: keyword + +-- + +*`juniper.srx.application_name`*:: ++ +-- +application name + + +type: keyword + +-- + +*`juniper.srx.attack_name`*:: ++ +-- +attack name + + +type: keyword + +-- + +*`juniper.srx.index`*:: ++ +-- +index + + +type: keyword + +-- + +*`juniper.srx.message`*:: ++ +-- +mesagge + + +type: keyword + +-- + +*`juniper.srx.epoch_time`*:: ++ +-- +epoch time + + +type: date + +-- + +*`juniper.srx.packet_log_id`*:: ++ +-- +packet log id + + +type: integer + +-- + +*`juniper.srx.export_id`*:: ++ +-- +packet log id + + +type: integer + +-- + +*`juniper.srx.ddos_application_name`*:: ++ +-- +ddos application name + + +type: keyword + +-- + +*`juniper.srx.connection_hit_rate`*:: ++ +-- +connection hit rate + + +type: integer + +-- + +*`juniper.srx.time_scope`*:: ++ +-- +time scope + + +type: keyword + +-- + +*`juniper.srx.context_hit_rate`*:: ++ +-- +context hit rate + + +type: integer + +-- + +*`juniper.srx.context_value_hit_rate`*:: ++ +-- +context value hit rate + + +type: integer + +-- + +*`juniper.srx.time_count`*:: ++ +-- +time count + + +type: integer + +-- + +*`juniper.srx.time_period`*:: ++ +-- +time period + + +type: integer + +-- + +*`juniper.srx.context_value`*:: ++ +-- +context value + + +type: keyword + +-- + +*`juniper.srx.context_name`*:: ++ +-- +context name + + +type: keyword + +-- + +*`juniper.srx.ruleebase_name`*:: ++ +-- +ruleebase name + + +type: keyword + +-- + +*`juniper.srx.verdict_source`*:: ++ +-- +verdict source + + +type: keyword + +-- + +*`juniper.srx.verdict_number`*:: ++ +-- +verdict number + + +type: integer + +-- + +*`juniper.srx.file_category`*:: ++ +-- +file category + + +type: keyword + +-- + +*`juniper.srx.sample_sha256`*:: ++ +-- +sample sha256 + + +type: keyword + +-- + +*`juniper.srx.malware_info`*:: ++ +-- +malware info + + +type: keyword + +-- + +*`juniper.srx.client_ip`*:: ++ +-- +client ip + + +type: ip + +-- + +*`juniper.srx.tenant_id`*:: ++ +-- +tenant id + + +type: keyword + +-- + +*`juniper.srx.timestamp`*:: ++ +-- +timestamp + + +type: date + +-- + +*`juniper.srx.th`*:: ++ +-- +th + + +type: keyword + +-- + +*`juniper.srx.status`*:: ++ +-- +status + + +type: keyword + +-- + +*`juniper.srx.state`*:: ++ +-- +state + + +type: keyword + +-- + +*`juniper.srx.file_hash_lookup`*:: ++ +-- +file hash lookup + + +type: keyword + +-- + +*`juniper.srx.file_name`*:: ++ +-- +file name + + +type: keyword + +-- + +*`juniper.srx.action_detail`*:: ++ +-- +action detail + + +type: keyword + +-- + +*`juniper.srx.sub_category`*:: ++ +-- +sub category + + +type: keyword + +-- + +*`juniper.srx.feed_name`*:: ++ +-- +feed name + + +type: keyword + +-- + +*`juniper.srx.occur_count`*:: ++ +-- +occur count + + +type: integer + +-- + +*`juniper.srx.tag`*:: ++ +-- +system log message tag, which uniquely identifies the message. + + type: keyword -- diff --git a/filebeat/docs/modules/juniper.asciidoc b/filebeat/docs/modules/juniper.asciidoc index 047e847bc5a..a2d2a0100d3 100644 --- a/filebeat/docs/modules/juniper.asciidoc +++ b/filebeat/docs/modules/juniper.asciidoc @@ -10,18 +10,131 @@ This file is generated! See scripts/docs_collector.py == Juniper module -experimental[] +This is a module for ingesting data from the different Juniper Products. Currently supports these filesets: -This is a module for receiving Juniper JUNOS logs over Syslog or a file. +- `srx` fileset: Supports Juniper SRX logs +- `junos` fileset: Supports Juniper JUNOS logs +- `netscreen` fileset: Supports Juniper Netscreen logs include::../include/gs-link.asciidoc[] include::../include/configuring-intro.asciidoc[] -:fileset_ex: junos - include::../include/config-option-intro.asciidoc[] +:fileset_ex: srx +beta[] + +[float] +==== `srx` fileset settings + +The Juniper-SRX module only supports syslog messages in the format "structured-data + brief" https://www.juniper.net/documentation/en_US/junos/topics/reference/configuration-statement/structured-data-edit-system.html[JunOS Documentation structured-data] + +To configure a remote syslog destination, please reference the https://kb.juniper.net/InfoCenter/index?page=content&id=kb16502[SRX Getting Started - Configure System Logging]. + +The following processes and tags are supported: + +[options="header"] +|============================================================== +| JunOS processes | JunOS tags | +| RT_FLOW | RT_FLOW_SESSION_CREATE | +| | RT_FLOW_SESSION_CLOSE | +| | RT_FLOW_SESSION_DENY | +| | APPTRACK_SESSION_CREATE | +| | APPTRACK_SESSION_CLOSE | +| | APPTRACK_SESSION_VOL_UPDATE | +| RT_IDS | RT_SCREEN_TCP | +| | RT_SCREEN_UDP | +| | RT_SCREEN_ICMP | +| | RT_SCREEN_IP | +| | RT_SCREEN_TCP_DST_IP | +| | RT_SCREEN_TCP_SRC_IP | +| RT_UTM | WEBFILTER_URL_PERMITTED | +| | WEBFILTER_URL_BLOCKED | +| | AV_VIRUS_DETECTED_MT | +| | CONTENT_FILTERING_BLOCKED_MT | +| | ANTISPAM_SPAM_DETECTED_MT | +| RT_IDP | IDP_ATTACK_LOG_EVENT | +| | IDP_APPDDOS_APP_STATE_EVENT | +| RT_AAMW | SRX_AAMW_ACTION_LOG | +| | AAMW_MALWARE_EVENT_LOG | +| | AAMW_HOST_INFECTED_EVENT_LOG | +| | AAMW_ACTION_LOG | +| RT_SECINTEL | SECINTEL_ACTION_LOG | +|============================================================== + +The syslog format choosen should be `Default`. + +[float] +=== Compatibility + +This module has been tested against JunOS version 19.x and 20.x. +Versions above this are expected to work but have not been tested. + +[source,yaml] +---- +- module: sophosxg + firewall: + enabled: true + var.input: udp + var.syslog_host: 0.0.0.0 + var.syslog_port: 9006 +---- + +include::../include/var-paths.asciidoc[] + +*`var.input`*:: + +The input to use, can be either the value `tcp`, `udp` or `file`. + +*`var.syslog_host`*:: + +The interface to listen to all syslog traffic. Defaults to localhost. +Set to 0.0.0.0 to bind to all available interfaces. + +*`var.syslog_port`*:: + +The port to listen for syslog traffic. Defaults to 9006. + + +[float] +==== Juniper SRX ECS fields + +This is a list of JunOS fields that are mapped to ECS. + +[options="header"] +|============================================================== +| Juniper SRX Fields | ECS Fields | +| application-risk | event.risk_score | +| bytes-from-client | source.bytes | +| bytes-from-server | destination.bytes | +| destination-interface-name | observer.egress.interface.name | +| destination-zone-name | observer.egress.zone | +| destination-address | destination.ip | +| destination-port | destination.port | +| dst_domainname | url.domain | +| elapsed-time | event.duration | +| filename | file.name | +| nat-destination-address | destination.nat.ip | +| nat-destination-port | destination.nat.port | +| nat-source-address | source.nat.ip | +| nat-source-port | source.nat.port | +| message | message | +| obj | url.path | +| packets-from-client | source.packets | +| packets-from-server | destination.packets | +| policy-name | rule.name | +| protocol | network.transport | +| source-address | source.ip | +| source-interface-name | observer.ingress.interface.name| +| source-port | source.port | +| source-zone-name | observer.ingress.zone | +| url | url.domain | +|============================================================== + + +:fileset_ex: junos + [float] ==== `junos` fileset settings diff --git a/x-pack/filebeat/filebeat.reference.yml b/x-pack/filebeat/filebeat.reference.yml index 9797291bdf4..cc994b45cac 100644 --- a/x-pack/filebeat/filebeat.reference.yml +++ b/x-pack/filebeat/filebeat.reference.yml @@ -1050,6 +1050,19 @@ filebeat.modules: # "+02:00" for GMT+02:00 # var.tz_offset: local + srx: + enabled: true + + # Set which input to use between tcp, udp (default) or file. + #var.input: udp + + # The interface to listen to syslog traffic. Defaults to + # localhost. Set to 0.0.0.0 to bind to all available interfaces. + #var.syslog_host: localhost + + # The port to listen for syslog traffic. Defaults to 9006. + #var.syslog_port: 9006 + #-------------------------------- Kafka Module -------------------------------- - module: kafka # All logs diff --git a/x-pack/filebeat/module/juniper/_meta/config.yml b/x-pack/filebeat/module/juniper/_meta/config.yml index be40af66202..7f992656788 100644 --- a/x-pack/filebeat/module/juniper/_meta/config.yml +++ b/x-pack/filebeat/module/juniper/_meta/config.yml @@ -36,3 +36,16 @@ # "local" (default) for system timezone. # "+02:00" for GMT+02:00 # var.tz_offset: local + + srx: + enabled: true + + # Set which input to use between tcp, udp (default) or file. + #var.input: udp + + # The interface to listen to syslog traffic. Defaults to + # localhost. Set to 0.0.0.0 to bind to all available interfaces. + #var.syslog_host: localhost + + # The port to listen for syslog traffic. Defaults to 9006. + #var.syslog_port: 9006 diff --git a/x-pack/filebeat/module/juniper/_meta/docs.asciidoc b/x-pack/filebeat/module/juniper/_meta/docs.asciidoc index c59b7ac4a95..3e145ea81c9 100644 --- a/x-pack/filebeat/module/juniper/_meta/docs.asciidoc +++ b/x-pack/filebeat/module/juniper/_meta/docs.asciidoc @@ -5,18 +5,131 @@ == Juniper module -experimental[] +This is a module for ingesting data from the different Juniper Products. Currently supports these filesets: -This is a module for receiving Juniper JUNOS logs over Syslog or a file. +- `srx` fileset: Supports Juniper SRX logs +- `junos` fileset: Supports Juniper JUNOS logs +- `netscreen` fileset: Supports Juniper Netscreen logs include::../include/gs-link.asciidoc[] include::../include/configuring-intro.asciidoc[] -:fileset_ex: junos - include::../include/config-option-intro.asciidoc[] +:fileset_ex: srx +beta[] + +[float] +==== `srx` fileset settings + +The Juniper-SRX module only supports syslog messages in the format "structured-data + brief" https://www.juniper.net/documentation/en_US/junos/topics/reference/configuration-statement/structured-data-edit-system.html[JunOS Documentation structured-data] + +To configure a remote syslog destination, please reference the https://kb.juniper.net/InfoCenter/index?page=content&id=kb16502[SRX Getting Started - Configure System Logging]. + +The following processes and tags are supported: + +[options="header"] +|============================================================== +| JunOS processes | JunOS tags | +| RT_FLOW | RT_FLOW_SESSION_CREATE | +| | RT_FLOW_SESSION_CLOSE | +| | RT_FLOW_SESSION_DENY | +| | APPTRACK_SESSION_CREATE | +| | APPTRACK_SESSION_CLOSE | +| | APPTRACK_SESSION_VOL_UPDATE | +| RT_IDS | RT_SCREEN_TCP | +| | RT_SCREEN_UDP | +| | RT_SCREEN_ICMP | +| | RT_SCREEN_IP | +| | RT_SCREEN_TCP_DST_IP | +| | RT_SCREEN_TCP_SRC_IP | +| RT_UTM | WEBFILTER_URL_PERMITTED | +| | WEBFILTER_URL_BLOCKED | +| | AV_VIRUS_DETECTED_MT | +| | CONTENT_FILTERING_BLOCKED_MT | +| | ANTISPAM_SPAM_DETECTED_MT | +| RT_IDP | IDP_ATTACK_LOG_EVENT | +| | IDP_APPDDOS_APP_STATE_EVENT | +| RT_AAMW | SRX_AAMW_ACTION_LOG | +| | AAMW_MALWARE_EVENT_LOG | +| | AAMW_HOST_INFECTED_EVENT_LOG | +| | AAMW_ACTION_LOG | +| RT_SECINTEL | SECINTEL_ACTION_LOG | +|============================================================== + +The syslog format choosen should be `Default`. + +[float] +=== Compatibility + +This module has been tested against JunOS version 19.x and 20.x. +Versions above this are expected to work but have not been tested. + +[source,yaml] +---- +- module: sophosxg + firewall: + enabled: true + var.input: udp + var.syslog_host: 0.0.0.0 + var.syslog_port: 9006 +---- + +include::../include/var-paths.asciidoc[] + +*`var.input`*:: + +The input to use, can be either the value `tcp`, `udp` or `file`. + +*`var.syslog_host`*:: + +The interface to listen to all syslog traffic. Defaults to localhost. +Set to 0.0.0.0 to bind to all available interfaces. + +*`var.syslog_port`*:: + +The port to listen for syslog traffic. Defaults to 9006. + + +[float] +==== Juniper SRX ECS fields + +This is a list of JunOS fields that are mapped to ECS. + +[options="header"] +|============================================================== +| Juniper SRX Fields | ECS Fields | +| application-risk | event.risk_score | +| bytes-from-client | source.bytes | +| bytes-from-server | destination.bytes | +| destination-interface-name | observer.egress.interface.name | +| destination-zone-name | observer.egress.zone | +| destination-address | destination.ip | +| destination-port | destination.port | +| dst_domainname | url.domain | +| elapsed-time | event.duration | +| filename | file.name | +| nat-destination-address | destination.nat.ip | +| nat-destination-port | destination.nat.port | +| nat-source-address | source.nat.ip | +| nat-source-port | source.nat.port | +| message | message | +| obj | url.path | +| packets-from-client | source.packets | +| packets-from-server | destination.packets | +| policy-name | rule.name | +| protocol | network.transport | +| source-address | source.ip | +| source-interface-name | observer.ingress.interface.name| +| source-port | source.port | +| source-zone-name | observer.ingress.zone | +| url | url.domain | +|============================================================== + + +:fileset_ex: junos + [float] ==== `junos` fileset settings diff --git a/x-pack/filebeat/module/juniper/fields.go b/x-pack/filebeat/module/juniper/fields.go index 6122a564654..e22907d0244 100644 --- a/x-pack/filebeat/module/juniper/fields.go +++ b/x-pack/filebeat/module/juniper/fields.go @@ -19,5 +19,5 @@ func init() { // AssetJuniper returns asset data. // This is the base64 encoded gzipped contents of module/juniper. func AssetJuniper() string { - return "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" + return "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" } diff --git a/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json b/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json index fb4fca25df2..da17c3a5f76 100644 --- a/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json +++ b/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json @@ -2399,8 +2399,8 @@ "observer.type": "Firewall", "observer.vendor": "Juniper", "related.ip": [ - "10.119.181.171", - "10.166.144.66" + "10.166.144.66", + "10.119.181.171" ], "rsa.internal.messageid": "00625", "rsa.misc.hardware_id": "dol", diff --git a/x-pack/filebeat/module/juniper/srx/_meta/fields.yml b/x-pack/filebeat/module/juniper/srx/_meta/fields.yml new file mode 100644 index 00000000000..55ded3a11e6 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/_meta/fields.yml @@ -0,0 +1,488 @@ +- name: juniper.srx + type: group + release: beta + default_field: false + overwrite: true + description: > + Module for parsing junipersrx syslog. + fields: + - name: reason + type: keyword + description: > + reason + + - name: connection_tag + type: keyword + description: > + connection tag + + - name: service_name + type: keyword + description: > + service name + + - name: nat_connection_tag + type: keyword + description: > + nat connection tag + + - name: src_nat_rule_type + type: keyword + description: > + src nat rule type + + - name: src_nat_rule_name + type: keyword + description: > + src nat rule name + + - name: dst_nat_rule_type + type: keyword + description: > + dst nat rule type + + - name: dst_nat_rule_name + type: keyword + description: > + dst nat rule name + + - name: protocol_id + type: keyword + description: > + protocol id + + - name: policy_name + type: keyword + description: > + policy name + + - name: session_id_32 + type: keyword + description: > + session id 32 + + - name: session_id + type: keyword + description: > + session id + + - name: outbound_packets + type: integer + description: > + packets from client + + - name: outbound_bytes + type: integer + description: > + bytes from client + + - name: inbound_packets + type: integer + description: > + packets from server + + - name: inbound_bytes + type: integer + description: > + bytes from server + + - name: elapsed_time + type: date + description: > + elapsed time + + - name: application + type: keyword + description: > + application + + - name: nested_application + type: keyword + description: > + nested application + + - name: username + type: keyword + description: > + username + + - name: roles + type: keyword + description: > + roles + + - name: encrypted + type: keyword + description: > + encrypted + + - name: application_category + type: keyword + description: > + application category + + - name: application_sub_category + type: keyword + description: > + application sub category + + - name: application_characteristics + type: keyword + description: > + application characteristics + + - name: secure_web_proxy_session_type + type: keyword + description: > + secure web proxy session type + + - name: peer_session_id + type: keyword + description: > + peer session id + + - name: peer_source_address + type: ip + description: > + peer source address + + - name: peer_source_port + type: integer + description: > + peer source port + + - name: peer_destination_address + type: ip + description: > + peer destination address + + - name: peer_destination_port + type: integer + description: > + peer destination port + + - name: hostname + type: keyword + description: > + hostname + + - name: src_vrf_grp + type: keyword + description: > + src_vrf_grp + + - name: dst_vrf_grp + type: keyword + description: > + dst_vrf_grp + + - name: icmp_type + type: integer + description: > + icmp type + + - name: process + type: keyword + description: > + process that generated the message + + - name: apbr_rule_type + type: keyword + description: > + apbr rule type + + - name: dscp_value + type: integer + description: > + apbr rule type + + - name: logical_system_name + type: keyword + description: > + logical system name + + - name: profile_name + type: keyword + description: > + profile name + + - name: routing_instance + type: keyword + description: > + routing instance + + - name: rule_name + type: keyword + description: > + rule name + + - name: uplink_tx_bytes + type: integer + description: > + uplink tx bytes + + - name: uplink_rx_bytes + type: integer + description: > + uplink rx bytes + + - name: obj + type: keyword + description: > + url path + + - name: url + type: keyword + description: > + url domain + + - name: profile + type: keyword + description: > + filter profile + + - name: category + type: keyword + description: > + filter category + + - name: filename + type: keyword + description: > + filename + + - name: temporary_filename + type: keyword + description: > + temporary_filename + + - name: name + type: keyword + description: > + name + + - name: error_message + type: keyword + description: > + error_message + + - name: error_code + type: keyword + description: > + error_code + + - name: action + type: keyword + description: > + action + + - name: protocol + type: keyword + description: > + protocol + + - name: protocol_name + type: keyword + description: > + protocol name + + - name: type + type: keyword + description: > + type + + - name: repeat_count + type: integer + description: > + repeat count + + - name: alert + type: keyword + description: > + repeat alert + + - name: message_type + type: keyword + description: > + message type + + - name: threat_severity + type: keyword + description: > + threat severity + + - name: application_name + type: keyword + description: > + application name + + - name: attack_name + type: keyword + description: > + attack name + + - name: index + type: keyword + description: > + index + + - name: message + type: keyword + description: > + mesagge + + - name: epoch_time + type: date + description: > + epoch time + + - name: packet_log_id + type: integer + description: > + packet log id + + - name: export_id + type: integer + description: > + packet log id + + - name: ddos_application_name + type: keyword + description: > + ddos application name + + - name: connection_hit_rate + type: integer + description: > + connection hit rate + + - name: time_scope + type: keyword + description: > + time scope + + - name: context_hit_rate + type: integer + description: > + context hit rate + + - name: context_value_hit_rate + type: integer + description: > + context value hit rate + + - name: time_count + type: integer + description: > + time count + + - name: time_period + type: integer + description: > + time period + + - name: context_value + type: keyword + description: > + context value + + - name: context_name + type: keyword + description: > + context name + + - name: ruleebase_name + type: keyword + description: > + ruleebase name + + - name: verdict_source + type: keyword + description: > + verdict source + + - name: verdict_number + type: integer + description: > + verdict number + + - name: file_category + type: keyword + description: > + file category + + - name: sample_sha256 + type: keyword + description: > + sample sha256 + + - name: malware_info + type: keyword + description: > + malware info + + - name: client_ip + type: ip + description: > + client ip + + - name: tenant_id + type: keyword + description: > + tenant id + + - name: timestamp + type: date + description: > + timestamp + + - name: th + type: keyword + description: > + th + + - name: status + type: keyword + description: > + status + + - name: state + type: keyword + description: > + state + + - name: file_hash_lookup + type: keyword + description: > + file hash lookup + + - name: file_name + type: keyword + description: > + file name + + - name: action_detail + type: keyword + description: > + action detail + + - name: sub_category + type: keyword + description: > + sub category + + - name: feed_name + type: keyword + description: > + feed name + + - name: occur_count + type: integer + description: > + occur count + + - name: tag + type: keyword + description: > + system log message tag, which uniquely identifies the message. + diff --git a/x-pack/filebeat/module/juniper/srx/config/srx.yml b/x-pack/filebeat/module/juniper/srx/config/srx.yml new file mode 100644 index 00000000000..6af16945317 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/config/srx.yml @@ -0,0 +1,31 @@ +{{ if eq .input "tcp" }} + +type: tcp +host: "{{.syslog_host}}:{{.syslog_port}}" + +{{ else if eq .input "udp" }} + +type: udp +host: "{{.syslog_host}}:{{.syslog_port}}" + +{{ else if eq .input "file" }} + +type: log +paths: +{{ range $i, $path := .paths }} + - {{$path}} +{{ end }} + +exclude_files: [".gz$"] + +{{ end }} + +tags: {{.tags | tojson}} +publisher_pipeline.disable_host: {{ inList .tags "forwarded" }} + +processors: + - add_locale: ~ + - add_fields: + target: '' + fields: + ecs.version: 1.5.0 diff --git a/x-pack/filebeat/module/juniper/srx/ingest/atp.yml b/x-pack/filebeat/module/juniper/srx/ingest/atp.yml new file mode 100644 index 00000000000..b93e8da9f98 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/ingest/atp.yml @@ -0,0 +1,363 @@ +description: Pipeline for parsing junipersrx firewall logs (atp pipeline) +processors: +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.kind + value: event +- set: + field: event.outcome + value: success + if: "ctx.juniper?.srx?.tag != null" +- append: + field: event.category + value: network +- set: + field: event.kind + value: alert + if: '["SRX_AAMW_ACTION_LOG", "AAMW_MALWARE_EVENT_LOG", "AAMW_HOST_INFECTED_EVENT_LOG", "AAMW_ACTION_LOG"].contains(ctx.juniper?.srx?.tag) && ctx.juniper?.srx?.action != "PERMIT"' +- append: + field: event.category + value: malware + if: '["SRX_AAMW_ACTION_LOG", "AAMW_MALWARE_EVENT_LOG", "AAMW_HOST_INFECTED_EVENT_LOG", "AAMW_ACTION_LOG"].contains(ctx.juniper?.srx?.tag) && ctx.juniper?.srx?.action != "PERMIT"' +- append: + field: event.type + value: + - info + - denied + - connection + if: "ctx.juniper?.srx?.action == 'BLOCK' || ctx.juniper?.srx?.tag == 'AAMW_MALWARE_EVENT_LOG'" +- append: + field: event.type + value: + - allowed + - connection + if: "ctx.juniper?.srx?.action != 'BLOCK' && ctx.juniper?.srx?.tag != 'AAMW_MALWARE_EVENT_LOG'" +- set: + field: event.action + value: malware_detected + if: "ctx.juniper?.srx?.action == 'BLOCK' || ctx.juniper?.srx?.tag == 'AAMW_MALWARE_EVENT_LOG'" + + +#################################### +## ECS Server/Destination Mapping ## +#################################### +- rename: + field: juniper.srx.destination_address + target_field: destination.ip + ignore_missing: true + if: "ctx.juniper?.srx?.destination_address != null" +- set: + field: server.ip + value: '{{destination.ip}}' + if: "ctx.destination?.ip != null" +- rename: + field: juniper.srx.nat_destination_address + target_field: destination.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_address != null" +- convert: + field: juniper.srx.destination_port + target_field: destination.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.destination_port != null" +- set: + field: server.port + value: '{{destination.port}}' + if: "ctx.destination?.port != null" +- convert: + field: server.port + target_field: server.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.port != null" +- convert: + field: juniper.srx.nat_destination_port + target_field: destination.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_port != null" +- set: + field: server.nat.port + value: '{{destination.nat.port}}' + if: "ctx.destination?.nat?.port != null" +- convert: + field: server.nat.port + target_field: server.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_server + target_field: destination.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_server != null" +- set: + field: server.bytes + value: '{{destination.bytes}}' + if: "ctx.destination?.bytes != null" +- convert: + field: server.bytes + target_field: server.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.bytes != null" +- convert: + field: juniper.srx.packets_from_server + target_field: destination.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_server != null" +- set: + field: server.packets + value: '{{destination.packets}}' + if: "ctx.destination?.packets != null" +- convert: + field: server.packets + target_field: server.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.packets != null" + +############################### +## ECS Client/Source Mapping ## +############################### +- rename: + field: juniper.srx.source_address + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.source_address != null" +- set: + field: client.ip + value: '{{source.ip}}' + if: "ctx.source?.ip != null" +- rename: + field: juniper.srx.nat_source_address + target_field: source.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_address != null" +- rename: + field: juniper.srx.sourceip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.sourceip != null" +- convert: + field: juniper.srx.source_port + target_field: source.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.source_port != null" +- set: + field: client.port + value: '{{source.port}}' + if: "ctx.source?.port != null" +- convert: + field: client.port + target_field: client.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.port != null" +- convert: + field: juniper.srx.nat_source_port + target_field: source.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_port != null" +- set: + field: client.nat.port + value: '{{source.nat.port}}' + if: "ctx.source?.nat?.port != null" +- convert: + field: client.nat.port + target_field: client.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_client + target_field: source.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_client != null" +- set: + field: client.bytes + value: '{{source.bytes}}' + if: "ctx.source?.bytes != null" +- convert: + field: client.bytes + target_field: client.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.bytes != null" +- convert: + field: juniper.srx.packets_from_client + target_field: source.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_client != null" +- set: + field: client.packets + value: '{{source.packets}}' + if: "ctx.source?.packets != null" +- convert: + field: client.packets + target_field: client.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.packets != null" +- rename: + field: juniper.srx.username + target_field: source.user.name + ignore_missing: true + if: "ctx.juniper?.srx?.username != null" +- rename: + field: juniper.srx.hostname + target_field: source.domain + ignore_missing: true + if: "ctx.juniper?.srx?.hostname != null" +- rename: + field: juniper.srx.client_ip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.client_ip != null" + +###################### +## ECS URL Mapping ## +###################### +- rename: + field: juniper.srx.http_host + target_field: url.domain + ignore_missing: true + if: "ctx.juniper?.srx?.http_host != null" + +############################# +## ECS Network/Geo Mapping ## +############################# +- rename: + field: juniper.srx.protocol_id + target_field: network.iana_number + ignore_missing: true + if: "ctx.juniper?.srx?.protocol_id != null" +- geoip: + field: source.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + field: source.nat.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.nat.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.nat.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.source?.as == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.nat.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.destination?.as == null" +- rename: + field: source.as.asn + target_field: source.as.number + ignore_missing: true +- rename: + field: source.as.organization_name + target_field: source.as.organization.name + ignore_missing: true +- rename: + field: destination.as.asn + target_field: destination.as.number + ignore_missing: true +- rename: + field: destination.as.organization_name + target_field: destination.as.organization.name + ignore_missing: true +############### +## Timestamp ## +############### +- date: + if: 'ctx.juniper.srx?.timestamp != null' + field: juniper.srx.timestamp + target_field: juniper.srx.timestamp + formats: + - 'EEE MMM dd HH:mm:ss yyyy' + - 'EEE MMM d HH:mm:ss yyyy' + on_failure: + - remove: + field: + - juniper.srx.timestamp + +############# +## Cleanup ## +############# +- remove: + field: + - juniper.srx.destination_port + - juniper.srx.nat_destination_port + - juniper.srx.bytes_from_client + - juniper.srx.packets_from_client + - juniper.srx.source_port + - juniper.srx.nat_source_port + - juniper.srx.bytes_from_server + - juniper.srx.packets_from_server + ignore_missing: true + +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/juniper/srx/ingest/flow.yml b/x-pack/filebeat/module/juniper/srx/ingest/flow.yml new file mode 100644 index 00000000000..1a488a57bd8 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/ingest/flow.yml @@ -0,0 +1,360 @@ +description: Pipeline for parsing junipersrx firewall logs (flow pipeline) +processors: +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.kind + value: event +- set: + field: event.outcome + value: success + if: "ctx.juniper?.srx?.tag != null" +- append: + field: event.category + value: network +- rename: + field: juniper.srx.application_risk + target_field: event.risk_score + ignore_missing: true + if: "ctx.juniper?.srx?.application_risk != null" +- append: + field: event.type + value: + - start + - allowed + - connection + if: "ctx.juniper?.srx?.tag.endsWith('CREATE') || ctx.juniper?.srx?.tag.endsWith('UPDATE') || ctx.juniper?.srx?.tag.endsWith('CREATE_LS') || ctx.juniper?.srx?.tag.endsWith('UPDATE_LS')" +- append: + field: event.type + value: + - end + - allowed + - connection + if: "ctx.juniper?.srx?.tag.endsWith('CLOSE') || ctx.juniper?.srx?.tag.endsWith('CLOSE_LS')" +- append: + field: event.type + value: + - denied + - connection + if: "ctx.juniper?.srx?.tag.endsWith('DENY') || ctx.juniper?.srx?.tag.endsWith('DENY_LS')" +- set: + field: event.action + value: flow_started + if: "ctx.juniper?.srx?.tag.endsWith('CREATE') || ctx.juniper?.srx?.tag.endsWith('UPDATE') || ctx.juniper?.srx?.tag.endsWith('CREATE_LS') || ctx.juniper?.srx?.tag.endsWith('UPDATE_LS')" +- set: + field: event.action + value: flow_close + if: "ctx.juniper?.srx?.tag.endsWith('CLOSE') || ctx.juniper?.srx?.tag.endsWith('CLOSE_LS')" +- set: + field: event.action + value: flow_deny + if: "ctx.juniper?.srx?.tag.endsWith('DENY') || ctx.juniper?.srx?.tag.endsWith('DENY_LS')" + +#################################### +## ECS Server/Destination Mapping ## +#################################### +- rename: + field: juniper.srx.destination_address + target_field: destination.ip + ignore_missing: true + if: "ctx.juniper?.srx?.destination_address != null" +- set: + field: server.ip + value: '{{destination.ip}}' + if: "ctx.destination?.ip != null" +- rename: + field: juniper.srx.nat_destination_address + target_field: destination.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_address != null" +- convert: + field: juniper.srx.destination_port + target_field: destination.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.destination_port != null" +- set: + field: server.port + value: '{{destination.port}}' + if: "ctx?.destination?.port != null" +- convert: + field: server.port + target_field: server.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.port != null" +- convert: + field: juniper.srx.nat_destination_port + target_field: destination.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_port != null" +- set: + field: server.nat.port + value: '{{destination.nat.port}}' + if: "ctx.destination?.nat?.port != null" +- convert: + field: server.nat.port + target_field: server.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_server + target_field: destination.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_server != null" +- set: + field: server.bytes + value: '{{destination.bytes}}' + if: "ctx.destination?.bytes != null" +- convert: + field: server.bytes + target_field: server.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.bytes != null" +- convert: + field: juniper.srx.packets_from_server + target_field: destination.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_server != null" +- set: + field: server.packets + value: '{{destination.packets}}' + if: "ctx.destination?.packets != null" +- convert: + field: server.packets + target_field: server.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.packets != null" + +############################### +## ECS Client/Source Mapping ## +############################### +- rename: + field: juniper.srx.source_address + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.source_address != null" +- set: + field: client.ip + value: '{{source.ip}}' + if: "ctx.source?.ip != null" +- rename: + field: juniper.srx.nat_source_address + target_field: source.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_address != null" +- rename: + field: juniper.srx.sourceip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.sourceip != null" +- convert: + field: juniper.srx.source_port + target_field: source.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.source_port != null" +- set: + field: client.port + value: '{{source.port}}' + if: "ctx.source?.port != null" +- convert: + field: client.port + target_field: client.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.port != null" +- convert: + field: juniper.srx.nat_source_port + target_field: source.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_port != null" +- set: + field: client.nat.port + value: '{{source.nat.port}}' + if: "ctx.source?.nat?.port != null" +- convert: + field: client.nat.port + target_field: client.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_client + target_field: source.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_client != null" +- set: + field: client.bytes + value: '{{source.bytes}}' + if: "ctx.source?.bytes != null" +- convert: + field: client.bytes + target_field: client.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.bytes != null" +- convert: + field: juniper.srx.packets_from_client + target_field: source.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_client != null" +- set: + field: client.packets + value: '{{source.packets}}' + if: "ctx.source?.packets != null" +- convert: + field: client.packets + target_field: client.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.packets != null" +- rename: + field: juniper.srx.username + target_field: source.user.name + ignore_missing: true + if: "ctx.juniper?.srx?.username != null" + +###################### +## ECS Rule Mapping ## +###################### +- rename: + field: juniper.srx.policy_name + target_field: rule.name + ignore_missing: true + if: "ctx.juniper?.srx?.policy_name != null" + +############################# +## ECS Network/Geo Mapping ## +############################# +- rename: + field: juniper.srx.protocol_id + target_field: network.iana_number + ignore_missing: true + if: "ctx.juniper?.srx?.protocol_id != null" +- geoip: + field: source.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + field: source.nat.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.nat.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.nat.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.source?.as == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.nat.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.destination?.as == null" +- rename: + field: source.as.asn + target_field: source.as.number + ignore_missing: true +- rename: + field: source.as.organization_name + target_field: source.as.organization.name + ignore_missing: true +- rename: + field: destination.as.asn + target_field: destination.as.number + ignore_missing: true +- rename: + field: destination.as.organization_name + target_field: destination.as.organization.name + ignore_missing: true +- script: + lang: painless + source: "ctx.network.bytes = ctx.source.bytes + ctx.destination.bytes" + if: "ctx?.source?.bytes != null && ctx?.destination?.bytes != null" + ignore_failure: true +- script: + lang: painless + source: "ctx.network.packets = ctx.client.packets + ctx.server.packets" + if: "ctx?.client?.packets != null && ctx?.server?.packets != null" + ignore_failure: true + +############# +## Cleanup ## +############# +- remove: + field: + - juniper.srx.destination_port + - juniper.srx.nat_destination_port + - juniper.srx.bytes_from_client + - juniper.srx.packets_from_client + - juniper.srx.source_port + - juniper.srx.nat_source_port + - juniper.srx.bytes_from_server + - juniper.srx.packets_from_server + ignore_missing: true + +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/juniper/srx/ingest/idp.yml b/x-pack/filebeat/module/juniper/srx/ingest/idp.yml new file mode 100644 index 00000000000..808185410d7 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/ingest/idp.yml @@ -0,0 +1,287 @@ +description: Pipeline for parsing junipersrx firewall logs (idp pipeline) +processors: +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.kind + value: event +- set: + field: event.outcome + value: success + if: "ctx.juniper?.srx?.tag != null" +- append: + field: event.category + value: network +- set: + field: event.kind + value: alert + if: '["IDP_ATTACK_LOG_EVENT", "IDP_APPDDOS_APP_STATE_EVENT", "IDP_APPDDOS_APP_ATTACK_EVENT", "IDP_ATTACK_LOG_EVENT_LS", "IDP_APPDDOS_APP_STATE_EVENT_LS", "IDP_APPDDOS_APP_ATTACK_EVENT_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.category + value: intrusion_detection + if: '["IDP_ATTACK_LOG_EVENT", "IDP_APPDDOS_APP_STATE_EVENT", "IDP_APPDDOS_APP_ATTACK_EVENT", "IDP_ATTACK_LOG_EVENT_LS", "IDP_APPDDOS_APP_STATE_EVENT_LS", "IDP_APPDDOS_APP_ATTACK_EVENT_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.type + value: + - info + - denied + - connection + if: '["IDP_ATTACK_LOG_EVENT", "IDP_APPDDOS_APP_STATE_EVENT", "IDP_APPDDOS_APP_ATTACK_EVENT", "IDP_ATTACK_LOG_EVENT_LS", "IDP_APPDDOS_APP_STATE_EVENT_LS", "IDP_APPDDOS_APP_ATTACK_EVENT_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.type + value: + - allowed + - connection + if: '!["IDP_ATTACK_LOG_EVENT", "IDP_APPDDOS_APP_STATE_EVENT", "IDP_APPDDOS_APP_ATTACK_EVENT", "IDP_ATTACK_LOG_EVENT_LS", "IDP_APPDDOS_APP_STATE_EVENT_LS", "IDP_APPDDOS_APP_ATTACK_EVENT_LS"].contains(ctx.juniper?.srx?.tag)' +- set: + field: event.action + value: application_ddos + if: '["IDP_APPDDOS_APP_STATE_EVENT", "IDP_APPDDOS_APP_ATTACK_EVENT", "IDP_APPDDOS_APP_STATE_EVENT_LS", "IDP_APPDDOS_APP_ATTACK_EVENT_LS"].contains(ctx.juniper?.srx?.tag)' +- set: + field: event.action + value: security_threat + if: '["IDP_ATTACK_LOG_EVENT", "IDP_ATTACK_LOG_EVENT_LS"].contains(ctx.juniper?.srx?.tag)' + + +#################################### +## ECS Server/Destination Mapping ## +#################################### +- rename: + field: juniper.srx.destination_address + target_field: destination.ip + ignore_missing: true + if: "ctx.juniper?.srx?.destination_address != null" +- set: + field: server.ip + value: '{{destination.ip}}' + if: "ctx.destination?.ip != null" +- rename: + field: juniper.srx.nat_destination_address + target_field: destination.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_address != null" +- convert: + field: juniper.srx.destination_port + target_field: destination.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.destination_port != null" +- set: + field: server.port + value: '{{destination.port}}' + if: "ctx.destination?.port != null" +- convert: + field: server.port + target_field: server.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.port != null" +- convert: + field: juniper.srx.nat_destination_port + target_field: destination.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx['nat_destination_port'] != null" +- set: + field: server.nat.port + value: '{{destination.nat.port}}' + if: "ctx.destination?.nat?.port != null" +- convert: + field: server.nat.port + target_field: server.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.nat?.port != null" +- convert: + field: juniper.srx.inbound_bytes + target_field: destination.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.inbound_bytes != null" +- set: + field: server.bytes + value: '{{destination.bytes}}' + if: "ctx.destination?.bytes != null" +- convert: + field: server.bytes + target_field: server.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.bytes != null" +- convert: + field: juniper.srx.inbound_packets + target_field: destination.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.inbound_packets !=null" +- set: + field: server.packets + value: '{{destination.packets}}' + if: "ctx.destination?.packets != null" +- convert: + field: server.packets + target_field: server.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.packets != null" + +############################### +## ECS Client/Source Mapping ## +############################### +- rename: + field: juniper.srx.source_address + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.source_address != null" +- set: + field: client.ip + value: '{{source.ip}}' + if: "ctx.source?.ip != null" +- rename: + field: juniper.srx.nat_source_address + target_field: source.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_address != null" +- rename: + field: juniper.srx.sourceip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.sourceip != null" +- convert: + field: juniper.srx.source_port + target_field: source.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.source_port != null" +- set: + field: client.port + value: '{{source.port}}' + if: "ctx.source?.port != null" +- convert: + field: client.port + target_field: client.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.port != null" +- convert: + field: juniper.srx.nat_source_port + target_field: source.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_port != null" +- set: + field: client.nat.port + value: '{{source.nat.port}}' + if: "ctx.source?.nat?.port != null" +- convert: + field: client.nat.port + target_field: client.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.nat?.port != null" +- convert: + field: juniper.srx.outbound_bytes + target_field: source.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.outbound_bytes != null" +- set: + field: client.bytes + value: '{{source.bytes}}' + if: "ctx.source?.bytes != null" +- convert: + field: client.bytes + target_field: client.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.bytes != null" +- convert: + field: juniper.srx.outbound_packets + target_field: source.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.outbound_packets != null" +- set: + field: client.packets + value: '{{source.packets}}' + if: "ctx.source?.packets != null" +- convert: + field: client.packets + target_field: client.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.packets != null" +- rename: + field: juniper.srx.username + target_field: source.user.name + ignore_missing: true + if: "ctx.juniper?.srx?.username != null" + +###################### +## ECS Rule Mapping ## +###################### +- rename: + field: juniper.srx.rulebase_name + target_field: rule.name + ignore_missing: true + if: "ctx.juniper?.srx?.rulebase_name != null" +- rename: + field: juniper.srx.rule_name + target_field: rule.id + ignore_missing: true + if: "ctx.juniper?.srx?.rule_name != null" + +######################### +## ECS Network Mapping ## +######################### +- rename: + field: juniper.srx.protocol_name + target_field: network.protocol + ignore_missing: true + if: "ctx.juniper?.srx?.protocol_name != null" + +######################### +## ECS message Mapping ## +######################### +- rename: + field: juniper.srx.message + target_field: message + ignore_missing: true + if: "ctx.juniper?.srx?.message != null" + +############# +## Cleanup ## +############# +- remove: + field: + - juniper.srx.destination_port + - juniper.srx.nat_destination_port + - juniper.srx.outbound_bytes + - juniper.srx.outbound_packets + - juniper.srx.source_port + - juniper.srx.nat_source_port + - juniper.srx.inbound_bytes + - juniper.srx.inbound_packets + ignore_missing: true + +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/juniper/srx/ingest/ids.yml b/x-pack/filebeat/module/juniper/srx/ingest/ids.yml new file mode 100644 index 00000000000..039fdd64ccb --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/ingest/ids.yml @@ -0,0 +1,363 @@ +description: Pipeline for parsing junipersrx firewall logs (ids pipeline) +processors: +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.kind + value: event +- set: + field: event.outcome + value: success + if: "ctx.juniper?.srx?.tag != null" +- append: + field: event.category + value: network +- set: + field: event.kind + value: alert + if: '["RT_SCREEN_TCP", "RT_SCREEN_UDP", "RT_SCREEN_ICMP", "RT_SCREEN_IP", "RT_SCREEN_TCP_DST_IP", "RT_SCREEN_TCP_SRC_IP", "RT_SCREEN_TCP_LS", "RT_SCREEN_UDP_LS", "RT_SCREEN_ICMP_LS", "RT_SCREEN_IP_LS", "RT_SCREEN_TCP_DST_IP_LS", "RT_SCREEN_TCP_SRC_IP_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.category + value: intrusion_detection + if: '["RT_SCREEN_TCP", "RT_SCREEN_UDP", "RT_SCREEN_ICMP", "RT_SCREEN_IP", "RT_SCREEN_TCP_DST_IP", "RT_SCREEN_TCP_SRC_IP", "RT_SCREEN_TCP_LS", "RT_SCREEN_UDP_LS", "RT_SCREEN_ICMP_LS", "RT_SCREEN_IP_LS", "RT_SCREEN_TCP_DST_IP_LS", "RT_SCREEN_TCP_SRC_IP_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.type + value: + - info + - denied + - connection + if: '["RT_SCREEN_TCP", "RT_SCREEN_UDP", "RT_SCREEN_ICMP", "RT_SCREEN_IP", "RT_SCREEN_TCP_DST_IP", "RT_SCREEN_TCP_SRC_IP", "RT_SCREEN_TCP_LS", "RT_SCREEN_UDP_LS", "RT_SCREEN_ICMP_LS", "RT_SCREEN_IP_LS", "RT_SCREEN_TCP_DST_IP_LS", "RT_SCREEN_TCP_SRC_IP_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.type + value: + - allowed + - connection + if: '!["RT_SCREEN_TCP", "RT_SCREEN_UDP", "RT_SCREEN_ICMP", "RT_SCREEN_IP", "RT_SCREEN_TCP_DST_IP", "RT_SCREEN_TCP_SRC_IP", "RT_SCREEN_TCP_LS", "RT_SCREEN_UDP_LS", "RT_SCREEN_ICMP_LS", "RT_SCREEN_IP_LS", "RT_SCREEN_TCP_DST_IP_LS", "RT_SCREEN_TCP_SRC_IP_LS"].contains(ctx.juniper?.srx?.tag)' +- set: + field: event.action + value: flood_detected + if: '["ICMP flood!", "UDP flood!", "SYN flood!", "SYN flood Src-IP based!", "SYN flood Dst-IP based!"].contains(ctx.juniper?.srx?.attack_name)' +- set: + field: event.action + value: scan_detected + if: "ctx.juniper?.srx?.attack_name == 'TCP port scan!'" +- set: + field: event.action + value: sweep_detected + if: '["TCP sweep!", "IP sweep!", "UDP sweep!", "Address sweep!"].contains(ctx.juniper?.srx?.attack_name)' +- set: + field: event.action + value: fragment_detected + if: '["ICMP fragment!", "SYN fragment!"].contains(ctx.juniper?.srx?.attack_name)' +- set: + field: event.action + value: spoofing_detected + if: "ctx.juniper?.srx?.attack_name == 'IP spoofing!'" +- set: + field: event.action + value: session_limit_detected + if: '["Src IP session limit!", "Dst IP session limit!"].contains(ctx.juniper?.srx?.attack_name)' +- set: + field: event.action + value: attack_detected + if: '["Land attack!", "WinNuke attack!"].contains(ctx.juniper?.srx?.attack_name)' +- set: + field: event.action + value: illegal_tcp_flag_detected + if: '["No TCP flag!", "SYN and FIN bits!", "FIN but no ACK bit!"].contains(ctx.juniper?.srx?.attack_name)' +- set: + field: event.action + value: tunneling_screen + if: "ctx.juniper?.srx?.attack_name.startsWith('Tunnel')" + + +#################################### +## ECS Server/Destination Mapping ## +#################################### +- rename: + field: juniper.srx.destination_address + target_field: destination.ip + ignore_missing: true + if: "ctx.juniper?.srx?.destination_address != null" +- set: + field: server.ip + value: '{{destination.ip}}' + if: "ctx.destination?.ip != null" +- rename: + field: juniper.srx.nat_destination_address + target_field: destination.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_address != null" +- convert: + field: juniper.srx.destination_port + target_field: destination.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.destination_port != null" +- set: + field: server.port + value: '{{destination.port}}' + if: "ctx.destination?.port != null" +- convert: + field: server.port + target_field: server.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.port != null" +- convert: + field: juniper.srx.nat_destination_port + target_field: destination.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_port != null" +- set: + field: server.nat.port + value: '{{destination.nat.port}}' + if: "ctx.destination?.nat?.port != null" +- convert: + field: server.nat.port + target_field: server.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_server + target_field: destination.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_server != null" +- set: + field: server.bytes + value: '{{destination.bytes}}' + if: "ctx.destination?.bytes != null" +- convert: + field: server.bytes + target_field: server.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.bytes != null" +- convert: + field: juniper.srx.packets_from_server + target_field: destination.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_server !=null" +- set: + field: server.packets + value: '{{destination.packets}}' + if: "ctx.destination?.packets != null" +- convert: + field: server.packets + target_field: server.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.packets != null" + +############################### +## ECS Client/Source Mapping ## +############################### +- rename: + field: juniper.srx.source_address + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.source_address != null" +- set: + field: client.ip + value: '{{source.ip}}' + if: "ctx.source?.ip != null" +- rename: + field: juniper.srx.nat_source_address + target_field: source.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_address != null" +- rename: + field: juniper.srx.sourceip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.sourceip != null" +- convert: + field: juniper.srx.source_port + target_field: source.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.source_port != null" +- set: + field: client.port + value: '{{source.port}}' + if: "ctx.source?.port != null" +- convert: + field: client.port + target_field: client.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.port != null" +- convert: + field: juniper.srx.nat_source_port + target_field: source.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_port != null" +- set: + field: client.nat.port + value: '{{source.nat.port}}' + if: "ctx.source?.nat?.port != null" +- convert: + field: client.nat.port + target_field: client.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_client + target_field: source.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_client != null" +- set: + field: client.bytes + value: '{{source.bytes}}' + if: "ctx.source?.bytes != null" +- convert: + field: client.bytes + target_field: client.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.bytes != null" +- convert: + field: juniper.srx.packets_from_client + target_field: source.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_client != null" +- set: + field: client.packets + value: '{{source.packets}}' + if: "ctx.source?.packets != null" +- convert: + field: client.packets + target_field: client.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.packets != null" +- rename: + field: juniper.srx.username + target_field: source.user.name + ignore_missing: true + if: "ctx.juniper?.srx?.username != null" + +############################# +## ECS Network/Geo Mapping ## +############################# +- rename: + field: juniper.srx.protocol_id + target_field: network.iana_number + ignore_missing: true + if: "ctx.juniper?.srx?.protocol_id != null" +- geoip: + field: source.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + field: source.nat.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.nat.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.nat.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.source?.as == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.nat.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.destination?.as == null" +- rename: + field: source.as.asn + target_field: source.as.number + ignore_missing: true +- rename: + field: source.as.organization_name + target_field: source.as.organization.name + ignore_missing: true +- rename: + field: destination.as.asn + target_field: destination.as.number + ignore_missing: true +- rename: + field: destination.as.organization_name + target_field: destination.as.organization.name + ignore_missing: true + + +############# +## Cleanup ## +############# +- remove: + field: + - juniper.srx.destination_port + - juniper.srx.nat_destination_port + - juniper.srx.bytes_from_client + - juniper.srx.packets_from_client + - juniper.srx.source_port + - juniper.srx.nat_source_port + - juniper.srx.bytes_from_server + - juniper.srx.packets_from_server + ignore_missing: true + +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml b/x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml new file mode 100644 index 00000000000..5bc4d45e82e --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/ingest/pipeline.yml @@ -0,0 +1,275 @@ +# This module only supports syslog messages in the format "structured-data + brief" +# https://www.juniper.net/documentation/en_US/junos/topics/reference/configuration-statement/structured-data-edit-system.html +description: Pipeline for parsing junipersrx firewall logs +processors: +- grok: + field: message + patterns: + - '^<%{POSINT:syslog_pri}>(\d{1,3}\s)?(?:%{TIMESTAMP_ISO8601:_temp_.raw_date})\s%{SYSLOGHOST:syslog_hostname}\s%{PROG:syslog_program}\s(?:%{POSINT:syslog_pid}|-)?\s%{WORD:log_type}\s\[.+?\s%{GREEDYDATA:log.original}\]$' + +# split Juniper-SRX fields +- kv: + field: log.original + field_split: " (?=[a-z0-9\\_\\-]+=)" + value_split: "=" + prefix: "juniper.srx." + ignore_missing: true + ignore_failure: false + trim_value: "\"" + +# Converts all kebab-case key names to snake_case +- script: + lang: painless + source: >- + ctx.juniper.srx = ctx?.juniper?.srx.entrySet().stream().collect(Collectors.toMap(e -> e.getKey().replace('-', '_'), e -> e.getValue())); + +# +# Parse the date +# +- date: + if: "ctx.event.timezone == null" + field: _temp_.raw_date + target_field: "@timestamp" + formats: + - yyyy-MM-dd HH:mm:ss + - yyyy-MM-dd HH:mm:ss z + - yyyy-MM-dd HH:mm:ss Z + - ISO8601 +- date: + if: "ctx.event.timezone != null" + timezone: "{{ event.timezone }}" + field: _temp_.raw_date + target_field: "@timestamp" + formats: + - yyyy-MM-dd HH:mm:ss + - yyyy-MM-dd HH:mm:ss z + - yyyy-MM-dd HH:mm:ss Z + - ISO8601 + +- set: + field: event.ingested + value: '{{_ingest.timestamp}}' + +# Can possibly be omitted if there is a solution for the equal signs and the calculation of the start time. +# -> juniper.srx.elapsed_time +- rename: + field: juniper.srx.elapsed_time + target_field: juniper.srx.duration + if: "ctx.juniper?.srx?.elapsed_time != null" + +# Sets starts, end and duration when start and duration is known +- script: + lang: painless + if: ctx?.juniper?.srx?.duration != null + source: >- + ctx.event.duration = Integer.parseInt(ctx.juniper.srx.duration) * 1000000000L; + ctx.event.start = ctx['@timestamp']; + ZonedDateTime start = ZonedDateTime.parse(ctx.event.start); + ctx.event.end = start.plus(ctx.event.duration, ChronoUnit.NANOS); + +# Removes all empty fields +- script: + lang: painless + params: + values: + - "None" + - "UNKNOWN" + - "N/A" + - "-" + source: >- + ctx?.juniper?.srx.entrySet().removeIf(entry -> params.values.contains(entry.getValue())); + +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.module + value: juniper +- set: + field: event.dataset + value: juniper.srx +- set: + field: event.severity + value: '{{syslog_pri}}' +- rename: + field: log.original + target_field: event.original + ignore_missing: true + +##################### +## ECS Log Mapping ## +##################### +# https://www.juniper.net/documentation/en_US/junos/topics/reference/general/syslog-interpreting-msg-generated-structured-data-format.html#fac_sev_codes +- set: + field: "log.level" + if: '["0", "8", "16", "24", "32", "40", "48", "56", "64", "72", "80", "88", "96", "104", "112", "128", "136", "144", "152", "160", "168", "176", "184"].contains(ctx.syslog_pri)' + value: emergency +- set: + field: "log.level" + if: '["1", "9", "17", "25", "33", "41", "49", "57", "65", "73", "81", "89", "97", "105", "113", "129", "137", "145", "153", "161", "169", "177", "185"].contains(ctx.syslog_pri)' + value: alert +- set: + field: "log.level" + if: '["2", "10", "18", "26", "34", "42", "50", "58", "66", "74", "82", "90", "98", "106", "114", "130", "138", "146", "154", "162", "170", "178", "186"].contains(ctx.syslog_pri)' + value: critical +- set: + field: "log.level" + if: '["3", "11", "19", "27", "35", "43", "51", "59", "67", "75", "83", "91", "99", "107", "115", "131", "139", "147", "155", "163", "171", "179", "187"].contains(ctx.syslog_pri)' + value: error +- set: + field: "log.level" + if: '["4", "12", "20", "28", "36", "44", "52", "60", "68", "76", "84", "92", "100", "108", "116", "132", "140", "148", "156", "164", "172", "180", "188"].contains(ctx.syslog_pri)' + value: warning +- set: + field: "log.level" + if: '["5", "13", "21", "29", "37", "45", "53", "61", "69", "77", "85", "93", "101", "109", "117", "133", "141", "149", "157", "165", "173", "181", "189"].contains(ctx.syslog_pri)' + value: notification +- set: + field: "log.level" + if: '["6", "14", "22", "30", "38", "46", "54", "62", "70", "78", "86", "94", "102", "110", "118", "134", "142", "150", "158", "166", "174", "182", "190"].contains(ctx.syslog_pri)' + value: informational +- set: + field: "log.level" + if: '["7", "15", "23", "31", "39", "47", "55", "63", "71", "79", "87", "95", "103", "111", "119", "135", "143", "151", "159", "167", "175", "183", "191"].contains(ctx.syslog_pri)' + value: debug + +########################## +## ECS Observer Mapping ## +########################## +- set: + field: observer.vendor + value: Juniper +- set: + field: observer.product + value: SRX +- set: + field: observer.type + value: firewall +- rename: + field: syslog_hostname + target_field: observer.name + ignore_missing: true +- rename: + field: juniper.srx.packet_incoming_interface + target_field: observer.ingress.interface.name + ignore_missing: true +- rename: + field: juniper.srx.destination_interface_name + target_field: observer.egress.interface.name + ignore_missing: true +- rename: + field: juniper.srx.source_interface_name + target_field: observer.ingress.interface.name + ignore_missing: true +- rename: + field: juniper.srx.interface_name + target_field: observer.ingress.interface.name + ignore_missing: true +- rename: + field: juniper.srx.source_zone_name + target_field: observer.ingress.zone + ignore_missing: true +- rename: + field: juniper.srx.source_zone + target_field: observer.ingress.zone + ignore_missing: true +- rename: + field: juniper.srx.destination_zone_name + target_field: observer.egress.zone + ignore_missing: true +- rename: + field: juniper.srx.destination_zone + target_field: observer.egress.zone + ignore_missing: true +- rename: + field: syslog_program + target_field: juniper.srx.process + ignore_missing: true +- rename: + field: log_type + target_field: juniper.srx.tag + ignore_missing: true + + +############# +## Cleanup ## +############# +- remove: + field: + - message + - _temp_ + - _temp + - juniper.srx.duration + - juniper.srx.dir_disp + - juniper.srx.srczone + - juniper.srx.dstzone + - juniper.srx.duration + - syslog_pri + ignore_missing: true + +################################ +## Product Specific Pipelines ## +################################ +- pipeline: + name: '{< IngestPipeline "flow" >}' + if: "ctx.juniper?.srx?.process == 'RT_FLOW'" +- pipeline: + name: '{< IngestPipeline "utm" >}' + if: "ctx.juniper?.srx?.process == 'RT_UTM'" +- pipeline: + name: '{< IngestPipeline "idp" >}' + if: "ctx.juniper?.srx?.process == 'RT_IDP'" +- pipeline: + name: '{< IngestPipeline "ids" >}' + if: "ctx.juniper?.srx?.process == 'RT_IDS'" +- pipeline: + name: '{< IngestPipeline "atp" >}' + if: "ctx.juniper?.srx?.process == 'RT_AAMW'" +- pipeline: + name: '{< IngestPipeline "secintel" >}' + if: "ctx.juniper?.srx?.process == 'RT_SECINTEL'" + +######################### +## ECS Related Mapping ## +######################### +- append: + if: 'ctx.source?.ip != null' + field: related.ip + value: '{{source.ip}}' + ignore_failure: true +- append: + if: 'ctx.destination?.ip != null' + field: related.ip + value: '{{destination.ip}}' + ignore_failure: true +- append: + if: 'ctx.source?.nat?.ip != null' + field: related.ip + value: '{{source.nat.ip}}' + ignore_failure: true +- append: + if: 'ctx?.destination?.nat?.ip != null' + field: related.ip + value: '{{destination.nat.ip}}' + ignore_failure: true + +- append: + if: 'ctx.url?.domain != null' + field: related.hosts + value: '{{url.domain}}' + ignore_failure: true +- append: + if: 'ctx.source?.domain != null' + field: related.hosts + value: '{{source.domain}}' + ignore_failure: true +- append: + if: 'ctx.destination?.domain != null' + field: related.hosts + value: '{{destination.domain}}' + ignore_failure: true + +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/juniper/srx/ingest/secintel.yml b/x-pack/filebeat/module/juniper/srx/ingest/secintel.yml new file mode 100644 index 00000000000..f2abb2bcf9c --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/ingest/secintel.yml @@ -0,0 +1,349 @@ +description: Pipeline for parsing junipersrx firewall logs (secintel pipeline) +processors: +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.kind + value: event +- set: + field: event.outcome + value: success + if: "ctx.juniper?.srx?.tag != null" +- append: + field: event.category + value: network +- set: + field: event.kind + value: alert + if: 'ctx.juniper?.srx?.tag == "SECINTEL_ACTION_LOG" && ctx.juniper?.srx?.action != "PERMIT"' +- append: + field: event.category + value: malware + if: 'ctx.juniper?.srx?.tag == "SECINTEL_ACTION_LOG" && ctx.juniper?.srx?.action != "PERMIT"' +- append: + field: event.type + value: + - info + - denied + - connection + if: "ctx.juniper?.srx?.action == 'BLOCK'" +- append: + field: event.type + value: + - allowed + - connection + if: "ctx.juniper?.srx?.action != 'BLOCK'" +- set: + field: event.action + value: malware_detected + if: "ctx.juniper?.srx?.action == 'BLOCK'" + + +#################################### +## ECS Server/Destination Mapping ## +#################################### +- rename: + field: juniper.srx.destination_address + target_field: destination.ip + ignore_missing: true + if: "ctx.juniper?.srx?.destination_address != null" +- set: + field: server.ip + value: '{{destination.ip}}' + if: "ctx.destination?.ip != null" +- rename: + field: juniper.srx.nat_destination_address + target_field: destination.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_address != null" +- convert: + field: juniper.srx.destination_port + target_field: destination.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.destination_port != null" +- set: + field: server.port + value: '{{destination.port}}' + if: "ctx.destination?.port != null" +- convert: + field: server.port + target_field: server.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.port != null" +- convert: + field: juniper.srx.nat_destination_port + target_field: destination.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_port != null" +- set: + field: server.nat.port + value: '{{destination.nat.port}}' + if: "ctx.destination?.nat?.port != null" +- convert: + field: server.nat.port + target_field: server.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_server + target_field: destination.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_server != null" +- set: + field: server.bytes + value: '{{destination.bytes}}' + if: "ctx.destination?.bytes != null" +- convert: + field: server.bytes + target_field: server.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.bytes != null" +- convert: + field: juniper.srx.packets_from_server + target_field: destination.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_server !=null" +- set: + field: server.packets + value: '{{destination.packets}}' + if: "ctx.destination?.packets != null" +- convert: + field: server.packets + target_field: server.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.packets != null" + +############################### +## ECS Client/Source Mapping ## +############################### +- rename: + field: juniper.srx.source_address + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.source_address != null" +- set: + field: client.ip + value: '{{source.ip}}' + if: "ctx.source?.ip != null" +- rename: + field: juniper.srx.nat_source_address + target_field: source.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_address != null" +- rename: + field: juniper.srx.sourceip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.sourceip != null" +- convert: + field: juniper.srx.source_port + target_field: source.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.source_port != null" +- set: + field: client.port + value: '{{source.port}}' + if: "ctx.source?.port != null" +- convert: + field: client.port + target_field: client.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.port != null" +- convert: + field: juniper.srx.nat_source_port + target_field: source.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_port != null" +- set: + field: client.nat.port + value: '{{source.nat.port}}' + if: "ctx.source?.nat?.port != null" +- convert: + field: client.nat.port + target_field: client.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_client + target_field: source.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_client != null" +- set: + field: client.bytes + value: '{{source.bytes}}' + if: "ctx.source?.bytes != null" +- convert: + field: client.bytes + target_field: client.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.bytes != null" +- convert: + field: juniper.srx.packets_from_client + target_field: source.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_client != null" +- set: + field: client.packets + value: '{{source.packets}}' + if: "ctx.source?.packets != null" +- convert: + field: client.packets + target_field: client.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.packets != null" +- rename: + field: juniper.srx.username + target_field: source.user.name + ignore_missing: true + if: "ctx.juniper?.srx?.username != null" +- rename: + field: juniper.srx.hostname + target_field: source.address + ignore_missing: true + if: "ctx.juniper?.srx?.hostname != null" +- rename: + field: juniper.srx.client_ip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.client_ip != null" + +###################### +## ECS URL Mapping ## +###################### +- rename: + field: juniper.srx.http_host + target_field: url.domain + ignore_missing: true + if: "ctx.juniper?.srx?.http_host != null" + +############################# +## ECS Network/Geo Mapping ## +############################# +- rename: + field: juniper.srx.protocol_id + target_field: network.iana_number + ignore_missing: true + if: "ctx.juniper?.srx?.protocol_id != null" +- geoip: + field: source.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + field: source.nat.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.nat.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.nat.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.source?.as == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.nat.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.destination?.as == null" +- rename: + field: source.as.asn + target_field: source.as.number + ignore_missing: true +- rename: + field: source.as.organization_name + target_field: source.as.organization.name + ignore_missing: true +- rename: + field: destination.as.asn + target_field: destination.as.number + ignore_missing: true +- rename: + field: destination.as.organization_name + target_field: destination.as.organization.name + ignore_missing: true + +############# +## Cleanup ## +############# +- remove: + field: + - juniper.srx.destination_port + - juniper.srx.nat_destination_port + - juniper.srx.bytes_from_client + - juniper.srx.packets_from_client + - juniper.srx.source_port + - juniper.srx.nat_source_port + - juniper.srx.bytes_from_server + - juniper.srx.packets_from_server + ignore_missing: true + +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/juniper/srx/ingest/utm.yml b/x-pack/filebeat/module/juniper/srx/ingest/utm.yml new file mode 100644 index 00000000000..a80e5a94d97 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/ingest/utm.yml @@ -0,0 +1,388 @@ +description: Pipeline for parsing junipersrx firewall logs (utm pipeline) +processors: +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.kind + value: event +- set: + field: event.outcome + value: success + if: "ctx.juniper?.srx?.tag != null" +- append: + field: event.category + value: network +- rename: + field: juniper.srx.urlcategory_risk + target_field: event.risk_score + ignore_missing: true + if: "ctx.juniper?.srx?.urlcategory_risk != null" +- set: + field: event.kind + value: alert + if: '["AV_VIRUS_DETECTED_MT", "WEBFILTER_URL_BLOCKED", "ANTISPAM_SPAM_DETECTED_MT", "CONTENT_FILTERING_BLOCKED_MT", "AV_VIRUS_DETECTED_MT_LS", "WEBFILTER_URL_BLOCKED_LS", "ANTISPAM_SPAM_DETECTED_MT_LS", "CONTENT_FILTERING_BLOCKED_MT_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.category + value: malware + if: '["AV_VIRUS_DETECTED_MT", "WEBFILTER_URL_BLOCKED", "ANTISPAM_SPAM_DETECTED_MT", "CONTENT_FILTERING_BLOCKED_MT", "AV_VIRUS_DETECTED_MT_LS", "WEBFILTER_URL_BLOCKED_LS", "ANTISPAM_SPAM_DETECTED_MT_LS", "CONTENT_FILTERING_BLOCKED_MT_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.type + value: + - info + - denied + - connection + if: '["AV_VIRUS_DETECTED_MT", "WEBFILTER_URL_BLOCKED", "ANTISPAM_SPAM_DETECTED_MT", "CONTENT_FILTERING_BLOCKED_MT", "AV_VIRUS_DETECTED_MT_LS", "WEBFILTER_URL_BLOCKED_LS", "ANTISPAM_SPAM_DETECTED_MT_LS", "CONTENT_FILTERING_BLOCKED_MT_LS"].contains(ctx.juniper?.srx?.tag)' +- append: + field: event.type + value: + - allowed + - connection + if: '!["AV_VIRUS_DETECTED_MT", "WEBFILTER_URL_BLOCKED", "ANTISPAM_SPAM_DETECTED_MT", "CONTENT_FILTERING_BLOCKED_MT", "AV_VIRUS_DETECTED_MT_LS", "WEBFILTER_URL_BLOCKED_LS", "ANTISPAM_SPAM_DETECTED_MT_LS", "CONTENT_FILTERING_BLOCKED_MT_LS"].contains(ctx.juniper?.srx?.tag)' +- set: + field: event.action + value: web_filter + if: '["WEBFILTER_URL_BLOCKED", "WEBFILTER_URL_BLOCKED_LS"].contains(ctx.juniper?.srx?.tag)' +- set: + field: event.action + value: content_filter + if: '["CONTENT_FILTERING_BLOCKED_MT", "CONTENT_FILTERING_BLOCKED_MT_LS"].contains(ctx.juniper?.srx?.tag)' +- set: + field: event.action + value: antispam_filter + if: '["ANTISPAM_SPAM_DETECTED_MT", "ANTISPAM_SPAM_DETECTED_MT_LS"].contains(ctx.juniper?.srx?.tag)' +- set: + field: event.action + value: virus_detected + if: '["AV_VIRUS_DETECTED_MT", "AV_VIRUS_DETECTED_MT_LS"].contains(ctx.juniper?.srx?.tag)' + + +#################################### +## ECS Server/Destination Mapping ## +#################################### +- rename: + field: juniper.srx.destination_address + target_field: destination.ip + ignore_missing: true + if: "ctx.juniper?.srx?.destination_address != null" +- set: + field: server.ip + value: '{{destination.ip}}' + if: "ctx.destination?.ip != null" +- rename: + field: juniper.srx.nat_destination_address + target_field: destination.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_address != null" +- convert: + field: juniper.srx.destination_port + target_field: destination.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.destination_port != null" +- set: + field: server.port + value: '{{destination.port}}' + if: "ctx.destination?.port != null" +- convert: + field: server.port + target_field: server.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.port != null" +- convert: + field: juniper.srx.nat_destination_port + target_field: destination.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_destination_port != null" +- set: + field: server.nat.port + value: '{{destination.nat.port}}' + if: "ctx.destination?.nat?.port != null" +- convert: + field: server.nat.port + target_field: server.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_server + target_field: destination.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_server != null" +- set: + field: server.bytes + value: '{{destination.bytes}}' + if: "ctx.destination?.bytes != null" +- convert: + field: server.bytes + target_field: server.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.bytes != null" +- convert: + field: juniper.srx.packets_from_server + target_field: destination.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_server !=null" +- set: + field: server.packets + value: '{{destination.packets}}' + if: "ctx.destination?.packets != null" +- convert: + field: server.packets + target_field: server.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.server?.packets != null" + +############################### +## ECS Client/Source Mapping ## +############################### +- rename: + field: juniper.srx.source_address + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.source_address != null" +- set: + field: client.ip + value: '{{source.ip}}' + if: "ctx.source?.ip != null" +- rename: + field: juniper.srx.nat_source_address + target_field: source.nat.ip + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_address != null" +- rename: + field: juniper.srx.sourceip + target_field: source.ip + ignore_missing: true + if: "ctx.juniper?.srx?.sourceip != null" +- convert: + field: juniper.srx.source_port + target_field: source.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.source_port != null" +- set: + field: client.port + value: '{{source.port}}' + if: "ctx.source?.port != null" +- convert: + field: client.port + target_field: client.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.port != null" +- convert: + field: juniper.srx.nat_source_port + target_field: source.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.nat_source_port != null" +- set: + field: client.nat.port + value: '{{source.nat.port}}' + if: "ctx.source?.nat?.port != null" +- convert: + field: client.nat.port + target_field: client.nat.port + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.nat?.port != null" +- convert: + field: juniper.srx.bytes_from_client + target_field: source.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.bytes_from_client != null" +- set: + field: client.bytes + value: '{{source.bytes}}' + if: "ctx.source?.bytes != null" +- convert: + field: client.bytes + target_field: client.bytes + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.bytes != null" +- convert: + field: juniper.srx.packets_from_client + target_field: source.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.juniper?.srx?.packets_from_client != null" +- set: + field: client.packets + value: '{{source.packets}}' + if: "ctx.source?.packets != null" +- convert: + field: client.packets + target_field: client.packets + type: long + ignore_failure: true + ignore_missing: true + if: "ctx.client?.packets != null" +- rename: + field: juniper.srx.username + target_field: source.user.name + ignore_missing: true + if: "ctx.juniper?.srx?.username != null" + +###################### +## ECS Rule Mapping ## +###################### +- rename: + field: juniper.srx.policy_name + target_field: rule.name + ignore_missing: true + if: "ctx.juniper?.srx?.policy_name != null" + +##################### +## ECS URL Mapping ## +##################### +- rename: + field: juniper.srx.url + target_field: url.domain + ignore_missing: true + if: "ctx.juniper?.srx?.url != null" +- rename: + field: juniper.srx.obj + target_field: url.path + ignore_missing: true + if: "ctx.juniper?.srx?.obj != null" + +###################### +## ECS File Mapping ## +###################### +- rename: + field: juniper.srx.filename + target_field: file.name + ignore_missing: true + if: "ctx.juniper?.srx?.filename != null" + +######################### +## ECS Network Mapping ## +######################### +- rename: + field: juniper.srx.protocol + target_field: network.protocol + ignore_missing: true + if: "ctx.juniper?.srx?.protocol != null" + +############################# +## ECS Network/Geo Mapping ## +############################# +- rename: + field: juniper.srx.protocol_id + target_field: network.iana_number + ignore_missing: true + if: "ctx.juniper?.srx?.protocol_id != null" +- geoip: + field: source.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true +- geoip: + field: source.nat.ip + target_field: source.geo + ignore_missing: true + if: "ctx.source?.geo == null" +- geoip: + field: destination.nat.ip + target_field: destination.geo + ignore_missing: true + if: "ctx.destination?.geo == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: source.nat.ip + target_field: source.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.source?.as == null" +- geoip: + database_file: GeoLite2-ASN.mmdb + field: destination.nat.ip + target_field: destination.as + properties: + - asn + - organization_name + ignore_missing: true + if: "ctx.destination?.as == null" +- rename: + field: source.as.asn + target_field: source.as.number + ignore_missing: true +- rename: + field: source.as.organization_name + target_field: source.as.organization.name + ignore_missing: true +- rename: + field: destination.as.asn + target_field: destination.as.number + ignore_missing: true +- rename: + field: destination.as.organization_name + target_field: destination.as.organization.name + ignore_missing: true + +############# +## Cleanup ## +############# +- remove: + field: + - juniper.srx.destination_port + - juniper.srx.nat_destination_port + - juniper.srx.bytes_from_client + - juniper.srx.packets_from_client + - juniper.srx.source_port + - juniper.srx.nat_source_port + - juniper.srx.bytes_from_server + - juniper.srx.packets_from_server + ignore_missing: true + +on_failure: +- set: + field: error.message + value: '{{ _ingest.on_failure_message }}' diff --git a/x-pack/filebeat/module/juniper/srx/manifest.yml b/x-pack/filebeat/module/juniper/srx/manifest.yml new file mode 100644 index 00000000000..879be66b99d --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/manifest.yml @@ -0,0 +1,26 @@ +module_version: 1.0 + +var: + - name: syslog_host + default: localhost + - name: tags + default: ["juniper.srx", "forwarded"] + - name: syslog_port + default: 9006 + - name: input + default: udp + +ingest_pipeline: + - ingest/pipeline.yml + - ingest/flow.yml + - ingest/utm.yml + - ingest/idp.yml + - ingest/ids.yml + - ingest/atp.yml + - ingest/secintel.yml + +input: config/srx.yml + +requires.processors: +- name: geoip + plugin: ingest-geoip diff --git a/x-pack/filebeat/module/juniper/srx/test/atp.log b/x-pack/filebeat/module/juniper/srx/test/atp.log new file mode 100644 index 00000000000..95c8210f038 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/atp.log @@ -0,0 +1,4 @@ +<14>1 2013-12-14T16:06:59.134Z pinarello RT_AAMW - SRX_AAMW_ACTION_LOG [junos@xxx.x.x.x.x.28 http-host="www.mytest.com" file-category="executable" action="BLOCK" verdict-number="8" verdict-source=”cloud/blacklist/whitelist” source-address="10.10.10.1" source-port="57116" destination-address="187.19.188.200" destination-port="80" protocol-id="6" application="UNKNOWN" nested-application="UNKNOWN" policy-name="argon_policy" username="user1" session-id-32="50000002" source-zone-name="untrust" destination-zone-name="trust"] +<14>1 2016-09-20T10:43:30.330-07:00 host-example RT_AAMW - AAMW_MALWARE_EVENT_LOG [junos@xxxx.1.1.x.x.xxx timestamp="Thu Jun 23 09:55:38 2016" tenant-id="ABC123456" sample-sha256="ABC123" client-ip="192.0.2.0" verdict-number="9" malware-info="Eicar:TestVirus" username="admin" hostname="host.example.com"] +<11>1 2016-09-20T10:40:30.050-07:00 host-example RT_AAMW - AAMW_HOST_INFECTED_EVENT_LOG [junos@xxxx.1.1.x.x.xxx timestamp="Thu Jun 23 09:55:38 2016" tenant-id="ABC123456" client-ip="192.0.2.0" hostname="host.example.com" status="in_progress" policy-name="default" th="7" state="added" reason="malware" message="malware analysis detected host downloaded a malicious_file with score 9, sha256 ABC123"] +<165>1 2007-02-15T09:17:15.719Z aamw1 RT_AAMW - AAMW_ACTION_LOG [junos@2636.1.1.1.2.129 hostname="dummy_host" file-category="executable" verdict-number="10" malware-info="Testfile" action="PERMIT" list-hit="N/A" file-hash-lookup="FALSE" source-address="1.1.1.1" source-port="60148" destination-address="10.0.0.1" destination-port="80" protocol-id="6" application="HTTP" nested-application="N/A" policy-name="test-policy" username="N/A" roles="N/A" session-id-32="502156" source-zone-name="Inside" destination-zone-name="Outside" sample-sha256="e038b5168d9209267058112d845341cae83d92b1d1af0a10b66830acb7529494" file-name="dummy_file" url="dummy_url"] diff --git a/x-pack/filebeat/module/juniper/srx/test/atp.log-expected.json b/x-pack/filebeat/module/juniper/srx/test/atp.log-expected.json new file mode 100644 index 00000000000..4187866594e --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/atp.log-expected.json @@ -0,0 +1,240 @@ +[ + { + "@timestamp": "2013-12-14T14:06:59.134-02:00", + "client.ip": "10.10.10.1", + "client.port": 57116, + "destination.as.number": 28126, + "destination.as.organization.name": "BRISANET SERVICOS DE TELECOMUNICACOES LTDA", + "destination.geo.city_name": "Juazeiro do Norte", + "destination.geo.continent_name": "South America", + "destination.geo.country_iso_code": "BR", + "destination.geo.country_name": "Brazil", + "destination.geo.location.lat": -7.1467, + "destination.geo.location.lon": -39.247, + "destination.geo.region_iso_code": "BR-CE", + "destination.geo.region_name": "Ceara", + "destination.ip": "187.19.188.200", + "destination.port": 80, + "event.action": "malware_detected", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "http-host=\"www.mytest.com\" file-category=\"executable\" action=\"BLOCK\" verdict-number=\"8\" verdict-source=\u201dcloud/blacklist/whitelist\u201d source-address=\"10.10.10.1\" source-port=\"57116\" destination-address=\"187.19.188.200\" destination-port=\"80\" protocol-id=\"6\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" policy-name=\"argon_policy\" username=\"user1\" session-id-32=\"50000002\" source-zone-name=\"untrust\" destination-zone-name=\"trust\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "BLOCK", + "juniper.srx.file_category": "executable", + "juniper.srx.policy_name": "argon_policy", + "juniper.srx.process": "RT_AAMW", + "juniper.srx.session_id_32": "50000002", + "juniper.srx.tag": "SRX_AAMW_ACTION_LOG", + "juniper.srx.verdict_number": "8", + "juniper.srx.verdict_source": "\u201dcloud/blacklist/whitelist\u201d", + "log.level": "informational", + "log.offset": 0, + "network.iana_number": "6", + "observer.egress.zone": "trust", + "observer.ingress.zone": "untrust", + "observer.name": "pinarello", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "www.mytest.com" + ], + "related.ip": [ + "10.10.10.1", + "187.19.188.200" + ], + "server.ip": "187.19.188.200", + "server.port": 80, + "service.type": "juniper", + "source.ip": "10.10.10.1", + "source.port": 57116, + "source.user.name": "user1", + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "www.mytest.com" + }, + { + "@timestamp": "2016-09-20T15:43:30.330-02:00", + "event.action": "malware_detected", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "timestamp=\"Thu Jun 23 09:55:38 2016\" tenant-id=\"ABC123456\" sample-sha256=\"ABC123\" client-ip=\"192.0.2.0\" verdict-number=\"9\" malware-info=\"Eicar:TestVirus\" username=\"admin\" hostname=\"host.example.com\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.malware_info": "Eicar:TestVirus", + "juniper.srx.process": "RT_AAMW", + "juniper.srx.sample_sha256": "ABC123", + "juniper.srx.tag": "AAMW_MALWARE_EVENT_LOG", + "juniper.srx.tenant_id": "ABC123456", + "juniper.srx.timestamp": "2016-06-23T09:55:38.000Z", + "juniper.srx.verdict_number": "9", + "log.level": "informational", + "log.offset": 529, + "observer.name": "host-example", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "host.example.com" + ], + "related.ip": [ + "192.0.2.0" + ], + "service.type": "juniper", + "source.domain": "host.example.com", + "source.ip": "192.0.2.0", + "source.user.name": "admin", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2016-09-20T15:40:30.050-02:00", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "timestamp=\"Thu Jun 23 09:55:38 2016\" tenant-id=\"ABC123456\" client-ip=\"192.0.2.0\" hostname=\"host.example.com\" status=\"in_progress\" policy-name=\"default\" th=\"7\" state=\"added\" reason=\"malware\" message=\"malware analysis detected host downloaded a malicious_file with score 9, sha256 ABC123\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.message": "malware analysis detected host downloaded a malicious_file with score 9, sha256 ABC123", + "juniper.srx.policy_name": "default", + "juniper.srx.process": "RT_AAMW", + "juniper.srx.reason": "malware", + "juniper.srx.state": "added", + "juniper.srx.status": "in_progress", + "juniper.srx.tag": "AAMW_HOST_INFECTED_EVENT_LOG", + "juniper.srx.tenant_id": "ABC123456", + "juniper.srx.th": "7", + "juniper.srx.timestamp": "2016-06-23T09:55:38.000Z", + "log.level": "error", + "log.offset": 835, + "observer.name": "host-example", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "host.example.com" + ], + "related.ip": [ + "192.0.2.0" + ], + "service.type": "juniper", + "source.domain": "host.example.com", + "source.ip": "192.0.2.0", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2007-02-15T07:17:15.719-02:00", + "client.ip": "1.1.1.1", + "client.port": 60148, + "destination.ip": "10.0.0.1", + "destination.port": 80, + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "hostname=\"dummy_host\" file-category=\"executable\" verdict-number=\"10\" malware-info=\"Testfile\" action=\"PERMIT\" list-hit=\"N/A\" file-hash-lookup=\"FALSE\" source-address=\"1.1.1.1\" source-port=\"60148\" destination-address=\"10.0.0.1\" destination-port=\"80\" protocol-id=\"6\" application=\"HTTP\" nested-application=\"N/A\" policy-name=\"test-policy\" username=\"N/A\" roles=\"N/A\" session-id-32=\"502156\" source-zone-name=\"Inside\" destination-zone-name=\"Outside\" sample-sha256=\"e038b5168d9209267058112d845341cae83d92b1d1af0a10b66830acb7529494\" file-name=\"dummy_file\" url=\"dummy_url\"", + "event.outcome": "success", + "event.severity": "165", + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "PERMIT", + "juniper.srx.application": "HTTP", + "juniper.srx.file_category": "executable", + "juniper.srx.file_hash_lookup": "FALSE", + "juniper.srx.file_name": "dummy_file", + "juniper.srx.malware_info": "Testfile", + "juniper.srx.policy_name": "test-policy", + "juniper.srx.process": "RT_AAMW", + "juniper.srx.sample_sha256": "e038b5168d9209267058112d845341cae83d92b1d1af0a10b66830acb7529494", + "juniper.srx.session_id_32": "502156", + "juniper.srx.tag": "AAMW_ACTION_LOG", + "juniper.srx.url": "dummy_url", + "juniper.srx.verdict_number": "10", + "log.level": "notification", + "log.offset": 1235, + "network.iana_number": "6", + "observer.egress.zone": "Outside", + "observer.ingress.zone": "Inside", + "observer.name": "aamw1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "dummy_host" + ], + "related.ip": [ + "1.1.1.1", + "10.0.0.1" + ], + "server.ip": "10.0.0.1", + "server.port": 80, + "service.type": "juniper", + "source.as.number": 13335, + "source.as.organization.name": "Cloudflare, Inc.", + "source.domain": "dummy_host", + "source.geo.continent_name": "Oceania", + "source.geo.country_iso_code": "AU", + "source.geo.country_name": "Australia", + "source.geo.location.lat": -33.494, + "source.geo.location.lon": 143.2104, + "source.ip": "1.1.1.1", + "source.port": 60148, + "tags": [ + "juniper.srx", + "forwarded" + ] + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/juniper/srx/test/flow.log b/x-pack/filebeat/module/juniper/srx/test/flow.log new file mode 100644 index 00000000000..400bceceeee --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/flow.log @@ -0,0 +1,25 @@ +<14>1 2019-11-14T09:37:51.184+01:00 SRX-GW1 RT_FLOW - RT_FLOW_SESSION_CREATE [junos@2636.1.1.1.2.134 source-address="10.0.0.1" source-port="594" destination-address="10.128.0.1" destination-port="10400" connection-tag="0" service-name="icmp" nat-source-address="10.0.0.1" nat-source-port="594" nat-destination-address="10.128.0.1" nat-destination-port="10400" nat-connection-tag="0" src-nat-rule-type="N/A" src-nat-rule-name="N/A" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="1" policy-name="vpn_trust_permit-all" source-zone-name="vpn" destination-zone-name="trust" session-id-32="6093" username="N/A" roles="N/A" packet-incoming-interface="st0.0" application="UNKNOWN" nested-application="UNKNOWN" encrypted="UNKNOWN" application-category="N/A" application-sub-category="N/A" application-risk="1" application-characteristics="N/A"] +<14>1 2019-11-14T11:12:46.573+01:00 SRX-GW1 RT_FLOW - RT_FLOW_SESSION_DENY [junos@2636.1.1.1.2.134 source-address="10.0.0.26" source-port="37233" destination-address="10.128.0.1" destination-port="161" connection-tag="0" service-name="None" protocol-id="17" icmp-type="0" policy-name="MgmtAccess-trust-cleanup" source-zone-name="trust" destination-zone-name="junos-host" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface=".local..0" encrypted="No" reason="Denied by policy" session-id-32="7087" application-category="N/A" application-sub-category="N/A" application-risk="1" application-characteristics="N/A"] +<14>1 2014-05-01T08:26:51.179Z fw01 RT_FLOW - RT_FLOW_SESSION_DENY [junos@2636.1.1.1.2.39 source-address="1.2.3.4" source-port="56639" destination-address="5.6.7.8" destination-port="2003" service-name="None" protocol-id="6" icmp-type="0" policy-name="log-all-else" source-zone-name="campus" destination-zone-name="mngmt" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="reth6.0" encrypted="No "] +<14>1 2014-05-01T08:28:10.933Z fw01 RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.1.1.1.2.39 reason="unset" source-address="1.2.3.4" source-port="63456" destination-address="5.6.7.8" destination-port="902" service-name="None" nat-source-address="1.2.3.4" nat-source-port="63456" nat-destination-address="5.6.7.8" nat-destination-port="902" src-nat-rule-name="None" dst-nat-rule-name="None" protocol-id="17" policy-name="mngmt-to-vcenter" source-zone-name="mngmt" destination-zone-name="intra" session-id-32="15353" packets-from-client="1" bytes-from-client="94" packets-from-server="0" bytes-from-server="0" elapsed-time="60" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="reth3.5" encrypted="No "] +<14>1 2013-11-04T16:23:09.264Z cixi RT_FLOW - RT_FLOW_SESSION_CREATE [junos@2636.1.1.1.2.35 source-address="50.0.0.100" source-port="24065" destination-address="30.0.0.100" destination-port="768" service-name="icmp" nat-source-address="50.0.0.100" nat-source-port="24065" nat-destination-address="30.0.0.100" nat-destination-port="768" src-nat-rule-name="None" dst-nat-rule-name="None" protocol-id="1" policy-name="alg-policy" source-zone-name="untrust" destination-zone-name="trust" session-id-32="100000165" username="N/A" roles="N/A" packet-incoming-interface="reth2.0" application="UNKNOWN" nested-application="UNKNOWN" encrypted="UNKNOWN"] +<14>1 2010-09-30T14:55:04.323+08:00 mrpp-srx550-dut01 RT_FLOW - RT_FLOW_SESSION_CREATE [junos@2626.192.0.2.1.40 source-address="192.0.2.1" source-port="1" destination-address="198.51.100.12" destination-port="46384" service-name="icmp" nat-source-address="192.0.2.1" nat-source-port="1" nat-destination-address="18.51.100.12" nat-destination-port="46384" src-nat-rule-name="None" dst-nat-rule-name="None" protocol-id="1" policy-name="policy1" source-zone-name="trustZone" destination-zone-name="untrustZone" session-id-32="41" packet-incoming-interface="ge-0/0/1.0"] +<14>1 2010-09-30T14:55:07.188+08:00 mrpp-srx550-dut01 RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2626.192.0.2.1.40 reason="response received" source-address="192.0.2.1" source-port="1" destination-address="198.51.100.12" destination-port="46384" service-name="icmp" nat-source-address="192.0.2.1" nat-source-port="1" nat-destination-address="18.51.100.12" nat-destination-port="46384" src-nat-rule-name="None" dst-nat-rule-name="None" protocol-id="1" policy-name="policy1" source-zone-name="trustZone" destination-zone-name="untrustZone" session-id-32="41" packets-from-client="1" bytes-from-client="84" packets-from-server="1" bytes-from-server="84" elapsed-time="0" packet-incoming-interface="ge-0/0/1.0"] +<14>1 2019-04-12T14:29:06.576Z cixi RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.1.1.1.2.129 reason="TCP FIN" source-address="10.3.255.203" source-port="47776" destination-address="8.23.224.110" destination-port="80" connection-tag="0" service-name="junos-http" nat-source-address="10.3.136.49" nat-source-port="19162" nat-destination-address="8.23.224.110" nat-destination-port="80" nat-connection-tag="0" src-nat-rule-type="source rule" src-nat-rule-name="nat1" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="6" policy-name="permit_all" source-zone-name="trust" destination-zone-name="untrust" session-id-32="5" packets-from-client="6" bytes-from-client="337" packets-from-server="4" bytes-from-server="535" elapsed-time="1" application="HTTP" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="ge-0/0/0.0" encrypted="No" application-category="Web" application-sub-category="N/A" application-risk="4" application-characteristics="Can Leak Information;Supports File Transfer;Prone to Misuse;Known Vulnerabilities;Carrier of Malware;Capable of Tunneling;"] +<14>1 2019-04-13T14:33:06.576Z cixi RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.1.1.1.2.58 reason="TCP RST" source-address="192.168.2.164" source-port="53232" destination-address="172.16.1.19" destination-port="445" service-name="junos-smb" nat-source-address="192.168.2.164" nat-source-port="53232" nat-destination-address="172.16.1.19" nat-destination-port="445" src-nat-rule-name="None" dst-nat-rule-name="None" protocol-id="6" policy-name="35" source-zone-name="Trust" destination-zone-name="Trust" session-id-32="206" packets-from-client="13" bytes-from-client="4274" packets-from-server="9" bytes-from-server="1575" elapsed-time="16" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="ge-0/0/2.0"] +<14>1 2018-10-07T01:32:20.898Z TestFW2 RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.1.1.1.2.34 reason="idle Timeout" source-address="100.73.10.92" source-port="52890" destination-address="58.68.126.198" destination-port="53" service-name="junos-dns-udp" nat-source-address="58.78.140.131" nat-source-port="11152" nat-destination-address="58.68.126.198" nat-destination-port="53" src-nat-rule-type="source rule" src-nat-rule-name="NAT_S" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="17" policy-name="NAT" source-zone-name="Gi_nat" destination-zone-name="Internet" session-id-32="220368889" packets-from-client="1" bytes-from-client="72" packets-from-server="1" bytes-from-server="136" elapsed-time="8" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="reth0.108" encrypted="UNKNOWN"] +<14>1 2018-06-30T02:17:22.753Z fw0001 RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.1.1.1.2.41 reason="idle Timeout" source-address="192.168.255.2" source-port="62047" destination-address="8.8.8.8" destination-port="53" service-name="junos-dns-udp" nat-source-address="192.168.0.47" nat-source-port="20215" nat-destination-address="8.8.8.8" nat-destination-port="53" src-nat-rule-type="source rule" src-nat-rule-name="rule001" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="17" policy-name="trust-to-untrust-001" source-zone-name="trust" destination-zone-name="untrust" session-id-32="9621" packets-from-client="1" bytes-from-client="67" packets-from-server="1" bytes-from-server="116" elapsed-time="3" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="fe-0/0/1.0" encrypted="UNKNOWN"] +<14>1 2015-09-25T14:19:53.846Z VPNBox-A RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.1.1.1.2.36 reason="application failure or action" source-address="10.164.110.223" source-port="9057" destination-address="10.104.12.161" destination-port="21" service-name="junos-ftp" nat-source-address="10.9.1.150" nat-source-port="58020" nat-destination-address="10.12.70.1" nat-destination-port="21" src-nat-rule-name="SNAT-Policy5" dst-nat-rule-name="NAT-Policy10" protocol-id="6" policy-name="FW-FTP" source-zone-name="trust" destination-zone-name="untrust" session-id-32="24311" packets-from-client="0" bytes-from-client="0" packets-from-server="0" bytes-from-server="0" elapsed-time="1" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="reth0.0" encrypted="No "] +<14>1 2013-01-19T15:18:17.040 SRX100HM RT_FLOW - APPTRACK_SESSION_CREATE [junos@2636.1.1.1.2.41 source-address="192.168.224.30" source-port="3129" destination-address="207.17.137.56" destination-port="21" service-name="junos-ftp" application="UNKNOWN" nested-application="UNKNOWN" nat-source-address="173.167.224.7" nat-source-port="14406" nat-destination-address="207.17.137.56" nat-destination-port="21" src-nat-rule-name="1" dst-nat-rule-name="None" protocol-id="6" policy-name="General-Outbound" source-zone-name="LAN" destination-zone-name="Danger" session-id-32="5058" username="N/A" roles="N/A" encrypted="N/A"] +<14>1 2013-01-19T15:18:17.040 SRX100HM RT_FLOW - APPTRACK_SESSION_VOL_UPDATE [junos@2636.1.1.1.2.41 source-address="192.168.224.30" source-port="3129" destination-address="207.17.137.56" destination-port="21" service-name="junos-ftp" application="UNKNOWN" nested-application="UNKNOWN" nat-source-address="173.167.224.7" nat-source-port="14406" nat-destination-address="207.17.137.56" nat-destination-port="21" src-nat-rule-name="1" dst-nat-rule-name="None" protocol-id="6" policy-name="General-Outbound" source-zone-name="LAN" destination-zone-name="Danger" session-id-32="5058" packets-from-client="1" bytes-from-client="48" packets-from-server="0" bytes-from-server="0" elapsed-time="0" username="N/A" roles="N/A" encrypted="N/A"] +<14>1 2013-01-19T15:18:17.040 SRX100HM RT_FLOW - APPTRACK_SESSION_CLOSE [junos@2636.1.1.1.2.41 reason="application failure or action" source-address="192.168.224.30" source-port="3129" destination-address="207.17.137.56" destination-port="21" service-name="junos-ftp" application="FTP" nested-application="UNKNOWN" nat-source-address="173.167.224.7" nat-source-port="14406" nat-destination-address="207.17.137.56" nat-destination-port="21" src-nat-rule-name="1" dst-nat-rule-name="None" protocol-id="6" policy-name="General-Outbound" source-zone-name="LAN" destination-zone-name="Danger" session-id-32="5058" packets-from-client="3" bytes-from-client="144" packets-from-server="2" bytes-from-server="104" elapsed-time="1" username="N/A" roles="N/A" encrypted="N/A"] +<14>1 2013-01-19T15:18:18.040 SRX100HM RT_FLOW - APPTRACK_SESSION_VOL_UPDATE [junos@2636.1.1.1.2.129 source-address="4.0.0.1" source-port="33040" destination-address="5.0.0.1" destination-port="80" service-name="junos-http" application="HTTP" nested-application="FACEBOOK-SOCIALRSS" nat-source-address="4.0.0.1" nat-source-port="33040" nat-destination-address="5.0.0.1" nat-destination-port="80" src-nat-rule-name="N/A" dst-nat-rule-name="N/A" protocol-id="6" policy-name="permit-all" source-zone-name="trust" destination-zone-name="untrust" session-id-32="28" packets-from-client="371" bytes-from-client="19592" packets-from-server="584" bytes-from-server="686432" elapsed-time="60" username="user1" roles="DEPT1" encrypted="No" destination-interface-name=”st0.0” apbr-rule-type=”default”] +<14>1 2013-01-19T15:18:19.040 SRX100HM RT_FLOW - APPTRACK_SESSION_ROUTE_UPDATE [junos@2636.1.1.1.2.129 source-address="4.0.0.1" source-port="33040" destination-address="5.0.0.1" destination-port="80" service-name="junos-http" application="HTTP" nested-application="FACEBOOK-SOCIALRSS" nat-source-address="4.0.0.1" nat-source-port="33040" nat-destination-address="5.0.0.1" nat-destination-port="80" src-nat-rule-name="N/A" dst-nat-rule-name="N/A" protocol-id="6" policy-name="permit-all" source-zone-name="trust" destination-zone-name="untrust" session-id-32="28" username="user1" roles="DEPT1" encrypted="No" profile-name=”pf1” rule-name=”facebook1” routing-instance=”instance1” destination-interface-name=”st0.0” apbr-rule-type=”default”] +<14>1 2013-01-19T15:18:20.040 SRX100HM RT_FLOW - APPTRACK_SESSION_CLOSE [junos@2636.1.1.1.2.129 reason="TCP CLIENT RST" source-address="4.0.0.1" source-port="48873" destination-address="5.0.0.1" destination-port="80" service-name="junos-http" application="UNKNOWN" nested-application="UNKNOWN" nat-source-address="4.0.0.1" nat-source-port="48873" nat-destination-address="5.0.0.1" nat-destination-port="80" src-nat-rule-name="N/A" dst-nat-rule-name="N/A" protocol-id="6" policy-name="permit-all" source-zone-name="trust" destination-zone-name="untrust" session-id-32="32" packets-from-client="5" bytes-from-client="392" packets-from-server="3" bytes-from-server="646" elapsed-time="3" username="user1" roles="DEPT1" encrypted="No" destination-interface-name=”st0.0” apbr-rule-type=”default”] +<14>1 2020-11-04T16:23:09.264Z cixi RT_FLOW - RT_FLOW_SESSION_CREATE_LS [junos@2636.1.1.1.2.35 source-address="50.0.0.100" source-port="24065" destination-address="30.0.0.100" destination-port="768" service-name="icmp" nat-source-address="50.0.0.100" nat-source-port="24065" nat-destination-address="30.0.0.100" nat-destination-port="768" src-nat-rule-name="None" dst-nat-rule-name="None" protocol-id="1" policy-name="alg-policy" source-zone-name="untrust" destination-zone-name="trust" session-id-32="100000165" username="N/A" roles="N/A" packet-incoming-interface="reth2.0" application="UNKNOWN" nested-application="UNKNOWN" encrypted="UNKNOWN"] +<14>1 2020-11-14T11:12:46.573+01:00 SRX-GW1 RT_FLOW - RT_FLOW_SESSION_DENY_LS [junos@2636.1.1.1.2.134 source-address="10.0.0.26" source-port="37233" destination-address="10.128.0.1" destination-port="161" connection-tag="0" service-name="None" protocol-id="17" icmp-type="0" policy-name="MgmtAccess-trust-cleanup" source-zone-name="trust" destination-zone-name="junos-host" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface=".local..0" encrypted="No" reason="Denied by policy" session-id-32="7087" application-category="N/A" application-sub-category="N/A" application-risk="1" application-characteristics="N/A"] +<14>1 2020-01-19T15:18:20.040 SRX100HM RT_FLOW - APPTRACK_SESSION_CLOSE_LS [junos@2636.1.1.1.2.129 reason="TCP CLIENT RST" source-address="4.0.0.1" source-port="48873" destination-address="5.0.0.1" destination-port="80" service-name="junos-http" application="UNKNOWN" nested-application="UNKNOWN" nat-source-address="4.0.0.1" nat-source-port="48873" nat-destination-address="5.0.0.1" nat-destination-port="80" src-nat-rule-name="N/A" dst-nat-rule-name="N/A" protocol-id="6" policy-name="permit-all" source-zone-name="trust" destination-zone-name="untrust" session-id-32="32" packets-from-client="5" bytes-from-client="392" packets-from-server="3" bytes-from-server="646" elapsed-time="3" username="user1" roles="DEPT1" encrypted="No" destination-interface-name=”st0.0” apbr-rule-type=”default”] +<14>1 2020-07-14T14:17:11.928Z SRX100HM RT_FLOW - APPTRACK_SESSION_VOL_UPDATE [junos@2636.1.1.1.2.129 source-address="10.1.1.100" source-port="58943" destination-address="46.165.154.241" destination-port="80" service-name="junos-http" application="UNKNOWN" nested-application="UNKNOWN" nat-source-address="172.19.34.100" nat-source-port="6018" nat-destination-address="46.165.154.241" nat-destination-port="80" src-nat-rule-name="our-nat-rule" dst-nat-rule-name="N/A" protocol-id="6" policy-name="default-permit" source-zone-name="trust" destination-zone-name="untrust" session-id-32="16118" packets-from-client="42" bytes-from-client="2322" packets-from-server="34" bytes-from-server="2132" elapsed-time="60" username="N/A" roles="N/A" encrypted="No" destination-interface-name="ge-0/0/0.0" category="N/A" sub-category="N/A" src-vrf-grp="N/A" dst-vrf-grp="N/A"] +<14>1 2020-07-13T16:43:05.041Z SRX100HM RT_FLOW - RT_FLOW_SESSION_CLOSE [junos@2636.1.1.1.2.129 reason="idle Timeout" source-address="10.1.1.100" source-port="64720" destination-address="91.228.167.172" destination-port="8883" connection-tag="0" service-name="None" nat-source-address="172.19.34.100" nat-source-port="24519" nat-destination-address="91.228.167.172" nat-destination-port="8883" nat-connection-tag="0" src-nat-rule-type="source rule" src-nat-rule-name="our-nat-rule" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="6" policy-name="default-permit" source-zone-name="trust" destination-zone-name="untrust" session-id-32="3851" packets-from-client="161" bytes-from-client="9530" packets-from-server="96" bytes-from-server="9670" elapsed-time="23755" application="UNKNOWN" nested-application="UNKNOWN" username="N/A" roles="N/A" packet-incoming-interface="ge-0/0/1.0" encrypted="UNKNOWN" application-category="N/A" application-sub-category="N/A" application-risk="1" application-characteristics="N/A" secure-web-proxy-session-type="NA" peer-session-id="0" peer-source-address="0.0.0.0" peer-source-port="0" peer-destination-address="0.0.0.0" peer-destination-port="0" hostname="NA NA" src-vrf-grp="N/A" dst-vrf-grp="N/A"] +<14>1 2020-07-13T16:12:05.530Z SRX100HM RT_FLOW - RT_FLOW_SESSION_CREATE [junos@2636.1.1.1.2.129 source-address="10.1.1.100" source-port="49583" destination-address="8.8.8.8" destination-port="53" connection-tag="0" service-name="junos-dns-udp" nat-source-address="172.19.34.100" nat-source-port="30838" nat-destination-address="8.8.8.8" nat-destination-port="53" nat-connection-tag="0" src-nat-rule-type="source rule" src-nat-rule-name="our-nat-rule" dst-nat-rule-type="N/A" dst-nat-rule-name="N/A" protocol-id="17" policy-name="default-permit" source-zone-name="trust" destination-zone-name="untrust" session-id-32="15399" username="N/A" roles="N/A" packet-incoming-interface="ge-0/0/1.0" application="UNKNOWN" nested-application="UNKNOWN" encrypted="UNKNOWN" application-category="N/A" application-sub-category="N/A" application-risk="1" application-characteristics="N/A" src-vrf-grp="N/A" dst-vrf-grp="N/A"] +<14>1 2020-07-13T16:12:05.530Z SRX100HM RT_FLOW - APPTRACK_SESSION_CLOSE [junos@2636.1.1.1.2.129 reason="Closed by junos-alg" source-address="10.1.1.100" source-port="63381" destination-address="8.8.8.8" destination-port="53" service-name="junos-dns-udp" application="UNKNOWN" nested-application="UNKNOWN" nat-source-address="172.19.34.100" nat-source-port="26764" nat-destination-address="8.8.8.8" nat-destination-port="53" src-nat-rule-name="our-nat-rule" dst-nat-rule-name="N/A" protocol-id="17" policy-name="default-permit" source-zone-name="trust" destination-zone-name="untrust" session-id-32="15361" packets-from-client="1" bytes-from-client="66" packets-from-server="1" bytes-from-server="82" elapsed-time="3" username="N/A" roles="N/A" encrypted="No" profile-name="N/A" rule-name="N/A" routing-instance="default" destination-interface-name="ge-0/0/0.0" uplink-incoming-interface-name="N/A" uplink-tx-bytes="0" uplink-rx-bytes="0" category="N/A" sub-category="N/A" apbr-policy-name="N/A" multipath-rule-name="N/A" src-vrf-grp="N/A" dst-vrf-grp="N/A"] diff --git a/x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json b/x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json new file mode 100644 index 00000000000..b597ed2afc5 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/flow.log-expected.json @@ -0,0 +1,2013 @@ +[ + { + "@timestamp": "2019-11-14T06:37:51.184-02:00", + "client.ip": "10.0.0.1", + "client.nat.port": 594, + "client.port": 594, + "destination.ip": "10.128.0.1", + "destination.nat.ip": "10.128.0.1", + "destination.nat.port": 10400, + "destination.port": 10400, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"10.0.0.1\" source-port=\"594\" destination-address=\"10.128.0.1\" destination-port=\"10400\" connection-tag=\"0\" service-name=\"icmp\" nat-source-address=\"10.0.0.1\" nat-source-port=\"594\" nat-destination-address=\"10.128.0.1\" nat-destination-port=\"10400\" nat-connection-tag=\"0\" src-nat-rule-type=\"N/A\" src-nat-rule-name=\"N/A\" dst-nat-rule-type=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"1\" policy-name=\"vpn_trust_permit-all\" source-zone-name=\"vpn\" destination-zone-name=\"trust\" session-id-32=\"6093\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"st0.0\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" encrypted=\"UNKNOWN\" application-category=\"N/A\" application-sub-category=\"N/A\" application-risk=\"1\" application-characteristics=\"N/A\"", + "event.outcome": "success", + "event.risk_score": "1", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.connection_tag": "0", + "juniper.srx.nat_connection_tag": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "icmp", + "juniper.srx.session_id_32": "6093", + "juniper.srx.tag": "RT_FLOW_SESSION_CREATE", + "log.level": "informational", + "log.offset": 0, + "network.iana_number": "1", + "observer.egress.zone": "trust", + "observer.ingress.interface.name": "st0.0", + "observer.ingress.zone": "vpn", + "observer.name": "SRX-GW1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.0.0.1", + "10.128.0.1", + "10.0.0.1", + "10.128.0.1" + ], + "rule.name": "vpn_trust_permit-all", + "server.ip": "10.128.0.1", + "server.nat.port": 10400, + "server.port": 10400, + "service.type": "juniper", + "source.ip": "10.0.0.1", + "source.nat.ip": "10.0.0.1", + "source.nat.port": 594, + "source.port": 594, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2019-11-14T08:12:46.573-02:00", + "client.ip": "10.0.0.26", + "client.port": 37233, + "destination.ip": "10.128.0.1", + "destination.port": 161, + "event.action": "flow_deny", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"10.0.0.26\" source-port=\"37233\" destination-address=\"10.128.0.1\" destination-port=\"161\" connection-tag=\"0\" service-name=\"None\" protocol-id=\"17\" icmp-type=\"0\" policy-name=\"MgmtAccess-trust-cleanup\" source-zone-name=\"trust\" destination-zone-name=\"junos-host\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\".local..0\" encrypted=\"No\" reason=\"Denied by policy\" session-id-32=\"7087\" application-category=\"N/A\" application-sub-category=\"N/A\" application-risk=\"1\" application-characteristics=\"N/A\"", + "event.outcome": "success", + "event.risk_score": "1", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.connection_tag": "0", + "juniper.srx.encrypted": "No", + "juniper.srx.icmp_type": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "Denied by policy", + "juniper.srx.session_id_32": "7087", + "juniper.srx.tag": "RT_FLOW_SESSION_DENY", + "log.level": "informational", + "log.offset": 850, + "network.iana_number": "17", + "observer.egress.zone": "junos-host", + "observer.ingress.interface.name": ".local..0", + "observer.ingress.zone": "trust", + "observer.name": "SRX-GW1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.0.0.26", + "10.128.0.1" + ], + "rule.name": "MgmtAccess-trust-cleanup", + "server.ip": "10.128.0.1", + "server.port": 161, + "service.type": "juniper", + "source.ip": "10.0.0.26", + "source.port": 37233, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2014-05-01T06:26:51.179-02:00", + "client.ip": "1.2.3.4", + "client.port": 56639, + "destination.as.number": 6805, + "destination.as.organization.name": "Telefonica Germany", + "destination.geo.continent_name": "Europe", + "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", + "destination.geo.location.lat": 51.2993, + "destination.geo.location.lon": 9.491, + "destination.ip": "5.6.7.8", + "destination.port": 2003, + "event.action": "flow_deny", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"1.2.3.4\" source-port=\"56639\" destination-address=\"5.6.7.8\" destination-port=\"2003\" service-name=\"None\" protocol-id=\"6\" icmp-type=\"0\" policy-name=\"log-all-else\" source-zone-name=\"campus\" destination-zone-name=\"mngmt\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"reth6.0\" encrypted=\"No \"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.encrypted": "No ", + "juniper.srx.icmp_type": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.tag": "RT_FLOW_SESSION_DENY", + "log.level": "informational", + "log.offset": 1513, + "network.iana_number": "6", + "observer.egress.zone": "mngmt", + "observer.ingress.interface.name": "reth6.0", + "observer.ingress.zone": "campus", + "observer.name": "fw01", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "1.2.3.4", + "5.6.7.8" + ], + "rule.name": "log-all-else", + "server.ip": "5.6.7.8", + "server.port": 2003, + "service.type": "juniper", + "source.geo.city_name": "Moscow", + "source.geo.continent_name": "Europe", + "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", + "source.geo.location.lat": 55.7527, + "source.geo.location.lon": 37.6172, + "source.geo.region_iso_code": "RU-MOW", + "source.geo.region_name": "Moscow", + "source.ip": "1.2.3.4", + "source.port": 56639, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2014-05-01T06:28:10.933-02:00", + "client.bytes": 94, + "client.ip": "1.2.3.4", + "client.nat.port": 63456, + "client.packets": 1, + "client.port": 63456, + "destination.as.number": 6805, + "destination.as.organization.name": "Telefonica Germany", + "destination.bytes": 0, + "destination.geo.continent_name": "Europe", + "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", + "destination.geo.location.lat": 51.2993, + "destination.geo.location.lon": 9.491, + "destination.ip": "5.6.7.8", + "destination.nat.ip": "5.6.7.8", + "destination.nat.port": 902, + "destination.packets": 0, + "destination.port": 902, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 60000000000, + "event.end": "2014-05-01T06:29:10.933-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"unset\" source-address=\"1.2.3.4\" source-port=\"63456\" destination-address=\"5.6.7.8\" destination-port=\"902\" service-name=\"None\" nat-source-address=\"1.2.3.4\" nat-source-port=\"63456\" nat-destination-address=\"5.6.7.8\" nat-destination-port=\"902\" src-nat-rule-name=\"None\" dst-nat-rule-name=\"None\" protocol-id=\"17\" policy-name=\"mngmt-to-vcenter\" source-zone-name=\"mngmt\" destination-zone-name=\"intra\" session-id-32=\"15353\" packets-from-client=\"1\" bytes-from-client=\"94\" packets-from-server=\"0\" bytes-from-server=\"0\" elapsed-time=\"60\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"reth3.5\" encrypted=\"No \"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2014-05-01T06:28:10.933-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.encrypted": "No ", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "unset", + "juniper.srx.session_id_32": "15353", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 1966, + "network.bytes": 94, + "network.iana_number": "17", + "network.packets": 1, + "observer.egress.zone": "intra", + "observer.ingress.interface.name": "reth3.5", + "observer.ingress.zone": "mngmt", + "observer.name": "fw01", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "1.2.3.4", + "5.6.7.8", + "1.2.3.4", + "5.6.7.8" + ], + "rule.name": "mngmt-to-vcenter", + "server.bytes": 0, + "server.ip": "5.6.7.8", + "server.nat.port": 902, + "server.packets": 0, + "server.port": 902, + "service.type": "juniper", + "source.bytes": 94, + "source.geo.city_name": "Moscow", + "source.geo.continent_name": "Europe", + "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", + "source.geo.location.lat": 55.7527, + "source.geo.location.lon": 37.6172, + "source.geo.region_iso_code": "RU-MOW", + "source.geo.region_name": "Moscow", + "source.ip": "1.2.3.4", + "source.nat.ip": "1.2.3.4", + "source.nat.port": 63456, + "source.packets": 1, + "source.port": 63456, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2013-11-04T14:23:09.264-02:00", + "client.ip": "50.0.0.100", + "client.nat.port": 24065, + "client.port": 24065, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "30.0.0.100", + "destination.nat.ip": "30.0.0.100", + "destination.nat.port": 768, + "destination.port": 768, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"50.0.0.100\" source-port=\"24065\" destination-address=\"30.0.0.100\" destination-port=\"768\" service-name=\"icmp\" nat-source-address=\"50.0.0.100\" nat-source-port=\"24065\" nat-destination-address=\"30.0.0.100\" nat-destination-port=\"768\" src-nat-rule-name=\"None\" dst-nat-rule-name=\"None\" protocol-id=\"1\" policy-name=\"alg-policy\" source-zone-name=\"untrust\" destination-zone-name=\"trust\" session-id-32=\"100000165\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"reth2.0\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" encrypted=\"UNKNOWN\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "icmp", + "juniper.srx.session_id_32": "100000165", + "juniper.srx.tag": "RT_FLOW_SESSION_CREATE", + "log.level": "informational", + "log.offset": 2721, + "network.iana_number": "1", + "observer.egress.zone": "trust", + "observer.ingress.interface.name": "reth2.0", + "observer.ingress.zone": "untrust", + "observer.name": "cixi", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "50.0.0.100", + "30.0.0.100", + "50.0.0.100", + "30.0.0.100" + ], + "rule.name": "alg-policy", + "server.ip": "30.0.0.100", + "server.nat.port": 768, + "server.port": 768, + "service.type": "juniper", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "50.0.0.100", + "source.nat.ip": "50.0.0.100", + "source.nat.port": 24065, + "source.port": 24065, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2010-09-30T04:55:04.323-02:00", + "client.ip": "192.0.2.1", + "client.nat.port": 1, + "client.port": 1, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "198.51.100.12", + "destination.nat.ip": "18.51.100.12", + "destination.nat.port": 46384, + "destination.port": 46384, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"192.0.2.1\" source-port=\"1\" destination-address=\"198.51.100.12\" destination-port=\"46384\" service-name=\"icmp\" nat-source-address=\"192.0.2.1\" nat-source-port=\"1\" nat-destination-address=\"18.51.100.12\" nat-destination-port=\"46384\" src-nat-rule-name=\"None\" dst-nat-rule-name=\"None\" protocol-id=\"1\" policy-name=\"policy1\" source-zone-name=\"trustZone\" destination-zone-name=\"untrustZone\" session-id-32=\"41\" packet-incoming-interface=\"ge-0/0/1.0\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "icmp", + "juniper.srx.session_id_32": "41", + "juniper.srx.tag": "RT_FLOW_SESSION_CREATE", + "log.level": "informational", + "log.offset": 3366, + "network.iana_number": "1", + "observer.egress.zone": "untrustZone", + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "mrpp-srx550-dut01", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.0.2.1", + "198.51.100.12", + "192.0.2.1", + "18.51.100.12" + ], + "rule.name": "policy1", + "server.ip": "198.51.100.12", + "server.nat.port": 46384, + "server.port": 46384, + "service.type": "juniper", + "source.ip": "192.0.2.1", + "source.nat.ip": "192.0.2.1", + "source.nat.port": 1, + "source.port": 1, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2010-09-30T04:55:07.188-02:00", + "client.bytes": 84, + "client.ip": "192.0.2.1", + "client.nat.port": 1, + "client.packets": 1, + "client.port": 1, + "destination.bytes": 84, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "198.51.100.12", + "destination.nat.ip": "18.51.100.12", + "destination.nat.port": 46384, + "destination.packets": 1, + "destination.port": 46384, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 0, + "event.end": "2010-09-30T04:55:07.188-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"response received\" source-address=\"192.0.2.1\" source-port=\"1\" destination-address=\"198.51.100.12\" destination-port=\"46384\" service-name=\"icmp\" nat-source-address=\"192.0.2.1\" nat-source-port=\"1\" nat-destination-address=\"18.51.100.12\" nat-destination-port=\"46384\" src-nat-rule-name=\"None\" dst-nat-rule-name=\"None\" protocol-id=\"1\" policy-name=\"policy1\" source-zone-name=\"trustZone\" destination-zone-name=\"untrustZone\" session-id-32=\"41\" packets-from-client=\"1\" bytes-from-client=\"84\" packets-from-server=\"1\" bytes-from-server=\"84\" elapsed-time=\"0\" packet-incoming-interface=\"ge-0/0/1.0\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2010-09-30T04:55:07.188-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "response received", + "juniper.srx.service_name": "icmp", + "juniper.srx.session_id_32": "41", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 3933, + "network.bytes": 168, + "network.iana_number": "1", + "network.packets": 2, + "observer.egress.zone": "untrustZone", + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "mrpp-srx550-dut01", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.0.2.1", + "198.51.100.12", + "192.0.2.1", + "18.51.100.12" + ], + "rule.name": "policy1", + "server.bytes": 84, + "server.ip": "198.51.100.12", + "server.nat.port": 46384, + "server.packets": 1, + "server.port": 46384, + "service.type": "juniper", + "source.bytes": 84, + "source.ip": "192.0.2.1", + "source.nat.ip": "192.0.2.1", + "source.nat.port": 1, + "source.packets": 1, + "source.port": 1, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2019-04-12T12:29:06.576-02:00", + "client.bytes": 337, + "client.ip": "10.3.255.203", + "client.nat.port": 19162, + "client.packets": 6, + "client.port": 47776, + "destination.as.number": 14627, + "destination.as.organization.name": "Vitalwerks Internet Solutions, LLC", + "destination.bytes": 535, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "8.23.224.110", + "destination.nat.ip": "8.23.224.110", + "destination.nat.port": 80, + "destination.packets": 4, + "destination.port": 80, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 1000000000, + "event.end": "2019-04-12T12:29:07.576-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"TCP FIN\" source-address=\"10.3.255.203\" source-port=\"47776\" destination-address=\"8.23.224.110\" destination-port=\"80\" connection-tag=\"0\" service-name=\"junos-http\" nat-source-address=\"10.3.136.49\" nat-source-port=\"19162\" nat-destination-address=\"8.23.224.110\" nat-destination-port=\"80\" nat-connection-tag=\"0\" src-nat-rule-type=\"source rule\" src-nat-rule-name=\"nat1\" dst-nat-rule-type=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"6\" policy-name=\"permit_all\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"5\" packets-from-client=\"6\" bytes-from-client=\"337\" packets-from-server=\"4\" bytes-from-server=\"535\" elapsed-time=\"1\" application=\"HTTP\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"ge-0/0/0.0\" encrypted=\"No\" application-category=\"Web\" application-sub-category=\"N/A\" application-risk=\"4\" application-characteristics=\"Can Leak Information;Supports File Transfer;Prone to Misuse;Known Vulnerabilities;Carrier of Malware;Capable of Tunneling;\"", + "event.outcome": "success", + "event.risk_score": "4", + "event.severity": "14", + "event.start": "2019-04-12T12:29:06.576-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.application": "HTTP", + "juniper.srx.application_category": "Web", + "juniper.srx.application_characteristics": "Can Leak Information;Supports File Transfer;Prone to Misuse;Known Vulnerabilities;Carrier of Malware;Capable of Tunneling;", + "juniper.srx.connection_tag": "0", + "juniper.srx.encrypted": "No", + "juniper.srx.nat_connection_tag": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "TCP FIN", + "juniper.srx.service_name": "junos-http", + "juniper.srx.session_id_32": "5", + "juniper.srx.src_nat_rule_name": "nat1", + "juniper.srx.src_nat_rule_type": "source rule", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 4637, + "network.bytes": 872, + "network.iana_number": "6", + "network.packets": 10, + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "ge-0/0/0.0", + "observer.ingress.zone": "trust", + "observer.name": "cixi", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.3.255.203", + "8.23.224.110", + "10.3.136.49", + "8.23.224.110" + ], + "rule.name": "permit_all", + "server.bytes": 535, + "server.ip": "8.23.224.110", + "server.nat.port": 80, + "server.packets": 4, + "server.port": 80, + "service.type": "juniper", + "source.bytes": 337, + "source.ip": "10.3.255.203", + "source.nat.ip": "10.3.136.49", + "source.nat.port": 19162, + "source.packets": 6, + "source.port": 47776, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2019-04-13T12:33:06.576-02:00", + "client.bytes": 4274, + "client.ip": "192.168.2.164", + "client.nat.port": 53232, + "client.packets": 13, + "client.port": 53232, + "destination.bytes": 1575, + "destination.ip": "172.16.1.19", + "destination.nat.ip": "172.16.1.19", + "destination.nat.port": 445, + "destination.packets": 9, + "destination.port": 445, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 16000000000, + "event.end": "2019-04-13T12:33:22.576-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"TCP RST\" source-address=\"192.168.2.164\" source-port=\"53232\" destination-address=\"172.16.1.19\" destination-port=\"445\" service-name=\"junos-smb\" nat-source-address=\"192.168.2.164\" nat-source-port=\"53232\" nat-destination-address=\"172.16.1.19\" nat-destination-port=\"445\" src-nat-rule-name=\"None\" dst-nat-rule-name=\"None\" protocol-id=\"6\" policy-name=\"35\" source-zone-name=\"Trust\" destination-zone-name=\"Trust\" session-id-32=\"206\" packets-from-client=\"13\" bytes-from-client=\"4274\" packets-from-server=\"9\" bytes-from-server=\"1575\" elapsed-time=\"16\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"ge-0/0/2.0\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2019-04-13T12:33:06.576-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "TCP RST", + "juniper.srx.service_name": "junos-smb", + "juniper.srx.session_id_32": "206", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 5739, + "network.bytes": 5849, + "network.iana_number": "6", + "network.packets": 22, + "observer.egress.zone": "Trust", + "observer.ingress.interface.name": "ge-0/0/2.0", + "observer.ingress.zone": "Trust", + "observer.name": "cixi", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.168.2.164", + "172.16.1.19", + "192.168.2.164", + "172.16.1.19" + ], + "rule.name": "35", + "server.bytes": 1575, + "server.ip": "172.16.1.19", + "server.nat.port": 445, + "server.packets": 9, + "server.port": 445, + "service.type": "juniper", + "source.bytes": 4274, + "source.ip": "192.168.2.164", + "source.nat.ip": "192.168.2.164", + "source.nat.port": 53232, + "source.packets": 13, + "source.port": 53232, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-10-06T23:32:20.898-02:00", + "client.bytes": 72, + "client.ip": "100.73.10.92", + "client.nat.port": 11152, + "client.packets": 1, + "client.port": 52890, + "destination.as.number": 10201, + "destination.as.organization.name": "Dishnet Wireless Limited. Broadband Wireless", + "destination.bytes": 136, + "destination.geo.continent_name": "Asia", + "destination.geo.country_iso_code": "IN", + "destination.geo.country_name": "India", + "destination.geo.location.lat": 20.0, + "destination.geo.location.lon": 77.0, + "destination.ip": "58.68.126.198", + "destination.nat.ip": "58.68.126.198", + "destination.nat.port": 53, + "destination.packets": 1, + "destination.port": 53, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 8000000000, + "event.end": "2018-10-06T23:32:28.898-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"idle Timeout\" source-address=\"100.73.10.92\" source-port=\"52890\" destination-address=\"58.68.126.198\" destination-port=\"53\" service-name=\"junos-dns-udp\" nat-source-address=\"58.78.140.131\" nat-source-port=\"11152\" nat-destination-address=\"58.68.126.198\" nat-destination-port=\"53\" src-nat-rule-type=\"source rule\" src-nat-rule-name=\"NAT_S\" dst-nat-rule-type=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"17\" policy-name=\"NAT\" source-zone-name=\"Gi_nat\" destination-zone-name=\"Internet\" session-id-32=\"220368889\" packets-from-client=\"1\" bytes-from-client=\"72\" packets-from-server=\"1\" bytes-from-server=\"136\" elapsed-time=\"8\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"reth0.108\" encrypted=\"UNKNOWN\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2018-10-06T23:32:20.898-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "idle Timeout", + "juniper.srx.service_name": "junos-dns-udp", + "juniper.srx.session_id_32": "220368889", + "juniper.srx.src_nat_rule_name": "NAT_S", + "juniper.srx.src_nat_rule_type": "source rule", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 6497, + "network.bytes": 208, + "network.iana_number": "17", + "network.packets": 2, + "observer.egress.zone": "Internet", + "observer.ingress.interface.name": "reth0.108", + "observer.ingress.zone": "Gi_nat", + "observer.name": "TestFW2", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "100.73.10.92", + "58.68.126.198", + "58.78.140.131", + "58.68.126.198" + ], + "rule.name": "NAT", + "server.bytes": 136, + "server.ip": "58.68.126.198", + "server.nat.port": 53, + "server.packets": 1, + "server.port": 53, + "service.type": "juniper", + "source.as.number": 3786, + "source.as.organization.name": "LG DACOM Corporation", + "source.bytes": 72, + "source.geo.city_name": "Seogwipo", + "source.geo.continent_name": "Asia", + "source.geo.country_iso_code": "KR", + "source.geo.country_name": "South Korea", + "source.geo.location.lat": 33.2486, + "source.geo.location.lon": 126.5628, + "source.geo.region_iso_code": "KR-49", + "source.geo.region_name": "Jeju-do", + "source.ip": "100.73.10.92", + "source.nat.ip": "58.78.140.131", + "source.nat.port": 11152, + "source.packets": 1, + "source.port": 52890, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-06-30T00:17:22.753-02:00", + "client.bytes": 67, + "client.ip": "192.168.255.2", + "client.nat.port": 20215, + "client.packets": 1, + "client.port": 62047, + "destination.as.number": 15169, + "destination.as.organization.name": "Google LLC", + "destination.bytes": 116, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "8.8.8.8", + "destination.nat.ip": "8.8.8.8", + "destination.nat.port": 53, + "destination.packets": 1, + "destination.port": 53, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 3000000000, + "event.end": "2018-06-30T00:17:25.753-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"idle Timeout\" source-address=\"192.168.255.2\" source-port=\"62047\" destination-address=\"8.8.8.8\" destination-port=\"53\" service-name=\"junos-dns-udp\" nat-source-address=\"192.168.0.47\" nat-source-port=\"20215\" nat-destination-address=\"8.8.8.8\" nat-destination-port=\"53\" src-nat-rule-type=\"source rule\" src-nat-rule-name=\"rule001\" dst-nat-rule-type=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"17\" policy-name=\"trust-to-untrust-001\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"9621\" packets-from-client=\"1\" bytes-from-client=\"67\" packets-from-server=\"1\" bytes-from-server=\"116\" elapsed-time=\"3\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"fe-0/0/1.0\" encrypted=\"UNKNOWN\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2018-06-30T00:17:22.753-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "idle Timeout", + "juniper.srx.service_name": "junos-dns-udp", + "juniper.srx.session_id_32": "9621", + "juniper.srx.src_nat_rule_name": "rule001", + "juniper.srx.src_nat_rule_type": "source rule", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 7350, + "network.bytes": 183, + "network.iana_number": "17", + "network.packets": 2, + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "fe-0/0/1.0", + "observer.ingress.zone": "trust", + "observer.name": "fw0001", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.168.255.2", + "8.8.8.8", + "192.168.0.47", + "8.8.8.8" + ], + "rule.name": "trust-to-untrust-001", + "server.bytes": 116, + "server.ip": "8.8.8.8", + "server.nat.port": 53, + "server.packets": 1, + "server.port": 53, + "service.type": "juniper", + "source.bytes": 67, + "source.ip": "192.168.255.2", + "source.nat.ip": "192.168.0.47", + "source.nat.port": 20215, + "source.packets": 1, + "source.port": 62047, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2015-09-25T12:19:53.846-02:00", + "client.bytes": 0, + "client.ip": "10.164.110.223", + "client.nat.port": 58020, + "client.packets": 0, + "client.port": 9057, + "destination.bytes": 0, + "destination.ip": "10.104.12.161", + "destination.nat.ip": "10.12.70.1", + "destination.nat.port": 21, + "destination.packets": 0, + "destination.port": 21, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 1000000000, + "event.end": "2015-09-25T12:19:54.846-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"application failure or action\" source-address=\"10.164.110.223\" source-port=\"9057\" destination-address=\"10.104.12.161\" destination-port=\"21\" service-name=\"junos-ftp\" nat-source-address=\"10.9.1.150\" nat-source-port=\"58020\" nat-destination-address=\"10.12.70.1\" nat-destination-port=\"21\" src-nat-rule-name=\"SNAT-Policy5\" dst-nat-rule-name=\"NAT-Policy10\" protocol-id=\"6\" policy-name=\"FW-FTP\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"24311\" packets-from-client=\"0\" bytes-from-client=\"0\" packets-from-server=\"0\" bytes-from-server=\"0\" elapsed-time=\"1\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"reth0.0\" encrypted=\"No \"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2015-09-25T12:19:53.846-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.dst_nat_rule_name": "NAT-Policy10", + "juniper.srx.encrypted": "No ", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "application failure or action", + "juniper.srx.service_name": "junos-ftp", + "juniper.srx.session_id_32": "24311", + "juniper.srx.src_nat_rule_name": "SNAT-Policy5", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 8203, + "network.bytes": 0, + "network.iana_number": "6", + "network.packets": 0, + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "reth0.0", + "observer.ingress.zone": "trust", + "observer.name": "VPNBox-A", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.164.110.223", + "10.104.12.161", + "10.9.1.150", + "10.12.70.1" + ], + "rule.name": "FW-FTP", + "server.bytes": 0, + "server.ip": "10.104.12.161", + "server.nat.port": 21, + "server.packets": 0, + "server.port": 21, + "service.type": "juniper", + "source.bytes": 0, + "source.ip": "10.164.110.223", + "source.nat.ip": "10.9.1.150", + "source.nat.port": 58020, + "source.packets": 0, + "source.port": 9057, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2013-01-19T15:18:17.040-02:00", + "client.ip": "192.168.224.30", + "client.nat.port": 14406, + "client.port": 3129, + "destination.as.number": 701, + "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "207.17.137.56", + "destination.nat.ip": "207.17.137.56", + "destination.nat.port": 21, + "destination.port": 21, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"192.168.224.30\" source-port=\"3129\" destination-address=\"207.17.137.56\" destination-port=\"21\" service-name=\"junos-ftp\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" nat-source-address=\"173.167.224.7\" nat-source-port=\"14406\" nat-destination-address=\"207.17.137.56\" nat-destination-port=\"21\" src-nat-rule-name=\"1\" dst-nat-rule-name=\"None\" protocol-id=\"6\" policy-name=\"General-Outbound\" source-zone-name=\"LAN\" destination-zone-name=\"Danger\" session-id-32=\"5058\" username=\"N/A\" roles=\"N/A\" encrypted=\"N/A\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "junos-ftp", + "juniper.srx.session_id_32": "5058", + "juniper.srx.src_nat_rule_name": "1", + "juniper.srx.tag": "APPTRACK_SESSION_CREATE", + "log.level": "informational", + "log.offset": 9012, + "network.iana_number": "6", + "observer.egress.zone": "Danger", + "observer.ingress.zone": "LAN", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.168.224.30", + "207.17.137.56", + "173.167.224.7", + "207.17.137.56" + ], + "rule.name": "General-Outbound", + "server.ip": "207.17.137.56", + "server.nat.port": 21, + "server.port": 21, + "service.type": "juniper", + "source.as.number": 7922, + "source.as.organization.name": "Comcast Cable Communications, LLC", + "source.geo.city_name": "Plymouth", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 42.3695, + "source.geo.location.lon": -83.4769, + "source.geo.region_iso_code": "US-MI", + "source.geo.region_name": "Michigan", + "source.ip": "192.168.224.30", + "source.nat.ip": "173.167.224.7", + "source.nat.port": 14406, + "source.port": 3129, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2013-01-19T15:18:17.040-02:00", + "client.bytes": 48, + "client.ip": "192.168.224.30", + "client.nat.port": 14406, + "client.packets": 1, + "client.port": 3129, + "destination.as.number": 701, + "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", + "destination.bytes": 0, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "207.17.137.56", + "destination.nat.ip": "207.17.137.56", + "destination.nat.port": 21, + "destination.packets": 0, + "destination.port": 21, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 0, + "event.end": "2013-01-19T15:18:17.040-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"192.168.224.30\" source-port=\"3129\" destination-address=\"207.17.137.56\" destination-port=\"21\" service-name=\"junos-ftp\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" nat-source-address=\"173.167.224.7\" nat-source-port=\"14406\" nat-destination-address=\"207.17.137.56\" nat-destination-port=\"21\" src-nat-rule-name=\"1\" dst-nat-rule-name=\"None\" protocol-id=\"6\" policy-name=\"General-Outbound\" source-zone-name=\"LAN\" destination-zone-name=\"Danger\" session-id-32=\"5058\" packets-from-client=\"1\" bytes-from-client=\"48\" packets-from-server=\"0\" bytes-from-server=\"0\" elapsed-time=\"0\" username=\"N/A\" roles=\"N/A\" encrypted=\"N/A\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2013-01-19T15:18:17.040-02:00", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "junos-ftp", + "juniper.srx.session_id_32": "5058", + "juniper.srx.src_nat_rule_name": "1", + "juniper.srx.tag": "APPTRACK_SESSION_VOL_UPDATE", + "log.level": "informational", + "log.offset": 9631, + "network.bytes": 48, + "network.iana_number": "6", + "network.packets": 1, + "observer.egress.zone": "Danger", + "observer.ingress.zone": "LAN", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.168.224.30", + "207.17.137.56", + "173.167.224.7", + "207.17.137.56" + ], + "rule.name": "General-Outbound", + "server.bytes": 0, + "server.ip": "207.17.137.56", + "server.nat.port": 21, + "server.packets": 0, + "server.port": 21, + "service.type": "juniper", + "source.as.number": 7922, + "source.as.organization.name": "Comcast Cable Communications, LLC", + "source.bytes": 48, + "source.geo.city_name": "Plymouth", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 42.3695, + "source.geo.location.lon": -83.4769, + "source.geo.region_iso_code": "US-MI", + "source.geo.region_name": "Michigan", + "source.ip": "192.168.224.30", + "source.nat.ip": "173.167.224.7", + "source.nat.port": 14406, + "source.packets": 1, + "source.port": 3129, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2013-01-19T15:18:17.040-02:00", + "client.bytes": 144, + "client.ip": "192.168.224.30", + "client.nat.port": 14406, + "client.packets": 3, + "client.port": 3129, + "destination.as.number": 701, + "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", + "destination.bytes": 104, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "207.17.137.56", + "destination.nat.ip": "207.17.137.56", + "destination.nat.port": 21, + "destination.packets": 2, + "destination.port": 21, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 1000000000, + "event.end": "2013-01-19T15:18:18.040-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"application failure or action\" source-address=\"192.168.224.30\" source-port=\"3129\" destination-address=\"207.17.137.56\" destination-port=\"21\" service-name=\"junos-ftp\" application=\"FTP\" nested-application=\"UNKNOWN\" nat-source-address=\"173.167.224.7\" nat-source-port=\"14406\" nat-destination-address=\"207.17.137.56\" nat-destination-port=\"21\" src-nat-rule-name=\"1\" dst-nat-rule-name=\"None\" protocol-id=\"6\" policy-name=\"General-Outbound\" source-zone-name=\"LAN\" destination-zone-name=\"Danger\" session-id-32=\"5058\" packets-from-client=\"3\" bytes-from-client=\"144\" packets-from-server=\"2\" bytes-from-server=\"104\" elapsed-time=\"1\" username=\"N/A\" roles=\"N/A\" encrypted=\"N/A\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2013-01-19T15:18:17.040-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.application": "FTP", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "application failure or action", + "juniper.srx.service_name": "junos-ftp", + "juniper.srx.session_id_32": "5058", + "juniper.srx.src_nat_rule_name": "1", + "juniper.srx.tag": "APPTRACK_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 10364, + "network.bytes": 248, + "network.iana_number": "6", + "network.packets": 5, + "observer.egress.zone": "Danger", + "observer.ingress.zone": "LAN", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.168.224.30", + "207.17.137.56", + "173.167.224.7", + "207.17.137.56" + ], + "rule.name": "General-Outbound", + "server.bytes": 104, + "server.ip": "207.17.137.56", + "server.nat.port": 21, + "server.packets": 2, + "server.port": 21, + "service.type": "juniper", + "source.as.number": 7922, + "source.as.organization.name": "Comcast Cable Communications, LLC", + "source.bytes": 144, + "source.geo.city_name": "Plymouth", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 42.3695, + "source.geo.location.lon": -83.4769, + "source.geo.region_iso_code": "US-MI", + "source.geo.region_name": "Michigan", + "source.ip": "192.168.224.30", + "source.nat.ip": "173.167.224.7", + "source.nat.port": 14406, + "source.packets": 3, + "source.port": 3129, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2013-01-19T15:18:18.040-02:00", + "client.bytes": 19592, + "client.ip": "4.0.0.1", + "client.nat.port": 33040, + "client.packets": 371, + "client.port": 33040, + "destination.as.number": 29256, + "destination.as.organization.name": "Syrian Telecom", + "destination.bytes": 686432, + "destination.geo.continent_name": "Asia", + "destination.geo.country_iso_code": "SY", + "destination.geo.country_name": "Syria", + "destination.geo.location.lat": 35.0, + "destination.geo.location.lon": 38.0, + "destination.ip": "5.0.0.1", + "destination.nat.ip": "5.0.0.1", + "destination.nat.port": 80, + "destination.packets": 584, + "destination.port": 80, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 60000000000, + "event.end": "2013-01-19T15:19:18.040-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"4.0.0.1\" source-port=\"33040\" destination-address=\"5.0.0.1\" destination-port=\"80\" service-name=\"junos-http\" application=\"HTTP\" nested-application=\"FACEBOOK-SOCIALRSS\" nat-source-address=\"4.0.0.1\" nat-source-port=\"33040\" nat-destination-address=\"5.0.0.1\" nat-destination-port=\"80\" src-nat-rule-name=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"6\" policy-name=\"permit-all\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"28\" packets-from-client=\"371\" bytes-from-client=\"19592\" packets-from-server=\"584\" bytes-from-server=\"686432\" elapsed-time=\"60\" username=\"user1\" roles=\"DEPT1\" encrypted=\"No\" destination-interface-name=\u201dst0.0\u201d apbr-rule-type=\u201ddefault\u201d", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2013-01-19T15:18:18.040-02:00", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.apbr_rule_type": "\u201ddefault\u201d", + "juniper.srx.application": "HTTP", + "juniper.srx.encrypted": "No", + "juniper.srx.nested_application": "FACEBOOK-SOCIALRSS", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.roles": "DEPT1", + "juniper.srx.service_name": "junos-http", + "juniper.srx.session_id_32": "28", + "juniper.srx.tag": "APPTRACK_SESSION_VOL_UPDATE", + "log.level": "informational", + "log.offset": 11130, + "network.bytes": 706024, + "network.iana_number": "6", + "network.packets": 955, + "observer.egress.interface.name": "\u201dst0.0\u201d", + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "4.0.0.1", + "5.0.0.1", + "4.0.0.1", + "5.0.0.1" + ], + "rule.name": "permit-all", + "server.bytes": 686432, + "server.ip": "5.0.0.1", + "server.nat.port": 80, + "server.packets": 584, + "server.port": 80, + "service.type": "juniper", + "source.as.number": 3356, + "source.as.organization.name": "Level 3 Parent, LLC", + "source.bytes": 19592, + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "4.0.0.1", + "source.nat.ip": "4.0.0.1", + "source.nat.port": 33040, + "source.packets": 371, + "source.port": 33040, + "source.user.name": "user1", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2013-01-19T15:18:19.040-02:00", + "client.ip": "4.0.0.1", + "client.nat.port": 33040, + "client.port": 33040, + "destination.as.number": 29256, + "destination.as.organization.name": "Syrian Telecom", + "destination.geo.continent_name": "Asia", + "destination.geo.country_iso_code": "SY", + "destination.geo.country_name": "Syria", + "destination.geo.location.lat": 35.0, + "destination.geo.location.lon": 38.0, + "destination.ip": "5.0.0.1", + "destination.nat.ip": "5.0.0.1", + "destination.nat.port": 80, + "destination.port": 80, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"4.0.0.1\" source-port=\"33040\" destination-address=\"5.0.0.1\" destination-port=\"80\" service-name=\"junos-http\" application=\"HTTP\" nested-application=\"FACEBOOK-SOCIALRSS\" nat-source-address=\"4.0.0.1\" nat-source-port=\"33040\" nat-destination-address=\"5.0.0.1\" nat-destination-port=\"80\" src-nat-rule-name=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"6\" policy-name=\"permit-all\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"28\" username=\"user1\" roles=\"DEPT1\" encrypted=\"No\" profile-name=\u201dpf1\u201d rule-name=\u201dfacebook1\u201d routing-instance=\u201dinstance1\u201d destination-interface-name=\u201dst0.0\u201d apbr-rule-type=\u201ddefault\u201d", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.apbr_rule_type": "\u201ddefault\u201d", + "juniper.srx.application": "HTTP", + "juniper.srx.encrypted": "No", + "juniper.srx.nested_application": "FACEBOOK-SOCIALRSS", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.profile_name": "\u201dpf1\u201d", + "juniper.srx.roles": "DEPT1", + "juniper.srx.routing_instance": "\u201dinstance1\u201d", + "juniper.srx.rule_name": "\u201dfacebook1\u201d", + "juniper.srx.service_name": "junos-http", + "juniper.srx.session_id_32": "28", + "juniper.srx.tag": "APPTRACK_SESSION_ROUTE_UPDATE", + "log.level": "informational", + "log.offset": 11929, + "network.iana_number": "6", + "observer.egress.interface.name": "\u201dst0.0\u201d", + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "4.0.0.1", + "5.0.0.1", + "4.0.0.1", + "5.0.0.1" + ], + "rule.name": "permit-all", + "server.ip": "5.0.0.1", + "server.nat.port": 80, + "server.port": 80, + "service.type": "juniper", + "source.as.number": 3356, + "source.as.organization.name": "Level 3 Parent, LLC", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "4.0.0.1", + "source.nat.ip": "4.0.0.1", + "source.nat.port": 33040, + "source.port": 33040, + "source.user.name": "user1", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2013-01-19T15:18:20.040-02:00", + "client.bytes": 392, + "client.ip": "4.0.0.1", + "client.nat.port": 48873, + "client.packets": 5, + "client.port": 48873, + "destination.as.number": 29256, + "destination.as.organization.name": "Syrian Telecom", + "destination.bytes": 646, + "destination.geo.continent_name": "Asia", + "destination.geo.country_iso_code": "SY", + "destination.geo.country_name": "Syria", + "destination.geo.location.lat": 35.0, + "destination.geo.location.lon": 38.0, + "destination.ip": "5.0.0.1", + "destination.nat.ip": "5.0.0.1", + "destination.nat.port": 80, + "destination.packets": 3, + "destination.port": 80, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 3000000000, + "event.end": "2013-01-19T15:18:23.040-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"TCP CLIENT RST\" source-address=\"4.0.0.1\" source-port=\"48873\" destination-address=\"5.0.0.1\" destination-port=\"80\" service-name=\"junos-http\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" nat-source-address=\"4.0.0.1\" nat-source-port=\"48873\" nat-destination-address=\"5.0.0.1\" nat-destination-port=\"80\" src-nat-rule-name=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"6\" policy-name=\"permit-all\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"32\" packets-from-client=\"5\" bytes-from-client=\"392\" packets-from-server=\"3\" bytes-from-server=\"646\" elapsed-time=\"3\" username=\"user1\" roles=\"DEPT1\" encrypted=\"No\" destination-interface-name=\u201dst0.0\u201d apbr-rule-type=\u201ddefault\u201d", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2013-01-19T15:18:20.040-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.apbr_rule_type": "\u201ddefault\u201d", + "juniper.srx.encrypted": "No", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "TCP CLIENT RST", + "juniper.srx.roles": "DEPT1", + "juniper.srx.service_name": "junos-http", + "juniper.srx.session_id_32": "32", + "juniper.srx.tag": "APPTRACK_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 12689, + "network.bytes": 1038, + "network.iana_number": "6", + "network.packets": 8, + "observer.egress.interface.name": "\u201dst0.0\u201d", + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "4.0.0.1", + "5.0.0.1", + "4.0.0.1", + "5.0.0.1" + ], + "rule.name": "permit-all", + "server.bytes": 646, + "server.ip": "5.0.0.1", + "server.nat.port": 80, + "server.packets": 3, + "server.port": 80, + "service.type": "juniper", + "source.as.number": 3356, + "source.as.organization.name": "Level 3 Parent, LLC", + "source.bytes": 392, + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "4.0.0.1", + "source.nat.ip": "4.0.0.1", + "source.nat.port": 48873, + "source.packets": 5, + "source.port": 48873, + "source.user.name": "user1", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-11-04T14:23:09.264-02:00", + "client.ip": "50.0.0.100", + "client.nat.port": 24065, + "client.port": 24065, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "30.0.0.100", + "destination.nat.ip": "30.0.0.100", + "destination.nat.port": 768, + "destination.port": 768, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"50.0.0.100\" source-port=\"24065\" destination-address=\"30.0.0.100\" destination-port=\"768\" service-name=\"icmp\" nat-source-address=\"50.0.0.100\" nat-source-port=\"24065\" nat-destination-address=\"30.0.0.100\" nat-destination-port=\"768\" src-nat-rule-name=\"None\" dst-nat-rule-name=\"None\" protocol-id=\"1\" policy-name=\"alg-policy\" source-zone-name=\"untrust\" destination-zone-name=\"trust\" session-id-32=\"100000165\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"reth2.0\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" encrypted=\"UNKNOWN\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "icmp", + "juniper.srx.session_id_32": "100000165", + "juniper.srx.tag": "RT_FLOW_SESSION_CREATE_LS", + "log.level": "informational", + "log.offset": 13489, + "network.iana_number": "1", + "observer.egress.zone": "trust", + "observer.ingress.interface.name": "reth2.0", + "observer.ingress.zone": "untrust", + "observer.name": "cixi", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "50.0.0.100", + "30.0.0.100", + "50.0.0.100", + "30.0.0.100" + ], + "rule.name": "alg-policy", + "server.ip": "30.0.0.100", + "server.nat.port": 768, + "server.port": 768, + "service.type": "juniper", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "50.0.0.100", + "source.nat.ip": "50.0.0.100", + "source.nat.port": 24065, + "source.port": 24065, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-11-14T08:12:46.573-02:00", + "client.ip": "10.0.0.26", + "client.port": 37233, + "destination.ip": "10.128.0.1", + "destination.port": 161, + "event.action": "flow_deny", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"10.0.0.26\" source-port=\"37233\" destination-address=\"10.128.0.1\" destination-port=\"161\" connection-tag=\"0\" service-name=\"None\" protocol-id=\"17\" icmp-type=\"0\" policy-name=\"MgmtAccess-trust-cleanup\" source-zone-name=\"trust\" destination-zone-name=\"junos-host\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\".local..0\" encrypted=\"No\" reason=\"Denied by policy\" session-id-32=\"7087\" application-category=\"N/A\" application-sub-category=\"N/A\" application-risk=\"1\" application-characteristics=\"N/A\"", + "event.outcome": "success", + "event.risk_score": "1", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.connection_tag": "0", + "juniper.srx.encrypted": "No", + "juniper.srx.icmp_type": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "Denied by policy", + "juniper.srx.session_id_32": "7087", + "juniper.srx.tag": "RT_FLOW_SESSION_DENY_LS", + "log.level": "informational", + "log.offset": 14137, + "network.iana_number": "17", + "observer.egress.zone": "junos-host", + "observer.ingress.interface.name": ".local..0", + "observer.ingress.zone": "trust", + "observer.name": "SRX-GW1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.0.0.26", + "10.128.0.1" + ], + "rule.name": "MgmtAccess-trust-cleanup", + "server.ip": "10.128.0.1", + "server.port": 161, + "service.type": "juniper", + "source.ip": "10.0.0.26", + "source.port": 37233, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-01-19T15:18:20.040-02:00", + "client.bytes": 392, + "client.ip": "4.0.0.1", + "client.nat.port": 48873, + "client.packets": 5, + "client.port": 48873, + "destination.as.number": 29256, + "destination.as.organization.name": "Syrian Telecom", + "destination.bytes": 646, + "destination.geo.continent_name": "Asia", + "destination.geo.country_iso_code": "SY", + "destination.geo.country_name": "Syria", + "destination.geo.location.lat": 35.0, + "destination.geo.location.lon": 38.0, + "destination.ip": "5.0.0.1", + "destination.nat.ip": "5.0.0.1", + "destination.nat.port": 80, + "destination.packets": 3, + "destination.port": 80, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 3000000000, + "event.end": "2020-01-19T15:18:23.040-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"TCP CLIENT RST\" source-address=\"4.0.0.1\" source-port=\"48873\" destination-address=\"5.0.0.1\" destination-port=\"80\" service-name=\"junos-http\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" nat-source-address=\"4.0.0.1\" nat-source-port=\"48873\" nat-destination-address=\"5.0.0.1\" nat-destination-port=\"80\" src-nat-rule-name=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"6\" policy-name=\"permit-all\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"32\" packets-from-client=\"5\" bytes-from-client=\"392\" packets-from-server=\"3\" bytes-from-server=\"646\" elapsed-time=\"3\" username=\"user1\" roles=\"DEPT1\" encrypted=\"No\" destination-interface-name=\u201dst0.0\u201d apbr-rule-type=\u201ddefault\u201d", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2020-01-19T15:18:20.040-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.apbr_rule_type": "\u201ddefault\u201d", + "juniper.srx.encrypted": "No", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "TCP CLIENT RST", + "juniper.srx.roles": "DEPT1", + "juniper.srx.service_name": "junos-http", + "juniper.srx.session_id_32": "32", + "juniper.srx.tag": "APPTRACK_SESSION_CLOSE_LS", + "log.level": "informational", + "log.offset": 14803, + "network.bytes": 1038, + "network.iana_number": "6", + "network.packets": 8, + "observer.egress.interface.name": "\u201dst0.0\u201d", + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "4.0.0.1", + "5.0.0.1", + "4.0.0.1", + "5.0.0.1" + ], + "rule.name": "permit-all", + "server.bytes": 646, + "server.ip": "5.0.0.1", + "server.nat.port": 80, + "server.packets": 3, + "server.port": 80, + "service.type": "juniper", + "source.as.number": 3356, + "source.as.organization.name": "Level 3 Parent, LLC", + "source.bytes": 392, + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "4.0.0.1", + "source.nat.ip": "4.0.0.1", + "source.nat.port": 48873, + "source.packets": 5, + "source.port": 48873, + "source.user.name": "user1", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-07-14T12:17:11.928-02:00", + "client.bytes": 2322, + "client.ip": "10.1.1.100", + "client.nat.port": 6018, + "client.packets": 42, + "client.port": 58943, + "destination.as.number": 42652, + "destination.as.organization.name": "inexio Informationstechnologie und Telekommunikation Gmbh", + "destination.bytes": 2132, + "destination.geo.city_name": "Philippsburg", + "destination.geo.continent_name": "Europe", + "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", + "destination.geo.location.lat": 49.2317, + "destination.geo.location.lon": 8.4607, + "destination.geo.region_iso_code": "DE-BW", + "destination.geo.region_name": "Baden-W\u00fcrttemberg", + "destination.ip": "46.165.154.241", + "destination.nat.ip": "46.165.154.241", + "destination.nat.port": 80, + "destination.packets": 34, + "destination.port": 80, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 60000000000, + "event.end": "2020-07-14T12:18:11.928-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"10.1.1.100\" source-port=\"58943\" destination-address=\"46.165.154.241\" destination-port=\"80\" service-name=\"junos-http\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" nat-source-address=\"172.19.34.100\" nat-source-port=\"6018\" nat-destination-address=\"46.165.154.241\" nat-destination-port=\"80\" src-nat-rule-name=\"our-nat-rule\" dst-nat-rule-name=\"N/A\" protocol-id=\"6\" policy-name=\"default-permit\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"16118\" packets-from-client=\"42\" bytes-from-client=\"2322\" packets-from-server=\"34\" bytes-from-server=\"2132\" elapsed-time=\"60\" username=\"N/A\" roles=\"N/A\" encrypted=\"No\" destination-interface-name=\"ge-0/0/0.0\" category=\"N/A\" sub-category=\"N/A\" src-vrf-grp=\"N/A\" dst-vrf-grp=\"N/A\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2020-07-14T12:17:11.928-02:00", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.encrypted": "No", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "junos-http", + "juniper.srx.session_id_32": "16118", + "juniper.srx.src_nat_rule_name": "our-nat-rule", + "juniper.srx.tag": "APPTRACK_SESSION_VOL_UPDATE", + "log.level": "informational", + "log.offset": 15606, + "network.bytes": 4454, + "network.iana_number": "6", + "network.packets": 76, + "observer.egress.interface.name": "ge-0/0/0.0", + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.1.1.100", + "46.165.154.241", + "172.19.34.100", + "46.165.154.241" + ], + "rule.name": "default-permit", + "server.bytes": 2132, + "server.ip": "46.165.154.241", + "server.nat.port": 80, + "server.packets": 34, + "server.port": 80, + "service.type": "juniper", + "source.bytes": 2322, + "source.ip": "10.1.1.100", + "source.nat.ip": "172.19.34.100", + "source.nat.port": 6018, + "source.packets": 42, + "source.port": 58943, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-07-13T14:43:05.041-02:00", + "client.bytes": 9530, + "client.ip": "10.1.1.100", + "client.nat.port": 24519, + "client.packets": 161, + "client.port": 64720, + "destination.as.number": 50881, + "destination.as.organization.name": "ESET, spol. s r.o.", + "destination.bytes": 9670, + "destination.geo.city_name": "Bratislava", + "destination.geo.continent_name": "Europe", + "destination.geo.country_iso_code": "SK", + "destination.geo.country_name": "Slovakia", + "destination.geo.location.lat": 48.15, + "destination.geo.location.lon": 17.1078, + "destination.geo.region_iso_code": "SK-BL", + "destination.geo.region_name": "Bratislava", + "destination.ip": "91.228.167.172", + "destination.nat.ip": "91.228.167.172", + "destination.nat.port": 8883, + "destination.packets": 96, + "destination.port": 8883, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 23755000000000, + "event.end": "2020-07-13T21:19:00.041-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"idle Timeout\" source-address=\"10.1.1.100\" source-port=\"64720\" destination-address=\"91.228.167.172\" destination-port=\"8883\" connection-tag=\"0\" service-name=\"None\" nat-source-address=\"172.19.34.100\" nat-source-port=\"24519\" nat-destination-address=\"91.228.167.172\" nat-destination-port=\"8883\" nat-connection-tag=\"0\" src-nat-rule-type=\"source rule\" src-nat-rule-name=\"our-nat-rule\" dst-nat-rule-type=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"6\" policy-name=\"default-permit\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"3851\" packets-from-client=\"161\" bytes-from-client=\"9530\" packets-from-server=\"96\" bytes-from-server=\"9670\" elapsed-time=\"23755\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"ge-0/0/1.0\" encrypted=\"UNKNOWN\" application-category=\"N/A\" application-sub-category=\"N/A\" application-risk=\"1\" application-characteristics=\"N/A\" secure-web-proxy-session-type=\"NA\" peer-session-id=\"0\" peer-source-address=\"0.0.0.0\" peer-source-port=\"0\" peer-destination-address=\"0.0.0.0\" peer-destination-port=\"0\" hostname=\"NA NA\" src-vrf-grp=\"N/A\" dst-vrf-grp=\"N/A\"", + "event.outcome": "success", + "event.risk_score": "1", + "event.severity": "14", + "event.start": "2020-07-13T14:43:05.041-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.connection_tag": "0", + "juniper.srx.hostname": "NA NA", + "juniper.srx.nat_connection_tag": "0", + "juniper.srx.peer_destination_address": "0.0.0.0", + "juniper.srx.peer_destination_port": "0", + "juniper.srx.peer_session_id": "0", + "juniper.srx.peer_source_address": "0.0.0.0", + "juniper.srx.peer_source_port": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "idle Timeout", + "juniper.srx.secure_web_proxy_session_type": "NA", + "juniper.srx.session_id_32": "3851", + "juniper.srx.src_nat_rule_name": "our-nat-rule", + "juniper.srx.src_nat_rule_type": "source rule", + "juniper.srx.tag": "RT_FLOW_SESSION_CLOSE", + "log.level": "informational", + "log.offset": 16469, + "network.bytes": 19200, + "network.iana_number": "6", + "network.packets": 257, + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.1.1.100", + "91.228.167.172", + "172.19.34.100", + "91.228.167.172" + ], + "rule.name": "default-permit", + "server.bytes": 9670, + "server.ip": "91.228.167.172", + "server.nat.port": 8883, + "server.packets": 96, + "server.port": 8883, + "service.type": "juniper", + "source.bytes": 9530, + "source.ip": "10.1.1.100", + "source.nat.ip": "172.19.34.100", + "source.nat.port": 24519, + "source.packets": 161, + "source.port": 64720, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-07-13T14:12:05.530-02:00", + "client.ip": "10.1.1.100", + "client.nat.port": 30838, + "client.port": 49583, + "destination.as.number": 15169, + "destination.as.organization.name": "Google LLC", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "8.8.8.8", + "destination.nat.ip": "8.8.8.8", + "destination.nat.port": 53, + "destination.port": 53, + "event.action": "flow_started", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"10.1.1.100\" source-port=\"49583\" destination-address=\"8.8.8.8\" destination-port=\"53\" connection-tag=\"0\" service-name=\"junos-dns-udp\" nat-source-address=\"172.19.34.100\" nat-source-port=\"30838\" nat-destination-address=\"8.8.8.8\" nat-destination-port=\"53\" nat-connection-tag=\"0\" src-nat-rule-type=\"source rule\" src-nat-rule-name=\"our-nat-rule\" dst-nat-rule-type=\"N/A\" dst-nat-rule-name=\"N/A\" protocol-id=\"17\" policy-name=\"default-permit\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"15399\" username=\"N/A\" roles=\"N/A\" packet-incoming-interface=\"ge-0/0/1.0\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" encrypted=\"UNKNOWN\" application-category=\"N/A\" application-sub-category=\"N/A\" application-risk=\"1\" application-characteristics=\"N/A\" src-vrf-grp=\"N/A\" dst-vrf-grp=\"N/A\"", + "event.outcome": "success", + "event.risk_score": "1", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "start", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.connection_tag": "0", + "juniper.srx.nat_connection_tag": "0", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.service_name": "junos-dns-udp", + "juniper.srx.session_id_32": "15399", + "juniper.srx.src_nat_rule_name": "our-nat-rule", + "juniper.srx.src_nat_rule_type": "source rule", + "juniper.srx.tag": "RT_FLOW_SESSION_CREATE", + "log.level": "informational", + "log.offset": 17715, + "network.iana_number": "17", + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.1.1.100", + "8.8.8.8", + "172.19.34.100", + "8.8.8.8" + ], + "rule.name": "default-permit", + "server.ip": "8.8.8.8", + "server.nat.port": 53, + "server.port": 53, + "service.type": "juniper", + "source.ip": "10.1.1.100", + "source.nat.ip": "172.19.34.100", + "source.nat.port": 30838, + "source.port": 49583, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-07-13T14:12:05.530-02:00", + "client.bytes": 66, + "client.ip": "10.1.1.100", + "client.nat.port": 26764, + "client.packets": 1, + "client.port": 63381, + "destination.as.number": 15169, + "destination.as.organization.name": "Google LLC", + "destination.bytes": 82, + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "8.8.8.8", + "destination.nat.ip": "8.8.8.8", + "destination.nat.port": 53, + "destination.packets": 1, + "destination.port": 53, + "event.action": "flow_close", + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.duration": 3000000000, + "event.end": "2020-07-13T14:12:08.530-02:00", + "event.kind": "event", + "event.module": "juniper", + "event.original": "reason=\"Closed by junos-alg\" source-address=\"10.1.1.100\" source-port=\"63381\" destination-address=\"8.8.8.8\" destination-port=\"53\" service-name=\"junos-dns-udp\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" nat-source-address=\"172.19.34.100\" nat-source-port=\"26764\" nat-destination-address=\"8.8.8.8\" nat-destination-port=\"53\" src-nat-rule-name=\"our-nat-rule\" dst-nat-rule-name=\"N/A\" protocol-id=\"17\" policy-name=\"default-permit\" source-zone-name=\"trust\" destination-zone-name=\"untrust\" session-id-32=\"15361\" packets-from-client=\"1\" bytes-from-client=\"66\" packets-from-server=\"1\" bytes-from-server=\"82\" elapsed-time=\"3\" username=\"N/A\" roles=\"N/A\" encrypted=\"No\" profile-name=\"N/A\" rule-name=\"N/A\" routing-instance=\"default\" destination-interface-name=\"ge-0/0/0.0\" uplink-incoming-interface-name=\"N/A\" uplink-tx-bytes=\"0\" uplink-rx-bytes=\"0\" category=\"N/A\" sub-category=\"N/A\" apbr-policy-name=\"N/A\" multipath-rule-name=\"N/A\" src-vrf-grp=\"N/A\" dst-vrf-grp=\"N/A\"", + "event.outcome": "success", + "event.severity": "14", + "event.start": "2020-07-13T14:12:05.530-02:00", + "event.timezone": "-02:00", + "event.type": [ + "end", + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.encrypted": "No", + "juniper.srx.process": "RT_FLOW", + "juniper.srx.reason": "Closed by junos-alg", + "juniper.srx.routing_instance": "default", + "juniper.srx.service_name": "junos-dns-udp", + "juniper.srx.session_id_32": "15361", + "juniper.srx.src_nat_rule_name": "our-nat-rule", + "juniper.srx.tag": "APPTRACK_SESSION_CLOSE", + "juniper.srx.uplink_rx_bytes": "0", + "juniper.srx.uplink_tx_bytes": "0", + "log.level": "informational", + "log.offset": 18627, + "network.bytes": 148, + "network.iana_number": "17", + "network.packets": 2, + "observer.egress.interface.name": "ge-0/0/0.0", + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX100HM", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.1.1.100", + "8.8.8.8", + "172.19.34.100", + "8.8.8.8" + ], + "rule.name": "default-permit", + "server.bytes": 82, + "server.ip": "8.8.8.8", + "server.nat.port": 53, + "server.packets": 1, + "server.port": 53, + "service.type": "juniper", + "source.bytes": 66, + "source.ip": "10.1.1.100", + "source.nat.ip": "172.19.34.100", + "source.nat.port": 26764, + "source.packets": 1, + "source.port": 63381, + "tags": [ + "juniper.srx", + "forwarded" + ] + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/juniper/srx/test/idp.log b/x-pack/filebeat/module/juniper/srx/test/idp.log new file mode 100644 index 00000000000..c05d9732fb5 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/idp.log @@ -0,0 +1,7 @@ +<165>1 2020-03-02T23:13:03.193Z idp1 RT_IDP - IDP_ATTACK_LOG_EVENT [junos@2636.1.1.1.2.28 epoch-time="1583190783" message-type="SIG" source-address="10.11.11.1" source-port="12345" destination-address="187.188.188.10" destination-port="123" protocol-name="TCP" service-name="SERVICE_IDP" application-name="HTTP" rule-name="3" rulebase-name="IPS" policy-name="Recommended" export-id="20175" repeat-count="0" action="DROP" threat-severity="HIGH" attack-name="HTTP:MISC:GENERIC-DIR-TRAVERSAL" nat-source-address="0.0.0.0" nat-source-port="13312" nat-destination-address="3.3.10.11" nat-destination-port="9757" elapsed-time="0" inbound-bytes="0" outbound-bytes="0" inbound-packets="0" outbound-packets="0" source-zone-name="UNTRUST" source-interface-name="reth1.24" destination-zone-name="DMZ" destination-interface-name="reth2.21" packet-log-id="0" alert="no" username="unknown-user" roles="N/A" index="cnm" type="idp" message="-"] +<165>1 2020-03-02T23:13:03.197Z idp1 RT_IDP - IDP_ATTACK_LOG_EVENT [junos@2636.1.1.1.2.28 epoch-time="1583190783" message-type="SIG" source-address="10.11.11.1" source-port="12345" destination-address="187.188.188.10" destination-port="123" protocol-name="TCP" service-name="SERVICE_IDP" application-name="HTTP" rule-name="3" rulebase-name="IPS" policy-name="Recommended" export-id="20175" repeat-count="0" action="DROP" threat-severity="CRITICAL" attack-name="TCP:C2S:AMBIG:C2S-SYN-DATA" nat-source-address="0.0.0.0" nat-source-port="13312" nat-destination-address="3.3.10.11" nat-destination-port="9757" elapsed-time="0" inbound-bytes="0" outbound-bytes="0" inbound-packets="0" outbound-packets="0" source-zone-name="UNTRUST" source-interface-name="reth1.24" destination-zone-name="DMZ" destination-interface-name="reth2.21" packet-log-id="0" alert="no" username="unknown-user" roles="N/A" index="cnm" type="idp" message="-"] +<165>1 2007-02-15T09:17:15.719Z idp1 RT_IDP - IDP_ATTACK_LOG_EVENT [junos@2636.1.1.1.2.135 epoch-time="1507845354" message-type="SIG" source-address="183.78.180.27" source-port="45610" destination-address="118.127.111.1" destination-port="80" protocol-name="TCP" service-name="SERVICE_IDP" application-name="HTTP" rule-name="9" rulebase-name="IPS" policy-name="Recommended" export-id="15229" repeat-count="0" action="DROP" threat-severity="HIGH" attack-name="TROJAN:ZMEU-BOT-SCAN" nat-source-address="0.0.0.0" nat-source-port="0" nat-destination-address="172.19.13.11" nat-destination-port="0" elapsed-time="0" inbound-bytes="0" outbound-bytes="0" inbound-packets="0" outbound-packets="0" source-zone-name="sec-zone-name-internet" source-interface-name="reth0.11" destination-zone-name="dst-sec-zone1-outside" destination-interface-name="reth1.1" packet-log-id="0" alert="no" username="N/A" roles="N/A" message="-"] +<165>1 2017-10-13T08:55:55.792+11:00 idp1 RT_IDP - IDP_ATTACK_LOG_EVENT [junos@2636.1.1.1.2.135 epoch-time="1507845354" message-type="SIG" source-address="183.78.180.27" source-port="45610" destination-address="118.127.30.11" destination-port="80" protocol-name="TCP" service-name="SERVICE_IDP" application-name="HTTP" rule-name="9" rulebase-name="IPS" policy-name="Recommended" export-id="15229" repeat-count="0" action="DROP" threat-severity="HIGH" attack-name="TROJAN:ZMEU-BOT-SCAN" nat-source-address="0.0.0.0" nat-source-port="0" nat-destination-address="172.16.1.10" nat-destination-port="0" elapsed-time="0" inbound-bytes="0" outbound-bytes="0" inbound-packets="0" outbound-packets="0" source-zone-name="sec-zone-name-internet" source-interface-name="reth0.11" destination-zone-name="dst-sec-zone1-outside" destination-interface-name="reth1.1" packet-log-id="0" alert="no" username="N/A" roles="N/A" message="-"] +<165>1 2011-10-23T02:06:26.544 SRX34001 RT_IDP - IDP_APPDDOS_APP_STATE_EVENT [junos@2636.1.1.1.2.35 epoch-time="1319367986" ddos-application-name="Webserver" destination-zone-name="untrust" destination-interface-name="reth0.0" destination-address="172.27.14.203" destination-port="80" protocol-name="TCP" service-name="HTTP" rule-name="1" rulebase-name="DDOS" policy-name="A DoS-Webserver" repeat-count="0" message="Connection rate exceeded limit 60" context-value="N/A"] +<165>1 2011-10-23T16:28:31.696 SRX34001 RT_IDP - IDP_APPDDOS_APP_ATTACK_EVENT [junos@2636.1.1.1.2.35 epoch-time="1319419711" ddos-application-name="Webserver" source-zone-name="trust" source-interface-name="reth1.O" source-address="192.168.14.214" source-port="50825" destination-zone-name="untrust" destination-interface-name="reth0.0" destination-address="172.27.14.203" destination-port="80" protocol-name="TCP" service-name="HTTP" rule-name="1" ruleebase-name="DDOS" policy-name="AppDoS-Webserver" repeat-count="0" action="NONE" threat-severity="INFO" connection-hit-rate="30" context-name="http-get-url" context-hit-rate="123" context-value-hit-rate="0" time-scope="PEER" time-count="3" time-period="60" context-value="N/A"] +<165>1 2012-10-23T17:28:31.696 SRX34001 RT_IDP - IDP_APPDDOS_APP_ATTACK_EVENT_LS [junos@2636.1.1.1.2.35 epoch-time="1419419711" ddos-application-name="Webserver" source-zone-name="trust" source-interface-name="reth3.0" source-address="193.168.14.214" source-port="50825" destination-zone-name="untrust" destination-interface-name="reth0.1" destination-address="172.30.20.201" destination-port="80" protocol-name="TCP" service-name="HTTP" rule-name="1" ruleebase-name="DDOS02" policy-name="AppDoS-Webserver" repeat-count="0" action="NONE" threat-severity="INFO" connection-hit-rate="30" context-name="http-get-url" context-hit-rate="123" context-value-hit-rate="0" time-scope="PEER" time-count="3" time-period="60" context-value="N/A"] diff --git a/x-pack/filebeat/module/juniper/srx/test/idp.log-expected.json b/x-pack/filebeat/module/juniper/srx/test/idp.log-expected.json new file mode 100644 index 00000000000..7704c88fac0 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/idp.log-expected.json @@ -0,0 +1,537 @@ +[ + { + "@timestamp": "2020-03-02T21:13:03.193-02:00", + "client.bytes": 0, + "client.ip": "10.11.11.1", + "client.nat.port": 13312, + "client.packets": 0, + "client.port": 12345, + "destination.bytes": 0, + "destination.ip": "187.188.188.10", + "destination.nat.ip": "3.3.10.11", + "destination.nat.port": 9757, + "destination.packets": 0, + "destination.port": 123, + "event.action": "security_threat", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.duration": 0, + "event.end": "2020-03-02T21:13:03.193-02:00", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "epoch-time=\"1583190783\" message-type=\"SIG\" source-address=\"10.11.11.1\" source-port=\"12345\" destination-address=\"187.188.188.10\" destination-port=\"123\" protocol-name=\"TCP\" service-name=\"SERVICE_IDP\" application-name=\"HTTP\" rule-name=\"3\" rulebase-name=\"IPS\" policy-name=\"Recommended\" export-id=\"20175\" repeat-count=\"0\" action=\"DROP\" threat-severity=\"HIGH\" attack-name=\"HTTP:MISC:GENERIC-DIR-TRAVERSAL\" nat-source-address=\"0.0.0.0\" nat-source-port=\"13312\" nat-destination-address=\"3.3.10.11\" nat-destination-port=\"9757\" elapsed-time=\"0\" inbound-bytes=\"0\" outbound-bytes=\"0\" inbound-packets=\"0\" outbound-packets=\"0\" source-zone-name=\"UNTRUST\" source-interface-name=\"reth1.24\" destination-zone-name=\"DMZ\" destination-interface-name=\"reth2.21\" packet-log-id=\"0\" alert=\"no\" username=\"unknown-user\" roles=\"N/A\" index=\"cnm\" type=\"idp\" message=\"-\"", + "event.outcome": "success", + "event.severity": "165", + "event.start": "2020-03-02T21:13:03.193-02:00", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "DROP", + "juniper.srx.alert": "no", + "juniper.srx.application_name": "HTTP", + "juniper.srx.attack_name": "HTTP:MISC:GENERIC-DIR-TRAVERSAL", + "juniper.srx.epoch_time": "1583190783", + "juniper.srx.export_id": "20175", + "juniper.srx.index": "cnm", + "juniper.srx.message_type": "SIG", + "juniper.srx.packet_log_id": "0", + "juniper.srx.policy_name": "Recommended", + "juniper.srx.process": "RT_IDP", + "juniper.srx.repeat_count": "0", + "juniper.srx.service_name": "SERVICE_IDP", + "juniper.srx.tag": "IDP_ATTACK_LOG_EVENT", + "juniper.srx.threat_severity": "HIGH", + "juniper.srx.type": "idp", + "log.level": "notification", + "log.offset": 0, + "network.protocol": "TCP", + "observer.egress.interface.name": "reth2.21", + "observer.egress.zone": "DMZ", + "observer.ingress.interface.name": "reth1.24", + "observer.ingress.zone": "UNTRUST", + "observer.name": "idp1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.11.11.1", + "187.188.188.10", + "0.0.0.0", + "3.3.10.11" + ], + "rule.id": "3", + "rule.name": "IPS", + "server.bytes": 0, + "server.ip": "187.188.188.10", + "server.nat.port": 9757, + "server.packets": 0, + "server.port": 123, + "service.type": "juniper", + "source.bytes": 0, + "source.ip": "10.11.11.1", + "source.nat.ip": "0.0.0.0", + "source.nat.port": 13312, + "source.packets": 0, + "source.port": 12345, + "source.user.name": "unknown-user", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-03-02T21:13:03.197-02:00", + "client.bytes": 0, + "client.ip": "10.11.11.1", + "client.nat.port": 13312, + "client.packets": 0, + "client.port": 12345, + "destination.bytes": 0, + "destination.ip": "187.188.188.10", + "destination.nat.ip": "3.3.10.11", + "destination.nat.port": 9757, + "destination.packets": 0, + "destination.port": 123, + "event.action": "security_threat", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.duration": 0, + "event.end": "2020-03-02T21:13:03.197-02:00", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "epoch-time=\"1583190783\" message-type=\"SIG\" source-address=\"10.11.11.1\" source-port=\"12345\" destination-address=\"187.188.188.10\" destination-port=\"123\" protocol-name=\"TCP\" service-name=\"SERVICE_IDP\" application-name=\"HTTP\" rule-name=\"3\" rulebase-name=\"IPS\" policy-name=\"Recommended\" export-id=\"20175\" repeat-count=\"0\" action=\"DROP\" threat-severity=\"CRITICAL\" attack-name=\"TCP:C2S:AMBIG:C2S-SYN-DATA\" nat-source-address=\"0.0.0.0\" nat-source-port=\"13312\" nat-destination-address=\"3.3.10.11\" nat-destination-port=\"9757\" elapsed-time=\"0\" inbound-bytes=\"0\" outbound-bytes=\"0\" inbound-packets=\"0\" outbound-packets=\"0\" source-zone-name=\"UNTRUST\" source-interface-name=\"reth1.24\" destination-zone-name=\"DMZ\" destination-interface-name=\"reth2.21\" packet-log-id=\"0\" alert=\"no\" username=\"unknown-user\" roles=\"N/A\" index=\"cnm\" type=\"idp\" message=\"-\"", + "event.outcome": "success", + "event.severity": "165", + "event.start": "2020-03-02T21:13:03.197-02:00", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "DROP", + "juniper.srx.alert": "no", + "juniper.srx.application_name": "HTTP", + "juniper.srx.attack_name": "TCP:C2S:AMBIG:C2S-SYN-DATA", + "juniper.srx.epoch_time": "1583190783", + "juniper.srx.export_id": "20175", + "juniper.srx.index": "cnm", + "juniper.srx.message_type": "SIG", + "juniper.srx.packet_log_id": "0", + "juniper.srx.policy_name": "Recommended", + "juniper.srx.process": "RT_IDP", + "juniper.srx.repeat_count": "0", + "juniper.srx.service_name": "SERVICE_IDP", + "juniper.srx.tag": "IDP_ATTACK_LOG_EVENT", + "juniper.srx.threat_severity": "CRITICAL", + "juniper.srx.type": "idp", + "log.level": "notification", + "log.offset": 929, + "network.protocol": "TCP", + "observer.egress.interface.name": "reth2.21", + "observer.egress.zone": "DMZ", + "observer.ingress.interface.name": "reth1.24", + "observer.ingress.zone": "UNTRUST", + "observer.name": "idp1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.11.11.1", + "187.188.188.10", + "0.0.0.0", + "3.3.10.11" + ], + "rule.id": "3", + "rule.name": "IPS", + "server.bytes": 0, + "server.ip": "187.188.188.10", + "server.nat.port": 9757, + "server.packets": 0, + "server.port": 123, + "service.type": "juniper", + "source.bytes": 0, + "source.ip": "10.11.11.1", + "source.nat.ip": "0.0.0.0", + "source.nat.port": 13312, + "source.packets": 0, + "source.port": 12345, + "source.user.name": "unknown-user", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2007-02-15T07:17:15.719-02:00", + "client.bytes": 0, + "client.ip": "183.78.180.27", + "client.nat.port": 0, + "client.packets": 0, + "client.port": 45610, + "destination.bytes": 0, + "destination.ip": "118.127.111.1", + "destination.nat.ip": "172.19.13.11", + "destination.nat.port": 0, + "destination.packets": 0, + "destination.port": 80, + "event.action": "security_threat", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.duration": 0, + "event.end": "2007-02-15T07:17:15.719-02:00", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "epoch-time=\"1507845354\" message-type=\"SIG\" source-address=\"183.78.180.27\" source-port=\"45610\" destination-address=\"118.127.111.1\" destination-port=\"80\" protocol-name=\"TCP\" service-name=\"SERVICE_IDP\" application-name=\"HTTP\" rule-name=\"9\" rulebase-name=\"IPS\" policy-name=\"Recommended\" export-id=\"15229\" repeat-count=\"0\" action=\"DROP\" threat-severity=\"HIGH\" attack-name=\"TROJAN:ZMEU-BOT-SCAN\" nat-source-address=\"0.0.0.0\" nat-source-port=\"0\" nat-destination-address=\"172.19.13.11\" nat-destination-port=\"0\" elapsed-time=\"0\" inbound-bytes=\"0\" outbound-bytes=\"0\" inbound-packets=\"0\" outbound-packets=\"0\" source-zone-name=\"sec-zone-name-internet\" source-interface-name=\"reth0.11\" destination-zone-name=\"dst-sec-zone1-outside\" destination-interface-name=\"reth1.1\" packet-log-id=\"0\" alert=\"no\" username=\"N/A\" roles=\"N/A\" message=\"-\"", + "event.outcome": "success", + "event.severity": "165", + "event.start": "2007-02-15T07:17:15.719-02:00", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "DROP", + "juniper.srx.alert": "no", + "juniper.srx.application_name": "HTTP", + "juniper.srx.attack_name": "TROJAN:ZMEU-BOT-SCAN", + "juniper.srx.epoch_time": "1507845354", + "juniper.srx.export_id": "15229", + "juniper.srx.message_type": "SIG", + "juniper.srx.packet_log_id": "0", + "juniper.srx.policy_name": "Recommended", + "juniper.srx.process": "RT_IDP", + "juniper.srx.repeat_count": "0", + "juniper.srx.service_name": "SERVICE_IDP", + "juniper.srx.tag": "IDP_ATTACK_LOG_EVENT", + "juniper.srx.threat_severity": "HIGH", + "log.level": "notification", + "log.offset": 1857, + "network.protocol": "TCP", + "observer.egress.interface.name": "reth1.1", + "observer.egress.zone": "dst-sec-zone1-outside", + "observer.ingress.interface.name": "reth0.11", + "observer.ingress.zone": "sec-zone-name-internet", + "observer.name": "idp1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "183.78.180.27", + "118.127.111.1", + "0.0.0.0", + "172.19.13.11" + ], + "rule.id": "9", + "rule.name": "IPS", + "server.bytes": 0, + "server.ip": "118.127.111.1", + "server.nat.port": 0, + "server.packets": 0, + "server.port": 80, + "service.type": "juniper", + "source.bytes": 0, + "source.ip": "183.78.180.27", + "source.nat.ip": "0.0.0.0", + "source.nat.port": 0, + "source.packets": 0, + "source.port": 45610, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2017-10-12T19:55:55.792-02:00", + "client.bytes": 0, + "client.ip": "183.78.180.27", + "client.nat.port": 0, + "client.packets": 0, + "client.port": 45610, + "destination.bytes": 0, + "destination.ip": "118.127.30.11", + "destination.nat.ip": "172.16.1.10", + "destination.nat.port": 0, + "destination.packets": 0, + "destination.port": 80, + "event.action": "security_threat", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.duration": 0, + "event.end": "2017-10-12T19:55:55.792-02:00", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "epoch-time=\"1507845354\" message-type=\"SIG\" source-address=\"183.78.180.27\" source-port=\"45610\" destination-address=\"118.127.30.11\" destination-port=\"80\" protocol-name=\"TCP\" service-name=\"SERVICE_IDP\" application-name=\"HTTP\" rule-name=\"9\" rulebase-name=\"IPS\" policy-name=\"Recommended\" export-id=\"15229\" repeat-count=\"0\" action=\"DROP\" threat-severity=\"HIGH\" attack-name=\"TROJAN:ZMEU-BOT-SCAN\" nat-source-address=\"0.0.0.0\" nat-source-port=\"0\" nat-destination-address=\"172.16.1.10\" nat-destination-port=\"0\" elapsed-time=\"0\" inbound-bytes=\"0\" outbound-bytes=\"0\" inbound-packets=\"0\" outbound-packets=\"0\" source-zone-name=\"sec-zone-name-internet\" source-interface-name=\"reth0.11\" destination-zone-name=\"dst-sec-zone1-outside\" destination-interface-name=\"reth1.1\" packet-log-id=\"0\" alert=\"no\" username=\"N/A\" roles=\"N/A\" message=\"-\"", + "event.outcome": "success", + "event.severity": "165", + "event.start": "2017-10-12T19:55:55.792-02:00", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "DROP", + "juniper.srx.alert": "no", + "juniper.srx.application_name": "HTTP", + "juniper.srx.attack_name": "TROJAN:ZMEU-BOT-SCAN", + "juniper.srx.epoch_time": "1507845354", + "juniper.srx.export_id": "15229", + "juniper.srx.message_type": "SIG", + "juniper.srx.packet_log_id": "0", + "juniper.srx.policy_name": "Recommended", + "juniper.srx.process": "RT_IDP", + "juniper.srx.repeat_count": "0", + "juniper.srx.service_name": "SERVICE_IDP", + "juniper.srx.tag": "IDP_ATTACK_LOG_EVENT", + "juniper.srx.threat_severity": "HIGH", + "log.level": "notification", + "log.offset": 2773, + "network.protocol": "TCP", + "observer.egress.interface.name": "reth1.1", + "observer.egress.zone": "dst-sec-zone1-outside", + "observer.ingress.interface.name": "reth0.11", + "observer.ingress.zone": "sec-zone-name-internet", + "observer.name": "idp1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "183.78.180.27", + "118.127.30.11", + "0.0.0.0", + "172.16.1.10" + ], + "rule.id": "9", + "rule.name": "IPS", + "server.bytes": 0, + "server.ip": "118.127.30.11", + "server.nat.port": 0, + "server.packets": 0, + "server.port": 80, + "service.type": "juniper", + "source.bytes": 0, + "source.ip": "183.78.180.27", + "source.nat.ip": "0.0.0.0", + "source.nat.port": 0, + "source.packets": 0, + "source.port": 45610, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2011-10-23T02:06:26.544-02:00", + "destination.ip": "172.27.14.203", + "destination.port": 80, + "event.action": "application_ddos", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "epoch-time=\"1319367986\" ddos-application-name=\"Webserver\" destination-zone-name=\"untrust\" destination-interface-name=\"reth0.0\" destination-address=\"172.27.14.203\" destination-port=\"80\" protocol-name=\"TCP\" service-name=\"HTTP\" rule-name=\"1\" rulebase-name=\"DDOS\" policy-name=\"A DoS-Webserver\" repeat-count=\"0\" message=\"Connection rate exceeded limit 60\" context-value=\"N/A\"", + "event.outcome": "success", + "event.severity": "165", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.ddos_application_name": "Webserver", + "juniper.srx.epoch_time": "1319367986", + "juniper.srx.policy_name": "A DoS-Webserver", + "juniper.srx.process": "RT_IDP", + "juniper.srx.repeat_count": "0", + "juniper.srx.service_name": "HTTP", + "juniper.srx.tag": "IDP_APPDDOS_APP_STATE_EVENT", + "log.level": "notification", + "log.offset": 3693, + "message": "Connection rate exceeded limit 60", + "network.protocol": "TCP", + "observer.egress.interface.name": "reth0.0", + "observer.egress.zone": "untrust", + "observer.name": "SRX34001", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "172.27.14.203" + ], + "rule.id": "1", + "rule.name": "DDOS", + "server.ip": "172.27.14.203", + "server.port": 80, + "service.type": "juniper", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2011-10-23T16:28:31.696-02:00", + "client.ip": "192.168.14.214", + "client.port": 50825, + "destination.ip": "172.27.14.203", + "destination.port": 80, + "event.action": "application_ddos", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "epoch-time=\"1319419711\" ddos-application-name=\"Webserver\" source-zone-name=\"trust\" source-interface-name=\"reth1.O\" source-address=\"192.168.14.214\" source-port=\"50825\" destination-zone-name=\"untrust\" destination-interface-name=\"reth0.0\" destination-address=\"172.27.14.203\" destination-port=\"80\" protocol-name=\"TCP\" service-name=\"HTTP\" rule-name=\"1\" ruleebase-name=\"DDOS\" policy-name=\"AppDoS-Webserver\" repeat-count=\"0\" action=\"NONE\" threat-severity=\"INFO\" connection-hit-rate=\"30\" context-name=\"http-get-url\" context-hit-rate=\"123\" context-value-hit-rate=\"0\" time-scope=\"PEER\" time-count=\"3\" time-period=\"60\" context-value=\"N/A\"", + "event.outcome": "success", + "event.severity": "165", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "NONE", + "juniper.srx.connection_hit_rate": "30", + "juniper.srx.context_hit_rate": "123", + "juniper.srx.context_name": "http-get-url", + "juniper.srx.context_value_hit_rate": "0", + "juniper.srx.ddos_application_name": "Webserver", + "juniper.srx.epoch_time": "1319419711", + "juniper.srx.policy_name": "AppDoS-Webserver", + "juniper.srx.process": "RT_IDP", + "juniper.srx.repeat_count": "0", + "juniper.srx.ruleebase_name": "DDOS", + "juniper.srx.service_name": "HTTP", + "juniper.srx.tag": "IDP_APPDDOS_APP_ATTACK_EVENT", + "juniper.srx.threat_severity": "INFO", + "juniper.srx.time_count": "3", + "juniper.srx.time_period": "60", + "juniper.srx.time_scope": "PEER", + "log.level": "notification", + "log.offset": 4165, + "network.protocol": "TCP", + "observer.egress.interface.name": "reth0.0", + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "reth1.O", + "observer.ingress.zone": "trust", + "observer.name": "SRX34001", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.168.14.214", + "172.27.14.203" + ], + "rule.id": "1", + "server.ip": "172.27.14.203", + "server.port": 80, + "service.type": "juniper", + "source.ip": "192.168.14.214", + "source.port": 50825, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2012-10-23T17:28:31.696-02:00", + "client.ip": "193.168.14.214", + "client.port": 50825, + "destination.ip": "172.30.20.201", + "destination.port": 80, + "event.action": "application_ddos", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "epoch-time=\"1419419711\" ddos-application-name=\"Webserver\" source-zone-name=\"trust\" source-interface-name=\"reth3.0\" source-address=\"193.168.14.214\" source-port=\"50825\" destination-zone-name=\"untrust\" destination-interface-name=\"reth0.1\" destination-address=\"172.30.20.201\" destination-port=\"80\" protocol-name=\"TCP\" service-name=\"HTTP\" rule-name=\"1\" ruleebase-name=\"DDOS02\" policy-name=\"AppDoS-Webserver\" repeat-count=\"0\" action=\"NONE\" threat-severity=\"INFO\" connection-hit-rate=\"30\" context-name=\"http-get-url\" context-hit-rate=\"123\" context-value-hit-rate=\"0\" time-scope=\"PEER\" time-count=\"3\" time-period=\"60\" context-value=\"N/A\"", + "event.outcome": "success", + "event.severity": "165", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "NONE", + "juniper.srx.connection_hit_rate": "30", + "juniper.srx.context_hit_rate": "123", + "juniper.srx.context_name": "http-get-url", + "juniper.srx.context_value_hit_rate": "0", + "juniper.srx.ddos_application_name": "Webserver", + "juniper.srx.epoch_time": "1419419711", + "juniper.srx.policy_name": "AppDoS-Webserver", + "juniper.srx.process": "RT_IDP", + "juniper.srx.repeat_count": "0", + "juniper.srx.ruleebase_name": "DDOS02", + "juniper.srx.service_name": "HTTP", + "juniper.srx.tag": "IDP_APPDDOS_APP_ATTACK_EVENT_LS", + "juniper.srx.threat_severity": "INFO", + "juniper.srx.time_count": "3", + "juniper.srx.time_period": "60", + "juniper.srx.time_scope": "PEER", + "log.level": "notification", + "log.offset": 4895, + "network.protocol": "TCP", + "observer.egress.interface.name": "reth0.1", + "observer.egress.zone": "untrust", + "observer.ingress.interface.name": "reth3.0", + "observer.ingress.zone": "trust", + "observer.name": "SRX34001", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "193.168.14.214", + "172.30.20.201" + ], + "rule.id": "1", + "server.ip": "172.30.20.201", + "server.port": 80, + "service.type": "juniper", + "source.ip": "193.168.14.214", + "source.port": 50825, + "tags": [ + "juniper.srx", + "forwarded" + ] + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/juniper/srx/test/ids.log b/x-pack/filebeat/module/juniper/srx/test/ids.log new file mode 100644 index 00000000000..5b87817da86 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/ids.log @@ -0,0 +1,12 @@ +<11>1 2018-07-19T18:17:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_TCP [junos@2636.1.1.1.2.137 attack-name="TCP sweep!" source-address="113.113.17.17" source-port="6000" destination-address="40.177.177.1" destination-port="1433" source-zone-name="untrust" interface-name="fe-0/0/2.0" action="drop"] +<11>1 2018-07-19T18:18:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_TCP [junos@2636.1.1.1.2.36 attack-name="WinNuke attack!" source-address="2000:0000:0000:0000:0000:0000:0000:0002" source-port="3240" destination-address="2001:0000:0000:0000:0000:0000:0000:0002" destination-port="139" source-zone-name="untrust" interface-name="fe-0/0/2.0" action="drop"] +<11>1 2018-07-19T18:19:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_TCP [junos@2636.1.1.1.2.40 attack-name="SYN flood!" source-address="1.1.1.2" source-port="40001" destination-address="2.2.2.2" destination-port="50010" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="drop"] +<11>1 2018-07-19T18:22:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_UDP [junos@2636.1.1.1.2.40 attack-name="UDP flood!" source-address="111.1.1.3" source-port="40001" destination-address="3.4.2.2" destination-port="53" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="drop"] +<11>1 2018-07-19T18:25:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_ICMP [junos@2636.1.1.1.2.40 attack-name="ICMP fragment!" source-address="111.1.1.3" destination-address="3.4.2.2" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="drop"] +<11>1 2018-07-19T18:26:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_IP [junos@2636.1.1.1.2.40 attack-name="Record Route IP option!" source-address="111.1.1.3" destination-address="3.4.2.2" protocol-id="1" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="drop"] +<11>1 2018-07-19T18:27:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_IP [junos@2636.1.1.1.2.40 attack-name="Tunnel GRE 6in6!" source-address="1212::12" destination-address="1111::11" protocol-id="1" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="drop"] +<11>1 2018-07-19T18:28:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_IP [junos@2636.1.1.1.2.40 attack-name="Tunnel GRE 4in4!" source-address="12.12.12.1" destination-address="11.11.11.1" protocol-id="1" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="drop"] +<11>1 2018-07-19T19:19:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_TCP_DST_IP [junos@2636.1.1.1.2.40 attack-name="SYN flood!" destination-address="2.2.2.2" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="alarm-without-drop"] +<11>1 2018-07-19T19:19:02.309-05:00 rtr199 RT_IDS - RT_SCREEN_TCP_SRC_IP [junos@2636.1.1.1.2.40 attack-name="SYN flood!" source-address="111.1.1.3" source-zone-name="trustZone" interface-name="ge-0/0/1.0" action="alarm-without-drop"] +<11>1 2020-07-17T09:54:43.912+02:00 rtr199 RT_IDS - RT_SCREEN_TCP [junos@2636.1.1.1.2.129 attack-name="TCP port scan!" source-address="10.1.1.100" source-port="50630" destination-address="10.1.1.1" destination-port="10778" source-zone-name="trust" interface-name="ge-0/0/1.0" action="drop"] +<11>1 2020-07-17T10:01:43.006+02:00 rtr199 RT_IDS - RT_SCREEN_TCP [junos@2636.1.1.1.2.129 attack-name="FIN but no ACK bit!" source-address="10.1.1.100" source-port="42799" destination-address="10.1.1.1" destination-port="7" source-zone-name="trust" interface-name="ge-0/0/1.0" action="drop"] diff --git a/x-pack/filebeat/module/juniper/srx/test/ids.log-expected.json b/x-pack/filebeat/module/juniper/srx/test/ids.log-expected.json new file mode 100644 index 00000000000..10abae2fa6d --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/ids.log-expected.json @@ -0,0 +1,699 @@ +[ + { + "@timestamp": "2018-07-19T21:17:02.309-02:00", + "client.ip": "113.113.17.17", + "client.port": 6000, + "destination.as.number": 4249, + "destination.as.organization.name": "Eli Lilly and Company", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "40.177.177.1", + "destination.port": 1433, + "event.action": "sweep_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"TCP sweep!\" source-address=\"113.113.17.17\" source-port=\"6000\" destination-address=\"40.177.177.1\" destination-port=\"1433\" source-zone-name=\"untrust\" interface-name=\"fe-0/0/2.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "TCP sweep!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_TCP", + "log.level": "error", + "log.offset": 0, + "observer.ingress.interface.name": "fe-0/0/2.0", + "observer.ingress.zone": "untrust", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "113.113.17.17", + "40.177.177.1" + ], + "server.ip": "40.177.177.1", + "server.port": 1433, + "service.type": "juniper", + "source.as.number": 4134, + "source.as.organization.name": "No.31,Jin-rong Street", + "source.geo.continent_name": "Asia", + "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", + "source.geo.location.lat": 23.1167, + "source.geo.location.lon": 113.25, + "source.geo.region_iso_code": "CN-GD", + "source.geo.region_name": "Guangdong", + "source.ip": "113.113.17.17", + "source.port": 6000, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T21:18:02.309-02:00", + "client.ip": "2000:0000:0000:0000:0000:0000:0000:0002", + "client.port": 3240, + "destination.ip": "2001:0000:0000:0000:0000:0000:0000:0002", + "destination.port": 139, + "event.action": "attack_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"WinNuke attack!\" source-address=\"2000:0000:0000:0000:0000:0000:0000:0002\" source-port=\"3240\" destination-address=\"2001:0000:0000:0000:0000:0000:0000:0002\" destination-port=\"139\" source-zone-name=\"untrust\" interface-name=\"fe-0/0/2.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "WinNuke attack!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_TCP", + "log.level": "error", + "log.offset": 294, + "observer.ingress.interface.name": "fe-0/0/2.0", + "observer.ingress.zone": "untrust", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "2000:0000:0000:0000:0000:0000:0000:0002", + "2001:0000:0000:0000:0000:0000:0000:0002" + ], + "server.ip": "2001:0000:0000:0000:0000:0000:0000:0002", + "server.port": 139, + "service.type": "juniper", + "source.ip": "2000:0000:0000:0000:0000:0000:0000:0002", + "source.port": 3240, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T21:19:02.309-02:00", + "client.ip": "1.1.1.2", + "client.port": 40001, + "destination.as.number": 3215, + "destination.as.organization.name": "Orange", + "destination.geo.continent_name": "Europe", + "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", + "destination.geo.location.lat": 48.8582, + "destination.geo.location.lon": 2.3387, + "destination.ip": "2.2.2.2", + "destination.port": 50010, + "event.action": "flood_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"SYN flood!\" source-address=\"1.1.1.2\" source-port=\"40001\" destination-address=\"2.2.2.2\" destination-port=\"50010\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "SYN flood!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_TCP", + "log.level": "error", + "log.offset": 644, + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "1.1.1.2", + "2.2.2.2" + ], + "server.ip": "2.2.2.2", + "server.port": 50010, + "service.type": "juniper", + "source.as.number": 13335, + "source.as.organization.name": "Cloudflare, Inc.", + "source.geo.continent_name": "Oceania", + "source.geo.country_iso_code": "AU", + "source.geo.country_name": "Australia", + "source.geo.location.lat": -33.494, + "source.geo.location.lon": 143.2104, + "source.ip": "1.1.1.2", + "source.port": 40001, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T21:22:02.309-02:00", + "client.ip": "111.1.1.3", + "client.port": 40001, + "destination.geo.city_name": "Seattle", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 47.6348, + "destination.geo.location.lon": -122.3451, + "destination.geo.region_iso_code": "US-WA", + "destination.geo.region_name": "Washington", + "destination.ip": "3.4.2.2", + "destination.port": 53, + "event.action": "flood_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"UDP flood!\" source-address=\"111.1.1.3\" source-port=\"40001\" destination-address=\"3.4.2.2\" destination-port=\"53\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "UDP flood!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_UDP", + "log.level": "error", + "log.offset": 930, + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "111.1.1.3", + "3.4.2.2" + ], + "server.ip": "3.4.2.2", + "server.port": 53, + "service.type": "juniper", + "source.as.number": 56041, + "source.as.organization.name": "China Mobile communications corporation", + "source.geo.city_name": "Wenzhou", + "source.geo.continent_name": "Asia", + "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", + "source.geo.location.lat": 27.9983, + "source.geo.location.lon": 120.6666, + "source.geo.region_iso_code": "CN-ZJ", + "source.geo.region_name": "Zhejiang", + "source.ip": "111.1.1.3", + "source.port": 40001, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T21:25:02.309-02:00", + "client.ip": "111.1.1.3", + "destination.geo.city_name": "Seattle", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 47.6348, + "destination.geo.location.lon": -122.3451, + "destination.geo.region_iso_code": "US-WA", + "destination.geo.region_name": "Washington", + "destination.ip": "3.4.2.2", + "event.action": "fragment_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"ICMP fragment!\" source-address=\"111.1.1.3\" destination-address=\"3.4.2.2\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "ICMP fragment!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_ICMP", + "log.level": "error", + "log.offset": 1215, + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "111.1.1.3", + "3.4.2.2" + ], + "server.ip": "3.4.2.2", + "service.type": "juniper", + "source.as.number": 56041, + "source.as.organization.name": "China Mobile communications corporation", + "source.geo.city_name": "Wenzhou", + "source.geo.continent_name": "Asia", + "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", + "source.geo.location.lat": 27.9983, + "source.geo.location.lon": 120.6666, + "source.geo.region_iso_code": "CN-ZJ", + "source.geo.region_name": "Zhejiang", + "source.ip": "111.1.1.3", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T21:26:02.309-02:00", + "client.ip": "111.1.1.3", + "destination.geo.city_name": "Seattle", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 47.6348, + "destination.geo.location.lon": -122.3451, + "destination.geo.region_iso_code": "US-WA", + "destination.geo.region_name": "Washington", + "destination.ip": "3.4.2.2", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"Record Route IP option!\" source-address=\"111.1.1.3\" destination-address=\"3.4.2.2\" protocol-id=\"1\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "Record Route IP option!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_IP", + "log.level": "error", + "log.offset": 1463, + "network.iana_number": "1", + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "111.1.1.3", + "3.4.2.2" + ], + "server.ip": "3.4.2.2", + "service.type": "juniper", + "source.as.number": 56041, + "source.as.organization.name": "China Mobile communications corporation", + "source.geo.city_name": "Wenzhou", + "source.geo.continent_name": "Asia", + "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", + "source.geo.location.lat": 27.9983, + "source.geo.location.lon": 120.6666, + "source.geo.region_iso_code": "CN-ZJ", + "source.geo.region_name": "Zhejiang", + "source.ip": "111.1.1.3", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T21:27:02.309-02:00", + "client.ip": "1212::12", + "destination.ip": "1111::11", + "event.action": "tunneling_screen", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"Tunnel GRE 6in6!\" source-address=\"1212::12\" destination-address=\"1111::11\" protocol-id=\"1\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "Tunnel GRE 6in6!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_IP", + "log.level": "error", + "log.offset": 1734, + "network.iana_number": "1", + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "1212::12", + "1111::11" + ], + "server.ip": "1111::11", + "service.type": "juniper", + "source.ip": "1212::12", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T21:28:02.309-02:00", + "client.ip": "12.12.12.1", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "11.11.11.1", + "event.action": "tunneling_screen", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"Tunnel GRE 4in4!\" source-address=\"12.12.12.1\" destination-address=\"11.11.11.1\" protocol-id=\"1\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "Tunnel GRE 4in4!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_IP", + "log.level": "error", + "log.offset": 1998, + "network.iana_number": "1", + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "12.12.12.1", + "11.11.11.1" + ], + "server.ip": "11.11.11.1", + "service.type": "juniper", + "source.as.number": 32328, + "source.as.organization.name": "Alascom, Inc.", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "12.12.12.1", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T22:19:02.309-02:00", + "destination.as.number": 3215, + "destination.as.organization.name": "Orange", + "destination.geo.continent_name": "Europe", + "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", + "destination.geo.location.lat": 48.8582, + "destination.geo.location.lon": 2.3387, + "destination.ip": "2.2.2.2", + "event.action": "flood_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"SYN flood!\" destination-address=\"2.2.2.2\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"alarm-without-drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "alarm-without-drop", + "juniper.srx.attack_name": "SYN flood!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_TCP_DST_IP", + "log.level": "error", + "log.offset": 2266, + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "2.2.2.2" + ], + "server.ip": "2.2.2.2", + "service.type": "juniper", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2018-07-19T22:19:02.309-02:00", + "client.ip": "111.1.1.3", + "event.action": "flood_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"SYN flood!\" source-address=\"111.1.1.3\" source-zone-name=\"trustZone\" interface-name=\"ge-0/0/1.0\" action=\"alarm-without-drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "alarm-without-drop", + "juniper.srx.attack_name": "SYN flood!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_TCP_SRC_IP", + "log.level": "error", + "log.offset": 2503, + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trustZone", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "111.1.1.3" + ], + "service.type": "juniper", + "source.as.number": 56041, + "source.as.organization.name": "China Mobile communications corporation", + "source.geo.city_name": "Wenzhou", + "source.geo.continent_name": "Asia", + "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", + "source.geo.location.lat": 27.9983, + "source.geo.location.lon": 120.6666, + "source.geo.region_iso_code": "CN-ZJ", + "source.geo.region_name": "Zhejiang", + "source.ip": "111.1.1.3", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-07-17T05:54:43.912-02:00", + "client.ip": "10.1.1.100", + "client.port": 50630, + "destination.ip": "10.1.1.1", + "destination.port": 10778, + "event.action": "scan_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"TCP port scan!\" source-address=\"10.1.1.100\" source-port=\"50630\" destination-address=\"10.1.1.1\" destination-port=\"10778\" source-zone-name=\"trust\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "TCP port scan!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_TCP", + "log.level": "error", + "log.offset": 2737, + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trust", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.1.1.100", + "10.1.1.1" + ], + "server.ip": "10.1.1.1", + "server.port": 10778, + "service.type": "juniper", + "source.ip": "10.1.1.100", + "source.port": 50630, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2020-07-17T06:01:43.006-02:00", + "client.ip": "10.1.1.100", + "client.port": 42799, + "destination.ip": "10.1.1.1", + "destination.port": 7, + "event.action": "illegal_tcp_flag_detected", + "event.category": [ + "network", + "intrusion_detection" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "attack-name=\"FIN but no ACK bit!\" source-address=\"10.1.1.100\" source-port=\"42799\" destination-address=\"10.1.1.1\" destination-port=\"7\" source-zone-name=\"trust\" interface-name=\"ge-0/0/1.0\" action=\"drop\"", + "event.outcome": "success", + "event.severity": "11", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.attack_name": "FIN but no ACK bit!", + "juniper.srx.process": "RT_IDS", + "juniper.srx.tag": "RT_SCREEN_TCP", + "log.level": "error", + "log.offset": 3028, + "observer.ingress.interface.name": "ge-0/0/1.0", + "observer.ingress.zone": "trust", + "observer.name": "rtr199", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.1.1.100", + "10.1.1.1" + ], + "server.ip": "10.1.1.1", + "server.port": 7, + "service.type": "juniper", + "source.ip": "10.1.1.100", + "source.port": 42799, + "tags": [ + "juniper.srx", + "forwarded" + ] + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/juniper/srx/test/secintel.log b/x-pack/filebeat/module/juniper/srx/test/secintel.log new file mode 100644 index 00000000000..12f8f137c7f --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/secintel.log @@ -0,0 +1,2 @@ +<14>1 2016-10-17T15:18:11.618Z SRX-1500 RT_SECINTEL - SECINTEL_ACTION_LOG [junos@2636.1.1.1.2.129 category="secintel" sub-category="Blacklist" action="BLOCK" action-detail="DROP" http-host="N/A" threat-severity="0" source-address="5.196.121.161" source-port="1" destination-address="10.10.0.10" destination-port="24039" protocol-id="1" application="N/A" nested-application="N/A" feed-name="Tor_Exit_Nodes" policy-name="cc_policy" profile-name="Blacklist" username="N/A" roles="N/A" session-id-32="572564" source-zone-name="Outside" destination-zone-name="DMZ"] +<14>1 2016-10-17T15:18:11.618Z SRX-1500 RT_SECINTEL - SECINTEL_ACTION_LOG [junos@2636.1.1.1.2.129 category="secintel" sub-category="CC" action="BLOCK" action-detail="CLOSE REDIRECT MSG" http-host="dummy_host" threat-severity="10" source-address="1.1.1.1" source-port="36612" destination-address="10.0.0.1" destination-port="80" protocol-id="6" application="HTTP" nested-application="N/A" feed-name="cc_url_data" policy-name="test" profile-name="test-profile" username="N/A" roles="N/A" session-id-32="502362" source-zone-name="Inside" destination-zone-name="Outside" occur-count="0"] diff --git a/x-pack/filebeat/module/juniper/srx/test/secintel.log-expected.json b/x-pack/filebeat/module/juniper/srx/test/secintel.log-expected.json new file mode 100644 index 00000000000..49667e85897 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/secintel.log-expected.json @@ -0,0 +1,140 @@ +[ + { + "@timestamp": "2016-10-17T13:18:11.618-02:00", + "client.ip": "5.196.121.161", + "client.port": 1, + "destination.ip": "10.10.0.10", + "destination.port": 24039, + "event.action": "malware_detected", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "category=\"secintel\" sub-category=\"Blacklist\" action=\"BLOCK\" action-detail=\"DROP\" http-host=\"N/A\" threat-severity=\"0\" source-address=\"5.196.121.161\" source-port=\"1\" destination-address=\"10.10.0.10\" destination-port=\"24039\" protocol-id=\"1\" application=\"N/A\" nested-application=\"N/A\" feed-name=\"Tor_Exit_Nodes\" policy-name=\"cc_policy\" profile-name=\"Blacklist\" username=\"N/A\" roles=\"N/A\" session-id-32=\"572564\" source-zone-name=\"Outside\" destination-zone-name=\"DMZ\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "BLOCK", + "juniper.srx.action_detail": "DROP", + "juniper.srx.category": "secintel", + "juniper.srx.feed_name": "Tor_Exit_Nodes", + "juniper.srx.policy_name": "cc_policy", + "juniper.srx.process": "RT_SECINTEL", + "juniper.srx.profile_name": "Blacklist", + "juniper.srx.session_id_32": "572564", + "juniper.srx.sub_category": "Blacklist", + "juniper.srx.tag": "SECINTEL_ACTION_LOG", + "juniper.srx.threat_severity": "0", + "log.level": "informational", + "log.offset": 0, + "network.iana_number": "1", + "observer.egress.zone": "DMZ", + "observer.ingress.zone": "Outside", + "observer.name": "SRX-1500", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "5.196.121.161", + "10.10.0.10" + ], + "server.ip": "10.10.0.10", + "server.port": 24039, + "service.type": "juniper", + "source.as.number": 16276, + "source.as.organization.name": "OVH SAS", + "source.geo.continent_name": "Europe", + "source.geo.country_iso_code": "FR", + "source.geo.country_name": "France", + "source.geo.location.lat": 48.8582, + "source.geo.location.lon": 2.3387, + "source.ip": "5.196.121.161", + "source.port": 1, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2016-10-17T13:18:11.618-02:00", + "client.ip": "1.1.1.1", + "client.port": 36612, + "destination.ip": "10.0.0.1", + "destination.port": 80, + "event.action": "malware_detected", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "category=\"secintel\" sub-category=\"CC\" action=\"BLOCK\" action-detail=\"CLOSE REDIRECT MSG\" http-host=\"dummy_host\" threat-severity=\"10\" source-address=\"1.1.1.1\" source-port=\"36612\" destination-address=\"10.0.0.1\" destination-port=\"80\" protocol-id=\"6\" application=\"HTTP\" nested-application=\"N/A\" feed-name=\"cc_url_data\" policy-name=\"test\" profile-name=\"test-profile\" username=\"N/A\" roles=\"N/A\" session-id-32=\"502362\" source-zone-name=\"Inside\" destination-zone-name=\"Outside\" occur-count=\"0\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "BLOCK", + "juniper.srx.action_detail": "CLOSE REDIRECT MSG", + "juniper.srx.application": "HTTP", + "juniper.srx.category": "secintel", + "juniper.srx.feed_name": "cc_url_data", + "juniper.srx.occur_count": "0", + "juniper.srx.policy_name": "test", + "juniper.srx.process": "RT_SECINTEL", + "juniper.srx.profile_name": "test-profile", + "juniper.srx.session_id_32": "502362", + "juniper.srx.sub_category": "CC", + "juniper.srx.tag": "SECINTEL_ACTION_LOG", + "juniper.srx.threat_severity": "10", + "log.level": "informational", + "log.offset": 561, + "network.iana_number": "6", + "observer.egress.zone": "Outside", + "observer.ingress.zone": "Inside", + "observer.name": "SRX-1500", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "dummy_host" + ], + "related.ip": [ + "1.1.1.1", + "10.0.0.1" + ], + "server.ip": "10.0.0.1", + "server.port": 80, + "service.type": "juniper", + "source.as.number": 13335, + "source.as.organization.name": "Cloudflare, Inc.", + "source.geo.continent_name": "Oceania", + "source.geo.country_iso_code": "AU", + "source.geo.country_name": "Australia", + "source.geo.location.lat": -33.494, + "source.geo.location.lon": 143.2104, + "source.ip": "1.1.1.1", + "source.port": 36612, + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "dummy_host" + } +] \ No newline at end of file diff --git a/x-pack/filebeat/module/juniper/srx/test/utm.log b/x-pack/filebeat/module/juniper/srx/test/utm.log new file mode 100644 index 00000000000..61c320ae885 --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/utm.log @@ -0,0 +1,12 @@ +<12>1 2016-02-18T01:32:50.391Z utm-srx550-b RT_UTM - WEBFILTER_URL_BLOCKED [junos@2636.1.1.1.2.86 source-address="192.168.1.100" source-port="58071" destination-address="103.235.46.39" destination-port="80" category="cat1" reason="BY_BLACK_LIST" profile="uf1" url="www.baidu.com" obj="/" username="user01" roles="N/A"] +<12>1 2016-02-18T01:32:50.391Z utm-srx550-b RT_UTM - WEBFILTER_URL_PERMITTED [junos@2636.1.1.1.2.86 source-address="10.10.10.50" source-port="1402" destination-address="216.200.241.66" destination-port="80" category="N/A" reason="BY_OTHER" profile="wf-profile" url="www.checkpoint.com" obj="/css/homepage2012.css" username="user02" roles="N/A"] +<12>1 2010-02-08T08:29:28.565Z SRX650-1 RT_UTM - AV_VIRUS_DETECTED_MT [junos@2636.1.1.1.2.40 source-address="188.40.238.250" source-port="80" destination-address="10.1.1.103" destination-port="47095" source-zone-name="untrust" filename="www.eicar.org/download/eicar.com" temporary-filename="www.eicar.org/download/eicar.com" name="EICAR-Test-File" url="EICAR-Test-File"] +<12>1 2010-02-08T08:29:28.565Z SRX650-1 RT_UTM - AV_SCANNER_DROP_FILE_MT [junos@2636.1.1.1.2.40 source-address="74.125.155.147" source-port="80" destination-address="10.1.1.103" destination-port="33578" filename="www.google.com/" error-code="14" error-message="scan engine is not ready"] +<12>1 2010-01-29T10:59:59.660Z SRX650-1 RT_UTM - AV_HUGE_FILE_DROPPED_MT [junos@2636.1.1.1.2.40 source-address="10.2.1.101" source-port="80" destination-address="10.1.1.103" destination-port="51727" filename="10.2.1.101/images/junos- srxsme-10.2-20100106.0-domestic.tgz"] +<14>1 2016-02-18T01:33:50.391Z utm-srx550-b RT_UTM - ANTISPAM_SPAM_DETECTED_MT [junos@2636.1.1.1.2.86 source-zone="trust" destination-zone="untrust" source-name="N/A" source-address="10.10.10.1" profile-name="antispam01" action="drop" reason="Match local blacklist" username="user01" roles="N/A"] +<14>1 2016-02-18T01:34:50.391Z utm-srx550-b RT_UTM - CONTENT_FILTERING_BLOCKED_MT [junos@2636.1.1.1.2.86 source-zone="untrust" destination-zone="trust" protocol="http" source-address="192.0.2.3" source-port="58071" destination-address="198.51.100.2" destination-port="80" profile-name="content02" action="drop" reason="blocked due to file extension block list" username="user01@testuser.com" roles="N/A" filename="test.cmd"] +<12>1 2016-02-19T01:32:50.391Z utm-srx550-b RT_UTM - WEBFILTER_URL_BLOCKED_LS [junos@2636.1.1.1.2.86 source-address="192.168.1.100" source-port="58071" destination-address="103.235.46.39" destination-port="80" category="cat1" reason="BY_BLACK_LIST" profile="uf1" url="www.baidu.com" obj="/" username="user01" roles="N/A"] +<12>1 2011-02-08T08:29:28.565Z SRX650-1 RT_UTM - AV_VIRUS_DETECTED_MT_LS [junos@2636.1.1.1.2.40 source-address="188.40.238.250" source-port="80" destination-address="10.1.1.103" destination-port="47095" source-zone-name="untrust" filename="www.eicar.org/download/eicar.com" temporary-filename="www.eicar.org/download/eicar.com" name="EICAR-Test-File" url="EICAR-Test-File"] +<14>1 2020-07-14T14:16:18.345Z SRX650-1 RT_UTM - WEBFILTER_URL_PERMITTED [junos@2636.1.1.1.2.129 source-zone="trust" destination-zone="untrust" source-address="10.1.1.100" source-port="58974" destination-address="104.26.15.142" destination-port="443" session-id="16297" application="UNKNOWN" nested-application="UNKNOWN" category="Enhanced_Information_Technology" reason="BY_SITE_REPUTATION_MODERATELY_SAFE" profile="WCF1" url="datawrapper.dwcdn.net" obj="/" username="N/A" roles="N/A" application-sub-category="N/A" urlcategory-risk="0"] +<12>1 2020-07-14T14:16:29.541Z SRX650-1 RT_UTM - WEBFILTER_URL_BLOCKED [junos@2636.1.1.1.2.129 source-zone="trust" destination-zone="untrust" source-address="10.1.1.100" source-port="59075" destination-address="85.114.159.93" destination-port="443" session-id="16490" application="UNKNOWN" nested-application="UNKNOWN" category="Enhanced_Advertisements" reason="BY_SITE_REPUTATION_SUSPICIOUS" profile="WCF1" url="dsp.adfarm1.adition.com" obj="/" username="N/A" roles="N/A" application-sub-category="N/A" urlcategory-risk="3"] +<12>1 2020-07-14T14:17:04.733Z SRX650-1 RT_UTM - AV_FILE_NOT_SCANNED_DROPPED_MT [junos@2636.1.1.1.2.129 source-zone="trust" destination-zone="untrust" source-address="23.209.86.45" source-port="80" destination-address="10.1.1.100" destination-port="58954" profile-name="Custom-Sophos-Profile" filename="download.cdn.mozilla.net/pub/firefox/releases/78.0.2/update/win64/de/firefox-78.0.2.complete.mar" action="BLOCKED" reason="exceeding maximum content size" error-code="7" username="N/A" roles="N/A"] diff --git a/x-pack/filebeat/module/juniper/srx/test/utm.log-expected.json b/x-pack/filebeat/module/juniper/srx/test/utm.log-expected.json new file mode 100644 index 00000000000..f9890a6ca0f --- /dev/null +++ b/x-pack/filebeat/module/juniper/srx/test/utm.log-expected.json @@ -0,0 +1,698 @@ +[ + { + "@timestamp": "2016-02-17T23:32:50.391-02:00", + "client.ip": "192.168.1.100", + "client.port": 58071, + "destination.as.number": 55967, + "destination.as.organization.name": "Beijing Baidu Netcom Science and Technology Co., Ltd.", + "destination.geo.continent_name": "Asia", + "destination.geo.country_iso_code": "HK", + "destination.geo.country_name": "Hong Kong", + "destination.geo.location.lat": 22.25, + "destination.geo.location.lon": 114.1667, + "destination.ip": "103.235.46.39", + "destination.port": 80, + "event.action": "web_filter", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "source-address=\"192.168.1.100\" source-port=\"58071\" destination-address=\"103.235.46.39\" destination-port=\"80\" category=\"cat1\" reason=\"BY_BLACK_LIST\" profile=\"uf1\" url=\"www.baidu.com\" obj=\"/\" username=\"user01\" roles=\"N/A\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.category": "cat1", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile": "uf1", + "juniper.srx.reason": "BY_BLACK_LIST", + "juniper.srx.tag": "WEBFILTER_URL_BLOCKED", + "log.level": "warning", + "log.offset": 0, + "observer.name": "utm-srx550-b", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "www.baidu.com" + ], + "related.ip": [ + "192.168.1.100", + "103.235.46.39" + ], + "server.ip": "103.235.46.39", + "server.port": 80, + "service.type": "juniper", + "source.ip": "192.168.1.100", + "source.port": 58071, + "source.user.name": "user01", + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "www.baidu.com", + "url.path": "/" + }, + { + "@timestamp": "2016-02-17T23:32:50.391-02:00", + "client.ip": "10.10.10.50", + "client.port": 1402, + "destination.as.number": 6461, + "destination.as.organization.name": "Zayo Bandwidth", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "216.200.241.66", + "destination.port": 80, + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"10.10.10.50\" source-port=\"1402\" destination-address=\"216.200.241.66\" destination-port=\"80\" category=\"N/A\" reason=\"BY_OTHER\" profile=\"wf-profile\" url=\"www.checkpoint.com\" obj=\"/css/homepage2012.css\" username=\"user02\" roles=\"N/A\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile": "wf-profile", + "juniper.srx.reason": "BY_OTHER", + "juniper.srx.tag": "WEBFILTER_URL_PERMITTED", + "log.level": "warning", + "log.offset": 319, + "observer.name": "utm-srx550-b", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "www.checkpoint.com" + ], + "related.ip": [ + "10.10.10.50", + "216.200.241.66" + ], + "server.ip": "216.200.241.66", + "server.port": 80, + "service.type": "juniper", + "source.ip": "10.10.10.50", + "source.port": 1402, + "source.user.name": "user02", + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "www.checkpoint.com", + "url.path": "/css/homepage2012.css" + }, + { + "@timestamp": "2010-02-08T06:29:28.565-02:00", + "client.ip": "188.40.238.250", + "client.port": 80, + "destination.ip": "10.1.1.103", + "destination.port": 47095, + "event.action": "virus_detected", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "source-address=\"188.40.238.250\" source-port=\"80\" destination-address=\"10.1.1.103\" destination-port=\"47095\" source-zone-name=\"untrust\" filename=\"www.eicar.org/download/eicar.com\" temporary-filename=\"www.eicar.org/download/eicar.com\" name=\"EICAR-Test-File\" url=\"EICAR-Test-File\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "file.name": "www.eicar.org/download/eicar.com", + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.name": "EICAR-Test-File", + "juniper.srx.process": "RT_UTM", + "juniper.srx.tag": "AV_VIRUS_DETECTED_MT", + "juniper.srx.temporary_filename": "www.eicar.org/download/eicar.com", + "log.level": "warning", + "log.offset": 664, + "observer.ingress.zone": "untrust", + "observer.name": "SRX650-1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "EICAR-Test-File" + ], + "related.ip": [ + "188.40.238.250", + "10.1.1.103" + ], + "server.ip": "10.1.1.103", + "server.port": 47095, + "service.type": "juniper", + "source.as.number": 24940, + "source.as.organization.name": "Hetzner Online GmbH", + "source.geo.continent_name": "Europe", + "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", + "source.geo.location.lat": 51.2993, + "source.geo.location.lon": 9.491, + "source.ip": "188.40.238.250", + "source.port": 80, + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "EICAR-Test-File" + }, + { + "@timestamp": "2010-02-08T06:29:28.565-02:00", + "client.ip": "74.125.155.147", + "client.port": 80, + "destination.ip": "10.1.1.103", + "destination.port": 33578, + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"74.125.155.147\" source-port=\"80\" destination-address=\"10.1.1.103\" destination-port=\"33578\" filename=\"www.google.com/\" error-code=\"14\" error-message=\"scan engine is not ready\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "file.name": "www.google.com/", + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.error_code": "14", + "juniper.srx.error_message": "scan engine is not ready", + "juniper.srx.process": "RT_UTM", + "juniper.srx.tag": "AV_SCANNER_DROP_FILE_MT", + "log.level": "warning", + "log.offset": 1035, + "observer.name": "SRX650-1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "74.125.155.147", + "10.1.1.103" + ], + "server.ip": "10.1.1.103", + "server.port": 33578, + "service.type": "juniper", + "source.as.number": 15169, + "source.as.organization.name": "Google LLC", + "source.geo.continent_name": "North America", + "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", + "source.geo.location.lat": 37.751, + "source.geo.location.lon": -97.822, + "source.ip": "74.125.155.147", + "source.port": 80, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2010-01-29T08:59:59.660-02:00", + "client.ip": "10.2.1.101", + "client.port": 80, + "destination.ip": "10.1.1.103", + "destination.port": 51727, + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-address=\"10.2.1.101\" source-port=\"80\" destination-address=\"10.1.1.103\" destination-port=\"51727\" filename=\"10.2.1.101/images/junos- srxsme-10.2-20100106.0-domestic.tgz\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "file.name": "10.2.1.101/images/junos- srxsme-10.2-20100106.0-domestic.tgz", + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.process": "RT_UTM", + "juniper.srx.tag": "AV_HUGE_FILE_DROPPED_MT", + "log.level": "warning", + "log.offset": 1323, + "observer.name": "SRX650-1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.2.1.101", + "10.1.1.103" + ], + "server.ip": "10.1.1.103", + "server.port": 51727, + "service.type": "juniper", + "source.ip": "10.2.1.101", + "source.port": 80, + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2016-02-17T23:33:50.391-02:00", + "client.ip": "10.10.10.1", + "event.action": "antispam_filter", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "source-zone=\"trust\" destination-zone=\"untrust\" source-name=\"N/A\" source-address=\"10.10.10.1\" profile-name=\"antispam01\" action=\"drop\" reason=\"Match local blacklist\" username=\"user01\" roles=\"N/A\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile_name": "antispam01", + "juniper.srx.reason": "Match local blacklist", + "juniper.srx.tag": "ANTISPAM_SPAM_DETECTED_MT", + "log.level": "informational", + "log.offset": 1595, + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "utm-srx550-b", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "10.10.10.1" + ], + "service.type": "juniper", + "source.ip": "10.10.10.1", + "source.user.name": "user01", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2016-02-17T23:34:50.391-02:00", + "client.ip": "192.0.2.3", + "client.port": 58071, + "destination.ip": "198.51.100.2", + "destination.port": 80, + "event.action": "content_filter", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "source-zone=\"untrust\" destination-zone=\"trust\" protocol=\"http\" source-address=\"192.0.2.3\" source-port=\"58071\" destination-address=\"198.51.100.2\" destination-port=\"80\" profile-name=\"content02\" action=\"drop\" reason=\"blocked due to file extension block list\" username=\"user01@testuser.com\" roles=\"N/A\" filename=\"test.cmd\"", + "event.outcome": "success", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "file.name": "test.cmd", + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "drop", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile_name": "content02", + "juniper.srx.reason": "blocked due to file extension block list", + "juniper.srx.tag": "CONTENT_FILTERING_BLOCKED_MT", + "log.level": "informational", + "log.offset": 1892, + "network.protocol": "http", + "observer.egress.zone": "trust", + "observer.ingress.zone": "untrust", + "observer.name": "utm-srx550-b", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "192.0.2.3", + "198.51.100.2" + ], + "server.ip": "198.51.100.2", + "server.port": 80, + "service.type": "juniper", + "source.ip": "192.0.2.3", + "source.port": 58071, + "source.user.name": "user01@testuser.com", + "tags": [ + "juniper.srx", + "forwarded" + ] + }, + { + "@timestamp": "2016-02-18T23:32:50.391-02:00", + "client.ip": "192.168.1.100", + "client.port": 58071, + "destination.as.number": 55967, + "destination.as.organization.name": "Beijing Baidu Netcom Science and Technology Co., Ltd.", + "destination.geo.continent_name": "Asia", + "destination.geo.country_iso_code": "HK", + "destination.geo.country_name": "Hong Kong", + "destination.geo.location.lat": 22.25, + "destination.geo.location.lon": 114.1667, + "destination.ip": "103.235.46.39", + "destination.port": 80, + "event.action": "web_filter", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "source-address=\"192.168.1.100\" source-port=\"58071\" destination-address=\"103.235.46.39\" destination-port=\"80\" category=\"cat1\" reason=\"BY_BLACK_LIST\" profile=\"uf1\" url=\"www.baidu.com\" obj=\"/\" username=\"user01\" roles=\"N/A\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.category": "cat1", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile": "uf1", + "juniper.srx.reason": "BY_BLACK_LIST", + "juniper.srx.tag": "WEBFILTER_URL_BLOCKED_LS", + "log.level": "warning", + "log.offset": 2317, + "observer.name": "utm-srx550-b", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "www.baidu.com" + ], + "related.ip": [ + "192.168.1.100", + "103.235.46.39" + ], + "server.ip": "103.235.46.39", + "server.port": 80, + "service.type": "juniper", + "source.ip": "192.168.1.100", + "source.port": 58071, + "source.user.name": "user01", + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "www.baidu.com", + "url.path": "/" + }, + { + "@timestamp": "2011-02-08T06:29:28.565-02:00", + "client.ip": "188.40.238.250", + "client.port": 80, + "destination.ip": "10.1.1.103", + "destination.port": 47095, + "event.action": "virus_detected", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "source-address=\"188.40.238.250\" source-port=\"80\" destination-address=\"10.1.1.103\" destination-port=\"47095\" source-zone-name=\"untrust\" filename=\"www.eicar.org/download/eicar.com\" temporary-filename=\"www.eicar.org/download/eicar.com\" name=\"EICAR-Test-File\" url=\"EICAR-Test-File\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "file.name": "www.eicar.org/download/eicar.com", + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.name": "EICAR-Test-File", + "juniper.srx.process": "RT_UTM", + "juniper.srx.tag": "AV_VIRUS_DETECTED_MT_LS", + "juniper.srx.temporary_filename": "www.eicar.org/download/eicar.com", + "log.level": "warning", + "log.offset": 2639, + "observer.ingress.zone": "untrust", + "observer.name": "SRX650-1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "EICAR-Test-File" + ], + "related.ip": [ + "188.40.238.250", + "10.1.1.103" + ], + "server.ip": "10.1.1.103", + "server.port": 47095, + "service.type": "juniper", + "source.as.number": 24940, + "source.as.organization.name": "Hetzner Online GmbH", + "source.geo.continent_name": "Europe", + "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", + "source.geo.location.lat": 51.2993, + "source.geo.location.lon": 9.491, + "source.ip": "188.40.238.250", + "source.port": 80, + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "EICAR-Test-File" + }, + { + "@timestamp": "2020-07-14T12:16:18.345-02:00", + "client.ip": "10.1.1.100", + "client.port": 58974, + "destination.as.number": 13335, + "destination.as.organization.name": "Cloudflare, Inc.", + "destination.geo.continent_name": "North America", + "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", + "destination.geo.location.lat": 37.751, + "destination.geo.location.lon": -97.822, + "destination.ip": "104.26.15.142", + "destination.port": 443, + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-zone=\"trust\" destination-zone=\"untrust\" source-address=\"10.1.1.100\" source-port=\"58974\" destination-address=\"104.26.15.142\" destination-port=\"443\" session-id=\"16297\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" category=\"Enhanced_Information_Technology\" reason=\"BY_SITE_REPUTATION_MODERATELY_SAFE\" profile=\"WCF1\" url=\"datawrapper.dwcdn.net\" obj=\"/\" username=\"N/A\" roles=\"N/A\" application-sub-category=\"N/A\" urlcategory-risk=\"0\"", + "event.outcome": "success", + "event.risk_score": "0", + "event.severity": "14", + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.category": "Enhanced_Information_Technology", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile": "WCF1", + "juniper.srx.reason": "BY_SITE_REPUTATION_MODERATELY_SAFE", + "juniper.srx.session_id": "16297", + "juniper.srx.tag": "WEBFILTER_URL_PERMITTED", + "log.level": "informational", + "log.offset": 3013, + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX650-1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "datawrapper.dwcdn.net" + ], + "related.ip": [ + "10.1.1.100", + "104.26.15.142" + ], + "server.ip": "104.26.15.142", + "server.port": 443, + "service.type": "juniper", + "source.ip": "10.1.1.100", + "source.port": 58974, + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "datawrapper.dwcdn.net", + "url.path": "/" + }, + { + "@timestamp": "2020-07-14T12:16:29.541-02:00", + "client.ip": "10.1.1.100", + "client.port": 59075, + "destination.as.number": 24961, + "destination.as.organization.name": "myLoc managed IT AG", + "destination.geo.continent_name": "Europe", + "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", + "destination.geo.location.lat": 51.2993, + "destination.geo.location.lon": 9.491, + "destination.ip": "85.114.159.93", + "destination.port": 443, + "event.action": "web_filter", + "event.category": [ + "network", + "malware" + ], + "event.dataset": "juniper.srx", + "event.kind": "alert", + "event.module": "juniper", + "event.original": "source-zone=\"trust\" destination-zone=\"untrust\" source-address=\"10.1.1.100\" source-port=\"59075\" destination-address=\"85.114.159.93\" destination-port=\"443\" session-id=\"16490\" application=\"UNKNOWN\" nested-application=\"UNKNOWN\" category=\"Enhanced_Advertisements\" reason=\"BY_SITE_REPUTATION_SUSPICIOUS\" profile=\"WCF1\" url=\"dsp.adfarm1.adition.com\" obj=\"/\" username=\"N/A\" roles=\"N/A\" application-sub-category=\"N/A\" urlcategory-risk=\"3\"", + "event.outcome": "success", + "event.risk_score": "3", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "info", + "denied", + "connection" + ], + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.category": "Enhanced_Advertisements", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile": "WCF1", + "juniper.srx.reason": "BY_SITE_REPUTATION_SUSPICIOUS", + "juniper.srx.session_id": "16490", + "juniper.srx.tag": "WEBFILTER_URL_BLOCKED", + "log.level": "warning", + "log.offset": 3552, + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX650-1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.hosts": [ + "dsp.adfarm1.adition.com" + ], + "related.ip": [ + "10.1.1.100", + "85.114.159.93" + ], + "server.ip": "85.114.159.93", + "server.port": 443, + "service.type": "juniper", + "source.ip": "10.1.1.100", + "source.port": 59075, + "tags": [ + "juniper.srx", + "forwarded" + ], + "url.domain": "dsp.adfarm1.adition.com", + "url.path": "/" + }, + { + "@timestamp": "2020-07-14T12:17:04.733-02:00", + "client.ip": "23.209.86.45", + "client.port": 80, + "destination.ip": "10.1.1.100", + "destination.port": 58954, + "event.category": [ + "network" + ], + "event.dataset": "juniper.srx", + "event.kind": "event", + "event.module": "juniper", + "event.original": "source-zone=\"trust\" destination-zone=\"untrust\" source-address=\"23.209.86.45\" source-port=\"80\" destination-address=\"10.1.1.100\" destination-port=\"58954\" profile-name=\"Custom-Sophos-Profile\" filename=\"download.cdn.mozilla.net/pub/firefox/releases/78.0.2/update/win64/de/firefox-78.0.2.complete.mar\" action=\"BLOCKED\" reason=\"exceeding maximum content size\" error-code=\"7\" username=\"N/A\" roles=\"N/A\"", + "event.outcome": "success", + "event.severity": "12", + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "file.name": "download.cdn.mozilla.net/pub/firefox/releases/78.0.2/update/win64/de/firefox-78.0.2.complete.mar", + "fileset.name": "srx", + "input.type": "log", + "juniper.srx.action": "BLOCKED", + "juniper.srx.error_code": "7", + "juniper.srx.process": "RT_UTM", + "juniper.srx.profile_name": "Custom-Sophos-Profile", + "juniper.srx.reason": "exceeding maximum content size", + "juniper.srx.tag": "AV_FILE_NOT_SCANNED_DROPPED_MT", + "log.level": "warning", + "log.offset": 4078, + "observer.egress.zone": "untrust", + "observer.ingress.zone": "trust", + "observer.name": "SRX650-1", + "observer.product": "SRX", + "observer.type": "firewall", + "observer.vendor": "Juniper", + "related.ip": [ + "23.209.86.45", + "10.1.1.100" + ], + "server.ip": "10.1.1.100", + "server.port": 58954, + "service.type": "juniper", + "source.as.number": 16625, + "source.as.organization.name": "Akamai Technologies, Inc.", + "source.geo.continent_name": "Europe", + "source.geo.country_iso_code": "NL", + "source.geo.country_name": "Netherlands", + "source.geo.location.lat": 52.3824, + "source.geo.location.lon": 4.8995, + "source.ip": "23.209.86.45", + "source.port": 80, + "tags": [ + "juniper.srx", + "forwarded" + ] + } +] \ No newline at end of file diff --git a/x-pack/filebeat/modules.d/juniper.yml.disabled b/x-pack/filebeat/modules.d/juniper.yml.disabled index e3359756d90..6ffe87834a4 100644 --- a/x-pack/filebeat/modules.d/juniper.yml.disabled +++ b/x-pack/filebeat/modules.d/juniper.yml.disabled @@ -39,3 +39,16 @@ # "local" (default) for system timezone. # "+02:00" for GMT+02:00 # var.tz_offset: local + + srx: + enabled: true + + # Set which input to use between tcp, udp (default) or file. + #var.input: udp + + # The interface to listen to syslog traffic. Defaults to + # localhost. Set to 0.0.0.0 to bind to all available interfaces. + #var.syslog_host: localhost + + # The port to listen for syslog traffic. Defaults to 9006. + #var.syslog_port: 9006 From 4dd8061938e8aee474ef6e378fe9aae2bd4837da Mon Sep 17 00:00:00 2001 From: Marius Iversen Date: Tue, 6 Oct 2020 11:06:39 +0200 Subject: [PATCH 079/156] [Beats][pytest] Asserting if filebeat logs include errors (#20999) First iteration on tackling this issue, allowing to assert on errors in filebeat, since any test will fail afterwards anyway, and the logs should not include errors. This could be anything from Elasticsearch not being available to pipeline failing to install. --- filebeat/tests/system/test_modules.py | 48 ++++++++++++++++++--------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/filebeat/tests/system/test_modules.py b/filebeat/tests/system/test_modules.py index d449258c40f..fa3caa93475 100644 --- a/filebeat/tests/system/test_modules.py +++ b/filebeat/tests/system/test_modules.py @@ -131,22 +131,29 @@ def run_on_file(self, module, fileset, test_file, cfgfile): cmd.append("{module}.{fileset}.var.format=json".format(module=module, fileset=fileset)) output_path = os.path.join(self.working_dir) - output = open(os.path.join(output_path, "output.log"), "ab") - output.write(bytes(" ".join(cmd) + "\n", "utf-8")) - - # Use a fixed timezone so results don't vary depending on the environment - # Don't use UTC to avoid hiding that non-UTC timezones are not being converted as needed, - # this can happen because UTC uses to be the default timezone in date parsers when no other - # timezone is specified. - local_env = os.environ.copy() - local_env["TZ"] = 'Etc/GMT+2' - - subprocess.Popen(cmd, - env=local_env, - stdin=None, - stdout=output, - stderr=subprocess.STDOUT, - bufsize=0).wait() + # Runs inside a with block to ensure file is closed afterwards + with open(os.path.join(output_path, "output.log"), "ab") as output: + output.write(bytes(" ".join(cmd) + "\n", "utf-8")) + + # Use a fixed timezone so results don't vary depending on the environment + # Don't use UTC to avoid hiding that non-UTC timezones are not being converted as needed, + # this can happen because UTC uses to be the default timezone in date parsers when no other + # timezone is specified. + local_env = os.environ.copy() + local_env["TZ"] = 'Etc/GMT+2' + + subprocess.Popen(cmd, + env=local_env, + stdin=None, + stdout=output, + stderr=subprocess.STDOUT, + bufsize=0).wait() + + # List of errors to check in filebeat output logs + errors = ["Error loading pipeline for fileset"] + # Checks if the output of filebeat includes errors + contains_error, error_line = file_contains(os.path.join(output_path, "output.log"), errors) + assert contains_error is False, "Error found in log:{}".format(error_line) # Make sure index exists self.wait_until(lambda: self.es.indices.exists(self.index_name)) @@ -305,5 +312,14 @@ def delete_key(obj, key): del obj[key] +def file_contains(filepath, strings): + with open(filepath, 'r') as file: + for line in file: + for string in strings: + if string in line: + return True, line + return False, None + + def pretty_json(obj): return json.dumps(obj, indent=2, separators=(',', ': ')) From 804db767212ff046c93ca77d48eca1716f08b7f2 Mon Sep 17 00:00:00 2001 From: Marius Iversen Date: Tue, 6 Oct 2020 11:52:06 +0200 Subject: [PATCH 080/156] [Filebeat][New Module] Add support for Microsoft MTP / 365 Defender (#21446) * Initial commit for mtp mvp * first finished MVP version of MTP module * updating m365_defender with new fields and new name * reverting some files that shouldnt be added * removing dhcp generated logs from PR * converting two fields to strings and updating some default template configurations * adding changelog entry * Initial commit for mtp mvp * first finished MVP version of MTP module * updating m365_defender with new fields and new name * reverting some files that shouldnt be added * removing dhcp generated logs from PR * converting two fields to strings and updating some default template configurations * adding changelog entry * updating typo Co-authored-by: Marc Guasch --- CHANGELOG.next.asciidoc | 1 + filebeat/docs/fields.asciidoc | 427 ++++++++++++ filebeat/docs/modules/microsoft.asciidoc | 83 ++- x-pack/filebeat/filebeat.reference.yml | 15 +- .../module/microsoft/_meta/config.yml | 15 +- .../module/microsoft/_meta/docs.asciidoc | 83 ++- x-pack/filebeat/module/microsoft/fields.go | 2 +- .../microsoft/m365_defender/_meta/fields.yml | 176 +++++ .../m365_defender/config/defender.yml | 43 ++ .../m365_defender/ingest/pipeline.yml | 301 +++++++++ .../microsoft/m365_defender/manifest.yml | 17 + .../test/m365_defender-test.ndjson.log | 9 + ...365_defender-test.ndjson.log-expected.json | 611 ++++++++++++++++++ .../filebeat/modules.d/microsoft.yml.disabled | 15 +- 14 files changed, 1790 insertions(+), 8 deletions(-) create mode 100644 x-pack/filebeat/module/microsoft/m365_defender/_meta/fields.yml create mode 100644 x-pack/filebeat/module/microsoft/m365_defender/config/defender.yml create mode 100644 x-pack/filebeat/module/microsoft/m365_defender/ingest/pipeline.yml create mode 100644 x-pack/filebeat/module/microsoft/m365_defender/manifest.yml create mode 100644 x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log create mode 100644 x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log-expected.json diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 07e7bc4be0d..c86fc85e347 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -608,6 +608,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Convert aws s3 to v2 input {pull}20005[20005] - New Cisco Umbrella dataset {pull}21504[21504] - New juniper.srx dataset for Juniper SRX logs. {pull}20017[20017] +- Adding support for Microsoft 365 Defender (Microsoft Threat Protection) {pull}21446[21446] *Heartbeat* diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index a2f19000095..e7c2d35ff37 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -95523,6 +95523,433 @@ type: keyword -- +[float] +=== microsoft.m365_defender + +Module for ingesting Microsoft Defender ATP. + + + +*`microsoft.m365_defender.incidentId`*:: ++ +-- +Unique identifier to represent the incident. + + +type: keyword + +-- + +*`microsoft.m365_defender.redirectIncidentId`*:: ++ +-- +Only populated in case an incident is being grouped together with another incident, as part of the incident processing logic. + + +type: keyword + +-- + +*`microsoft.m365_defender.incidentName`*:: ++ +-- +Name of the Incident. + + +type: keyword + +-- + +*`microsoft.m365_defender.determination`*:: ++ +-- +Specifies the determination of the incident. The property values are: NotAvailable, Apt, Malware, SecurityPersonnel, SecurityTesting, UnwantedSoftware, Other. + + +type: keyword + +-- + +*`microsoft.m365_defender.investigationState`*:: ++ +-- +The current state of the Investigation. + + +type: keyword + +-- + +*`microsoft.m365_defender.assignedTo`*:: ++ +-- +Owner of the alert. + + +type: keyword + +-- + +*`microsoft.m365_defender.tags`*:: ++ +-- +Array of custom tags associated with an incident, for example to flag a group of incidents with a common characteristic. + + +type: keyword + +-- + +*`microsoft.m365_defender.status`*:: ++ +-- +Specifies the current status of the alert. Possible values are: 'Unknown', 'New', 'InProgress' and 'Resolved'. + + +type: keyword + +-- + +*`microsoft.m365_defender.classification`*:: ++ +-- +Specification of the alert. Possible values are: 'Unknown', 'FalsePositive', 'TruePositive'. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.incidentId`*:: ++ +-- +Unique identifier to represent the incident this alert is associated with. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.resolvedTime`*:: ++ +-- +Time when alert was resolved. + + +type: date + +-- + +*`microsoft.m365_defender.alerts.status`*:: ++ +-- +Categorize alerts (as New, Active, or Resolved). + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.severity`*:: ++ +-- +The severity of the related alert. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.creationTime`*:: ++ +-- +Time when alert was first created. + + +type: date + +-- + +*`microsoft.m365_defender.alerts.lastUpdatedTime`*:: ++ +-- +Time when alert was last updated. + + +type: date + +-- + +*`microsoft.m365_defender.alerts.investigationId`*:: ++ +-- +The automated investigation id triggered by this alert. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.userSid`*:: ++ +-- +The SID of the related user + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.detectionSource`*:: ++ +-- +The service that initially detected the threat. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.classification`*:: ++ +-- +The specification for the incident. The property values are: Unknown, FalsePositive, TruePositive or null. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.investigationState`*:: ++ +-- +Information on the investigation's current status. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.determination`*:: ++ +-- +Specifies the determination of the incident. The property values are: NotAvailable, Apt, Malware, SecurityPersonnel, SecurityTesting, UnwantedSoftware, Other or null + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.assignedTo`*:: ++ +-- +Owner of the incident, or null if no owner is assigned. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.actorName`*:: ++ +-- +The activity group, if any, the associated with this alert. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.threatFamilyName`*:: ++ +-- +Threat family associated with this alert. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.mitreTechniques`*:: ++ +-- +The attack techniques, as aligned with the MITRE ATT&CK™ framework. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.entityType`*:: ++ +-- +Entities that have been identified to be part of, or related to, a given alert. The properties values are: User, Ip, Url, File, Process, MailBox, MailMessage, MailCluster, Registry. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.accountName`*:: ++ +-- +Account name of the related user. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.mailboxDisplayName`*:: ++ +-- +The display name of the related mailbox. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.mailboxAddress`*:: ++ +-- +The mail address of the related mailbox. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.clusterBy`*:: ++ +-- +A list of metadata if the entityType is MailCluster. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.sender`*:: ++ +-- +The sender for the related email message. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.recipient`*:: ++ +-- +The recipient for the related email message. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.subject`*:: ++ +-- +The subject for the related email message. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.deliveryAction`*:: ++ +-- +The delivery status for the related email message. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.securityGroupId`*:: ++ +-- +The Security Group ID for the user related to the email message. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.securityGroupName`*:: ++ +-- +The Security Group Name for the user related to the email message. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.registryHive`*:: ++ +-- +Reference to which Hive in registry the event is related to, if eventType is registry. Example: HKEY_LOCAL_MACHINE. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.registryKey`*:: ++ +-- +Reference to the related registry key to the event. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.registryValueType`*:: ++ +-- +Value type of the registry key/value pair related to the event. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.deviceId`*:: ++ +-- +The unique ID of the device related to the event. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.entities.ipAddress`*:: ++ +-- +The related IP address to the event. + + +type: keyword + +-- + +*`microsoft.m365_defender.alerts.devices`*:: ++ +-- +The devices related to the investigation. + + +type: flattened + +-- + [[exported-fields-misp]] == MISP fields diff --git a/filebeat/docs/modules/microsoft.asciidoc b/filebeat/docs/modules/microsoft.asciidoc index 513ca155be6..5edbbf027d0 100644 --- a/filebeat/docs/modules/microsoft.asciidoc +++ b/filebeat/docs/modules/microsoft.asciidoc @@ -12,7 +12,8 @@ This file is generated! See scripts/docs_collector.py This is a module for ingesting data from the different Microsoft Products. Currently supports these filesets: -- `defender_atp` fileset: Supports Microsoft Defender ATP +- `defender_atp` fileset: Supports Microsoft Defender for Endpoint (Microsoft Defender ATP) +- `m365_defender` fileset: Supports Microsoft 365 Defender (Microsoft Threat Protection) - `dhcp` fileset: Supports Microsoft DHCP logs include::../include/what-happens.asciidoc[] @@ -25,6 +26,84 @@ include::../include/configuring-intro.asciidoc[] include::../include/config-option-intro.asciidoc[] +[float] +==== `m365_defender` fileset settings + +beta[] + +To configure access for Filebeat to Microsoft 365 Defender you will have to create a new Azure Application registration, this will again return Oauth tokens with access to the Microsoft 365 Defender API + +The procedure to create an application is found on the below link: + +https://docs.microsoft.com/en-us/microsoft-365/security/mtp/api-create-app-web?view=o365-worldwide#create-an-app[Create a new Azure Application] + +When giving the application the API permissions described in the documentation (Incident.Read.All) it will only grant access to read Incidents from 365 Defender and nothing else in the Azure Domain. + +After the application has been created, it should contain 3 values that you need to apply to the module configuration. + +These values are: + +- Client ID +- Client Secret +- Tenant ID + +Example config: + +[source,yaml] +---- +- module: microsoft + m365_defender: + enabled: true + var.oauth2.client.id: "123abc-879546asd-349587-ad64508" + var.oauth2.client.secret: "980453~-Sg99gedf" + var.oauth2.token_url: "https://login.microsoftonline.com/INSERT-TENANT-ID/oauth2/token" +---- + +*`var.oauth2.client.id`*:: + +This is the client ID related to creating a new application on Azure. + +*`var.oauth2.client.secret`*:: + +The secret related to the client ID. + +*`var.oauth2.token_url`*:: + +A predefined URL towards the Oauth2 service for Microsoft. The URL should always be the same with the exception of the Tenant ID that needs to be added to the full URL. + +[float] +==== 365 Defender ECS fields + +This is a list of 365 Defender fields that are mapped to ECS. + +[options="header"] +|====================================================================== +| 365 Defender Fields | ECS Fields | +| lastUpdateTime | @timestamp | +| severity | event.severity | +| createdTime | event.created | +| alerts.category | threat.technique.name | +| alerts.description | rule.description | +| alerts.serviceSource | event.provider | +| alerts.alertId | event.id | +| alerts.firstActivity | event.start | +| alerts.lastActivity | event.end | +| alerts.title | message | +| entities.processId | process.pid | +| entities.processCommandLine | process.command_line | +| entities.processCreationTime | process.start | +| entities.parentProcessId | process.parent.pid | +| entities.parentProcessCreationTime | process.parent.start | +| entities.sha1 | file.hash.sha1 | +| entities.sha256 | file.hash.sha256 | +| entities.url | url.full | +| entities.filePath | file.path | +| entities.fileName | file.name | +| entities.userPrincipalName | host.user.name | +| entities.domainName | host.user.domain | +| entities.aadUserId | host.user.id | +|====================================================================== + [float] ==== `defender_atp` fileset settings @@ -114,7 +193,7 @@ This module comes with a sample dashboard for Defender ATP. [role="screenshot"] image::./images/filebeat-defender-atp-overview.png[] -The best way to view Defender ATP events and alert data is in the SIEM. +The best way to view Defender ATP events and alert data is in the SIEM. [role="screenshot"] image::./images/siem-alerts-cs.jpg[] diff --git a/x-pack/filebeat/filebeat.reference.yml b/x-pack/filebeat/filebeat.reference.yml index cc994b45cac..2ffff82135e 100644 --- a/x-pack/filebeat/filebeat.reference.yml +++ b/x-pack/filebeat/filebeat.reference.yml @@ -1118,7 +1118,20 @@ filebeat.modules: # Oauth Client Secret #var.oauth2.client.secret: "" - + + # Oauth Token URL, should include the tenant ID + #var.oauth2.token_url: "https://login.microsoftonline.com/TENANT-ID/oauth2/token" + m365_defender: + enabled: true + # How often the API should be polled + #var.interval: 5m + + # Oauth Client ID + #var.oauth2.client.id: "" + + # Oauth Client Secret + #var.oauth2.client.secret: "" + # Oauth Token URL, should include the tenant ID #var.oauth2.token_url: "https://login.microsoftonline.com/TENANT-ID/oauth2/token" dhcp: diff --git a/x-pack/filebeat/module/microsoft/_meta/config.yml b/x-pack/filebeat/module/microsoft/_meta/config.yml index 8e793bd2f9c..ee06eea9228 100644 --- a/x-pack/filebeat/module/microsoft/_meta/config.yml +++ b/x-pack/filebeat/module/microsoft/_meta/config.yml @@ -10,7 +10,20 @@ # Oauth Client Secret #var.oauth2.client.secret: "" - + + # Oauth Token URL, should include the tenant ID + #var.oauth2.token_url: "https://login.microsoftonline.com/TENANT-ID/oauth2/token" + m365_defender: + enabled: true + # How often the API should be polled + #var.interval: 5m + + # Oauth Client ID + #var.oauth2.client.id: "" + + # Oauth Client Secret + #var.oauth2.client.secret: "" + # Oauth Token URL, should include the tenant ID #var.oauth2.token_url: "https://login.microsoftonline.com/TENANT-ID/oauth2/token" dhcp: diff --git a/x-pack/filebeat/module/microsoft/_meta/docs.asciidoc b/x-pack/filebeat/module/microsoft/_meta/docs.asciidoc index 8a3facdc259..7e646e1b4fe 100644 --- a/x-pack/filebeat/module/microsoft/_meta/docs.asciidoc +++ b/x-pack/filebeat/module/microsoft/_meta/docs.asciidoc @@ -7,7 +7,8 @@ This is a module for ingesting data from the different Microsoft Products. Currently supports these filesets: -- `defender_atp` fileset: Supports Microsoft Defender ATP +- `defender_atp` fileset: Supports Microsoft Defender for Endpoint (Microsoft Defender ATP) +- `m365_defender` fileset: Supports Microsoft 365 Defender (Microsoft Threat Protection) - `dhcp` fileset: Supports Microsoft DHCP logs include::../include/what-happens.asciidoc[] @@ -20,6 +21,84 @@ include::../include/configuring-intro.asciidoc[] include::../include/config-option-intro.asciidoc[] +[float] +==== `m365_defender` fileset settings + +beta[] + +To configure access for Filebeat to Microsoft 365 Defender you will have to create a new Azure Application registration, this will again return Oauth tokens with access to the Microsoft 365 Defender API + +The procedure to create an application is found on the below link: + +https://docs.microsoft.com/en-us/microsoft-365/security/mtp/api-create-app-web?view=o365-worldwide#create-an-app[Create a new Azure Application] + +When giving the application the API permissions described in the documentation (Incident.Read.All) it will only grant access to read Incidents from 365 Defender and nothing else in the Azure Domain. + +After the application has been created, it should contain 3 values that you need to apply to the module configuration. + +These values are: + +- Client ID +- Client Secret +- Tenant ID + +Example config: + +[source,yaml] +---- +- module: microsoft + m365_defender: + enabled: true + var.oauth2.client.id: "123abc-879546asd-349587-ad64508" + var.oauth2.client.secret: "980453~-Sg99gedf" + var.oauth2.token_url: "https://login.microsoftonline.com/INSERT-TENANT-ID/oauth2/token" +---- + +*`var.oauth2.client.id`*:: + +This is the client ID related to creating a new application on Azure. + +*`var.oauth2.client.secret`*:: + +The secret related to the client ID. + +*`var.oauth2.token_url`*:: + +A predefined URL towards the Oauth2 service for Microsoft. The URL should always be the same with the exception of the Tenant ID that needs to be added to the full URL. + +[float] +==== 365 Defender ECS fields + +This is a list of 365 Defender fields that are mapped to ECS. + +[options="header"] +|====================================================================== +| 365 Defender Fields | ECS Fields | +| lastUpdateTime | @timestamp | +| severity | event.severity | +| createdTime | event.created | +| alerts.category | threat.technique.name | +| alerts.description | rule.description | +| alerts.serviceSource | event.provider | +| alerts.alertId | event.id | +| alerts.firstActivity | event.start | +| alerts.lastActivity | event.end | +| alerts.title | message | +| entities.processId | process.pid | +| entities.processCommandLine | process.command_line | +| entities.processCreationTime | process.start | +| entities.parentProcessId | process.parent.pid | +| entities.parentProcessCreationTime | process.parent.start | +| entities.sha1 | file.hash.sha1 | +| entities.sha256 | file.hash.sha256 | +| entities.url | url.full | +| entities.filePath | file.path | +| entities.fileName | file.name | +| entities.userPrincipalName | host.user.name | +| entities.domainName | host.user.domain | +| entities.aadUserId | host.user.id | +|====================================================================== + [float] ==== `defender_atp` fileset settings @@ -109,7 +188,7 @@ This module comes with a sample dashboard for Defender ATP. [role="screenshot"] image::./images/filebeat-defender-atp-overview.png[] -The best way to view Defender ATP events and alert data is in the SIEM. +The best way to view Defender ATP events and alert data is in the SIEM. [role="screenshot"] image::./images/siem-alerts-cs.jpg[] diff --git a/x-pack/filebeat/module/microsoft/fields.go b/x-pack/filebeat/module/microsoft/fields.go index 2576fcb8ac7..d76c98c273d 100644 --- a/x-pack/filebeat/module/microsoft/fields.go +++ b/x-pack/filebeat/module/microsoft/fields.go @@ -19,5 +19,5 @@ func init() { // AssetMicrosoft returns asset data. // This is the base64 encoded gzipped contents of module/microsoft. func AssetMicrosoft() string { - return "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" + return "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" } diff --git a/x-pack/filebeat/module/microsoft/m365_defender/_meta/fields.yml b/x-pack/filebeat/module/microsoft/m365_defender/_meta/fields.yml new file mode 100644 index 00000000000..3656cd7c1de --- /dev/null +++ b/x-pack/filebeat/module/microsoft/m365_defender/_meta/fields.yml @@ -0,0 +1,176 @@ +- name: microsoft.m365_defender + type: group + release: beta + default_field: false + description: > + Module for ingesting Microsoft Defender ATP. + fields: + - name: incidentId + type: keyword + description: > + Unique identifier to represent the incident. + - name: redirectIncidentId + type: keyword + description: > + Only populated in case an incident is being grouped together with another incident, as part of the incident processing logic. + - name: incidentName + type: keyword + description: > + Name of the Incident. + - name: determination + type: keyword + description: > + Specifies the determination of the incident. The property values are: NotAvailable, Apt, Malware, SecurityPersonnel, SecurityTesting, UnwantedSoftware, Other. + - name: investigationState + type: keyword + description: > + The current state of the Investigation. + - name: assignedTo + type: keyword + description: > + Owner of the alert. + - name: tags + type: keyword + description: > + Array of custom tags associated with an incident, for example to flag a group of incidents with a common characteristic. + - name: status + type: keyword + description: > + Specifies the current status of the alert. Possible values are: 'Unknown', 'New', 'InProgress' and 'Resolved'. + - name: classification + type: keyword + description: > + Specification of the alert. Possible values are: 'Unknown', 'FalsePositive', 'TruePositive'. + - name: alerts.incidentId + type: keyword + description: > + Unique identifier to represent the incident this alert is associated with. + - name: alerts.resolvedTime + type: date + description: > + Time when alert was resolved. + - name: alerts.status + type: keyword + description: > + Categorize alerts (as New, Active, or Resolved). + - name: alerts.severity + type: keyword + description: > + The severity of the related alert. + - name: alerts.creationTime + type: date + description: > + Time when alert was first created. + - name: alerts.lastUpdatedTime + type: date + description: > + Time when alert was last updated. + - name: alerts.investigationId + type: keyword + description: > + The automated investigation id triggered by this alert. + - name: alerts.userSid + type: keyword + description: > + The SID of the related user + - name: alerts.detectionSource + type: keyword + description: > + The service that initially detected the threat. + - name: alerts.classification + type: keyword + description: > + The specification for the incident. The property values are: Unknown, FalsePositive, TruePositive or null. + - name: alerts.investigationState + type: keyword + description: > + Information on the investigation's current status. + - name: alerts.determination + type: keyword + description: > + Specifies the determination of the incident. The property values are: NotAvailable, Apt, Malware, SecurityPersonnel, SecurityTesting, UnwantedSoftware, Other or null + - name: alerts.assignedTo + type: keyword + description: > + Owner of the incident, or null if no owner is assigned. + - name: alerts.actorName + type: keyword + description: > + The activity group, if any, the associated with this alert. + - name: alerts.threatFamilyName + type: keyword + description: > + Threat family associated with this alert. + - name: alerts.mitreTechniques + type: keyword + description: > + The attack techniques, as aligned with the MITRE ATT&CK™ framework. + - name: alerts.entities.entityType + type: keyword + description: > + Entities that have been identified to be part of, or related to, a given alert. The properties values are: User, Ip, Url, File, Process, MailBox, MailMessage, MailCluster, Registry. + - name: alerts.entities.accountName + type: keyword + description: > + Account name of the related user. + - name: alerts.entities.mailboxDisplayName + type: keyword + description: > + The display name of the related mailbox. + - name: alerts.entities.mailboxAddress + type: keyword + description: > + The mail address of the related mailbox. + - name: alerts.entities.clusterBy + type: keyword + description: > + A list of metadata if the entityType is MailCluster. + - name: alerts.entities.sender + type: keyword + description: > + The sender for the related email message. + - name: alerts.entities.recipient + type: keyword + description: > + The recipient for the related email message. + - name: alerts.entities.subject + type: keyword + description: > + The subject for the related email message. + - name: alerts.entities.deliveryAction + type: keyword + description: > + The delivery status for the related email message. + - name: alerts.entities.securityGroupId + type: keyword + description: > + The Security Group ID for the user related to the email message. + - name: alerts.entities.securityGroupName + type: keyword + description: > + The Security Group Name for the user related to the email message. + - name: alerts.entities.registryHive + type: keyword + description: > + Reference to which Hive in registry the event is related to, if eventType is registry. Example: HKEY_LOCAL_MACHINE. + - name: alerts.entities.registryKey + type: keyword + description: > + Reference to the related registry key to the event. + - name: alerts.entities.registryValueType + type: keyword + description: > + Value type of the registry key/value pair related to the event. + - name: alerts.entities.deviceId + type: keyword + description: > + The unique ID of the device related to the event. + - name: alerts.entities.ipAddress + type: keyword + description: > + The related IP address to the event. + - name: alerts.devices + type: flattened + description: > + The devices related to the investigation. + diff --git a/x-pack/filebeat/module/microsoft/m365_defender/config/defender.yml b/x-pack/filebeat/module/microsoft/m365_defender/config/defender.yml new file mode 100644 index 00000000000..2b2a6f936f7 --- /dev/null +++ b/x-pack/filebeat/module/microsoft/m365_defender/config/defender.yml @@ -0,0 +1,43 @@ +{{ if eq .input "httpjson" }} + +type: httpjson +http_method: GET +interval: {{ .interval }} +json_objects_array: value +split_events_by: alerts..entities +url: {{ .url }} + +oauth2: {{ .oauth2 | tojson }} +oauth2.provider: azure +oauth2.azure.resource: https://api.security.microsoft.com +http_headers: + User-Agent: MdatpPartner-Elastic-Filebeat/1.0.0 +date_cursor.field: lastUpdateTime +date_cursor.url_field: '$filter' +date_cursor.value_template: 'lastUpdateTime gt {{.}}' +date_cursor.initial_interval: 55m +date_cursor.date_format: '2006-01-02T15:04:05.9999999Z' + + +{{ else if eq .input "file" }} + +type: log +paths: +{{ range $i, $path := .paths }} + - {{$path}} +{{ end }} +exclude_files: [".gz$"] + +{{ end }} + +tags: {{ .tags | tojson }} +publisher_pipeline.disable_host: {{ inList .tags "forwarded" }} + +processors: + - decode_json_fields: + fields: [message] + target: json + - add_fields: + target: '' + fields: + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/microsoft/m365_defender/ingest/pipeline.yml b/x-pack/filebeat/module/microsoft/m365_defender/ingest/pipeline.yml new file mode 100644 index 00000000000..f1ea7c03abd --- /dev/null +++ b/x-pack/filebeat/module/microsoft/m365_defender/ingest/pipeline.yml @@ -0,0 +1,301 @@ +--- +description: Pipeline for parsing microsoft atp logs +processors: +- set: + field: event.ingested + value: '{{_ingest.timestamp}}' +- remove: + field: + - message + - json.comments + - host + ignore_missing: true + +######################### +## ECS General Mapping ## +######################### +- script: + lang: painless + if: ctx?.json != null + source: | + void handleMap(Map map) { + for (def x : map.values()) { + if (x instanceof Map) { + handleMap(x); + } else if (x instanceof List) { + handleList(x); + } + } + map.values().removeIf(v -> v == null); + } + void handleList(List list) { + for (def x : list) { + if (x instanceof Map) { + handleMap(x); + } else if (x instanceof List) { + handleList(x); + } + } + } + handleMap(ctx); + +- set: + field: cloud.provider + value: azure +- set: + field: '@timestamp' + value: '{{json.lastUpdateTime}}' + if: ctx.json?.lastUpdateTime != null +- rename: + field: json.alerts.title + target_field: message + ignore_missing: true + +####################### +## ECS Event Mapping ## +####################### +- set: + field: event.kind + value: alert +# Events returned from the API is always in UTC, so should never use anything else +- set: + field: event.timezone + value: UTC +- set: + field: event.action + value: '{{json.alerts.category}}' + if: ctx.json?.alerts?.category != null +- set: + field: event.provider + value: '{{json.alerts.serviceSource}}' + if: ctx.json?.alerts?.serviceSource != null +- set: + field: event.created + value: '{{json.createdTime}}' + if: ctx.json?.createdTime != null +- append: + field: event.category + value: host +- append: + field: event.category + value: malware + if: ctx.json?.determination == 'Malware' +- append: + field: event.category + value: process + if: ctx.json?.entities?.entityType == 'Process' +- append: + field: event.type + value: user + if: ctx.json?.entities?.entityType == 'User' +- append: + field: event.type + value: + - creation + - start + if: ctx.json?.status == 'New' +- append: + field: event.type + value: end + if: ctx.json?.status == 'Resolved' +- rename: + field: json.alerts.alertId + target_field: event.id + ignore_missing: true +- rename: + field: json.alerts.firstActivity + target_field: event.start + ignore_missing: true +- rename: + field: json.alerts.lastActivity + target_field: event.end + ignore_missing: true +- set: + field: event.severity + value: 0 + if: ctx.json?.severity == 'Unspecified' +- set: + field: event.severity + value: 1 + if: ctx.json?.severity == 'Informational' +- set: + field: event.severity + value: 2 + if: ctx.json?.severity == 'Low' +- set: + field: event.severity + value: 3 + if: ctx.json?.severity == 'Medium' +- set: + field: event.severity + value: 4 + if: ctx.json?.severity == 'High' +- script: + lang: painless + if: "ctx?.event?.start != null && ctx?.event?.end != null" + source: > + Instant eventstart = ZonedDateTime.parse(ctx?.event?.start).toInstant(); + Instant eventend = ZonedDateTime.parse(ctx?.event?.end).toInstant(); + ctx.event['duration'] = ChronoUnit.NANOS.between(eventstart, eventend); + +######################## +## ECS Threat Mapping ## +######################## +- set: + field: threat.framework + value: MITRE ATT&CK + if: ctx.json?.alerts?.category != null +- rename: + field: json.alerts.category + target_field: threat.technique.name + ignore_missing: true +- rename: + field: json.alerts.description + target_field: rule.description + ignore_missing: true + if: ctx.json?.alerts?.description.length() < 1020 + +###################### +## ECS File Mapping ## +###################### +- rename: + field: json.alerts.entities.fileName + target_field: file.name + ignore_missing: true +- rename: + field: json.alerts.entities.sha256 + target_field: file.hash.sha256 + ignore_missing: true +- rename: + field: json.alerts.entities.sha1 + target_field: file.hash.sha1 + ignore_missing: true +- rename: + field: json.alerts.entities.filePath + target_field: file.path + ignore_missing: true + +######################### +## ECS Process Mapping ## +######################### +- rename: + field: json.alerts.entities.processId + target_field: process.pid + ignore_missing: true +- rename: + field: json.alerts.entities.processCommandLine + target_field: process.command_line + ignore_missing: true +- rename: + field: json.alerts.entities.processCreationTime + target_field: process.start + ignore_missing: true +- rename: + field: json.alerts.entities.parentProcessId + target_field: process.parent.pid + ignore_missing: true +- rename: + field: json.alerts.entities.parentProcessCreationTime + target_field: process.parent.start + ignore_missing: true + +########################## +## ECS Observer Mapping ## +########################## +- set: + field: observer.product + value: 365 Defender +- set: + field: observer.vendor + value: Microsoft +- rename: + field: json.alerts.serviceSource + target_field: observer.name + ignore_missing: true + +##################### +## ECS URL Mapping ## +##################### +- rename: + field: json.alerts.entities.url + target_field: url.full + ignore_missing: true + if: ctx?.json?.entities?.url != null + +###################### +## ECS User Mapping ## +###################### +- rename: + field: json.alerts.entities.userPrincipalName + target_field: host.user.name + ignore_missing: true +- rename: + field: json.alerts.entities.domainName + target_field: host.user.domain + ignore_missing: true +- rename: + field: json.alerts.entities.aadUserId + target_field: host.user.id + ignore_missing: true + +######################### +## ECS Related Mapping ## +######################### +- append: + field: related.ip + value: '{{json.alerts.entities.ipAddress}}' + if: ctx.json?.entities?.ipAddress != null +- append: + field: related.user + value: '{{host.user.name}}' + if: ctx.host?.user?.name != null +- append: + field: related.hash + value: '{{file.hash.sha1}}' + if: ctx.file?.hash?.sha1 != null +- append: + field: related.hash + value: '{{file.hash.sha256}}' + if: ctx.file?.hash?.sha256 != null +- append: + field: related.hosts + value: '{{host.hostname}}' + if: ctx.host?.hostname != null + +############# +## Cleanup ## +############# +- convert: + field: json.alerts.incidentId + type: string + ignore_missing: true +- convert: + field: json.incidentId + type: string + ignore_missing: true +- remove: + field: json.alerts.mitreTechniques + ignore_missing: true + if: ctx?.json?.alerts?.mitreTechniques.isEmpty() +- remove: + field: json.alerts.devices + ignore_missing: true + if: ctx?.json?.alerts?.devices.isEmpty() +- remove: + field: json.tags + ignore_missing: true + if: ctx?.json?.tags.isEmpty() +- remove: + ignore_missing: true + field: + - json.createdTime + - json.severity + - json.lastUpdateTime +- rename: + field: json + target_field: microsoft.m365_defender + ignore_missing: true +on_failure: +- set: + field: error.message + value: '{{_ingest.on_failure_message}}' diff --git a/x-pack/filebeat/module/microsoft/m365_defender/manifest.yml b/x-pack/filebeat/module/microsoft/m365_defender/manifest.yml new file mode 100644 index 00000000000..d7b73352f79 --- /dev/null +++ b/x-pack/filebeat/module/microsoft/m365_defender/manifest.yml @@ -0,0 +1,17 @@ +module_version: 1.0 + +var: + - name: input + default: httpjson + - name: interval + default: 5m + - name: tags + default: [m365-defender, forwarded] + - name: url + default: "https://api.security.microsoft.com/api/incidents" + - name: oauth2 + +ingest_pipeline: ingest/pipeline.yml +input: config/defender.yml + + diff --git a/x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log b/x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log new file mode 100644 index 00000000000..4fc4cf141b6 --- /dev/null +++ b/x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log @@ -0,0 +1,9 @@ +{"status":"Resolved","classification":"Unknown","createdTime":"2020-06-30T09:32:31.85Z","determination":"NotAvailable","incidentId":12,"incidentName":"12","redirectIncidentId":null,"severity":"Low","alerts":{"creationTime":"2020-06-30T09:32:31.4579225Z","detectionSource":"WindowsDefenderAv","firstActivity":"2020-06-30T09:31:22.5729558Z","incidentId":12,"serviceSource":"MicrosoftDefenderATP","actorName":null,"alertId":"da637291063515066999_-2102938302","determination":null,"lastActivity":"2020-06-30T09:46:15.0876676Z","assignedTo":"Automation","devices":[{"osBuild":17763,"osProcessor":"x64","rbacGroupId":0,"aadDeviceId":null,"firstSeen":"2020-06-30T08:55:08.8320449Z","mdatpDeviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","rbacGroupName":null,"riskScore":"High","version":"Other","deviceDnsName":"TestServer4","healthStatus":"Inactive","osPlatform":"Other"}],"investigationId":9,"threatFamilyName":null,"title":"'Mountsi' malware was detected","category":"Malware","classification":null,"description":"Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nThis detection might indicate that the malware was stopped from delivering its payload. However, it is prudent to check the machine for signs of infection.","entities":{"deviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","entityType":"File","fileName":"amsistream-1D89ECED25A52AB98B76FF619B7BA07A","sha1":"ffb1670c6c6a9c5b4c5cea8b6b8e68d62e7ff281","sha256":"fd46705c4f67a8ef16e76259ca6d6253241e51a1f8952223145f92aa1907d356"},"investigationState":"Benign","lastUpdatedTime":"2020-08-26T09:41:27.7233333Z","mitreTechniques":[],"resolvedTime":"2020-06-30T11:13:12.2680434Z","severity":"Informational","status":"Resolved"},"assignedTo":"elastic@elasticuser.com","lastUpdateTime":"2020-09-23T19:44:36.29Z","tags":[]} +{"incidentName":"12","redirectIncidentId":null,"severity":"Low","status":"Resolved","tags":[],"alerts":{"devices":[{"aadDeviceId":null,"firstSeen":"2020-06-30T08:55:08.8320449Z","healthStatus":"Inactive","osPlatform":"Other","rbacGroupId":0,"rbacGroupName":null,"deviceDnsName":"TestServer4","mdatpDeviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","osBuild":17763,"osProcessor":"x64","riskScore":"High","version":"Other"}],"entities":{"deviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","entityType":"File","fileName":"amsistream-B103C1A335BDB049E617D1AC4A41FCDC","sha1":"ffb1670c6c6a9c5b4c5cea8b6b8e68d62e7ff281","sha256":"fd46705c4f67a8ef16e76259ca6d6253241e51a1f8952223145f92aa1907d356"},"firstActivity":"2020-06-30T09:31:22.5729558Z","lastUpdatedTime":"2020-08-26T09:41:27.7233333Z","alertId":"da637291063515066999_-2102938302","category":"Malware","classification":null,"determination":null,"mitreTechniques":[],"serviceSource":"MicrosoftDefenderATP","status":"Resolved","assignedTo":"Automation","detectionSource":"WindowsDefenderAv","incidentId":12,"investigationId":9,"severity":"Informational","title":"'Mountsi' malware was detected","actorName":null,"description":"Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nThis detection might indicate that the malware was stopped from delivering its payload. However, it is prudent to check the machine for signs of infection.","lastActivity":"2020-06-30T09:46:15.0876676Z","resolvedTime":"2020-06-30T11:13:12.2680434Z","creationTime":"2020-06-30T09:32:31.4579225Z","investigationState":"Benign","threatFamilyName":null},"assignedTo":"elastic@elasticuser.com","determination":"NotAvailable","incidentId":12,"lastUpdateTime":"2020-09-23T19:44:36.29Z","classification":"Unknown","createdTime":"2020-06-30T09:32:31.85Z"} +{"alerts":{"mitreTechniques":[],"status":"Resolved","title":"'Exeselrun' malware was detected","threatFamilyName":null,"alertId":"da637291085389812387_-1296910232","category":"Malware","detectionSource":"WindowsDefenderAv","lastUpdatedTime":"2020-08-26T09:41:27.7233333Z","serviceSource":"MicrosoftDefenderATP","severity":"Informational","resolvedTime":"2020-06-30T11:13:12.2680434Z","description":"Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nThis detection might indicate that the malware was stopped from delivering its payload. However, it is prudent to check the machine for signs of infection.","devices":[{"deviceDnsName":"testserver4","healthStatus":"Inactive","osProcessor":"x64","rbacGroupId":0,"riskScore":"High","version":"Other","aadDeviceId":null,"firstSeen":"2020-06-30T08:55:08.8320449Z","mdatpDeviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","osBuild":17763,"osPlatform":"Other","rbacGroupName":null}],"firstActivity":"2020-06-30T10:07:44.3144099Z","incidentId":12,"investigationId":9,"investigationState":"Benign","lastActivity":"2020-06-30T10:07:44.3144099Z","actorName":null,"assignedTo":"Automation","classification":null,"creationTime":"2020-06-30T10:08:58.9655663Z","determination":null,"entities":{"fileName":"SB.xsl","filePath":"C:\\Windows\\Temp\\sb-sim-temp-ikyxqi\\sb_10554_bs_h4qpk5","sha1":"d1bb29ce3d01d01451e3623132545d5f577a1bd6","sha256":"ce8d3a3811a3bf923902d6924532308506fe5d024435ddee0cabf90ad9b29f6a","deviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","entityType":"File"}},"createdTime":"2020-06-30T09:32:31.85Z","determination":"NotAvailable","incidentId":12,"lastUpdateTime":"2020-09-23T19:44:36.29Z","redirectIncidentId":null,"assignedTo":"elastic@elasticuser.com","classification":"Unknown","incidentName":"12","severity":"Low","status":"Resolved","tags":[]} +{"classification":"Unknown","createdTime":"2020-06-30T09:32:31.85Z","determination":"NotAvailable","incidentName":"12","lastUpdateTime":"2020-09-23T19:44:36.29Z","redirectIncidentId":null,"severity":"Low","assignedTo":"elastic@elasticuser.com","status":"Resolved","incidentId":12,"tags":[],"alerts":{"assignedTo":"elastic@elasticuser.com","firstActivity":"2020-06-30T10:07:44.333733Z","investigationId":9,"mitreTechniques":[],"resolvedTime":"2020-06-30T11:13:12.2680434Z","title":"An active 'Exeselrun' malware was detected","alertId":"da637291085411733957_-1043898914","category":"Malware","classification":null,"detectionSource":"WindowsDefenderAv","determination":null,"threatFamilyName":null,"actorName":null,"serviceSource":"MicrosoftDefenderATP","status":"Resolved","creationTime":"2020-06-30T10:09:01.1569718Z","devices":[{"deviceDnsName":"TestServer4","healthStatus":"Inactive","osBuild":17763,"osProcessor":"x64","rbacGroupName":null,"riskScore":"High","version":"Other","aadDeviceId":null,"firstSeen":"2020-06-30T08:55:08.8320449Z","mdatpDeviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","osPlatform":"Other","rbacGroupId":0}],"entities":{"filePath":"C:\\Windows\\Temp\\sb-sim-temp-ikyxqi\\sb_10554_bs_h4qpk5","deviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","entityType":"File","fileName":"SB.xsl"},"incidentId":12,"investigationState":"Benign","lastActivity":"2020-06-30T10:07:44.333733Z","lastUpdatedTime":"2020-08-26T09:41:27.7233333Z","severity":"Low","description":"Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection."}} +{"assignedTo":"elastic@elasticuser.com","classification":"Unknown","createdTime":"2020-06-30T09:32:31.85Z","redirectIncidentId":null,"severity":"Low","status":"Resolved","tags":[],"alerts":{"assignedTo":"elastic@elasticuser.com","determination":null,"serviceSource":"MicrosoftDefenderATP","severity":"Low","alertId":"da637291086161511365_-2075772905","classification":"FalsePositive","creationTime":"2020-06-30T10:10:16.1355657Z","description":"Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection.","entities":{"deviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","entityType":"Process","processCreationTime":"2020-06-30T10:31:04.1092404Z","processId":6720},"mitreTechniques":[],"title":"Suspicious 'AccessibilityEscalation' behavior was detected","category":"SuspiciousActivity","devices":[{"aadDeviceId":null,"mdatpDeviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","osProcessor":"x64","riskScore":"High","osPlatform":"Other","rbacGroupId":0,"rbacGroupName":null,"version":"Other","deviceDnsName":"testserver4","firstSeen":"2020-06-30T08:55:08.8320449Z","healthStatus":"Inactive","osBuild":17763}],"firstActivity":"2020-06-30T10:09:10.8889583Z","investigationState":"UnsupportedAlertType","status":"Resolved","detectionSource":"WindowsDefenderAv","incidentId":12,"investigationId":null,"lastActivity":"2020-06-30T10:31:09.4165785Z","lastUpdatedTime":"2020-09-23T19:44:37.9666667Z","resolvedTime":"2020-09-23T19:44:36.1092821Z","threatFamilyName":null,"actorName":null},"determination":"NotAvailable","incidentId":12,"incidentName":"12","lastUpdateTime":"2020-09-23T19:44:36.29Z"} +{"determination":"NotAvailable","severity":"Low","classification":"Unknown","createdTime":"2020-06-30T09:32:31.85Z","incidentId":12,"incidentName":"12","lastUpdateTime":"2020-09-23T19:44:36.29Z","redirectIncidentId":null,"alerts":{"lastActivity":"2020-06-30T10:31:09.4165785Z","lastUpdatedTime":"2020-09-23T19:44:37.9666667Z","actorName":null,"description":"Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection.","determination":null,"entities":{"accountName":"","entityType":"User"},"firstActivity":"2020-06-30T10:09:10.8889583Z","investigationState":"UnsupportedAlertType","serviceSource":"MicrosoftDefenderATP","status":"Resolved","title":"Suspicious 'AccessibilityEscalation' behavior was detected","classification":"FalsePositive","devices":[{"aadDeviceId":null,"healthStatus":"Inactive","osPlatform":"Other","osProcessor":"x64","riskScore":"High","deviceDnsName":"testserver4","firstSeen":"2020-06-30T08:55:08.8320449Z","mdatpDeviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","osBuild":17763,"rbacGroupId":0,"rbacGroupName":null,"version":"Other"}],"mitreTechniques":[],"severity":"Low","threatFamilyName":null,"creationTime":"2020-06-30T10:10:16.1355657Z","detectionSource":"WindowsDefenderAv","incidentId":12,"alertId":"da637291086161511365_-2075772905","assignedTo":"elastic@elasticuser.com","category":"SuspiciousActivity","investigationId":null,"resolvedTime":"2020-09-23T19:44:36.1092821Z"},"assignedTo":"elastic@elasticuser.com","status":"Resolved","tags":[]} +{"determination":"NotAvailable","lastUpdateTime":"2020-09-23T19:44:36.29Z","tags":[],"alerts":{"investigationState":"UnsupportedAlertType","status":"Resolved","alertId":"da637291086161511365_-2075772905","assignedTo":"elastic@elasticuser.com","determination":null,"firstActivity":"2020-06-30T10:09:10.8889583Z","mitreTechniques":[],"resolvedTime":"2020-09-23T19:44:36.1092821Z","severity":"Low","actorName":null,"category":"SuspiciousActivity","description":"Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection.","lastUpdatedTime":"2020-09-23T19:44:37.9666667Z","title":"Suspicious 'AccessibilityEscalation' behavior was detected","classification":"FalsePositive","creationTime":"2020-06-30T10:10:16.1355657Z","entities":{"deviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","entityType":"Process","processCreationTime":"2020-06-30T10:09:10.5747992Z","processId":1324},"incidentId":12,"serviceSource":"MicrosoftDefenderATP","threatFamilyName":null,"detectionSource":"WindowsDefenderAv","devices":[{"osPlatform":"Other","osProcessor":"x64","rbacGroupId":0,"riskScore":"High","version":"Other","aadDeviceId":null,"deviceDnsName":"testserver4","mdatpDeviceId":"75a63a39f9bc5a964f417c11f6277d5bf9489f0d","rbacGroupName":null,"firstSeen":"2020-06-30T08:55:08.8320449Z","healthStatus":"Inactive","osBuild":17763}],"investigationId":null,"lastActivity":"2020-06-30T10:31:09.4165785Z"},"assignedTo":"elastic@elasticuser.com","classification":"Unknown","createdTime":"2020-06-30T09:32:31.85Z","status":"Resolved","incidentId":12,"incidentName":"12","redirectIncidentId":null,"severity":"Low"} +{"incidentId":14,"incidentName":"Activity from infrequent country","redirectIncidentId":null,"tags":[],"alerts":{"category":"SuspiciousActivity","entities":{"aadUserId":"8e24c50a-a77c-4782-813f-965009b5ddf3","accountName":"brent","entityType":"User","userPrincipalName":"brent@elasticbv.onmicrosoft.com"},"incidentId":14,"investigationState":"UnsupportedAlertType","status":"New","actorName":null,"classification":"FalsePositive","description":"Brent Murphy (brent@elasticbv.onmicrosoft.com) performed an activity. No activity was performed in United States in the past 41 days.","investigationId":null,"lastActivity":"2020-07-27T15:47:22.088Z","lastUpdatedTime":"2020-09-23T19:32:17.5433333Z","mitreTechniques":[],"serviceSource":"MicrosoftCloudAppSecurity","severity":"Medium","threatFamilyName":null,"title":"Activity from infrequent country","assignedTo":"elastic@elasticuser.com","detectionSource":"MCAS","devices":[],"alertId":"caA214771F-6AB0-311D-B2B0-BECD3B4A967B","creationTime":"2020-07-27T15:54:20.52207Z","determination":null,"firstActivity":"2020-07-27T15:47:22.088Z","resolvedTime":null},"classification":"Unknown","determination":"NotAvailable","lastUpdateTime":"2020-09-23T19:32:05.8366667Z","severity":"Medium","status":"Active","assignedTo":"elastic@elasticuser.com","createdTime":"2020-07-27T15:54:21.58Z"} +{"incidentId":14,"incidentName":"Activity from infrequent country","severity":"Medium","status":"Active","tags":[],"alerts":{"description":"Brent Murphy (brent@elasticbv.onmicrosoft.com) performed an activity. No activity was performed in United States in the past 41 days.","detectionSource":"MCAS","firstActivity":"2020-07-27T15:47:22.088Z","investigationId":null,"investigationState":"UnsupportedAlertType","severity":"Medium","alertId":"caA214771F-6AB0-311D-B2B0-BECD3B4A967B","category":"SuspiciousActivity","classification":"FalsePositive","determination":null,"entities":{"entityType":"Ip","ipAddress":"73.172.171.53"},"incidentId":14,"serviceSource":"MicrosoftCloudAppSecurity","status":"New","actorName":null,"title":"Activity from infrequent country","devices":[],"lastActivity":"2020-07-27T15:47:22.088Z","lastUpdatedTime":"2020-09-23T19:32:17.5433333Z","creationTime":"2020-07-27T15:54:20.52207Z","mitreTechniques":[],"resolvedTime":null,"threatFamilyName":null,"assignedTo":"elastic@elasticuser.com"},"createdTime":"2020-07-27T15:54:21.58Z","determination":"NotAvailable","lastUpdateTime":"2020-09-23T19:32:05.8366667Z","redirectIncidentId":null,"assignedTo":"elastic@elasticuser.com","classification":"Unknown"} diff --git a/x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log-expected.json b/x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log-expected.json new file mode 100644 index 00000000000..1f81a57a98f --- /dev/null +++ b/x-pack/filebeat/module/microsoft/m365_defender/test/m365_defender-test.ndjson.log-expected.json @@ -0,0 +1,611 @@ +[ + { + "@timestamp": "2020-09-23T19:44:36.29Z", + "cloud.provider": "azure", + "event.action": "Malware", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 892514711800, + "event.end": "2020-06-30T09:46:15.0876676Z", + "event.id": "da637291063515066999_-2102938302", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftDefenderATP", + "event.severity": 2, + "event.start": "2020-06-30T09:31:22.5729558Z", + "event.timezone": "UTC", + "event.type": [ + "end" + ], + "file.hash.sha1": "ffb1670c6c6a9c5b4c5cea8b6b8e68d62e7ff281", + "file.hash.sha256": "fd46705c4f67a8ef16e76259ca6d6253241e51a1f8952223145f92aa1907d356", + "file.name": "amsistream-1D89ECED25A52AB98B76FF619B7BA07A", + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 0, + "message": "'Mountsi' malware was detected", + "microsoft.m365_defender.alerts.assignedTo": "Automation", + "microsoft.m365_defender.alerts.creationTime": "2020-06-30T09:32:31.4579225Z", + "microsoft.m365_defender.alerts.detectionSource": "WindowsDefenderAv", + "microsoft.m365_defender.alerts.devices": [ + { + "deviceDnsName": "TestServer4", + "firstSeen": "2020-06-30T08:55:08.8320449Z", + "healthStatus": "Inactive", + "mdatpDeviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "osBuild": 17763, + "osPlatform": "Other", + "osProcessor": "x64", + "rbacGroupId": 0, + "riskScore": "High", + "version": "Other" + } + ], + "microsoft.m365_defender.alerts.entities.deviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "microsoft.m365_defender.alerts.entities.entityType": "File", + "microsoft.m365_defender.alerts.incidentId": "12", + "microsoft.m365_defender.alerts.investigationId": 9, + "microsoft.m365_defender.alerts.investigationState": "Benign", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-08-26T09:41:27.7233333Z", + "microsoft.m365_defender.alerts.resolvedTime": "2020-06-30T11:13:12.2680434Z", + "microsoft.m365_defender.alerts.severity": "Informational", + "microsoft.m365_defender.alerts.status": "Resolved", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "12", + "microsoft.m365_defender.incidentName": "12", + "microsoft.m365_defender.status": "Resolved", + "observer.name": "MicrosoftDefenderATP", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "related.hash": [ + "ffb1670c6c6a9c5b4c5cea8b6b8e68d62e7ff281", + "fd46705c4f67a8ef16e76259ca6d6253241e51a1f8952223145f92aa1907d356" + ], + "rule.description": "Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nThis detection might indicate that the malware was stopped from delivering its payload. However, it is prudent to check the machine for signs of infection.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "Malware" + }, + { + "@timestamp": "2020-09-23T19:44:36.29Z", + "cloud.provider": "azure", + "event.action": "Malware", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 892514711800, + "event.end": "2020-06-30T09:46:15.0876676Z", + "event.id": "da637291063515066999_-2102938302", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftDefenderATP", + "event.severity": 2, + "event.start": "2020-06-30T09:31:22.5729558Z", + "event.timezone": "UTC", + "event.type": [ + "end" + ], + "file.hash.sha1": "ffb1670c6c6a9c5b4c5cea8b6b8e68d62e7ff281", + "file.hash.sha256": "fd46705c4f67a8ef16e76259ca6d6253241e51a1f8952223145f92aa1907d356", + "file.name": "amsistream-B103C1A335BDB049E617D1AC4A41FCDC", + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 2071, + "message": "'Mountsi' malware was detected", + "microsoft.m365_defender.alerts.assignedTo": "Automation", + "microsoft.m365_defender.alerts.creationTime": "2020-06-30T09:32:31.4579225Z", + "microsoft.m365_defender.alerts.detectionSource": "WindowsDefenderAv", + "microsoft.m365_defender.alerts.devices": [ + { + "deviceDnsName": "TestServer4", + "firstSeen": "2020-06-30T08:55:08.8320449Z", + "healthStatus": "Inactive", + "mdatpDeviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "osBuild": 17763, + "osPlatform": "Other", + "osProcessor": "x64", + "rbacGroupId": 0, + "riskScore": "High", + "version": "Other" + } + ], + "microsoft.m365_defender.alerts.entities.deviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "microsoft.m365_defender.alerts.entities.entityType": "File", + "microsoft.m365_defender.alerts.incidentId": "12", + "microsoft.m365_defender.alerts.investigationId": 9, + "microsoft.m365_defender.alerts.investigationState": "Benign", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-08-26T09:41:27.7233333Z", + "microsoft.m365_defender.alerts.resolvedTime": "2020-06-30T11:13:12.2680434Z", + "microsoft.m365_defender.alerts.severity": "Informational", + "microsoft.m365_defender.alerts.status": "Resolved", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "12", + "microsoft.m365_defender.incidentName": "12", + "microsoft.m365_defender.status": "Resolved", + "observer.name": "MicrosoftDefenderATP", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "related.hash": [ + "ffb1670c6c6a9c5b4c5cea8b6b8e68d62e7ff281", + "fd46705c4f67a8ef16e76259ca6d6253241e51a1f8952223145f92aa1907d356" + ], + "rule.description": "Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nThis detection might indicate that the malware was stopped from delivering its payload. However, it is prudent to check the machine for signs of infection.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "Malware" + }, + { + "@timestamp": "2020-09-23T19:44:36.29Z", + "cloud.provider": "azure", + "event.action": "Malware", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 0, + "event.end": "2020-06-30T10:07:44.3144099Z", + "event.id": "da637291085389812387_-1296910232", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftDefenderATP", + "event.severity": 2, + "event.start": "2020-06-30T10:07:44.3144099Z", + "event.timezone": "UTC", + "event.type": [ + "end" + ], + "file.hash.sha1": "d1bb29ce3d01d01451e3623132545d5f577a1bd6", + "file.hash.sha256": "ce8d3a3811a3bf923902d6924532308506fe5d024435ddee0cabf90ad9b29f6a", + "file.name": "SB.xsl", + "file.path": "C:\\Windows\\Temp\\sb-sim-temp-ikyxqi\\sb_10554_bs_h4qpk5", + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 4142, + "message": "'Exeselrun' malware was detected", + "microsoft.m365_defender.alerts.assignedTo": "Automation", + "microsoft.m365_defender.alerts.creationTime": "2020-06-30T10:08:58.9655663Z", + "microsoft.m365_defender.alerts.detectionSource": "WindowsDefenderAv", + "microsoft.m365_defender.alerts.devices": [ + { + "deviceDnsName": "testserver4", + "firstSeen": "2020-06-30T08:55:08.8320449Z", + "healthStatus": "Inactive", + "mdatpDeviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "osBuild": 17763, + "osPlatform": "Other", + "osProcessor": "x64", + "rbacGroupId": 0, + "riskScore": "High", + "version": "Other" + } + ], + "microsoft.m365_defender.alerts.entities.deviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "microsoft.m365_defender.alerts.entities.entityType": "File", + "microsoft.m365_defender.alerts.incidentId": "12", + "microsoft.m365_defender.alerts.investigationId": 9, + "microsoft.m365_defender.alerts.investigationState": "Benign", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-08-26T09:41:27.7233333Z", + "microsoft.m365_defender.alerts.resolvedTime": "2020-06-30T11:13:12.2680434Z", + "microsoft.m365_defender.alerts.severity": "Informational", + "microsoft.m365_defender.alerts.status": "Resolved", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "12", + "microsoft.m365_defender.incidentName": "12", + "microsoft.m365_defender.status": "Resolved", + "observer.name": "MicrosoftDefenderATP", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "related.hash": [ + "d1bb29ce3d01d01451e3623132545d5f577a1bd6", + "ce8d3a3811a3bf923902d6924532308506fe5d024435ddee0cabf90ad9b29f6a" + ], + "rule.description": "Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nThis detection might indicate that the malware was stopped from delivering its payload. However, it is prudent to check the machine for signs of infection.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "Malware" + }, + { + "@timestamp": "2020-09-23T19:44:36.29Z", + "cloud.provider": "azure", + "event.action": "Malware", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 0, + "event.end": "2020-06-30T10:07:44.333733Z", + "event.id": "da637291085411733957_-1043898914", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftDefenderATP", + "event.severity": 2, + "event.start": "2020-06-30T10:07:44.333733Z", + "event.timezone": "UTC", + "event.type": [ + "end" + ], + "file.name": "SB.xsl", + "file.path": "C:\\Windows\\Temp\\sb-sim-temp-ikyxqi\\sb_10554_bs_h4qpk5", + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 6249, + "message": "An active 'Exeselrun' malware was detected", + "microsoft.m365_defender.alerts.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.alerts.creationTime": "2020-06-30T10:09:01.1569718Z", + "microsoft.m365_defender.alerts.detectionSource": "WindowsDefenderAv", + "microsoft.m365_defender.alerts.devices": [ + { + "deviceDnsName": "TestServer4", + "firstSeen": "2020-06-30T08:55:08.8320449Z", + "healthStatus": "Inactive", + "mdatpDeviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "osBuild": 17763, + "osPlatform": "Other", + "osProcessor": "x64", + "rbacGroupId": 0, + "riskScore": "High", + "version": "Other" + } + ], + "microsoft.m365_defender.alerts.entities.deviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "microsoft.m365_defender.alerts.entities.entityType": "File", + "microsoft.m365_defender.alerts.incidentId": "12", + "microsoft.m365_defender.alerts.investigationId": 9, + "microsoft.m365_defender.alerts.investigationState": "Benign", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-08-26T09:41:27.7233333Z", + "microsoft.m365_defender.alerts.resolvedTime": "2020-06-30T11:13:12.2680434Z", + "microsoft.m365_defender.alerts.severity": "Low", + "microsoft.m365_defender.alerts.status": "Resolved", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "12", + "microsoft.m365_defender.incidentName": "12", + "microsoft.m365_defender.status": "Resolved", + "observer.name": "MicrosoftDefenderATP", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "rule.description": "Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "Malware" + }, + { + "@timestamp": "2020-09-23T19:44:36.29Z", + "cloud.provider": "azure", + "event.action": "SuspiciousActivity", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 1318527620200, + "event.end": "2020-06-30T10:31:09.4165785Z", + "event.id": "da637291086161511365_-2075772905", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftDefenderATP", + "event.severity": 2, + "event.start": "2020-06-30T10:09:10.8889583Z", + "event.timezone": "UTC", + "event.type": [ + "end" + ], + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 8376, + "message": "Suspicious 'AccessibilityEscalation' behavior was detected", + "microsoft.m365_defender.alerts.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.alerts.classification": "FalsePositive", + "microsoft.m365_defender.alerts.creationTime": "2020-06-30T10:10:16.1355657Z", + "microsoft.m365_defender.alerts.detectionSource": "WindowsDefenderAv", + "microsoft.m365_defender.alerts.devices": [ + { + "deviceDnsName": "testserver4", + "firstSeen": "2020-06-30T08:55:08.8320449Z", + "healthStatus": "Inactive", + "mdatpDeviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "osBuild": 17763, + "osPlatform": "Other", + "osProcessor": "x64", + "rbacGroupId": 0, + "riskScore": "High", + "version": "Other" + } + ], + "microsoft.m365_defender.alerts.entities.deviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "microsoft.m365_defender.alerts.entities.entityType": "Process", + "microsoft.m365_defender.alerts.incidentId": "12", + "microsoft.m365_defender.alerts.investigationState": "UnsupportedAlertType", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-09-23T19:44:37.9666667Z", + "microsoft.m365_defender.alerts.resolvedTime": "2020-09-23T19:44:36.1092821Z", + "microsoft.m365_defender.alerts.severity": "Low", + "microsoft.m365_defender.alerts.status": "Resolved", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "12", + "microsoft.m365_defender.incidentName": "12", + "microsoft.m365_defender.status": "Resolved", + "observer.name": "MicrosoftDefenderATP", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "process.pid": 6720, + "process.start": "2020-06-30T10:31:04.1092404Z", + "rule.description": "Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "SuspiciousActivity" + }, + { + "@timestamp": "2020-09-23T19:44:36.29Z", + "cloud.provider": "azure", + "event.action": "SuspiciousActivity", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 1318527620200, + "event.end": "2020-06-30T10:31:09.4165785Z", + "event.id": "da637291086161511365_-2075772905", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftDefenderATP", + "event.severity": 2, + "event.start": "2020-06-30T10:09:10.8889583Z", + "event.timezone": "UTC", + "event.type": [ + "end" + ], + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 10542, + "message": "Suspicious 'AccessibilityEscalation' behavior was detected", + "microsoft.m365_defender.alerts.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.alerts.classification": "FalsePositive", + "microsoft.m365_defender.alerts.creationTime": "2020-06-30T10:10:16.1355657Z", + "microsoft.m365_defender.alerts.detectionSource": "WindowsDefenderAv", + "microsoft.m365_defender.alerts.devices": [ + { + "deviceDnsName": "testserver4", + "firstSeen": "2020-06-30T08:55:08.8320449Z", + "healthStatus": "Inactive", + "mdatpDeviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "osBuild": 17763, + "osPlatform": "Other", + "osProcessor": "x64", + "rbacGroupId": 0, + "riskScore": "High", + "version": "Other" + } + ], + "microsoft.m365_defender.alerts.entities.accountName": "", + "microsoft.m365_defender.alerts.entities.entityType": "User", + "microsoft.m365_defender.alerts.incidentId": "12", + "microsoft.m365_defender.alerts.investigationState": "UnsupportedAlertType", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-09-23T19:44:37.9666667Z", + "microsoft.m365_defender.alerts.resolvedTime": "2020-09-23T19:44:36.1092821Z", + "microsoft.m365_defender.alerts.severity": "Low", + "microsoft.m365_defender.alerts.status": "Resolved", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "12", + "microsoft.m365_defender.incidentName": "12", + "microsoft.m365_defender.status": "Resolved", + "observer.name": "MicrosoftDefenderATP", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "rule.description": "Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "SuspiciousActivity" + }, + { + "@timestamp": "2020-09-23T19:44:36.29Z", + "cloud.provider": "azure", + "event.action": "SuspiciousActivity", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 1318527620200, + "event.end": "2020-06-30T10:31:09.4165785Z", + "event.id": "da637291086161511365_-2075772905", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftDefenderATP", + "event.severity": 2, + "event.start": "2020-06-30T10:09:10.8889583Z", + "event.timezone": "UTC", + "event.type": [ + "end" + ], + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 12598, + "message": "Suspicious 'AccessibilityEscalation' behavior was detected", + "microsoft.m365_defender.alerts.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.alerts.classification": "FalsePositive", + "microsoft.m365_defender.alerts.creationTime": "2020-06-30T10:10:16.1355657Z", + "microsoft.m365_defender.alerts.detectionSource": "WindowsDefenderAv", + "microsoft.m365_defender.alerts.devices": [ + { + "deviceDnsName": "testserver4", + "firstSeen": "2020-06-30T08:55:08.8320449Z", + "healthStatus": "Inactive", + "mdatpDeviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "osBuild": 17763, + "osPlatform": "Other", + "osProcessor": "x64", + "rbacGroupId": 0, + "riskScore": "High", + "version": "Other" + } + ], + "microsoft.m365_defender.alerts.entities.deviceId": "75a63a39f9bc5a964f417c11f6277d5bf9489f0d", + "microsoft.m365_defender.alerts.entities.entityType": "Process", + "microsoft.m365_defender.alerts.incidentId": "12", + "microsoft.m365_defender.alerts.investigationState": "UnsupportedAlertType", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-09-23T19:44:37.9666667Z", + "microsoft.m365_defender.alerts.resolvedTime": "2020-09-23T19:44:36.1092821Z", + "microsoft.m365_defender.alerts.severity": "Low", + "microsoft.m365_defender.alerts.status": "Resolved", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "12", + "microsoft.m365_defender.incidentName": "12", + "microsoft.m365_defender.status": "Resolved", + "observer.name": "MicrosoftDefenderATP", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "process.pid": 1324, + "process.start": "2020-06-30T10:09:10.5747992Z", + "rule.description": "Malware and unwanted software are undesirable applications that perform annoying, disruptive, or harmful actions on affected machines. Some of these undesirable applications can replicate and spread from one machine to another. Others are able to receive commands from remote attackers and perform activities associated with cyber attacks.\n\nA malware is considered active if it is found running on the machine or it already has persistence mechanisms in place. Active malware detections are assigned higher severity ratings.\n\nBecause this malware was active, take precautionary measures and check for residual signs of infection.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "SuspiciousActivity" + }, + { + "@timestamp": "2020-09-23T19:32:05.8366667Z", + "cloud.provider": "azure", + "event.action": "SuspiciousActivity", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 0, + "event.end": "2020-07-27T15:47:22.088Z", + "event.id": "caA214771F-6AB0-311D-B2B0-BECD3B4A967B", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftCloudAppSecurity", + "event.severity": 3, + "event.start": "2020-07-27T15:47:22.088Z", + "event.timezone": "UTC", + "fileset.name": "m365_defender", + "host.user.id": "8e24c50a-a77c-4782-813f-965009b5ddf3", + "host.user.name": "brent@elasticbv.onmicrosoft.com", + "input.type": "log", + "log.offset": 14764, + "message": "Activity from infrequent country", + "microsoft.m365_defender.alerts.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.alerts.classification": "FalsePositive", + "microsoft.m365_defender.alerts.creationTime": "2020-07-27T15:54:20.52207Z", + "microsoft.m365_defender.alerts.detectionSource": "MCAS", + "microsoft.m365_defender.alerts.entities.accountName": "brent", + "microsoft.m365_defender.alerts.entities.entityType": "User", + "microsoft.m365_defender.alerts.incidentId": "14", + "microsoft.m365_defender.alerts.investigationState": "UnsupportedAlertType", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-09-23T19:32:17.5433333Z", + "microsoft.m365_defender.alerts.severity": "Medium", + "microsoft.m365_defender.alerts.status": "New", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "14", + "microsoft.m365_defender.incidentName": "Activity from infrequent country", + "microsoft.m365_defender.status": "Active", + "observer.name": "MicrosoftCloudAppSecurity", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "related.user": [ + "brent@elasticbv.onmicrosoft.com" + ], + "rule.description": "Brent Murphy (brent@elasticbv.onmicrosoft.com) performed an activity. No activity was performed in United States in the past 41 days.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "SuspiciousActivity" + }, + { + "@timestamp": "2020-09-23T19:32:05.8366667Z", + "cloud.provider": "azure", + "event.action": "SuspiciousActivity", + "event.category": [ + "host" + ], + "event.dataset": "microsoft.m365_defender", + "event.duration": 0, + "event.end": "2020-07-27T15:47:22.088Z", + "event.id": "caA214771F-6AB0-311D-B2B0-BECD3B4A967B", + "event.kind": "alert", + "event.module": "microsoft", + "event.provider": "MicrosoftCloudAppSecurity", + "event.severity": 3, + "event.start": "2020-07-27T15:47:22.088Z", + "event.timezone": "UTC", + "fileset.name": "m365_defender", + "input.type": "log", + "log.offset": 16091, + "message": "Activity from infrequent country", + "microsoft.m365_defender.alerts.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.alerts.classification": "FalsePositive", + "microsoft.m365_defender.alerts.creationTime": "2020-07-27T15:54:20.52207Z", + "microsoft.m365_defender.alerts.detectionSource": "MCAS", + "microsoft.m365_defender.alerts.entities.entityType": "Ip", + "microsoft.m365_defender.alerts.entities.ipAddress": "73.172.171.53", + "microsoft.m365_defender.alerts.incidentId": "14", + "microsoft.m365_defender.alerts.investigationState": "UnsupportedAlertType", + "microsoft.m365_defender.alerts.lastUpdatedTime": "2020-09-23T19:32:17.5433333Z", + "microsoft.m365_defender.alerts.severity": "Medium", + "microsoft.m365_defender.alerts.status": "New", + "microsoft.m365_defender.assignedTo": "elastic@elasticuser.com", + "microsoft.m365_defender.classification": "Unknown", + "microsoft.m365_defender.determination": "NotAvailable", + "microsoft.m365_defender.incidentId": "14", + "microsoft.m365_defender.incidentName": "Activity from infrequent country", + "microsoft.m365_defender.status": "Active", + "observer.name": "MicrosoftCloudAppSecurity", + "observer.product": "365 Defender", + "observer.vendor": "Microsoft", + "rule.description": "Brent Murphy (brent@elasticbv.onmicrosoft.com) performed an activity. No activity was performed in United States in the past 41 days.", + "service.type": "microsoft", + "tags": [ + "m365-defender", + "forwarded" + ], + "threat.framework": "MITRE ATT&CK", + "threat.technique.name": "SuspiciousActivity" + } +] \ No newline at end of file diff --git a/x-pack/filebeat/modules.d/microsoft.yml.disabled b/x-pack/filebeat/modules.d/microsoft.yml.disabled index 09c7211e179..63bcc20897a 100644 --- a/x-pack/filebeat/modules.d/microsoft.yml.disabled +++ b/x-pack/filebeat/modules.d/microsoft.yml.disabled @@ -13,7 +13,20 @@ # Oauth Client Secret #var.oauth2.client.secret: "" - + + # Oauth Token URL, should include the tenant ID + #var.oauth2.token_url: "https://login.microsoftonline.com/TENANT-ID/oauth2/token" + m365_defender: + enabled: true + # How often the API should be polled + #var.interval: 5m + + # Oauth Client ID + #var.oauth2.client.id: "" + + # Oauth Client Secret + #var.oauth2.client.secret: "" + # Oauth Token URL, should include the tenant ID #var.oauth2.token_url: "https://login.microsoftonline.com/TENANT-ID/oauth2/token" dhcp: From 0dd24289fa493ec742a54ad791cd7c3ed4bedf0f Mon Sep 17 00:00:00 2001 From: Marc Guasch Date: Tue, 6 Oct 2020 12:24:51 +0200 Subject: [PATCH 081/156] [Packetbeat] New SIP protocol (#21221) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * new protocol:sip:Make a directory and Readme file. new protocol:sip:update include list new protocol:sip:initial blank file DNSをベースとしてまずはDNSでやっている内容を解析開始・・・コメント付け中。 読み進めた分更新 パーサの実装を開始 パーサをのデコーダをsipPlugin内に移設もろもろ リクエスト、レスポンス判定を追加 SIPのパース, SDPのパース追加、パーサをいろいろばらばらに。醜い・・・ ヘッダパース系メソッドをsipMessageのメンバに変更 バッファリングの仕組みのプロトタイプ作成 ファイル分割、オブジェクト毎にファイルを分割。その他実装を進めているところ。とちゅう publish methodの実装 一部エラーハンドリングを追加 TODO更新とデータ構造を追加 ヘッダ処理諸々追加,途中 README TODO更新 ' 実働確認用に追加 フィールド名にsip.を付与、unixtimenanoをフィールドに追加(デフォルトのtimestampだとSIP信号を並び替えるのに精度不足なため。) フィールド命名規則を更新 Added english description change field name align the indents fields.yml update about timestamp テストケース追加 added testcase add testcases add testcases and fixed some bug cases add test cases add testcase parseSIPHeaders fixed bug cases. comment and refactoring update testcases add monitoring element named 'sip.message_ignored' move publish function call from expireBuffer to callback function when buffer expired. add testcase, bufferExpire remove unnecessary pkg add testcase at publish method add, edit and migrate test cases modify time duration change timer code remove fragmneted process translate comments add linux amd64 binary Comments translated update informations add windows bin update TODO list add no mandantory header parse check Add compact-form test case Add compact-form test case Add compact-form test case Add compact-form test case support compact form TODO list update add sip uri parser add detail mode add binary remove unnecessary file bug fix:broken when response parse in detail mode bug fix:detail mode modify detail mode modify detail mode Update Readme about compact form and parse detail sip header and request-uri Update Readme about compact form and parse detail sip header and request-uri Update Readme about compact form and parse detail sip header and request-uri Update Readme about compact form and parse detail sip header and request-uri expand config parsing options edit variable names arrangement and add text README file refine Readme message update Readme text update Readme on Configuration Go coding style was checked with golint Erase duplicate field in field.yml, move src and dst fields into sip filed Update docs, fields.asciidoc Update docs, fields.asciidoc * Fixes and style changes * Refactor to be more similar to http parser and add system tests * Add event action * Add related fields * Update fields and docs * Add sip to docs * Add beta warning * Parse SDP, Contact, Via and auth * Add suggestions Co-authored-by: tj8000rpm --- CHANGELOG.next.asciidoc | 1 + packetbeat/_meta/config/beat.docker.yml.tmpl | 3 + .../_meta/config/beat.reference.yml.tmpl | 13 + packetbeat/_meta/config/beat.yml.tmpl | 4 + packetbeat/_meta/sample_outputs/sip.json | 77 ++ packetbeat/docs/fields.asciidoc | 662 +++++++++++++++++ packetbeat/docs/shared-protocol-list.asciidoc | 1 + packetbeat/include/list.go | 1 + packetbeat/packetbeat.docker.yml | 3 + packetbeat/packetbeat.reference.yml | 13 + packetbeat/packetbeat.yml | 4 + packetbeat/pb/ecs.go | 6 +- packetbeat/pb/event.go | 47 +- packetbeat/protos/sip/README.md | 123 ++++ packetbeat/protos/sip/_meta/fields.yml | 238 +++++++ packetbeat/protos/sip/config.go | 41 ++ packetbeat/protos/sip/event.go | 102 +++ packetbeat/protos/sip/fields.go | 36 + packetbeat/protos/sip/parser.go | 469 ++++++++++++ packetbeat/protos/sip/plugin.go | 617 ++++++++++++++++ packetbeat/protos/sip/plugin_test.go | 168 +++++ .../tests/system/config/golden-tests.yml | 8 + .../tests/system/config/packetbeat.yml.j2 | 3 + .../tests/system/golden/sip-expected.json | 668 ++++++++++++++++++ .../sip_authenticated_register-expected.json | 142 ++++ packetbeat/tests/system/pcaps/sip.pcap | Bin 0 -> 6632 bytes .../pcaps/sip_authenticated_register.pcap | Bin 0 -> 1654 bytes .../tests/system/test_0099_golden_files.py | 3 + 28 files changed, 3451 insertions(+), 2 deletions(-) create mode 100644 packetbeat/_meta/sample_outputs/sip.json create mode 100644 packetbeat/protos/sip/README.md create mode 100644 packetbeat/protos/sip/_meta/fields.yml create mode 100644 packetbeat/protos/sip/config.go create mode 100644 packetbeat/protos/sip/event.go create mode 100644 packetbeat/protos/sip/fields.go create mode 100644 packetbeat/protos/sip/parser.go create mode 100644 packetbeat/protos/sip/plugin.go create mode 100644 packetbeat/protos/sip/plugin_test.go create mode 100644 packetbeat/tests/system/golden/sip-expected.json create mode 100644 packetbeat/tests/system/golden/sip_authenticated_register-expected.json create mode 100644 packetbeat/tests/system/pcaps/sip.pcap create mode 100644 packetbeat/tests/system/pcaps/sip_authenticated_register.pcap diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index c86fc85e347..15c2f9fe8a8 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -746,6 +746,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d port. {pull}19209[19209] - Add ECS fields for x509 certs, event categorization, and related IP info. {pull}19167[19167] - Add 100-continue support {issue}15830[15830] {pull}19349[19349] +- Add initial SIP protocol support {pull}21221[21221] *Functionbeat* diff --git a/packetbeat/_meta/config/beat.docker.yml.tmpl b/packetbeat/_meta/config/beat.docker.yml.tmpl index f4f0db1f7e6..f9b573edfeb 100644 --- a/packetbeat/_meta/config/beat.docker.yml.tmpl +++ b/packetbeat/_meta/config/beat.docker.yml.tmpl @@ -36,3 +36,6 @@ packetbeat.protocols.cassandra: packetbeat.protocols.tls: ports: [443, 993, 995, 5223, 8443, 8883, 9243] + +packetbeat.protocols.sip: + ports: [5060] diff --git a/packetbeat/_meta/config/beat.reference.yml.tmpl b/packetbeat/_meta/config/beat.reference.yml.tmpl index 1a3aab315d7..722c47102dc 100644 --- a/packetbeat/_meta/config/beat.reference.yml.tmpl +++ b/packetbeat/_meta/config/beat.reference.yml.tmpl @@ -531,6 +531,19 @@ packetbeat.protocols: # Set to true to publish fields with null values in events. #keep_null: false +- type: sip + # Configure the ports where to listen for SIP traffic. You can disable the SIP protocol by commenting out the list of ports. + ports: [5060] + + # Parse the authorization headers + parse_authorization: true + + # Parse body contents (only when body is SDP) + parse_body: true + + # Preserve original contents in event.original + keep_original: true + {{header "Monitored processes"}} # Packetbeat can enrich events with information about the process associated diff --git a/packetbeat/_meta/config/beat.yml.tmpl b/packetbeat/_meta/config/beat.yml.tmpl index fb221cba3c9..c5f9cfc0c23 100644 --- a/packetbeat/_meta/config/beat.yml.tmpl +++ b/packetbeat/_meta/config/beat.yml.tmpl @@ -101,6 +101,10 @@ packetbeat.protocols: - 8883 # Secure MQTT - 9243 # Elasticsearch +- type: sip + # Configure the ports where to listen for SIP traffic. You can disable the SIP protocol by commenting out the list of ports. + ports: [5060] + {{header "Elasticsearch template setting"}} setup.template.settings: diff --git a/packetbeat/_meta/sample_outputs/sip.json b/packetbeat/_meta/sample_outputs/sip.json new file mode 100644 index 00000000000..4a57d85908f --- /dev/null +++ b/packetbeat/_meta/sample_outputs/sip.json @@ -0,0 +1,77 @@ +{ + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "192.168.1.2", + "client.port": 5060, + "destination.ip": "212.242.33.35", + "destination.port": 5060, + "event.action": "sip_register", + "event.category": [ + "network", + "protocol", + "authentication" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "REGISTER sip:sip.cybercity.dk SIP/2.0\r\nVia: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp112903503-43a64480192.168.1.2;rport\r\nFrom: ;tag=6bac55c\r\nTo: \r\nCall-ID: 578222729-4665d775@578222732-4665d772\r\nContact: ;expires=1200;q=0.500\r\nExpires: 1200\r\nCSeq: 75 REGISTER\r\nContent-Length: 0\r\nAuthorization: Digest username=\"voi18062\",realm=\"sip.cybercity.dk\",uri=\"sip:192.168.1.2\",nonce=\"1701b22972b90f440c3e4eb250842bb\",opaque=\"1701a1351f70795\",nc=\"00000001\",response=\"79a0543188495d288c9ebbe0c881abdc\"\r\nMax-Forwards: 70\r\nUser-Agent: Nero SIPPS IP Phone Version 2.0.51.16\r\n\r\n", + "event.sequence": 75, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:dOa61R2NaaJsJlcFAiMIiyXX+Kk=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "sip.cybercity.dk" + ], + "related.ip": [ + "192.168.1.2", + "212.242.33.35" + ], + "related.user": [ + "voi18062" + ], + "server.ip": "212.242.33.35", + "server.port": 5060, + "sip.auth.realm": "sip.cybercity.dk", + "sip.auth.scheme": "Digest", + "sip.auth.uri.host": "192.168.1.2", + "sip.auth.uri.original": "sip:192.168.1.2", + "sip.auth.uri.scheme": "sip", + "sip.call_id": "578222729-4665d775@578222732-4665d772", + "sip.contact.uri.host": "sip.cybercity.dk", + "sip.contact.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.contact.uri.scheme": "sip", + "sip.contact.uri.username": "voi18062", + "sip.cseq.code": 75, + "sip.cseq.method": "REGISTER", + "sip.from.tag": "6bac55c", + "sip.from.uri.host": "sip.cybercity.dk", + "sip.from.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "voi18062", + "sip.max_forwards": 70, + "sip.method": "REGISTER", + "sip.to.uri.host": "sip.cybercity.dk", + "sip.to.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "voi18062", + "sip.type": "request", + "sip.uri.host": "sip.cybercity.dk", + "sip.uri.original": "sip:sip.cybercity.dk", + "sip.uri.scheme": "sip", + "sip.user_agent.original": "Nero SIPPS IP Phone Version 2.0.51.16", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp112903503-43a64480192.168.1.2;rport" + ], + "source.ip": "192.168.1.2", + "source.port": 5060, + "status": "OK", + "type": "sip", + "user.name": "voi18062" +} diff --git a/packetbeat/docs/fields.asciidoc b/packetbeat/docs/fields.asciidoc index 2c73f3dd277..14ed56f1578 100644 --- a/packetbeat/docs/fields.asciidoc +++ b/packetbeat/docs/fields.asciidoc @@ -35,6 +35,7 @@ grouped in the following categories: * <> * <> * <> +* <> * <> * <> * <> @@ -11680,6 +11681,667 @@ The return value of the Redis command in a human readable format. If the Redis command has resulted in an error, this field contains the error message returned by the Redis server. +-- + +[[exported-fields-sip]] +== SIP fields + +SIP-specific event fields. + + +[float] +=== sip + +Information about SIP traffic. + + +*`sip.timestamp`*:: ++ +-- +Timestamp with nano second precision. + +type: date_nanos + +-- + +*`sip.code`*:: ++ +-- +Response status code. + +type: keyword + +-- + +*`sip.method`*:: ++ +-- +Request method. + +type: keyword + +-- + +*`sip.status`*:: ++ +-- +Response status phrase. + +type: keyword + +-- + +*`sip.type`*:: ++ +-- +Either request or response. + +type: keyword + +-- + +*`sip.version`*:: ++ +-- +SIP protocol version. + +type: keyword + +-- + +*`sip.uri.original`*:: ++ +-- +The original URI. + +type: keyword + +-- + +*`sip.uri.original.text`*:: ++ +-- +type: text + +-- + +*`sip.uri.scheme`*:: ++ +-- +The URI scheme. + +type: keyword + +-- + +*`sip.uri.username`*:: ++ +-- +The URI user name. + +type: keyword + +-- + +*`sip.uri.host`*:: ++ +-- +The URI host. + +type: keyword + +-- + +*`sip.uri.port`*:: ++ +-- +The URI port. + +type: keyword + +-- + +*`sip.accept`*:: ++ +-- +Accept header value. + +type: keyword + +-- + +*`sip.allow`*:: ++ +-- +Allowed methods. + +type: keyword + +-- + +*`sip.call_id`*:: ++ +-- +Call ID. + +type: keyword + +-- + +*`sip.content_length`*:: ++ +-- +type: long + +-- + +*`sip.content_type`*:: ++ +-- +type: keyword + +-- + +*`sip.max_forwards`*:: ++ +-- +type: long + +-- + +*`sip.supported`*:: ++ +-- +Supported methods. + +type: keyword + +-- + +*`sip.user_agent.original`*:: ++ +-- +type: keyword + +-- + +*`sip.user_agent.original.text`*:: ++ +-- +type: text + +-- + +*`sip.private.uri.original`*:: ++ +-- +Private original URI. + +type: keyword + +-- + +*`sip.private.uri.original.text`*:: ++ +-- +type: text + +-- + +*`sip.private.uri.scheme`*:: ++ +-- +Private URI scheme. + +type: keyword + +-- + +*`sip.private.uri.username`*:: ++ +-- +Private URI user name. + +type: keyword + +-- + +*`sip.private.uri.host`*:: ++ +-- +Private URI host. + +type: keyword + +-- + +*`sip.private.uri.port`*:: ++ +-- +Private URI port. + +type: keyword + +-- + +*`sip.cseq.code`*:: ++ +-- +Sequence code. + +type: keyword + +-- + +*`sip.cseq.method`*:: ++ +-- +Sequence method. + +type: keyword + +-- + +*`sip.via.original`*:: ++ +-- +The original Via value. + +type: keyword + +-- + +*`sip.via.original.text`*:: ++ +-- +type: text + +-- + +*`sip.to.display_info`*:: ++ +-- +To display info + +type: keyword + +-- + +*`sip.to.uri.original`*:: ++ +-- +To original URI + +type: keyword + +-- + +*`sip.to.uri.original.text`*:: ++ +-- +type: text + +-- + +*`sip.to.uri.scheme`*:: ++ +-- +To URI scheme + +type: keyword + +-- + +*`sip.to.uri.username`*:: ++ +-- +To URI user name + +type: keyword + +-- + +*`sip.to.uri.host`*:: ++ +-- +To URI host + +type: keyword + +-- + +*`sip.to.uri.port`*:: ++ +-- +To URI port + +type: keyword + +-- + +*`sip.to.tag`*:: ++ +-- +To tag + +type: keyword + +-- + +*`sip.from.display_info`*:: ++ +-- +From display info + +type: keyword + +-- + +*`sip.from.uri.original`*:: ++ +-- +From original URI + +type: keyword + +-- + +*`sip.from.uri.original.text`*:: ++ +-- +type: text + +-- + +*`sip.from.uri.scheme`*:: ++ +-- +From URI scheme + +type: keyword + +-- + +*`sip.from.uri.username`*:: ++ +-- +From URI user name + +type: keyword + +-- + +*`sip.from.uri.host`*:: ++ +-- +From URI host + +type: keyword + +-- + +*`sip.from.uri.port`*:: ++ +-- +From URI port + +type: keyword + +-- + +*`sip.from.tag`*:: ++ +-- +From tag + +type: keyword + +-- + +*`sip.contact.display_info`*:: ++ +-- +Contact display info + +type: keyword + +-- + +*`sip.contact.uri.original`*:: ++ +-- +Contact original URI + +type: keyword + +-- + +*`sip.contact.uri.original.text`*:: ++ +-- +type: text + +-- + +*`sip.contact.uri.scheme`*:: ++ +-- +Contat URI scheme + +type: keyword + +-- + +*`sip.contact.uri.username`*:: ++ +-- +Contact URI user name + +type: keyword + +-- + +*`sip.contact.uri.host`*:: ++ +-- +Contact URI host + +type: keyword + +-- + +*`sip.contact.uri.port`*:: ++ +-- +Contact URI port + +type: keyword + +-- + +*`sip.contact.transport`*:: ++ +-- +Contact transport + +type: keyword + +-- + +*`sip.contact.line`*:: ++ +-- +Contact line + +type: keyword + +-- + +*`sip.contact.expires`*:: ++ +-- +Contact expires + +type: keyword + +-- + +*`sip.contact.q`*:: ++ +-- +Contact Q + +type: keyword + +-- + +*`sip.auth.scheme`*:: ++ +-- +Auth scheme + +type: keyword + +-- + +*`sip.auth.realm`*:: ++ +-- +Auth realm + +type: keyword + +-- + +*`sip.auth.uri.original`*:: ++ +-- +Auth original URI + +type: keyword + +-- + +*`sip.auth.uri.original.text`*:: ++ +-- +type: text + +-- + +*`sip.auth.uri.scheme`*:: ++ +-- +Auth URI scheme + +type: keyword + +-- + +*`sip.auth.uri.host`*:: ++ +-- +Auth URI host + +type: keyword + +-- + +*`sip.auth.uri.port`*:: ++ +-- +Auth URI port + +type: keyword + +-- + +*`sip.sdp.version`*:: ++ +-- +SDP version + +type: keyword + +-- + +*`sip.sdp.owner.username`*:: ++ +-- +SDP owner user name + +type: keyword + +-- + +*`sip.sdp.owner.session_id`*:: ++ +-- +SDP owner session ID + +type: keyword + +-- + +*`sip.sdp.owner.version`*:: ++ +-- +SDP owner version + +type: keyword + +-- + +*`sip.sdp.owner.ip`*:: ++ +-- +SDP owner IP + +type: ip + +-- + +*`sip.sdp.session.name`*:: ++ +-- +SDP session name + +type: keyword + +-- + +*`sip.sdp.connection.info`*:: ++ +-- +SDP connection info + +type: keyword + +-- + +*`sip.sdp.connection.address`*:: ++ +-- +SDP connection address + +type: keyword + +-- + +*`sip.sdp.body.original`*:: ++ +-- +SDP original body + +type: keyword + +-- + +*`sip.sdp.body.original.text`*:: ++ +-- +type: text + -- [[exported-fields-thrift]] diff --git a/packetbeat/docs/shared-protocol-list.asciidoc b/packetbeat/docs/shared-protocol-list.asciidoc index 3e18fc35eb8..fdac127050a 100644 --- a/packetbeat/docs/shared-protocol-list.asciidoc +++ b/packetbeat/docs/shared-protocol-list.asciidoc @@ -18,3 +18,4 @@ - Memcache - NFS - TLS + - SIP/SDP (beta) diff --git a/packetbeat/include/list.go b/packetbeat/include/list.go index 0dc1f0bd053..748d525eb2f 100644 --- a/packetbeat/include/list.go +++ b/packetbeat/include/list.go @@ -33,6 +33,7 @@ import ( _ "github.com/elastic/beats/v7/packetbeat/protos/nfs" _ "github.com/elastic/beats/v7/packetbeat/protos/pgsql" _ "github.com/elastic/beats/v7/packetbeat/protos/redis" + _ "github.com/elastic/beats/v7/packetbeat/protos/sip" _ "github.com/elastic/beats/v7/packetbeat/protos/thrift" _ "github.com/elastic/beats/v7/packetbeat/protos/tls" ) diff --git a/packetbeat/packetbeat.docker.yml b/packetbeat/packetbeat.docker.yml index edffce72694..4cf9016a926 100644 --- a/packetbeat/packetbeat.docker.yml +++ b/packetbeat/packetbeat.docker.yml @@ -37,6 +37,9 @@ packetbeat.protocols.cassandra: packetbeat.protocols.tls: ports: [443, 993, 995, 5223, 8443, 8883, 9243] +packetbeat.protocols.sip: + ports: [5060] + processors: - add_cloud_metadata: ~ - add_docker_metadata: ~ diff --git a/packetbeat/packetbeat.reference.yml b/packetbeat/packetbeat.reference.yml index 0dc551698e9..6b936240bbb 100644 --- a/packetbeat/packetbeat.reference.yml +++ b/packetbeat/packetbeat.reference.yml @@ -531,6 +531,19 @@ packetbeat.protocols: # Set to true to publish fields with null values in events. #keep_null: false +- type: sip + # Configure the ports where to listen for SIP traffic. You can disable the SIP protocol by commenting out the list of ports. + ports: [5060] + + # Parse the authorization headers + parse_authorization: true + + # Parse body contents (only when body is SDP) + parse_body: true + + # Preserve original contents in event.original + keep_original: true + # ============================ Monitored processes ============================= # Packetbeat can enrich events with information about the process associated diff --git a/packetbeat/packetbeat.yml b/packetbeat/packetbeat.yml index 53f87d73003..31c229b1ef7 100644 --- a/packetbeat/packetbeat.yml +++ b/packetbeat/packetbeat.yml @@ -101,6 +101,10 @@ packetbeat.protocols: - 8883 # Secure MQTT - 9243 # Elasticsearch +- type: sip + # Configure the ports where to listen for SIP traffic. You can disable the SIP protocol by commenting out the list of ports. + ports: [5060] + # ======================= Elasticsearch template setting ======================= setup.template.settings: diff --git a/packetbeat/pb/ecs.go b/packetbeat/pb/ecs.go index b7722c2c22a..4594f7cd8c4 100644 --- a/packetbeat/pb/ecs.go +++ b/packetbeat/pb/ecs.go @@ -54,7 +54,11 @@ type ecsRelated struct { User []string `ecs:"user"` // overridden because this needs to be an array Hash []string `ecs:"hash"` + // overridden because this needs to be an array + Hosts []string `ecs:"hosts"` // for de-dup - ipSet map[string]struct{} + ipSet map[string]struct{} + userSet map[string]struct{} + hostSet map[string]struct{} } diff --git a/packetbeat/pb/event.go b/packetbeat/pb/event.go index f0287665c0d..cd652756f3e 100644 --- a/packetbeat/pb/event.go +++ b/packetbeat/pb/event.go @@ -147,10 +147,15 @@ func (f *Fields) SetDestination(endpoint *common.Endpoint) { func (f *Fields) AddIP(ip ...string) { if f.Related == nil { f.Related = &ecsRelated{ - ipSet: make(map[string]struct{}), + ipSet: make(map[string]struct{}), + userSet: make(map[string]struct{}), + hostSet: make(map[string]struct{}), } } for _, ipAddress := range ip { + if ipAddress == "" { + continue + } if _, ok := f.Related.ipSet[ipAddress]; !ok { f.Related.ipSet[ipAddress] = struct{}{} f.Related.IP = append(f.Related.IP, ipAddress) @@ -158,6 +163,46 @@ func (f *Fields) AddIP(ip ...string) { } } +// AddUser adds the given user names to the related ECS User field +func (f *Fields) AddUser(u ...string) { + if f.Related == nil { + f.Related = &ecsRelated{ + ipSet: make(map[string]struct{}), + userSet: make(map[string]struct{}), + hostSet: make(map[string]struct{}), + } + } + for _, user := range u { + if user == "" { + continue + } + if _, ok := f.Related.userSet[user]; !ok { + f.Related.userSet[user] = struct{}{} + f.Related.User = append(f.Related.User, user) + } + } +} + +// AddHost adds the given hosts to the related ECS Hosts field +func (f *Fields) AddHost(h ...string) { + if f.Related == nil { + f.Related = &ecsRelated{ + ipSet: make(map[string]struct{}), + userSet: make(map[string]struct{}), + hostSet: make(map[string]struct{}), + } + } + for _, host := range h { + if host == "" { + continue + } + if _, ok := f.Related.hostSet[host]; !ok { + f.Related.hostSet[host] = struct{}{} + f.Related.Hosts = append(f.Related.Hosts, host) + } + } +} + func makeProcess(p *common.Process) *ecs.Process { return &ecs.Process{ Name: p.Name, diff --git a/packetbeat/protos/sip/README.md b/packetbeat/protos/sip/README.md new file mode 100644 index 00000000000..5e5962675a1 --- /dev/null +++ b/packetbeat/protos/sip/README.md @@ -0,0 +1,123 @@ +# SIP (Session Initiation Protocol) for packetbeat + +The SIP (Session Initiation Protocol) is a communications protocol for signaling and controlling multimedia communication sessions. SIP is used by many VoIP applications, not only for enterprise uses but also telecom carriers. + +SIP is a text-based protocol like HTTP. But SIP has various unique features like : +- SIP is server-client model, but its role may change in a per call basis. +- SIP is request-response model, but server may (usually) reply with many responses to a single request. +- There are many requests and responses in one call. +- It is not known when the call will end. + +## Implementation + +### Published for each SIP message (request or response) + +- SIP is not a one to one message with request and response. Also order to each message is not determined (a response may be sent after previous response). +- Therefore the SIP responses and requests are published when packetbeat receives them immediately. +- If you need all SIP messages in throughout of SIP dialog, you need to retrieve from Elasticsearch using the SIP Call ID field etc. + +### Notes +* ``transport=tcp`` is not supported yet. +* ``content-encoding`` is not supported yet. +* Default timestamp field(@timestamp) precision is not sufficient(the sip response is often send immediately when request received eg. 100 Trying). You can sort to keep the message correct order using the ``sip.timestamp``(`date_nanos`) field. +* Body parsing is partially supported for ``application/sdp`` content type only. + +## Configuration + +```yaml +- type: sip + # Configure the ports where to listen for SIP traffic. You can disable the SIP protocol by commenting out the list of ports. + ports: [5060] + + # Parse the authorization headers + parse_authorization: true + + # Parse body contents (only when body is SDP) + parse_body: true + + # Preserve original contents in event.original + keep_original: true +``` + +### Sample Full JSON Output + +```json +{ + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "192.168.1.2", + "client.port": 5060, + "destination.ip": "212.242.33.35", + "destination.port": 5060, + "event.action": "sip_register", + "event.category": [ + "network", + "protocol", + "authentication" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "REGISTER sip:sip.cybercity.dk SIP/2.0\r\nVia: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp112903503-43a64480192.168.1.2;rport\r\nFrom: ;tag=6bac55c\r\nTo: \r\nCall-ID: 578222729-4665d775@578222732-4665d772\r\nContact: ;expires=1200;q=0.500\r\nExpires: 1200\r\nCSeq: 75 REGISTER\r\nContent-Length: 0\r\nAuthorization: Digest username=\"voi18062\",realm=\"sip.cybercity.dk\",uri=\"sip:192.168.1.2\",nonce=\"1701b22972b90f440c3e4eb250842bb\",opaque=\"1701a1351f70795\",nc=\"00000001\",response=\"79a0543188495d288c9ebbe0c881abdc\"\r\nMax-Forwards: 70\r\nUser-Agent: Nero SIPPS IP Phone Version 2.0.51.16\r\n\r\n", + "event.sequence": 75, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:dOa61R2NaaJsJlcFAiMIiyXX+Kk=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "sip.cybercity.dk" + ], + "related.ip": [ + "192.168.1.2", + "212.242.33.35" + ], + "related.user": [ + "voi18062" + ], + "server.ip": "212.242.33.35", + "server.port": 5060, + "sip.auth.realm": "sip.cybercity.dk", + "sip.auth.scheme": "Digest", + "sip.auth.uri.host": "192.168.1.2", + "sip.auth.uri.original": "sip:192.168.1.2", + "sip.auth.uri.scheme": "sip", + "sip.call_id": "578222729-4665d775@578222732-4665d772", + "sip.contact.uri.host": "sip.cybercity.dk", + "sip.contact.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.contact.uri.scheme": "sip", + "sip.contact.uri.username": "voi18062", + "sip.cseq.code": 75, + "sip.cseq.method": "REGISTER", + "sip.from.tag": "6bac55c", + "sip.from.uri.host": "sip.cybercity.dk", + "sip.from.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "voi18062", + "sip.max_forwards": 70, + "sip.method": "REGISTER", + "sip.to.uri.host": "sip.cybercity.dk", + "sip.to.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "voi18062", + "sip.type": "request", + "sip.uri.host": "sip.cybercity.dk", + "sip.uri.original": "sip:sip.cybercity.dk", + "sip.uri.scheme": "sip", + "sip.user_agent.original": "Nero SIPPS IP Phone Version 2.0.51.16", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp112903503-43a64480192.168.1.2;rport" + ], + "source.ip": "192.168.1.2", + "source.port": 5060, + "status": "OK", + "type": "sip", + "user.name": "voi18062" +} +``` + diff --git a/packetbeat/protos/sip/_meta/fields.yml b/packetbeat/protos/sip/_meta/fields.yml new file mode 100644 index 00000000000..fcbb1349dd1 --- /dev/null +++ b/packetbeat/protos/sip/_meta/fields.yml @@ -0,0 +1,238 @@ +- key: sip + title: "SIP" + description: SIP-specific event fields. + fields: + - name: sip + type: group + description: Information about SIP traffic. + fields: + - name: timestamp + type: date_nanos + description: Timestamp with nano second precision. + - name: code + type: keyword + description: Response status code. + - name: method + type: keyword + description: Request method. + - name: status + type: keyword + description: Response status phrase. + - name: type + type: keyword + description: Either request or response. + - name: version + type: keyword + description: SIP protocol version. + - name: uri.original + type: keyword + description: The original URI. + multi_fields: + - name: text + type: text + analyzer: simple + - name: uri.scheme + type: keyword + description: The URI scheme. + - name: uri.username + type: keyword + description: The URI user name. + - name: uri.host + type: keyword + description: The URI host. + - name: uri.port + type: keyword + description: The URI port. + - name: accept + type: keyword + description: Accept header value. + - name: allow + type: keyword + description: Allowed methods. + - name: call_id + type: keyword + description: Call ID. + - name: content_length + type: long + - name: content_type + type: keyword + - name: max_forwards + type: long + - name: supported + type: keyword + description: Supported methods. + - name: user_agent.original + type: keyword + multi_fields: + - name: text + type: text + analyzer: simple + - name: private.uri.original + type: keyword + description: Private original URI. + multi_fields: + - name: text + type: text + analyzer: simple + - name: private.uri.scheme + type: keyword + description: Private URI scheme. + - name: private.uri.username + type: keyword + description: Private URI user name. + - name: private.uri.host + type: keyword + description: Private URI host. + - name: private.uri.port + type: keyword + description: Private URI port. + - name: cseq.code + type: keyword + description: Sequence code. + - name: cseq.method + type: keyword + description: Sequence method. + - name: via.original + type: keyword + description: The original Via value. + multi_fields: + - name: text + type: text + analyzer: simple + - name: to.display_info + type: keyword + description: "To display info" + - name: to.uri.original + type: keyword + description: "To original URI" + multi_fields: + - name: text + type: text + analyzer: simple + - name: to.uri.scheme + type: keyword + description: "To URI scheme" + - name: to.uri.username + type: keyword + description: "To URI user name" + - name: to.uri.host + type: keyword + description: "To URI host" + - name: to.uri.port + type: keyword + description: "To URI port" + - name: to.tag + type: keyword + description: "To tag" + - name: from.display_info + type: keyword + description: "From display info" + - name: from.uri.original + type: keyword + description: "From original URI" + multi_fields: + - name: text + type: text + analyzer: simple + - name: from.uri.scheme + type: keyword + description: "From URI scheme" + - name: from.uri.username + type: keyword + description: "From URI user name" + - name: from.uri.host + type: keyword + description: "From URI host" + - name: from.uri.port + type: keyword + description: "From URI port" + - name: from.tag + type: keyword + description: "From tag" + - name: contact.display_info + type: keyword + description: "Contact display info" + - name: contact.uri.original + type: keyword + description: "Contact original URI" + multi_fields: + - name: text + type: text + analyzer: simple + - name: contact.uri.scheme + type: keyword + description: "Contat URI scheme" + - name: contact.uri.username + type: keyword + description: "Contact URI user name" + - name: contact.uri.host + type: keyword + description: "Contact URI host" + - name: contact.uri.port + type: keyword + description: "Contact URI port" + - name: contact.transport + type: keyword + description: "Contact transport" + - name: contact.line + type: keyword + description: "Contact line" + - name: contact.expires + type: keyword + description: "Contact expires" + - name: contact.q + type: keyword + description: "Contact Q" + - name: auth.scheme + type: keyword + description: "Auth scheme" + - name: auth.realm + type: keyword + description: "Auth realm" + - name: auth.uri.original + type: keyword + description: "Auth original URI" + multi_fields: + - name: text + type: text + analyzer: simple + - name: auth.uri.scheme + type: keyword + description: "Auth URI scheme" + - name: auth.uri.host + type: keyword + description: "Auth URI host" + - name: auth.uri.port + type: keyword + description: "Auth URI port" + - name: sdp.version + type: keyword + description: "SDP version" + - name: sdp.owner.username + type: keyword + description: "SDP owner user name" + - name: sdp.owner.session_id + type: keyword + description: "SDP owner session ID" + - name: sdp.owner.version + type: keyword + description: "SDP owner version" + - name: sdp.owner.ip + type: ip + description: "SDP owner IP" + - name: sdp.session.name + type: keyword + description: "SDP session name" + - name: sdp.connection.info + type: keyword + description: "SDP connection info" + - name: sdp.connection.address + type: keyword + description: "SDP connection address" + - name: sdp.body.original + type: keyword + description: "SDP original body" + multi_fields: + - name: text + type: text + analyzer: simple diff --git a/packetbeat/protos/sip/config.go b/packetbeat/protos/sip/config.go new file mode 100644 index 00000000000..58a92606e80 --- /dev/null +++ b/packetbeat/protos/sip/config.go @@ -0,0 +1,41 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package sip + +import ( + cfg "github.com/elastic/beats/v7/packetbeat/config" + "github.com/elastic/beats/v7/packetbeat/protos" +) + +type config struct { + cfg.ProtocolCommon `config:",inline"` + ParseAuthorization bool `config:"parse_authorization"` + ParseBody bool `config:"parse_body"` + KeepOriginal bool `config:"keep_original"` +} + +var ( + defaultConfig = config{ + ProtocolCommon: cfg.ProtocolCommon{ + TransactionTimeout: protos.DefaultTransactionExpiration, + }, + ParseAuthorization: true, + ParseBody: true, + KeepOriginal: true, + } +) diff --git a/packetbeat/protos/sip/event.go b/packetbeat/protos/sip/event.go new file mode 100644 index 00000000000..fcb9112fe93 --- /dev/null +++ b/packetbeat/protos/sip/event.go @@ -0,0 +1,102 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package sip + +import ( + "github.com/elastic/beats/v7/libbeat/common" +) + +// ProtocolFields contains SIP fields. +type ProtocolFields struct { + Timestamp int64 `ecs:"timestamp"` + Code int `ecs:"code"` + Method common.NetString `ecs:"method"` + Status common.NetString `ecs:"status"` + Type string `ecs:"type"` + Version string `ecs:"version"` + + URIOriginal common.NetString `ecs:"uri.original"` + URIScheme common.NetString `ecs:"uri.scheme"` + URIUsername common.NetString `ecs:"uri.username"` + URIHost common.NetString `ecs:"uri.host"` + URIPort int `ecs:"uri.port"` + + Accept common.NetString `ecs:"accept"` + Allow []string `ecs:"allow"` + CallID common.NetString `ecs:"call_id"` + ContentLength int `ecs:"content_length"` + ContentType common.NetString `ecs:"content_type"` + MaxForwards int `ecs:"max_forwards"` + Supported []string `ecs:"supported"` + UserAgentOriginal common.NetString `ecs:"user_agent.original"` + + PrivateURIOriginal common.NetString `ecs:"private.uri.original"` + PrivateURIScheme common.NetString `ecs:"private.uri.scheme"` + PrivateURIUsername common.NetString `ecs:"private.uri.username"` + PrivateURIHost common.NetString `ecs:"private.uri.host"` + PrivateURIPort int `ecs:"private.uri.port"` + + CseqCode int `ecs:"cseq.code"` + CseqMethod common.NetString `ecs:"cseq.method"` + + ViaOriginal []common.NetString `ecs:"via.original"` + + ToDisplayInfo common.NetString `ecs:"to.display_info"` + ToURIOriginal common.NetString `ecs:"to.uri.original"` + ToURIScheme common.NetString `ecs:"to.uri.scheme"` + ToURIUsername common.NetString `ecs:"to.uri.username"` + ToURIHost common.NetString `ecs:"to.uri.host"` + ToURIPort int `ecs:"to.uri.port"` + ToTag common.NetString `ecs:"to.tag"` + + FromDisplayInfo common.NetString `ecs:"from.display_info"` + FromURIOriginal common.NetString `ecs:"from.uri.original"` + FromURIScheme common.NetString `ecs:"from.uri.scheme"` + FromURIUsername common.NetString `ecs:"from.uri.username"` + FromURIHost common.NetString `ecs:"from.uri.host"` + FromURIPort int `ecs:"from.uri.port"` + FromTag common.NetString `ecs:"from.tag"` + + ContactDisplayInfo common.NetString `ecs:"contact.display_info"` + ContactURIOriginal common.NetString `ecs:"contact.uri.original"` + ContactURIScheme common.NetString `ecs:"contact.uri.scheme"` + ContactURIUsername common.NetString `ecs:"contact.uri.username"` + ContactURIHost common.NetString `ecs:"contact.uri.host"` + ContactURIPort int `ecs:"contact.uri.port"` + ContactTransport common.NetString `ecs:"contact.transport"` + ContactLine common.NetString `ecs:"contact.line"` + ContactExpires int `ecs:"contact.expires"` + ContactQ float64 `ecs:"contact.q"` + + AuthScheme common.NetString `ecs:"auth.scheme"` + AuthRealm common.NetString `ecs:"auth.realm"` + AuthURIOriginal common.NetString `ecs:"auth.uri.original"` + AuthURIScheme common.NetString `ecs:"auth.uri.scheme"` + AuthURIHost common.NetString `ecs:"auth.uri.host"` + AuthURIPort int `ecs:"auth.uri.port"` + + SDPVersion string `ecs:"sdp.version"` + SDPOwnerUsername common.NetString `ecs:"sdp.owner.username"` + SDPOwnerSessID common.NetString `ecs:"sdp.owner.session_id"` + SDPOwnerVersion common.NetString `ecs:"sdp.owner.version"` + SDPOwnerIP common.NetString `ecs:"sdp.owner.ip"` + SDPSessName common.NetString `ecs:"sdp.session.name"` + SDPConnInfo common.NetString `ecs:"sdp.connection.info"` + SDPConnAddr common.NetString `ecs:"sdp.connection.address"` + SDPBodyOriginal common.NetString `ecs:"sdp.body.original"` +} diff --git a/packetbeat/protos/sip/fields.go b/packetbeat/protos/sip/fields.go new file mode 100644 index 00000000000..87c93ab0cad --- /dev/null +++ b/packetbeat/protos/sip/fields.go @@ -0,0 +1,36 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Code generated by beats/dev-tools/cmd/asset/asset.go - DO NOT EDIT. + +package sip + +import ( + "github.com/elastic/beats/v7/libbeat/asset" +) + +func init() { + if err := asset.SetFields("packetbeat", "sip", asset.ModuleFieldsPri, AssetSip); err != nil { + panic(err) + } +} + +// AssetSip returns asset data. +// This is the base64 encoded gzipped contents of protos/sip. +func AssetSip() string { + return "eJzEmcFy4jgQhu95ii7u8QNwm5rsVnHLhsxeKY3dxqqRJUdqQ9in35KxFGEkZqRUhZzAcX+/1Pz9ozKP8AtPazB8eAAgTgLXsNpunlcPAA2aWvOBuJJr2G6eH82ANW95DXhASdByFI2pHmB+tX4AAHgEyXp0SPtHpwHXsNdqdFcuyBvZKt0z+wbYTzWS1QLSrG15Xc0VocKHBvEeDbHecZ1Wwwh3kkll/D8uJF9dHRw5dWDvBIO1kg0MGmtuuJLVQqtWDS5kfuHpqHQT13hBMyhpEAwxGs1Uv2T2SJ1q8qhvIxqaK5e8s9RnVjl0mpmrdVpQDvUvTh1q0PNilX151lmSD6hts3Pg1h2DVqRqJVz9EjtqXinN91wykcN+7RBcHfx42VT+tn4UxHeXNrxoEb5TcNmpXV1mkonTf6jtgPSDwMjCTd1hn9Vvu+wfLxs4V8aaMRrU9l0J1dZOqBi4U4ZKoLYuxhuULuLZuiWP1TUOWbRvUwV0yBrUcGBivNo0E0Ids5i2AJt5ZM1VrjAhdjwrBL4zIWDzdJ1QklDSTqDcU7cACiX3ift/O90+rtj7rlX6yHSzDJkI3oyD/VAwa2tbV5RqlzXjju1R0p8O+BdN7qD5gRFWpdHzfK6/b/yEm8iPIbeFdBSF/JJIChWSsRSK5MZTKBCLqJCdG1UhOxZXtcG3KveYsbXfsbLG6PliIuYfMjwzfso4cPb5L9d/ObvM1y/zOKmq4WYQ7LTjslU5O1i9KphrwdaurtGl42/R4eiv7tCWsqm3K/+Y+ERLSobdgf2gJ9i5M+64ti6BzB1th7R1ESSxfS6N2H4JarXqy637t1b9TfNO+GL7Tvi7Gtivv8DC0+rTJvboIht7eNLInp9tZc+Omdljs+3ssTFDT9hcS0/EiKntIZTVVO7r72fATWs7kWJ3O5G7GjzcRYHHpz3QDZeH/CKjuy7d9Hqokm33UCHm+BCebfoQHvO9g5Nm0hTTfXUKL7gsa7stTEHxfeAasx4Nee5cm0K/FUH/WeLYSF2Jrb+N1CUMPSE1MtHnE6eyKLA4RCbuXRPEr7+0z+nw8Ojsmfbg2EB7bPa8eWxs1kwzVAWPHlfbp2f3yDGGVEeJuiw7LXkqTyfnh4JBY5eQ+dgo0JgBsHlKi5T256zw2y7x5UP74EIKev5dYsmbN1MV9dx1ItXwWkmJtS2oso8mlv9RHz2ZLCRY02g0eTG9UJkRMaGfqjmVRdf0EbjkspgviK7/AwAA///sesAq" +} diff --git a/packetbeat/protos/sip/parser.go b/packetbeat/protos/sip/parser.go new file mode 100644 index 00000000000..55e66045e95 --- /dev/null +++ b/packetbeat/protos/sip/parser.go @@ -0,0 +1,469 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package sip + +import ( + "bytes" + "errors" + "fmt" + "time" + "unicode" + + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/streambuf" + "github.com/elastic/beats/v7/packetbeat/procs" + "github.com/elastic/beats/v7/packetbeat/protos" +) + +// Http Message +type message struct { + ts time.Time + hasContentLength bool + headerOffset int + + isRequest bool + ipPortTuple common.IPPortTuple + cmdlineTuple *common.ProcessTuple + + // Info + requestURI common.NetString + method common.NetString + statusCode uint16 + statusPhrase common.NetString + version version + + // Headers + contentLength int + contentType common.NetString + userAgent common.NetString + to common.NetString + from common.NetString + cseq common.NetString + callID common.NetString + maxForwards int + via []common.NetString + allow []string + supported []string + + headers map[string][]common.NetString + size uint64 + + firstLine []byte + rawHeaders []byte + body []byte + rawData []byte +} + +type version struct { + major uint8 + minor uint8 +} + +func (v version) String() string { + return fmt.Sprintf("%d.%d", v.major, v.minor) +} + +type parserState uint8 + +const ( + stateStart parserState = iota + stateHeaders + stateBody +) + +type parser struct { +} + +type parsingInfo struct { + tuple *common.IPPortTuple + + data []byte + + parseOffset int + state parserState + bodyReceived int + + pkt *protos.Packet +} + +var ( + constCRLF = []byte("\r\n") + constSIPVersion = []byte("SIP/") + nameContentLength = []byte("content-length") + nameContentType = []byte("content-type") + nameUserAgent = []byte("user-agent") + nameTo = []byte("to") + nameFrom = []byte("from") + nameCseq = []byte("cseq") + nameCallID = []byte("call-id") + nameMaxForwards = []byte("max-forwards") + nameAllow = []byte("allow") + nameSupported = []byte("supported") + nameVia = []byte("via") +) + +func newParser() *parser { + return &parser{} +} + +func (parser *parser) parse(pi *parsingInfo) (*message, error) { + m := &message{ + ts: pi.pkt.Ts, + ipPortTuple: pi.pkt.Tuple, + cmdlineTuple: procs.ProcWatcher.FindProcessesTupleTCP(&pi.pkt.Tuple), + rawData: pi.data, + } + for pi.parseOffset < len(pi.data) { + switch pi.state { + case stateStart: + if err := parser.parseSIPLine(pi, m); err != nil { + return m, err + } + case stateHeaders: + if err := parser.parseHeaders(pi, m); err != nil { + return m, err + } + case stateBody: + parser.parseBody(pi, m) + } + } + return m, nil +} + +func (*parser) parseSIPLine(pi *parsingInfo, m *message) error { + // ignore any CRLF appearing before the start-line (RFC3261 7.5) + pi.data = bytes.TrimLeft(pi.data[pi.parseOffset:], string(constCRLF)) + + i := bytes.Index(pi.data[pi.parseOffset:], constCRLF) + if i == -1 { + return errors.New("not found expected CRLF") + } + + // Very basic tests on the first line. Just to check that + // we have what looks as a SIP message + var ( + version []byte + err error + ) + + fline := pi.data[pi.parseOffset:i] + if len(fline) < 16 { // minimum line will be "SIP/2.0 XXX OK\r\n" + if isDebug { + debugf("First line too small") + } + return errors.New("first line too small") + } + + m.firstLine = fline + + if bytes.Equal(fline[0:4], constSIPVersion) { + // RESPONSE + m.isRequest = false + version = fline[4:7] + m.statusCode, m.statusPhrase, err = parseResponseStatus(fline[8:]) + if err != nil { + if isDebug { + debugf("Failed to understand SIP response status: %s", fline[8:]) + } + return errors.New("failed to parse response status") + } + + if isDebug { + debugf("SIP status_code=%d, status_phrase=%s", m.statusCode, m.statusPhrase) + } + } else { + // REQUEST + afterMethodIdx := bytes.IndexFunc(fline, unicode.IsSpace) + afterRequestURIIdx := bytes.LastIndexFunc(fline, unicode.IsSpace) + + // Make sure we have the VERB + URI + SIP_VERSION + if afterMethodIdx == -1 || afterRequestURIIdx == -1 || afterMethodIdx == afterRequestURIIdx { + if isDebug { + debugf("Couldn't understand SIP request: %s", fline) + } + return errors.New("failed to parse SIP request") + } + + m.method = common.NetString(fline[:afterMethodIdx]) + m.requestURI = common.NetString(fline[afterMethodIdx+1 : afterRequestURIIdx]) + + versionIdx := afterRequestURIIdx + len(constSIPVersion) + 1 + if len(fline) > versionIdx && bytes.Equal(fline[afterRequestURIIdx+1:versionIdx], constSIPVersion) { + m.isRequest = true + version = fline[versionIdx:] + } else { + if isDebug { + debugf("Couldn't understand SIP version: %s", fline) + } + return errors.New("failed to parse SIP version") + } + } + + m.version.major, m.version.minor, err = parseVersion(version) + if err != nil { + if isDebug { + debugf(err.Error(), version) + } + return err + } + if isDebug { + debugf("SIP version %d.%d", m.version.major, m.version.minor) + } + + // ok so far + pi.parseOffset = i + 2 + m.headerOffset = pi.parseOffset + pi.state = stateHeaders + + return nil +} + +func parseResponseStatus(s []byte) (uint16, []byte, error) { + if isDebug { + debugf("parseResponseStatus: %s", s) + } + + var phrase []byte + p := bytes.IndexByte(s, ' ') + if p == -1 { + p = len(s) + } else { + phrase = s[p+1:] + } + statusCode, err := parseInt(s[0:p]) + if err != nil { + return 0, nil, fmt.Errorf("Unable to parse status code from [%s]", s) + } + return uint16(statusCode), phrase, nil +} + +func parseVersion(s []byte) (uint8, uint8, error) { + if len(s) < 3 { + return 0, 0, errors.New("Invalid version") + } + + major := s[0] - '0' + minor := s[2] - '0' + + return uint8(major), uint8(minor), nil +} + +func (parser *parser) parseHeaders(pi *parsingInfo, m *message) error { + // check if it isn't headers end yet with /r/n/r/n + if !(len(pi.data)-pi.parseOffset >= 2 && + bytes.Equal(pi.data[pi.parseOffset:pi.parseOffset+2], constCRLF)) { + offset, err := parser.parseHeader(m, pi.data[pi.parseOffset:]) + if err != nil { + return err + } + + pi.parseOffset += offset + + return nil + } + + m.size = uint64(pi.parseOffset + 2) + m.rawHeaders = pi.data[:m.size] + pi.data = pi.data[m.size:] + pi.parseOffset = 0 + + if m.contentLength == 0 && (m.isRequest || m.hasContentLength) { + if isDebug { + debugf("Empty content length, ignore body") + } + return nil + } + + if isDebug { + debugf("Read body") + } + + pi.state = stateBody + + return nil +} + +func (parser *parser) parseHeader(m *message, data []byte) (int, error) { + if m.headers == nil { + m.headers = make(map[string][]common.NetString) + } + + i := bytes.Index(data, []byte(":")) + if i == -1 { + // Expected \":\" in headers. Assuming incomplete + if isDebug { + debugf("ignoring incomplete header %s", data) + } + return len(data), nil + } + + // enabled if required. Allocs for parameters slow down parser big times + if isDetailed { + detailedf("Data: %s", data) + detailedf("Header: %s", data[:i]) + } + + // skip folding line + for p := i + 1; p < len(data); { + q := bytes.Index(data[p:], constCRLF) + if q == -1 { + if isDebug { + debugf("ignoring incomplete header %s", data) + } + return len(data), nil + } + + p += q + if len(data) > p && (data[p+1] == ' ' || data[p+1] == '\t') { + p = p + 2 + continue + } + + headerName := getExpandedHeaderName(bytes.ToLower(data[:i])) + headerVal := bytes.TrimSpace(data[i+1 : p]) + if isDebug { + debugf("Header: '%s' Value: '%s'\n", data[:i], headerVal) + } + + // Headers we need for parsing. Make sure we always + // capture their value + switch { + case bytes.Equal(headerName, nameMaxForwards): + m.maxForwards, _ = parseInt(headerVal) + case bytes.Equal(headerName, nameContentLength): + m.contentLength, _ = parseInt(headerVal) + m.hasContentLength = true + case bytes.Equal(headerName, nameContentType): + m.contentType = headerVal + case bytes.Equal(headerName, nameUserAgent): + m.userAgent = headerVal + case bytes.Equal(headerName, nameTo): + m.to = headerVal + case bytes.Equal(headerName, nameFrom): + m.from = headerVal + case bytes.Equal(headerName, nameCseq): + m.cseq = headerVal + case bytes.Equal(headerName, nameCallID): + m.callID = headerVal + case bytes.Equal(headerName, nameAllow): + m.allow = parseCommaSeparatedList(headerVal) + case bytes.Equal(headerName, nameSupported): + m.supported = parseCommaSeparatedList(headerVal) + case bytes.Equal(headerName, nameVia): + m.via = append(m.via, headerVal) + } + + m.headers[string(headerName)] = append( + m.headers[string(headerName)], + headerVal, + ) + + return p + 2, nil + } + + return len(data), nil +} + +func parseCommaSeparatedList(s common.NetString) (list []string) { + values := bytes.Split(s, []byte(",")) + list = make([]string, len(values)) + for idx := range values { + list[idx] = string(bytes.ToLower(bytes.Trim(values[idx], " "))) + } + return list +} + +func (*parser) parseBody(pi *parsingInfo, m *message) { + nbytes := len(pi.data) + if nbytes >= m.contentLength-pi.bodyReceived { + wanted := m.contentLength - pi.bodyReceived + m.body = append(m.body, pi.data[:wanted]...) + pi.bodyReceived = m.contentLength + m.size += uint64(wanted) + pi.data = pi.data[wanted:] + } else { + m.body = append(m.body, pi.data...) + pi.data = nil + pi.bodyReceived += nbytes + m.size += uint64(nbytes) + if isDebug { + debugf("bodyReceived: %d", pi.bodyReceived) + } + } +} + +func (m *message) getEndpoints() (src *common.Endpoint, dst *common.Endpoint) { + source, destination := common.MakeEndpointPair(m.ipPortTuple.BaseTuple, m.cmdlineTuple) + src, dst = &source, &destination + return src, dst +} + +func parseInt(line []byte) (int, error) { + buf := streambuf.NewFixed(line) + i, err := buf.IntASCII(false) + return int(i), err + // TODO: is it an error if 'buf.Len() != 0 {}' ? +} + +func getExpandedHeaderName(n []byte) []byte { + if len(n) > 1 { + return n + } + switch string(n) { + // referfenced by https://www.iana.org/assignments/sip-parameters/sip-parameters.xhtml + case "a": + return []byte("accept-contact") //[RFC3841] + case "b": + return []byte("referred-by") //[RFC3892] + case "c": + return []byte("content-type") //[RFC3261] + case "d": + return []byte("request-disposition") //[RFC3841] + case "e": + return []byte("content-encoding") //[RFC3261] + case "f": + return []byte("from") //[RFC3261] + case "i": + return []byte("call-id") //[RFC3261] + case "j": + return []byte("reject-contact") //[RFC3841] + case "k": + return []byte("supported") //[RFC3261] + case "l": + return []byte("content-length") //[RFC3261] + case "m": + return []byte("contact") //[RFC3261] + case "o": + return []byte("event") //[RFC666)5] [RFC6446] + case "r": + return []byte("refer-to") //[RFC3515] + case "s": + return []byte("subject") //[RFC3261] + case "t": + return []byte("to") //[RFC3261] + case "u": + return []byte("allow-events") //[RFC6665] + case "v": + return []byte("via") //[RFC326)1] [RFC7118] + case "x": + return []byte("session-expires") //[RFC4028] + case "y": + return []byte("identity") //[RFC8224] + } + return n +} diff --git a/packetbeat/protos/sip/plugin.go b/packetbeat/protos/sip/plugin.go new file mode 100644 index 00000000000..e4cc0364d9a --- /dev/null +++ b/packetbeat/protos/sip/plugin.go @@ -0,0 +1,617 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package sip + +import ( + "bytes" + "fmt" + "strconv" + "strings" + "time" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/cfgwarn" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/packetbeat/pb" + "github.com/elastic/beats/v7/packetbeat/protos" +) + +var ( + debugf = logp.MakeDebug("sip") + detailedf = logp.MakeDebug("sipdetailed") +) + +// SIP application level protocol analyser plugin. +type plugin struct { + // config + ports []int + parseAuthorization bool + parseBody bool + keepOriginal bool + + results protos.Reporter +} + +var ( + isDebug = false + isDetailed = false +) + +func init() { + protos.Register("sip", New) +} + +func New( + testMode bool, + results protos.Reporter, + cfg *common.Config, +) (protos.Plugin, error) { + cfgwarn.Beta("packetbeat SIP protocol is used") + + p := &plugin{} + config := defaultConfig + if !testMode { + if err := cfg.Unpack(&config); err != nil { + return nil, err + } + } + + if err := p.init(results, &config); err != nil { + return nil, err + } + return p, nil +} + +// Init initializes the HTTP protocol analyser. +func (p *plugin) init(results protos.Reporter, config *config) error { + p.setFromConfig(config) + + isDebug = logp.IsDebug("sip") + isDetailed = logp.IsDebug("sipdetailed") + p.results = results + return nil +} + +func (p *plugin) setFromConfig(config *config) { + p.ports = config.Ports + p.keepOriginal = config.KeepOriginal + p.parseAuthorization = config.ParseAuthorization + p.parseBody = config.ParseBody +} + +func (p *plugin) GetPorts() []int { + return p.ports +} + +func (p *plugin) ParseUDP(pkt *protos.Packet) { + defer logp.Recover("SIP ParseUDP exception") + + if err := p.doParse(pkt); err != nil { + debugf("error: %s", err) + } +} + +func (p *plugin) doParse(pkt *protos.Packet) error { + if isDetailed { + detailedf("Payload received: [%s]", pkt.Payload) + } + + parser := newParser() + + pi := newParsingInfo(pkt) + m, err := parser.parse(pi) + if err != nil { + return err + } + + evt, err := p.buildEvent(m, pkt) + if err != nil { + return err + } + + p.publish(*evt) + + return nil +} + +func (p *plugin) publish(evt beat.Event) { + if p.results != nil { + p.results(evt) + } +} + +func newParsingInfo(pkt *protos.Packet) *parsingInfo { + return &parsingInfo{ + tuple: &pkt.Tuple, + data: pkt.Payload, + pkt: pkt, + } +} + +func (p *plugin) buildEvent(m *message, pkt *protos.Packet) (*beat.Event, error) { + status := common.OK_STATUS + if m.statusCode >= 400 { + status = common.ERROR_STATUS + } + + evt, pbf := pb.NewBeatEvent(m.ts) + fields := evt.Fields + fields["type"] = "sip" + fields["status"] = status + + var sipFields ProtocolFields + sipFields.Timestamp = time.Now().UnixNano() + if m.isRequest { + populateRequestFields(m, pbf, &sipFields) + } else { + populateResponseFields(m, &sipFields) + } + + p.populateHeadersFields(m, evt, pbf, &sipFields) + + if p.parseBody { + populateBodyFields(m, pbf, &sipFields) + } + + pbf.Network.IANANumber = "17" + pbf.Network.Application = "sip" + pbf.Network.Protocol = "sip" + pbf.Network.Transport = "udp" + + src, dst := m.getEndpoints() + pbf.SetSource(src) + pbf.SetDestination(dst) + + p.populateEventFields(m, pbf, sipFields) + + if err := pb.MarshalStruct(evt.Fields, "sip", sipFields); err != nil { + return nil, err + } + + return &evt, nil +} + +func populateRequestFields(m *message, pbf *pb.Fields, fields *ProtocolFields) { + fields.Type = "request" + fields.Method = bytes.ToUpper(m.method) + fields.URIOriginal = m.requestURI + scheme, username, host, port, _ := parseURI(fields.URIOriginal) + fields.URIScheme = scheme + fields.URIHost = host + if !bytes.Equal(username, []byte(" ")) && !bytes.Equal(username, []byte("-")) { + fields.URIUsername = username + pbf.AddUser(string(username)) + } + fields.URIPort = port + fields.Version = m.version.String() + pbf.AddHost(string(host)) +} + +func populateResponseFields(m *message, fields *ProtocolFields) { + fields.Type = "response" + fields.Code = int(m.statusCode) + fields.Status = m.statusPhrase + fields.Version = m.version.String() +} + +func (p *plugin) populateHeadersFields(m *message, evt beat.Event, pbf *pb.Fields, fields *ProtocolFields) { + fields.Allow = m.allow + fields.CallID = m.callID + fields.ContentLength = m.contentLength + fields.ContentType = bytes.ToLower(m.contentType) + fields.MaxForwards = m.maxForwards + fields.Supported = m.supported + fields.UserAgentOriginal = m.userAgent + fields.ViaOriginal = m.via + + privateURI, found := m.headers["p-associated-uri"] + if found && len(privateURI) > 0 { + scheme, username, host, port, _ := parseURI(privateURI[0]) + fields.PrivateURIOriginal = privateURI[0] + fields.PrivateURIScheme = scheme + fields.PrivateURIHost = host + if !bytes.Equal(username, []byte(" ")) && !bytes.Equal(username, []byte("-")) { + fields.PrivateURIUsername = username + pbf.AddUser(string(username)) + } + fields.PrivateURIPort = port + pbf.AddHost(string(host)) + } + + if accept, found := m.headers["accept"]; found && len(accept) > 0 { + fields.Accept = bytes.ToLower(accept[0]) + } + + cseqParts := bytes.Split(m.cseq, []byte(" ")) + if len(cseqParts) == 2 { + fields.CseqCode, _ = strconv.Atoi(string(cseqParts[0])) + fields.CseqMethod = bytes.ToUpper(cseqParts[1]) + } + + populateFromFields(m, pbf, fields) + + populateToFields(m, pbf, fields) + + populateContactFields(m, pbf, fields) + + if p.parseAuthorization { + populateAuthFields(m, evt, pbf, fields) + } +} + +func populateFromFields(m *message, pbf *pb.Fields, fields *ProtocolFields) { + if len(m.from) > 0 { + displayInfo, uri, params := parseFromToContact(m.from) + fields.FromDisplayInfo = displayInfo + fields.FromTag = params["tag"] + scheme, username, host, port, _ := parseURI(uri) + fields.FromURIOriginal = uri + fields.FromURIScheme = scheme + fields.FromURIHost = host + if !bytes.Equal(username, []byte(" ")) && !bytes.Equal(username, []byte("-")) { + fields.FromURIUsername = username + pbf.AddUser(string(username)) + } + fields.FromURIPort = port + pbf.AddHost(string(host)) + } +} + +func populateToFields(m *message, pbf *pb.Fields, fields *ProtocolFields) { + if len(m.to) > 0 { + displayInfo, uri, params := parseFromToContact(m.to) + fields.ToDisplayInfo = displayInfo + fields.ToTag = params["tag"] + scheme, username, host, port, _ := parseURI(uri) + fields.ToURIOriginal = uri + fields.ToURIScheme = scheme + fields.ToURIHost = host + if !bytes.Equal(username, []byte(" ")) && !bytes.Equal(username, []byte("-")) { + fields.ToURIUsername = username + pbf.AddUser(string(username)) + } + fields.ToURIPort = port + pbf.AddHost(string(host)) + } +} + +func populateContactFields(m *message, pbf *pb.Fields, fields *ProtocolFields) { + if contact, found := m.headers["contact"]; found && len(contact) > 0 { + displayInfo, uri, params := parseFromToContact(m.to) + fields.ContactDisplayInfo = displayInfo + fields.ContactExpires, _ = strconv.Atoi(string(params["expires"])) + fields.ContactQ, _ = strconv.ParseFloat(string(params["q"]), 64) + scheme, username, host, port, urlparams := parseURI(uri) + fields.ContactURIOriginal = uri + fields.ContactURIScheme = scheme + fields.ContactURIHost = host + if !bytes.Equal(username, []byte(" ")) && !bytes.Equal(username, []byte("-")) { + fields.ContactURIUsername = username + pbf.AddUser(string(username)) + } + fields.ContactURIPort = port + fields.ContactLine = urlparams["line"] + fields.ContactTransport = bytes.ToLower(urlparams["transport"]) + pbf.AddHost(string(host)) + } +} + +func (p *plugin) populateEventFields(m *message, pbf *pb.Fields, fields ProtocolFields) { + pbf.Event.Kind = "event" + pbf.Event.Type = []string{"info"} + pbf.Event.Dataset = "sip" + pbf.Event.Sequence = int64(fields.CseqCode) + + // TODO: Get these values from body + pbf.Event.Start = m.ts + pbf.Event.End = m.ts + // + + if p.keepOriginal { + pbf.Event.Original = string(m.rawData) + } + + pbf.Event.Category = []string{"network", "protocol"} + if _, found := m.headers["authorization"]; found { + pbf.Event.Category = append(pbf.Event.Category, "authentication") + } + + pbf.Event.Action = func() string { + if m.isRequest { + return fmt.Sprintf("sip-%s", strings.ToLower(string(m.method))) + } + return fmt.Sprintf("sip-%s", strings.ToLower(string(fields.CseqMethod))) + }() + + pbf.Event.Outcome = func() string { + switch { + case m.statusCode < 200: + return "" + case m.statusCode > 299: + return "failure" + } + return "success" + }() + + pbf.Event.Reason = string(fields.Status) +} + +func populateAuthFields(m *message, evt beat.Event, pbf *pb.Fields, fields *ProtocolFields) { + auths, found := m.headers["authorization"] + if !found || len(auths) == 0 { + if isDetailed { + detailedf("sip packet without authorization header") + } + return + } + + if isDetailed { + detailedf("sip packet with authorization header") + } + + auth := bytes.TrimSpace(auths[0]) + pos := bytes.IndexByte(auth, ' ') + if pos == -1 { + if isDebug { + debugf("malformed authorization header: missing scheme") + } + return + } + + fields.AuthScheme = auth[:pos] + + pos += 1 + for _, param := range bytes.Split(auth[pos:], []byte(",")) { + kv := bytes.SplitN(param, []byte("="), 2) + if len(kv) != 2 { + continue + } + kv[1] = bytes.Trim(kv[1], "'\" \t") + switch string(bytes.ToLower(bytes.TrimSpace(kv[0]))) { + case "realm": + fields.AuthRealm = kv[1] + case "username": + username := string(kv[1]) + if username != "" && username != "-" { + _, _ = evt.Fields.Put("user.name", username) + pbf.AddUser(username) + } + case "uri": + scheme, _, host, port, _ := parseURI(kv[1]) + fields.AuthURIOriginal = kv[1] + fields.AuthURIScheme = scheme + fields.AuthURIHost = host + fields.AuthURIPort = port + } + } +} + +var constSDPContentType = []byte("application/sdp") + +func populateBodyFields(m *message, pbf *pb.Fields, fields *ProtocolFields) { + if !m.hasContentLength { + return + } + + if !bytes.Equal(m.contentType, constSDPContentType) { + if isDebug { + debugf("body content-type: %s is not supported", m.contentType) + } + return + } + + if _, found := m.headers["content-encoding"]; found { + if isDebug { + debugf("body decoding is not supported yet if content-endcoding is present") + } + return + } + + fields.SDPBodyOriginal = m.body + + var isInMedia bool + for _, line := range bytes.Split(m.body, []byte("\r\n")) { + kv := bytes.SplitN(line, []byte("="), 2) + if len(kv) != 2 { + continue + } + + kv[1] = bytes.TrimSpace(kv[1]) + ch := string(bytes.ToLower(bytes.TrimSpace(kv[0]))) + switch ch { + case "v": + fields.SDPVersion = string(kv[1]) + case "o": + var pos int + if kv[1][pos] == '"' { + endUserPos := bytes.IndexByte(kv[1][pos+1:], '"') + if !bytes.Equal(kv[1][pos+1:endUserPos], []byte("-")) { + fields.SDPOwnerUsername = kv[1][pos+1 : endUserPos] + } + pos = endUserPos + 1 + } + nParts := func() int { + if pos == 0 { + return 4 + } + return 3 // already have user + }() + parts := bytes.SplitN(kv[1][pos:], []byte(" "), nParts) + if len(parts) != nParts { + if isDebug { + debugf("malformed owner SDP line") + } + continue + } + if nParts == 4 { + if !bytes.Equal(parts[0], []byte("-")) { + fields.SDPOwnerUsername = parts[0] + } + parts = parts[1:] + } + fields.SDPOwnerSessID = parts[0] + fields.SDPOwnerVersion = parts[1] + fields.SDPOwnerIP = func() common.NetString { + p := bytes.Split(parts[2], []byte(" ")) + return p[len(p)-1] + }() + pbf.AddUser(string(fields.SDPOwnerUsername)) + pbf.AddIP(string(fields.SDPOwnerIP)) + case "s": + if !bytes.Equal(kv[1], []byte("-")) { + fields.SDPSessName = kv[1] + } + case "c": + if isInMedia { + continue + } + fields.SDPConnInfo = kv[1] + fields.SDPConnAddr = func() common.NetString { + p := bytes.Split(kv[1], []byte(" ")) + return p[len(p)-1] + }() + pbf.AddHost(string(fields.SDPConnAddr)) + case "m": + isInMedia = true + // TODO + case "i", "u", "e", "p", "b", "t", "r", "z", "k", "a": + // TODO + } + } +} + +func parseFromToContact(fromTo common.NetString) (displayInfo, uri common.NetString, params map[string]common.NetString) { + params = make(map[string]common.NetString) + + pos := bytes.IndexByte(fromTo, '<') + if pos == -1 { + pos = bytes.IndexByte(fromTo, ' ') + } + + displayInfo = bytes.Trim(fromTo[:pos], "'\"\t ") + + endURIPos := func() int { + if fromTo[pos] == '<' { + return bytes.IndexByte(fromTo, '>') + } + return bytes.IndexByte(fromTo, ';') + }() + + if endURIPos == -1 { + uri = bytes.TrimRight(fromTo[pos:], ">") + return + } + pos += 1 + uri = fromTo[pos:endURIPos] + + pos = endURIPos + 1 + for _, param := range bytes.Split(fromTo[pos:], []byte(";")) { + kv := bytes.SplitN(param, []byte("="), 2) + if len(kv) != 2 { + continue + } + params[string(bytes.ToLower(bytes.TrimSpace(kv[0])))] = kv[1] + } + + return displayInfo, uri, params +} + +func parseURI(uri common.NetString) (scheme, username, host common.NetString, port int, params map[string]common.NetString) { + var ( + prevChar rune + inIPv6 bool + idx int + hasParams bool + ) + uri = bytes.TrimSpace(uri) + prevChar = ' ' + pos := -1 + ppos := -1 + epos := len(uri) + + params = make(map[string]common.NetString) +loop: + for idx = 0; idx < len(uri); idx++ { + curChar := rune(uri[idx]) + + switch { + case idx == 0: + colonIdx := bytes.Index(uri, []byte(":")) + if colonIdx == -1 { + break loop + } + scheme = uri[:colonIdx] + idx += colonIdx + pos = idx + 1 + + case curChar == '[' && prevChar != '\\': + inIPv6 = true + + case curChar == ']' && prevChar != '\\': + inIPv6 = false + + case curChar == ';' && prevChar != '\\': + // we found end of URI + hasParams = true + epos = idx + break loop + + default: + // select wich part + switch curChar { + case '@': + if len(host) > 0 { + pos = ppos + host = nil + } + username = uri[pos:idx] + ppos = pos + pos = idx + 1 + case ':': + if !inIPv6 { + host = uri[pos:idx] + ppos = pos + pos = idx + 1 + } + } + } + + prevChar = curChar + } + + if pos > 0 && epos <= len(uri) && pos <= epos { + if len(host) == 0 { + host = bytes.TrimSpace(uri[pos:epos]) + } else { + port, _ = strconv.Atoi(string(bytes.TrimSpace(uri[pos:epos]))) + } + } + + if hasParams { + for _, param := range bytes.Split(uri[epos+1:], []byte(";")) { + kv := bytes.Split(param, []byte("=")) + if len(kv) != 2 { + continue + } + params[string(bytes.ToLower(bytes.TrimSpace(kv[0])))] = kv[1] + } + } + + return scheme, username, host, port, params +} diff --git a/packetbeat/protos/sip/plugin_test.go b/packetbeat/protos/sip/plugin_test.go new file mode 100644 index 00000000000..fc9ee53aff2 --- /dev/null +++ b/packetbeat/protos/sip/plugin_test.go @@ -0,0 +1,168 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build !integration + +package sip + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/packetbeat/protos" +) + +func TestParseURI(t *testing.T) { + scheme, username, host, port, params := parseURI(common.NetString("sip:test@10.0.2.15:5060")) + assert.Equal(t, common.NetString("sip"), scheme) + assert.Equal(t, common.NetString("test"), username) + assert.Equal(t, common.NetString("10.0.2.15"), host) + assert.Equal(t, map[string]common.NetString{}, params) + assert.Equal(t, 5060, port) + + scheme, username, host, port, params = parseURI(common.NetString("sips:test@10.0.2.15:5061 ; transport=udp")) + assert.Equal(t, common.NetString("sips"), scheme) + assert.Equal(t, common.NetString("test"), username) + assert.Equal(t, common.NetString("10.0.2.15"), host) + assert.Equal(t, common.NetString("udp"), params["transport"]) + assert.Equal(t, 5061, port) + + scheme, username, host, port, params = parseURI(common.NetString("mailto:192.168.0.2")) + assert.Equal(t, common.NetString("mailto"), scheme) + assert.Equal(t, common.NetString(nil), username) + assert.Equal(t, common.NetString("192.168.0.2"), host) + assert.Equal(t, map[string]common.NetString{}, params) + assert.Equal(t, 0, port) +} + +func TestParseFromTo(t *testing.T) { + // To + displayInfo, uri, params := parseFromToContact(common.NetString("test ;tag=QvN921")) + assert.Equal(t, common.NetString("test"), displayInfo) + assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060"), uri) + assert.Equal(t, common.NetString("QvN921"), params["tag"]) + displayInfo, uri, params = parseFromToContact(common.NetString("test ")) + assert.Equal(t, common.NetString("test"), displayInfo) + assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060"), uri) + assert.Equal(t, common.NetString(nil), params["tag"]) + + // From + displayInfo, uri, params = parseFromToContact(common.NetString("\"PCMU/8000\" ;tag=1")) + assert.Equal(t, common.NetString("PCMU/8000"), displayInfo) + assert.Equal(t, common.NetString("sip:sipp@10.0.2.15:5060"), uri) + assert.Equal(t, common.NetString("1"), params["tag"]) + displayInfo, uri, params = parseFromToContact(common.NetString("\"Matthew Hodgson\" ;tag=5c7cdb68")) + assert.Equal(t, common.NetString("Matthew Hodgson"), displayInfo) + assert.Equal(t, common.NetString("sip:matthew@mxtelecom.com"), uri) + assert.Equal(t, common.NetString("5c7cdb68"), params["tag"]) + displayInfo, uri, params = parseFromToContact(common.NetString(";tag=5c7cdb68")) + assert.Equal(t, common.NetString(nil), displayInfo) + assert.Equal(t, common.NetString("sip:matthew@mxtelecom.com"), uri) + assert.Equal(t, common.NetString("5c7cdb68"), params["tag"]) + displayInfo, uri, params = parseFromToContact(common.NetString("")) + assert.Equal(t, common.NetString(nil), displayInfo) + assert.Equal(t, common.NetString("sip:matthew@mxtelecom.com"), uri) + assert.Equal(t, common.NetString(nil), params["tag"]) + + // Contact + displayInfo, uri, _ = parseFromToContact(common.NetString("")) + assert.Equal(t, common.NetString(nil), displayInfo) + assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060;transport=udp"), uri) + displayInfo, uri, params = parseFromToContact(common.NetString(";expires=1200;q=0.500")) + assert.Equal(t, common.NetString(nil), displayInfo) + assert.Equal(t, common.NetString("sip:voi18062@192.168.1.2:5060;line=aca6b97ca3f5e51a"), uri) + assert.Equal(t, common.NetString("1200"), params["expires"]) + assert.Equal(t, common.NetString("0.500"), params["q"]) + displayInfo, uri, params = parseFromToContact(common.NetString(" \"Mr. Watson\" ;q=0.7; expires=3600")) + assert.Equal(t, common.NetString("Mr. Watson"), displayInfo) + assert.Equal(t, common.NetString("sip:watson@worcester.bell-telephone.com"), uri) + assert.Equal(t, common.NetString("3600"), params["expires"]) + assert.Equal(t, common.NetString("0.7"), params["q"]) + displayInfo, uri, params = parseFromToContact(common.NetString(" \"Mr. Watson\" ;q=0.1")) + assert.Equal(t, common.NetString("Mr. Watson"), displayInfo) + assert.Equal(t, common.NetString("mailto:watson@bell-telephone.com"), uri) + assert.Equal(t, common.NetString("0.1"), params["q"]) +} + +func TestParseUDP(t *testing.T) { + gotEvent := new(beat.Event) + reporter := func(evt beat.Event) { + gotEvent = &evt + } + const data = "INVITE sip:test@10.0.2.15:5060 SIP/2.0\r\nVia: SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-0\r\nFrom: \"DVI4/8000\" ;tag=1\r\nTo: test \r\nCall-ID: 1-2187@10.0.2.20\r\nCSeq: 1 INVITE\r\nContact: sip:sipp@10.0.2.20:5060\r\nMax-Forwards: 70\r\nContent-Type: application/sdp\r\nContent-Length: 123\r\n\r\nv=0\r\no=- 42 42 IN IP4 10.0.2.20\r\ns=-\r\nc=IN IP4 10.0.2.20\r\nt=0 0\r\nm=audio 6000 RTP/AVP 5\r\na=rtpmap:5 DVI4/8000\r\na=recvonly\r\n" + p, _ := New(true, reporter, nil) + plugin := p.(*plugin) + plugin.ParseUDP(&protos.Packet{ + Ts: time.Now(), + Tuple: common.IPPortTuple{}, + Payload: []byte(data), + }) + fields := *gotEvent + + assert.Equal(t, common.NetString("1-2187@10.0.2.20"), getVal(fields, "sip.call_id")) + assert.Equal(t, common.NetString("test"), getVal(fields, "sip.contact.display_info")) + assert.Equal(t, common.NetString("10.0.2.15"), getVal(fields, "sip.contact.uri.host")) + assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060"), getVal(fields, "sip.contact.uri.original")) + assert.Equal(t, 5060, getVal(fields, "sip.contact.uri.port")) + assert.Equal(t, common.NetString("sip"), getVal(fields, "sip.contact.uri.scheme")) + assert.Equal(t, common.NetString("test"), getVal(fields, "sip.contact.uri.username")) + assert.Equal(t, 123, getVal(fields, "sip.content_length")) + assert.Equal(t, common.NetString("application/sdp"), getVal(fields, "sip.content_type")) + assert.Equal(t, 1, getVal(fields, "sip.cseq.code")) + assert.Equal(t, common.NetString("INVITE"), getVal(fields, "sip.cseq.method")) + assert.Equal(t, common.NetString("DVI4/8000"), getVal(fields, "sip.from.display_info")) + assert.Equal(t, common.NetString("1"), getVal(fields, "sip.from.tag")) + assert.Equal(t, common.NetString("10.0.2.20"), getVal(fields, "sip.from.uri.host")) + assert.Equal(t, common.NetString("sip:sipp@10.0.2.20:5060"), getVal(fields, "sip.from.uri.original")) + assert.Equal(t, 5060, getVal(fields, "sip.from.uri.port")) + assert.Equal(t, common.NetString("sip"), getVal(fields, "sip.from.uri.scheme")) + assert.Equal(t, common.NetString("sipp"), getVal(fields, "sip.from.uri.username")) + assert.Equal(t, 70, getVal(fields, "sip.max_forwards")) + assert.Equal(t, common.NetString("INVITE"), getVal(fields, "sip.method")) + assert.Equal(t, common.NetString("10.0.2.20"), getVal(fields, "sip.sdp.connection.address")) + assert.Equal(t, common.NetString("IN IP4 10.0.2.20"), getVal(fields, "sip.sdp.connection.info")) + assert.Equal(t, common.NetString("10.0.2.20"), getVal(fields, "sip.sdp.owner.ip")) + assert.Equal(t, common.NetString("42"), getVal(fields, "sip.sdp.owner.session_id")) + assert.Equal(t, common.NetString("42"), getVal(fields, "sip.sdp.owner.version")) + assert.Equal(t, nil, getVal(fields, "sip.sdp.owner.username")) + assert.Equal(t, nil, getVal(fields, "sip.sdp.session.name")) + assert.Equal(t, "0", getVal(fields, "sip.sdp.version")) + assert.Equal(t, common.NetString("test"), getVal(fields, "sip.to.display_info")) + assert.Equal(t, nil, getVal(fields, "sip.to.tag")) + assert.Equal(t, common.NetString("10.0.2.15"), getVal(fields, "sip.to.uri.host")) + assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060"), getVal(fields, "sip.to.uri.original")) + assert.Equal(t, 5060, getVal(fields, "sip.to.uri.port")) + assert.Equal(t, common.NetString("sip"), getVal(fields, "sip.to.uri.scheme")) + assert.Equal(t, common.NetString("test"), getVal(fields, "sip.to.uri.username")) + assert.Equal(t, "request", getVal(fields, "sip.type")) + assert.Equal(t, common.NetString("10.0.2.15"), getVal(fields, "sip.uri.host")) + assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060"), getVal(fields, "sip.uri.original")) + assert.Equal(t, 5060, getVal(fields, "sip.uri.port")) + assert.Equal(t, common.NetString("sip"), getVal(fields, "sip.uri.scheme")) + assert.Equal(t, common.NetString("test"), getVal(fields, "sip.uri.username")) + assert.Equal(t, "2.0", getVal(fields, "sip.version")) + assert.EqualValues(t, []common.NetString{common.NetString("SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-0")}, getVal(fields, "sip.via.original")) +} + +func getVal(f beat.Event, k string) interface{} { + v, _ := f.GetValue(k) + return v +} diff --git a/packetbeat/tests/system/config/golden-tests.yml b/packetbeat/tests/system/config/golden-tests.yml index 6d49ce9c221..42ad0c746d2 100644 --- a/packetbeat/tests/system/config/golden-tests.yml +++ b/packetbeat/tests/system/config/golden-tests.yml @@ -27,3 +27,11 @@ test_cases: - name: TLS 1.3 pcap: pcaps/tls-version-13.pcap config: {} + + - name: SIP + pcap: pcaps/sip.pcap + config: {} + + - name: SIP Authenticated Register + pcap: pcaps/sip_authenticated_register.pcap + config: {} diff --git a/packetbeat/tests/system/config/packetbeat.yml.j2 b/packetbeat/tests/system/config/packetbeat.yml.j2 index b687f6f0402..7b253d8ec2c 100644 --- a/packetbeat/tests/system/config/packetbeat.yml.j2 +++ b/packetbeat/tests/system/config/packetbeat.yml.j2 @@ -148,6 +148,9 @@ packetbeat.protocols: {% if mongodb_max_docs is not none %} max_docs: {{mongodb_max_docs}}{% endif %} {% if mongodb_max_doc_length is not none %} max_doc_length: {{mongodb_max_doc_length}}{% endif %} +- type: sip + ports: [{{ sip_ports|default([5060])|join(", ") }}] + {% if procs_enabled %} #=========================== Monitored processes ============================== diff --git a/packetbeat/tests/system/golden/sip-expected.json b/packetbeat/tests/system/golden/sip-expected.json new file mode 100644 index 00000000000..37d95d715a7 --- /dev/null +++ b/packetbeat/tests/system/golden/sip-expected.json @@ -0,0 +1,668 @@ +[ + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.20", + "client.port": 5060, + "destination.ip": "10.0.2.15", + "destination.port": 5060, + "event.action": "sip-invite", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "INVITE sip:test@10.0.2.15:5060 SIP/2.0\r\nVia: SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-0\r\nFrom: \"DVI4/8000\" ;tag=1\r\nTo: test \r\nCall-ID: 1-2187@10.0.2.20\r\nCSeq: 1 INVITE\r\nContact: sip:sipp@10.0.2.20:5060\r\nMax-Forwards: 70\r\nContent-Type: application/sdp\r\nContent-Length: 123\r\n\r\nv=0\r\no=- 42 42 IN IP4 10.0.2.20\r\ns=-\r\nc=IN IP4 10.0.2.20\r\nt=0 0\r\nm=audio 6000 RTP/AVP 5\r\na=rtpmap:5 DVI4/8000\r\na=recvonly\r\n", + "event.sequence": 1, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.ip": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.user": [ + "test", + "sipp" + ], + "server.ip": "10.0.2.15", + "server.port": 5060, + "sip.call_id": "1-2187@10.0.2.20", + "sip.contact.display_info": "test", + "sip.contact.uri.host": "10.0.2.15", + "sip.contact.uri.original": "sip:test@10.0.2.15:5060", + "sip.contact.uri.port": 5060, + "sip.contact.uri.scheme": "sip", + "sip.contact.uri.username": "test", + "sip.content_length": 123, + "sip.content_type": "application/sdp", + "sip.cseq.code": 1, + "sip.cseq.method": "INVITE", + "sip.from.display_info": "DVI4/8000", + "sip.from.tag": "1", + "sip.from.uri.host": "10.0.2.20", + "sip.from.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "sipp", + "sip.max_forwards": 70, + "sip.method": "INVITE", + "sip.sdp.body.original": "v=0\r\no=- 42 42 IN IP4 10.0.2.20\r\ns=-\r\nc=IN IP4 10.0.2.20\r\nt=0 0\r\nm=audio 6000 RTP/AVP 5\r\na=rtpmap:5 DVI4/8000\r\na=recvonly\r\n", + "sip.sdp.connection.address": "10.0.2.20", + "sip.sdp.connection.info": "IN IP4 10.0.2.20", + "sip.sdp.owner.ip": "10.0.2.20", + "sip.sdp.owner.session_id": "42", + "sip.sdp.owner.version": "42", + "sip.sdp.version": "0", + "sip.to.display_info": "test", + "sip.to.uri.host": "10.0.2.15", + "sip.to.uri.original": "sip:test@10.0.2.15:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "test", + "sip.type": "request", + "sip.uri.host": "10.0.2.15", + "sip.uri.original": "sip:test@10.0.2.15:5060", + "sip.uri.port": 5060, + "sip.uri.scheme": "sip", + "sip.uri.username": "test", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-0" + ], + "source.ip": "10.0.2.20", + "source.port": 5060, + "status": "OK", + "type": "sip" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.15", + "client.port": 5060, + "destination.ip": "10.0.2.20", + "destination.port": 5060, + "event.action": "sip-invite", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "SIP/2.0 100 Trying\r\nVia: SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-0\r\nFrom: \"DVI4/8000\" ;tag=1\r\nTo: test \r\nCall-ID: 1-2187@10.0.2.20\r\nCSeq: 1 INVITE\r\nUser-Agent: FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit\r\nContent-Length: 0\r\n\r\n", + "event.reason": "Trying", + "event.sequence": 1, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.ip": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.user": [ + "sipp", + "test" + ], + "server.ip": "10.0.2.20", + "server.port": 5060, + "sip.call_id": "1-2187@10.0.2.20", + "sip.code": 100, + "sip.cseq.code": 1, + "sip.cseq.method": "INVITE", + "sip.from.display_info": "DVI4/8000", + "sip.from.tag": "1", + "sip.from.uri.host": "10.0.2.20", + "sip.from.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "sipp", + "sip.status": "Trying", + "sip.to.display_info": "test", + "sip.to.uri.host": "10.0.2.15", + "sip.to.uri.original": "sip:test@10.0.2.15:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "test", + "sip.type": "response", + "sip.user_agent.original": "FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-0" + ], + "source.ip": "10.0.2.15", + "source.port": 5060, + "status": "OK", + "type": "sip" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.20", + "client.port": 5060, + "destination.ip": "10.0.2.15", + "destination.port": 5060, + "event.action": "sip-ack", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "ACK sip:test@10.0.2.15:5060 SIP/2.0\r\nVia: SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-5\r\nFrom: \"DVI4/8000\" ;tag=1\r\nTo: test ;tag=e2jv529vDZ3eQ\r\nCall-ID: 1-2187@10.0.2.20\r\nCSeq: 1 ACK\r\nContact: sip:sipp@10.0.2.20:5060\r\nMax-Forwards: 70\r\nContent-Length: 0\r\n\r\n", + "event.sequence": 1, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.ip": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.user": [ + "test", + "sipp" + ], + "server.ip": "10.0.2.15", + "server.port": 5060, + "sip.call_id": "1-2187@10.0.2.20", + "sip.contact.display_info": "test", + "sip.contact.uri.host": "10.0.2.15", + "sip.contact.uri.original": "sip:test@10.0.2.15:5060", + "sip.contact.uri.port": 5060, + "sip.contact.uri.scheme": "sip", + "sip.contact.uri.username": "test", + "sip.cseq.code": 1, + "sip.cseq.method": "ACK", + "sip.from.display_info": "DVI4/8000", + "sip.from.tag": "1", + "sip.from.uri.host": "10.0.2.20", + "sip.from.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "sipp", + "sip.max_forwards": 70, + "sip.method": "ACK", + "sip.to.display_info": "test", + "sip.to.tag": "e2jv529vDZ3eQ", + "sip.to.uri.host": "10.0.2.15", + "sip.to.uri.original": "sip:test@10.0.2.15:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "test", + "sip.type": "request", + "sip.uri.host": "10.0.2.15", + "sip.uri.original": "sip:test@10.0.2.15:5060", + "sip.uri.port": 5060, + "sip.uri.scheme": "sip", + "sip.uri.username": "test", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2187-1-5" + ], + "source.ip": "10.0.2.20", + "source.port": 5060, + "status": "OK", + "type": "sip" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.15", + "client.port": 5060, + "destination.ip": "10.0.2.20", + "destination.port": 5060, + "event.action": "sip-bye", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "BYE sip:sipp@10.0.2.20:5060 SIP/2.0\r\nVia: SIP/2.0/UDP 10.0.2.15;rport;branch=z9hG4bKDQ7XK6BBH57ya\r\nMax-Forwards: 70\r\nFrom: test ;tag=e2jv529vDZ3eQ\r\nTo: \"DVI4/8000\" ;tag=1\r\nCall-ID: 1-2187@10.0.2.20\r\nCSeq: 99750433 BYE\r\nUser-Agent: FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit\r\nAllow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE\r\nSupported: timer, path, replaces\r\nReason: Q.850;cause=16;text=\"NORMAL_CLEARING\"\r\nContent-Length: 0\r\n\r\n", + "event.sequence": 99750433, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.ip": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.user": [ + "sipp", + "test" + ], + "server.ip": "10.0.2.20", + "server.port": 5060, + "sip.allow": [ + "invite", + "ack", + "bye", + "cancel", + "options", + "message", + "info", + "update", + "register", + "refer", + "notify", + "publish", + "subscribe" + ], + "sip.call_id": "1-2187@10.0.2.20", + "sip.cseq.code": 99750433, + "sip.cseq.method": "BYE", + "sip.from.display_info": "test", + "sip.from.tag": "e2jv529vDZ3eQ", + "sip.from.uri.host": "10.0.2.15", + "sip.from.uri.original": "sip:test@10.0.2.15:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "test", + "sip.max_forwards": 70, + "sip.method": "BYE", + "sip.supported": [ + "timer", + "path", + "replaces" + ], + "sip.to.display_info": "DVI4/8000", + "sip.to.tag": "1", + "sip.to.uri.host": "10.0.2.20", + "sip.to.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "sipp", + "sip.type": "request", + "sip.uri.host": "10.0.2.20", + "sip.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.uri.port": 5060, + "sip.uri.scheme": "sip", + "sip.uri.username": "sipp", + "sip.user_agent.original": "FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.15;rport;branch=z9hG4bKDQ7XK6BBH57ya" + ], + "source.ip": "10.0.2.15", + "source.port": 5060, + "status": "OK", + "type": "sip" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.20", + "client.port": 5060, + "destination.ip": "10.0.2.15", + "destination.port": 5060, + "event.action": "sip-invite", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "INVITE sip:test@10.0.2.15:5060 SIP/2.0\r\nVia: SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2189-1-0\r\nFrom: \"DVI4/16000\" ;tag=1\r\nTo: test \r\nCall-ID: 1-2189@10.0.2.20\r\nCSeq: 1 INVITE\r\nContact: sip:sipp@10.0.2.20:5060\r\nMax-Forwards: 70\r\nContent-Type: application/sdp\r\nContent-Length: 124\r\n\r\nv=0\r\no=- 42 42 IN IP4 10.0.2.20\r\ns=-\r\nc=IN IP4 10.0.2.20\r\nt=0 0\r\nm=audio 6000 RTP/AVP 6\r\na=rtpmap:6 DVI4/16000\r\na=recvonly\r\n", + "event.sequence": 1, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.ip": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.user": [ + "test", + "sipp" + ], + "server.ip": "10.0.2.15", + "server.port": 5060, + "sip.call_id": "1-2189@10.0.2.20", + "sip.contact.display_info": "test", + "sip.contact.uri.host": "10.0.2.15", + "sip.contact.uri.original": "sip:test@10.0.2.15:5060", + "sip.contact.uri.port": 5060, + "sip.contact.uri.scheme": "sip", + "sip.contact.uri.username": "test", + "sip.content_length": 124, + "sip.content_type": "application/sdp", + "sip.cseq.code": 1, + "sip.cseq.method": "INVITE", + "sip.from.display_info": "DVI4/16000", + "sip.from.tag": "1", + "sip.from.uri.host": "10.0.2.20", + "sip.from.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "sipp", + "sip.max_forwards": 70, + "sip.method": "INVITE", + "sip.sdp.body.original": "v=0\r\no=- 42 42 IN IP4 10.0.2.20\r\ns=-\r\nc=IN IP4 10.0.2.20\r\nt=0 0\r\nm=audio 6000 RTP/AVP 6\r\na=rtpmap:6 DVI4/16000\r\na=recvonly\r\n", + "sip.sdp.connection.address": "10.0.2.20", + "sip.sdp.connection.info": "IN IP4 10.0.2.20", + "sip.sdp.owner.ip": "10.0.2.20", + "sip.sdp.owner.session_id": "42", + "sip.sdp.owner.version": "42", + "sip.sdp.version": "0", + "sip.to.display_info": "test", + "sip.to.uri.host": "10.0.2.15", + "sip.to.uri.original": "sip:test@10.0.2.15:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "test", + "sip.type": "request", + "sip.uri.host": "10.0.2.15", + "sip.uri.original": "sip:test@10.0.2.15:5060", + "sip.uri.port": 5060, + "sip.uri.scheme": "sip", + "sip.uri.username": "test", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2189-1-0" + ], + "source.ip": "10.0.2.20", + "source.port": 5060, + "status": "OK", + "type": "sip" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.15", + "client.port": 5060, + "destination.ip": "10.0.2.20", + "destination.port": 5060, + "event.action": "sip-invite", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "SIP/2.0 100 Trying\r\nVia: SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2189-1-0\r\nFrom: \"DVI4/16000\" ;tag=1\r\nTo: test \r\nCall-ID: 1-2189@10.0.2.20\r\nCSeq: 1 INVITE\r\nUser-Agent: FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit\r\nContent-Length: 0\r\n\r\n", + "event.reason": "Trying", + "event.sequence": 1, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.ip": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.user": [ + "sipp", + "test" + ], + "server.ip": "10.0.2.20", + "server.port": 5060, + "sip.call_id": "1-2189@10.0.2.20", + "sip.code": 100, + "sip.cseq.code": 1, + "sip.cseq.method": "INVITE", + "sip.from.display_info": "DVI4/16000", + "sip.from.tag": "1", + "sip.from.uri.host": "10.0.2.20", + "sip.from.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "sipp", + "sip.status": "Trying", + "sip.to.display_info": "test", + "sip.to.uri.host": "10.0.2.15", + "sip.to.uri.original": "sip:test@10.0.2.15:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "test", + "sip.type": "response", + "sip.user_agent.original": "FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2189-1-0" + ], + "source.ip": "10.0.2.15", + "source.port": 5060, + "status": "OK", + "type": "sip" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.20", + "client.port": 5060, + "destination.ip": "10.0.2.15", + "destination.port": 5060, + "event.action": "sip-ack", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "ACK sip:test@10.0.2.15:5060 SIP/2.0\r\nVia: SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2189-1-5\r\nFrom: \"DVI4/16000\" ;tag=1\r\nTo: test ;tag=FBcN7Xt0a8S1j\r\nCall-ID: 1-2189@10.0.2.20\r\nCSeq: 1 ACK\r\nContact: sip:sipp@10.0.2.20:5060\r\nMax-Forwards: 70\r\nContent-Length: 0\r\n\r\n", + "event.sequence": 1, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.ip": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.user": [ + "test", + "sipp" + ], + "server.ip": "10.0.2.15", + "server.port": 5060, + "sip.call_id": "1-2189@10.0.2.20", + "sip.contact.display_info": "test", + "sip.contact.uri.host": "10.0.2.15", + "sip.contact.uri.original": "sip:test@10.0.2.15:5060", + "sip.contact.uri.port": 5060, + "sip.contact.uri.scheme": "sip", + "sip.contact.uri.username": "test", + "sip.cseq.code": 1, + "sip.cseq.method": "ACK", + "sip.from.display_info": "DVI4/16000", + "sip.from.tag": "1", + "sip.from.uri.host": "10.0.2.20", + "sip.from.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "sipp", + "sip.max_forwards": 70, + "sip.method": "ACK", + "sip.to.display_info": "test", + "sip.to.tag": "FBcN7Xt0a8S1j", + "sip.to.uri.host": "10.0.2.15", + "sip.to.uri.original": "sip:test@10.0.2.15:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "test", + "sip.type": "request", + "sip.uri.host": "10.0.2.15", + "sip.uri.original": "sip:test@10.0.2.15:5060", + "sip.uri.port": 5060, + "sip.uri.scheme": "sip", + "sip.uri.username": "test", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.20:5060;branch=z9hG4bK-2189-1-5" + ], + "source.ip": "10.0.2.20", + "source.port": 5060, + "status": "OK", + "type": "sip" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "10.0.2.15", + "client.port": 5060, + "destination.ip": "10.0.2.20", + "destination.port": 5060, + "event.action": "sip-bye", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "BYE sip:sipp@10.0.2.20:5060 SIP/2.0\r\nVia: SIP/2.0/UDP 10.0.2.15;rport;branch=z9hG4bKe00pN1veeeyHp\r\nMax-Forwards: 70\r\nFrom: test ;tag=FBcN7Xt0a8S1j\r\nTo: \"DVI4/16000\" ;tag=1\r\nCall-ID: 1-2189@10.0.2.20\r\nCSeq: 99750437 BYE\r\nUser-Agent: FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit\r\nAllow: INVITE, ACK, BYE, CANCEL, OPTIONS, MESSAGE, INFO, UPDATE, REGISTER, REFER, NOTIFY, PUBLISH, SUBSCRIBE\r\nSupported: timer, path, replaces\r\nReason: Q.850;cause=16;text=\"NORMAL_CLEARING\"\r\nContent-Length: 0\r\n\r\n", + "event.sequence": 99750437, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:xDRQZvk3ErEhBDslXv1c6EKI804=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "10.0.2.20", + "10.0.2.15" + ], + "related.ip": [ + "10.0.2.15", + "10.0.2.20" + ], + "related.user": [ + "sipp", + "test" + ], + "server.ip": "10.0.2.20", + "server.port": 5060, + "sip.allow": [ + "invite", + "ack", + "bye", + "cancel", + "options", + "message", + "info", + "update", + "register", + "refer", + "notify", + "publish", + "subscribe" + ], + "sip.call_id": "1-2189@10.0.2.20", + "sip.cseq.code": 99750437, + "sip.cseq.method": "BYE", + "sip.from.display_info": "test", + "sip.from.tag": "FBcN7Xt0a8S1j", + "sip.from.uri.host": "10.0.2.15", + "sip.from.uri.original": "sip:test@10.0.2.15:5060", + "sip.from.uri.port": 5060, + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "test", + "sip.max_forwards": 70, + "sip.method": "BYE", + "sip.supported": [ + "timer", + "path", + "replaces" + ], + "sip.to.display_info": "DVI4/16000", + "sip.to.tag": "1", + "sip.to.uri.host": "10.0.2.20", + "sip.to.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.to.uri.port": 5060, + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "sipp", + "sip.type": "request", + "sip.uri.host": "10.0.2.20", + "sip.uri.original": "sip:sipp@10.0.2.20:5060", + "sip.uri.port": 5060, + "sip.uri.scheme": "sip", + "sip.uri.username": "sipp", + "sip.user_agent.original": "FreeSWITCH-mod_sofia/1.6.12-20-b91a0a6~64bit", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 10.0.2.15;rport;branch=z9hG4bKe00pN1veeeyHp" + ], + "source.ip": "10.0.2.15", + "source.port": 5060, + "status": "OK", + "type": "sip" + } +] \ No newline at end of file diff --git a/packetbeat/tests/system/golden/sip_authenticated_register-expected.json b/packetbeat/tests/system/golden/sip_authenticated_register-expected.json new file mode 100644 index 00000000000..133792cc157 --- /dev/null +++ b/packetbeat/tests/system/golden/sip_authenticated_register-expected.json @@ -0,0 +1,142 @@ +[ + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "192.168.1.2", + "client.port": 5060, + "destination.ip": "212.242.33.35", + "destination.port": 5060, + "event.action": "sip-register", + "event.category": [ + "network", + "protocol", + "authentication" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "REGISTER sip:sip.cybercity.dk SIP/2.0\r\nVia: SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp112903503-43a64480192.168.1.2;rport\r\nFrom: ;tag=6bac55c\r\nTo: \r\nCall-ID: 578222729-4665d775@578222732-4665d772\r\nContact: ;expires=1200;q=0.500\r\nExpires: 1200\r\nCSeq: 75 REGISTER\r\nContent-Length: 0\r\nAuthorization: Digest username=\"voi18062\",realm=\"sip.cybercity.dk\",uri=\"sip:192.168.1.2\",nonce=\"1701b22972b90f440c3e4eb250842bb\",opaque=\"1701a1351f70795\",nc=\"00000001\",response=\"79a0543188495d288c9ebbe0c881abdc\"\r\nMax-Forwards: 70\r\nUser-Agent: Nero SIPPS IP Phone Version 2.0.51.16\r\n\r\n", + "event.sequence": 75, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:dOa61R2NaaJsJlcFAiMIiyXX+Kk=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "sip.cybercity.dk" + ], + "related.ip": [ + "192.168.1.2", + "212.242.33.35" + ], + "related.user": [ + "voi18062" + ], + "server.ip": "212.242.33.35", + "server.port": 5060, + "sip.auth.realm": "sip.cybercity.dk", + "sip.auth.scheme": "Digest", + "sip.auth.uri.host": "192.168.1.2", + "sip.auth.uri.original": "sip:192.168.1.2", + "sip.auth.uri.scheme": "sip", + "sip.call_id": "578222729-4665d775@578222732-4665d772", + "sip.contact.uri.host": "sip.cybercity.dk", + "sip.contact.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.contact.uri.scheme": "sip", + "sip.contact.uri.username": "voi18062", + "sip.cseq.code": 75, + "sip.cseq.method": "REGISTER", + "sip.from.tag": "6bac55c", + "sip.from.uri.host": "sip.cybercity.dk", + "sip.from.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "voi18062", + "sip.max_forwards": 70, + "sip.method": "REGISTER", + "sip.to.uri.host": "sip.cybercity.dk", + "sip.to.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "voi18062", + "sip.type": "request", + "sip.uri.host": "sip.cybercity.dk", + "sip.uri.original": "sip:sip.cybercity.dk", + "sip.uri.scheme": "sip", + "sip.user_agent.original": "Nero SIPPS IP Phone Version 2.0.51.16", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 192.168.1.2;branch=z9hG4bKnp112903503-43a64480192.168.1.2;rport" + ], + "source.ip": "192.168.1.2", + "source.port": 5060, + "status": "OK", + "type": "sip", + "user.name": "voi18062" + }, + { + "@metadata.beat": "packetbeat", + "@metadata.type": "_doc", + "client.ip": "212.242.33.35", + "client.port": 5060, + "destination.ip": "192.168.1.2", + "destination.port": 5060, + "event.action": "sip-register", + "event.category": [ + "network", + "protocol" + ], + "event.dataset": "sip", + "event.duration": 0, + "event.kind": "event", + "event.original": "SIP/2.0 100 Trying\r\nCall-ID: 578222729-4665d775@578222732-4665d772\r\nCSeq: 75 REGISTER\r\nFrom: ;tag=6bac55c\r\nTo: \r\nVia: SIP/2.0/UDP 192.168.1.2;received=80.230.219.70;rport=5060;branch=z9hG4bKnp112903503-43a64480192.168.1.2\r\nContent-Length: 0\r\n\r\n", + "event.reason": "Trying", + "event.sequence": 75, + "event.type": [ + "info" + ], + "network.application": "sip", + "network.community_id": "1:dOa61R2NaaJsJlcFAiMIiyXX+Kk=", + "network.iana_number": "17", + "network.protocol": "sip", + "network.transport": "udp", + "network.type": "ipv4", + "related.hosts": [ + "sip.cybercity.dk" + ], + "related.ip": [ + "212.242.33.35", + "192.168.1.2" + ], + "related.user": [ + "voi18062" + ], + "server.ip": "192.168.1.2", + "server.port": 5060, + "sip.call_id": "578222729-4665d775@578222732-4665d772", + "sip.code": 100, + "sip.cseq.code": 75, + "sip.cseq.method": "REGISTER", + "sip.from.tag": "6bac55c", + "sip.from.uri.host": "sip.cybercity.dk", + "sip.from.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.from.uri.scheme": "sip", + "sip.from.uri.username": "voi18062", + "sip.status": "Trying", + "sip.to.uri.host": "sip.cybercity.dk", + "sip.to.uri.original": "sip:voi18062@sip.cybercity.dk", + "sip.to.uri.scheme": "sip", + "sip.to.uri.username": "voi18062", + "sip.type": "response", + "sip.version": "2.0", + "sip.via.original": [ + "SIP/2.0/UDP 192.168.1.2;received=80.230.219.70;rport=5060;branch=z9hG4bKnp112903503-43a64480192.168.1.2" + ], + "source.ip": "212.242.33.35", + "source.port": 5060, + "status": "OK", + "type": "sip" + } +] \ No newline at end of file diff --git a/packetbeat/tests/system/pcaps/sip.pcap b/packetbeat/tests/system/pcaps/sip.pcap new file mode 100644 index 0000000000000000000000000000000000000000..7ec19fb525be299140dbfde2d0eddb177a31cf42 GIT binary patch literal 6632 zcmeHL&2QUe71*j2&9-@KRu0?9_Ji>ENmPY^`=l8mC=14%1ubP3z&rp6ztY z4jkaXof}6!_6INt5C|?~H#QDv8aE_%KwRK7@g*d9UMFeXq}58>OhwwGKB^tRul@S> zJkRfaetz)v?e_!BIMcUrW(-a~zm;5DyLOU!3@6n6Ho@eXv7hdx=a{)u)enPA;05sK zPTxI!ckH{V6H0MaspgTRTars0cTV8Ld{_(%Q7OvDc%&-j88OUiZv~fBat(e*omYc%v*}{ZmAseS<+-8Y z1$=`mnD%vS*BlAOVbydFX}VmsZ4n7!%QAEgySmw&acWlo@)BuoxSJ9}NDya3!BB8Z zhRLSPp@>NTlp<2fkv>+Tpd)jkpe7GraAh9B+=h%>HQhupfC^Qr<(c$q8AU@uEZeTt zz?Kw6+faJH5^c+D8tqV!=D;720}Bv;>VETbK*A3h$bo;ppz)`9;N`%%$;;g!!!mhP zwcC1g<9{9R6^GbddIQ2Ip@L0_dQqun7r2I5yW*I29nT2iSXdA_k>}Qv0_Jh-%~)hz zcZb6Y@#x?>`_@UO1Z79vZxq+@H2$9A`uA-=uH)QU+{0A_TuY0`4O6e$h|?6z#e5ju%QH60t~28#^6NjQh-H(|U+qoOzK zCW{;cvq*1hMyp0II}T71S0j#Q>lUS_{>{VJJ2M(E2yejPR-=LKHeD?&q@U|gV7QzP zA#`+lZy?al1N)PE{3nXBP_RN8rc1aow%xWz&C@h1x_rMgLC&WvI!dN*26U6MY<&xB zZP~2XQ}8Z?H07r0y7qic_EszDSZsIO1b6u+F~q| zS%}8lc(+!h69`&Ad-p@T;Yz!x|I~Ipk^Ga%c$AOK&Qgj!6rCS4)~*ojPg>xQ{_zb~u%Dd?J4Ec6!h9`sC9IW*H<7b-z(y$FuccDX_o4 z=LdFt=B(BO_TVySq@a3xVSN4&iyL zC~Ofz+6&g9l+FN~_m$3mAm?Zn{6!wrh0|~Tmsq?hc^+Rf+j93q$PQoqc}ARSQk4s8FINEep%pxhAHmo!U-mJ25fv z1(?|w5epL%5?R;~>cRqi0hWG&a?XpCwx|UJSbBzg^qil&|NZ{Y;rrJwir^9$f5*oF z6vU!G_2KrL=TqQQ5ex#L2GBRax9^4M?Nv|##r~sZ0G>==li$586c3NC-d_tCMb=WF=`SiMJhiD{s3ShuA^}nLpis&dpfM zGkg|M8kD3)eBp+Ybcc01N_EkJ)U*g8Cb1RWFlf^>>HH|Ak#UNM`Z&s1kU8+wStgF` zP-Gyt6Gq%)0W*Bt44Ae_ImK+w<$K*Q;i-oSLhg=-REmUNm0{L_d0I57^Bo786prN{ z_T^Eg+~rX#YdcU>E%dT>oP-A~3**Rvi(!kW8SJGziP$#xqf``{HbYd`ux05sZ4%20Z0`FU1(t=G-wfoEbdT*ROL6j;CCyYwAg;MC zE~G59#N{2h%9A+fs#b^98mzVBh{Fw@q(T5Fz*8v}l$E5CloM`#ybK-+-18W+J>)zm zys!$uJTRx9ea-34DbEQnIIc8e7-EEABiRq5)*nD}_Wk}9zvntF;Q Date: Tue, 6 Oct 2020 13:18:49 +0200 Subject: [PATCH 082/156] Release cloudfoundry input and processor as GA (#21525) --- CHANGELOG.next.asciidoc | 2 ++ x-pack/filebeat/input/cloudfoundry/input.go | 2 +- .../docs/add_cloudfoundry_metadata.asciidoc | 2 -- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 15c2f9fe8a8..cd1e6c50a4c 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -450,6 +450,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add Cloud Foundry tags in related events. {pull}21177[21177] - Cloud Foundry metadata is cached to disk. {pull}20775[20775] - Add option to select the type of index template to load: legacy, component, index. {pull}21212[21212] +- Release `add_cloudfoundry_metadata` as GA. {pull}21525[21525] *Auditbeat* @@ -606,6 +607,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add related.hosts ecs field to all modules {pull}21160[21160] - Keep cursor state between httpjson input restarts {pull}20751[20751] - Convert aws s3 to v2 input {pull}20005[20005] +- Release Cloud Foundry input as GA. {pull}21525[21525] - New Cisco Umbrella dataset {pull}21504[21504] - New juniper.srx dataset for Juniper SRX logs. {pull}20017[20017] - Adding support for Microsoft 365 Defender (Microsoft Threat Protection) {pull}21446[21446] diff --git a/x-pack/filebeat/input/cloudfoundry/input.go b/x-pack/filebeat/input/cloudfoundry/input.go index 036a61b9d1e..3d2b9b34e59 100644 --- a/x-pack/filebeat/input/cloudfoundry/input.go +++ b/x-pack/filebeat/input/cloudfoundry/input.go @@ -25,7 +25,7 @@ type cloudfoundryEvent interface { func Plugin() v2.Plugin { return v2.Plugin{ Name: "cloudfoundry", - Stability: feature.Beta, + Stability: feature.Stable, Deprecated: false, Info: "collect logs from cloudfoundry loggregator", Manager: stateless.NewInputManager(configure), diff --git a/x-pack/libbeat/processors/add_cloudfoundry_metadata/docs/add_cloudfoundry_metadata.asciidoc b/x-pack/libbeat/processors/add_cloudfoundry_metadata/docs/add_cloudfoundry_metadata.asciidoc index 558b5a1031b..67e89c8173b 100644 --- a/x-pack/libbeat/processors/add_cloudfoundry_metadata/docs/add_cloudfoundry_metadata.asciidoc +++ b/x-pack/libbeat/processors/add_cloudfoundry_metadata/docs/add_cloudfoundry_metadata.asciidoc @@ -6,8 +6,6 @@ add_cloudfoundry_metadata ++++ -beta[] - The `add_cloudfoundry_metadata` processor annotates each event with relevant metadata from Cloud Foundry applications. The events are annotated with Cloud Foundry metadata, only if the event contains a reference to a Cloud Foundry application (using field From f5d13aa2037bb26b8b1f0dcc801b48abb299e8e8 Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Tue, 6 Oct 2020 09:02:26 -0400 Subject: [PATCH 083/156] [Elastic Agent] Add elastic agent ID and version to events from filebeat and metricbeat. (#21543) * Add elastic agent ID and version to events from filebeat and metricbeat. * Add changelog and fix inputs. --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../pkg/agent/application/emitter.go | 11 +- .../pkg/agent/application/info/agent_info.go | 12 ++ .../agent/application/inspect_output_cmd.go | 45 ++++--- .../pkg/agent/application/local_mode.go | 1 + .../pkg/agent/application/managed_mode.go | 1 + .../agent/application/managed_mode_test.go | 4 +- .../agent/application/monitoring_decorator.go | 6 +- .../application/monitoring_decorator_test.go | 25 +++- .../pkg/agent/program/program.go | 8 +- .../pkg/agent/program/program_test.go | 16 ++- .../pkg/agent/program/supported.go | 2 +- .../testdata/enabled_output_true-filebeat.yml | 6 + .../testdata/enabled_true-filebeat.yml | 6 + .../testdata/single_config-filebeat.yml | 12 ++ .../testdata/single_config-metricbeat.yml | 19 ++- .../pkg/agent/transpiler/rules.go | 126 ++++++++++++++---- .../pkg/agent/transpiler/rules_test.go | 65 ++++++++- x-pack/elastic-agent/spec/filebeat.yml | 2 + x-pack/elastic-agent/spec/metricbeat.yml | 2 + 20 files changed, 301 insertions(+), 69 deletions(-) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 7d6870328c7..639b1dbad17 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -29,4 +29,5 @@ - Send `fleet.host.id` to Endpoint Security {pull}21042[21042] - Add `install` and `uninstall` subcommands {pull}21206[21206] - Send updating state {pull}21461[21461] +- Add `elastic.agent.id` and `elastic.agent.version` to published events from filebeat and metricbeat {pull}21543[21543] - Add `upgrade` subcommand to perform upgrade of installed Elastic Agent {pull}21425[21425] diff --git a/x-pack/elastic-agent/pkg/agent/application/emitter.go b/x-pack/elastic-agent/pkg/agent/application/emitter.go index d8a19492e2b..fc103366826 100644 --- a/x-pack/elastic-agent/pkg/agent/application/emitter.go +++ b/x-pack/elastic-agent/pkg/agent/application/emitter.go @@ -10,6 +10,7 @@ import ( "strings" "sync" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/program" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/transpiler" @@ -18,7 +19,7 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" ) -type decoratorFunc = func(string, *transpiler.AST, []program.Program) ([]program.Program, error) +type decoratorFunc = func(*info.AgentInfo, string, *transpiler.AST, []program.Program) ([]program.Program, error) type filterFunc = func(*logger.Logger, *transpiler.AST) error type reloadable interface { @@ -36,6 +37,7 @@ type programsDispatcher interface { type emitterController struct { logger *logger.Logger + agentInfo *info.AgentInfo controller composable.Controller router programsDispatcher modifiers *configModifiers @@ -112,14 +114,14 @@ func (e *emitterController) update() error { e.logger.Debug("Converting single configuration into specific programs configuration") - programsToRun, err := program.Programs(ast) + programsToRun, err := program.Programs(e.agentInfo, ast) if err != nil { return err } for _, decorator := range e.modifiers.Decorators { for outputType, ptr := range programsToRun { - programsToRun[outputType], err = decorator(outputType, ast, ptr) + programsToRun[outputType], err = decorator(e.agentInfo, outputType, ast, ptr) if err != nil { return err } @@ -135,12 +137,13 @@ func (e *emitterController) update() error { return e.router.Dispatch(ast.HashStr(), programsToRun) } -func emitter(ctx context.Context, log *logger.Logger, controller composable.Controller, router programsDispatcher, modifiers *configModifiers, reloadables ...reloadable) (emitterFunc, error) { +func emitter(ctx context.Context, log *logger.Logger, agentInfo *info.AgentInfo, controller composable.Controller, router programsDispatcher, modifiers *configModifiers, reloadables ...reloadable) (emitterFunc, error) { log.Debugf("Supported programs: %s", strings.Join(program.KnownProgramNames(), ", ")) init, _ := transpiler.NewVars(map[string]interface{}{}) ctrl := &emitterController{ logger: log, + agentInfo: agentInfo, controller: controller, router: router, modifiers: modifiers, diff --git a/x-pack/elastic-agent/pkg/agent/application/info/agent_info.go b/x-pack/elastic-agent/pkg/agent/application/info/agent_info.go index e990b83bd49..b0abbe19e64 100644 --- a/x-pack/elastic-agent/pkg/agent/application/info/agent_info.go +++ b/x-pack/elastic-agent/pkg/agent/application/info/agent_info.go @@ -4,6 +4,8 @@ package info +import "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" + // AgentInfo is a collection of information about agent. type AgentInfo struct { agentID string @@ -44,3 +46,13 @@ func ForceNewAgentInfo() (*AgentInfo, error) { func (i *AgentInfo) AgentID() string { return i.agentID } + +// Version returns the version for this Agent. +func (*AgentInfo) Version() string { + return release.Version() +} + +// Snapshot returns if this version is a snapshot. +func (*AgentInfo) Snapshot() bool { + return release.Snapshot() +} diff --git a/x-pack/elastic-agent/pkg/agent/application/inspect_output_cmd.go b/x-pack/elastic-agent/pkg/agent/application/inspect_output_cmd.go index 8f648887d10..bb319ce1569 100644 --- a/x-pack/elastic-agent/pkg/agent/application/inspect_output_cmd.go +++ b/x-pack/elastic-agent/pkg/agent/application/inspect_output_cmd.go @@ -8,11 +8,12 @@ import ( "context" "fmt" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/transpiler" - "github.com/elastic/beats/v7/libbeat/logp" + + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configuration" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/program" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/transpiler" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/config" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" @@ -37,14 +38,19 @@ func NewInspectOutputCmd(configPath, output, program string) (*InspectOutputCmd, // Execute tries to enroll the agent into Fleet. func (c *InspectOutputCmd) Execute() error { + agentInfo, err := info.NewAgentInfo() + if err != nil { + return err + } + if c.output == "" { - return c.inspectOutputs() + return c.inspectOutputs(agentInfo) } - return c.inspectOutput() + return c.inspectOutput(agentInfo) } -func (c *InspectOutputCmd) inspectOutputs() error { +func (c *InspectOutputCmd) inspectOutputs(agentInfo *info.AgentInfo) error { rawConfig, err := loadConfig(c.cfgPath) if err != nil { return err @@ -61,7 +67,7 @@ func (c *InspectOutputCmd) inspectOutputs() error { } if isStandalone(cfg.Fleet) { - return listOutputsFromConfig(l, rawConfig) + return listOutputsFromConfig(l, agentInfo, rawConfig) } fleetConfig, err := loadFleetConfig(rawConfig) @@ -71,11 +77,11 @@ func (c *InspectOutputCmd) inspectOutputs() error { return fmt.Errorf("no fleet config retrieved yet") } - return listOutputsFromMap(l, fleetConfig) + return listOutputsFromMap(l, agentInfo, fleetConfig) } -func listOutputsFromConfig(log *logger.Logger, cfg *config.Config) error { - programsGroup, err := getProgramsFromConfig(log, cfg) +func listOutputsFromConfig(log *logger.Logger, agentInfo *info.AgentInfo, cfg *config.Config) error { + programsGroup, err := getProgramsFromConfig(log, agentInfo, cfg) if err != nil { return err @@ -88,16 +94,16 @@ func listOutputsFromConfig(log *logger.Logger, cfg *config.Config) error { return nil } -func listOutputsFromMap(log *logger.Logger, cfg map[string]interface{}) error { +func listOutputsFromMap(log *logger.Logger, agentInfo *info.AgentInfo, cfg map[string]interface{}) error { c, err := config.NewConfigFrom(cfg) if err != nil { return err } - return listOutputsFromConfig(log, c) + return listOutputsFromConfig(log, agentInfo, c) } -func (c *InspectOutputCmd) inspectOutput() error { +func (c *InspectOutputCmd) inspectOutput(agentInfo *info.AgentInfo) error { rawConfig, err := loadConfig(c.cfgPath) if err != nil { return err @@ -114,7 +120,7 @@ func (c *InspectOutputCmd) inspectOutput() error { } if isStandalone(cfg.Fleet) { - return printOutputFromConfig(l, c.output, c.program, rawConfig) + return printOutputFromConfig(l, agentInfo, c.output, c.program, rawConfig) } fleetConfig, err := loadFleetConfig(rawConfig) @@ -124,11 +130,11 @@ func (c *InspectOutputCmd) inspectOutput() error { return fmt.Errorf("no fleet config retrieved yet") } - return printOutputFromMap(l, c.output, c.program, fleetConfig) + return printOutputFromMap(l, agentInfo, c.output, c.program, fleetConfig) } -func printOutputFromConfig(log *logger.Logger, output, programName string, cfg *config.Config) error { - programsGroup, err := getProgramsFromConfig(log, cfg) +func printOutputFromConfig(log *logger.Logger, agentInfo *info.AgentInfo, output, programName string, cfg *config.Config) error { + programsGroup, err := getProgramsFromConfig(log, agentInfo, cfg) if err != nil { return err @@ -164,16 +170,16 @@ func printOutputFromConfig(log *logger.Logger, output, programName string, cfg * } -func printOutputFromMap(log *logger.Logger, output, programName string, cfg map[string]interface{}) error { +func printOutputFromMap(log *logger.Logger, agentInfo *info.AgentInfo, output, programName string, cfg map[string]interface{}) error { c, err := config.NewConfigFrom(cfg) if err != nil { return err } - return printOutputFromConfig(log, output, programName, c) + return printOutputFromConfig(log, agentInfo, output, programName, c) } -func getProgramsFromConfig(log *logger.Logger, cfg *config.Config) (map[string][]program.Program, error) { +func getProgramsFromConfig(log *logger.Logger, agentInfo *info.AgentInfo, cfg *config.Config) (map[string][]program.Program, error) { monitor := noop.NewMonitor() router := &inmemRouter{} ctx, cancel := context.WithCancel(context.Background()) @@ -186,6 +192,7 @@ func getProgramsFromConfig(log *logger.Logger, cfg *config.Config) (map[string][ emit, err := emitter( ctx, log, + agentInfo, composableWaiter, router, &configModifiers{ diff --git a/x-pack/elastic-agent/pkg/agent/application/local_mode.go b/x-pack/elastic-agent/pkg/agent/application/local_mode.go index f8eed0f5792..b58e260cab6 100644 --- a/x-pack/elastic-agent/pkg/agent/application/local_mode.go +++ b/x-pack/elastic-agent/pkg/agent/application/local_mode.go @@ -115,6 +115,7 @@ func newLocal( emit, err := emitter( localApplication.bgContext, log, + agentInfo, composableCtrl, router, &configModifiers{ diff --git a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go index d1eaf197a88..647eae6d4e6 100644 --- a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go +++ b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go @@ -168,6 +168,7 @@ func newManaged( emit, err := emitter( managedApplication.bgContext, log, + agentInfo, composableCtrl, router, &configModifiers{ diff --git a/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go b/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go index 81f2419f936..65cb27547ff 100644 --- a/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configrequest" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" @@ -32,8 +33,9 @@ func TestManagedModeRouting(t *testing.T) { log, _ := logger.New("") router, _ := newRouter(log, streamFn) + agentInfo, _ := info.NewAgentInfo() composableCtrl, _ := composable.New(log, nil) - emit, err := emitter(ctx, log, composableCtrl, router, &configModifiers{Decorators: []decoratorFunc{injectMonitoring}}) + emit, err := emitter(ctx, log, agentInfo, composableCtrl, router, &configModifiers{Decorators: []decoratorFunc{injectMonitoring}}) require.NoError(t, err) actionDispatcher, err := newActionDispatcher(ctx, log, &handlerDefault{log: log}) diff --git a/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator.go b/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator.go index 2b04126381b..3fc49ef17d3 100644 --- a/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator.go +++ b/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator.go @@ -7,6 +7,7 @@ package application import ( "fmt" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/program" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/transpiler" ) @@ -28,7 +29,7 @@ const ( defaultOutputName = "default" ) -func injectMonitoring(outputGroup string, rootAst *transpiler.AST, programsToRun []program.Program) ([]program.Program, error) { +func injectMonitoring(agentInfo *info.AgentInfo, outputGroup string, rootAst *transpiler.AST, programsToRun []program.Program) ([]program.Program, error) { var err error monitoringProgram := program.Program{ Spec: program.Spec{ @@ -63,7 +64,7 @@ func injectMonitoring(outputGroup string, rootAst *transpiler.AST, programsToRun } ast := rootAst.Clone() - if err := getMonitoringRule(monitoringOutputName).Apply(ast); err != nil { + if err := getMonitoringRule(monitoringOutputName).Apply(agentInfo, ast); err != nil { return programsToRun, err } @@ -93,6 +94,7 @@ func getMonitoringRule(outputName string) *transpiler.RuleList { return transpiler.NewRuleList( transpiler.Copy(monitoringOutputSelector, outputKey), transpiler.Rename(fmt.Sprintf("%s.%s", outputsKey, outputName), elasticsearchKey), + transpiler.InjectAgentInfo(), transpiler.Filter(monitoringKey, programsKey, outputKey), ) } diff --git a/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator_test.go b/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator_test.go index f50bb74d5e8..6a3be4100be 100644 --- a/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/monitoring_decorator_test.go @@ -7,17 +7,22 @@ package application import ( "testing" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/program" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/transpiler" ) func TestMonitoringInjection(t *testing.T) { + agentInfo, err := info.NewAgentInfo() + if err != nil { + t.Fatal(err) + } ast, err := transpiler.NewAST(inputConfigMap) if err != nil { t.Fatal(err) } - programsToRun, err := program.Programs(ast) + programsToRun, err := program.Programs(agentInfo, ast) if err != nil { t.Fatal(err) } @@ -25,7 +30,7 @@ func TestMonitoringInjection(t *testing.T) { GROUPLOOP: for group, ptr := range programsToRun { programsCount := len(ptr) - newPtr, err := injectMonitoring(group, ast, ptr) + newPtr, err := injectMonitoring(agentInfo, group, ast, ptr) if err != nil { t.Error(err) continue GROUPLOOP @@ -83,12 +88,16 @@ GROUPLOOP: } func TestMonitoringInjectionDefaults(t *testing.T) { + agentInfo, err := info.NewAgentInfo() + if err != nil { + t.Fatal(err) + } ast, err := transpiler.NewAST(inputConfigMapDefaults) if err != nil { t.Fatal(err) } - programsToRun, err := program.Programs(ast) + programsToRun, err := program.Programs(agentInfo, ast) if err != nil { t.Fatal(err) } @@ -96,7 +105,7 @@ func TestMonitoringInjectionDefaults(t *testing.T) { GROUPLOOP: for group, ptr := range programsToRun { programsCount := len(ptr) - newPtr, err := injectMonitoring(group, ast, ptr) + newPtr, err := injectMonitoring(agentInfo, group, ast, ptr) if err != nil { t.Error(err) continue GROUPLOOP @@ -154,12 +163,16 @@ GROUPLOOP: } func TestMonitoringInjectionDisabled(t *testing.T) { + agentInfo, err := info.NewAgentInfo() + if err != nil { + t.Fatal(err) + } ast, err := transpiler.NewAST(inputConfigMapDisabled) if err != nil { t.Fatal(err) } - programsToRun, err := program.Programs(ast) + programsToRun, err := program.Programs(agentInfo, ast) if err != nil { t.Fatal(err) } @@ -167,7 +180,7 @@ func TestMonitoringInjectionDisabled(t *testing.T) { GROUPLOOP: for group, ptr := range programsToRun { programsCount := len(ptr) - newPtr, err := injectMonitoring(group, ast, ptr) + newPtr, err := injectMonitoring(agentInfo, group, ast, ptr) if err != nil { t.Error(err) continue GROUPLOOP diff --git a/x-pack/elastic-agent/pkg/agent/program/program.go b/x-pack/elastic-agent/pkg/agent/program/program.go index 25b56081e68..f3f17d06b9d 100644 --- a/x-pack/elastic-agent/pkg/agent/program/program.go +++ b/x-pack/elastic-agent/pkg/agent/program/program.go @@ -47,7 +47,7 @@ func (p *Program) Configuration() map[string]interface{} { // Programs take a Tree representation of the main configuration and apply all the different // programs rules and generate individual configuration from the rules. -func Programs(singleConfig *transpiler.AST) (map[string][]Program, error) { +func Programs(agentInfo transpiler.AgentInfo, singleConfig *transpiler.AST) (map[string][]Program, error) { grouped, err := groupByOutputs(singleConfig) if err != nil { return nil, errors.New(err, errors.TypeConfig, "fail to extract program configuration") @@ -55,7 +55,7 @@ func Programs(singleConfig *transpiler.AST) (map[string][]Program, error) { groupedPrograms := make(map[string][]Program) for k, config := range grouped { - programs, err := detectPrograms(config) + programs, err := detectPrograms(agentInfo, config) if err != nil { return nil, errors.New(err, errors.TypeConfig, "fail to generate program configuration") } @@ -65,11 +65,11 @@ func Programs(singleConfig *transpiler.AST) (map[string][]Program, error) { return groupedPrograms, nil } -func detectPrograms(singleConfig *transpiler.AST) ([]Program, error) { +func detectPrograms(agentInfo transpiler.AgentInfo, singleConfig *transpiler.AST) ([]Program, error) { programs := make([]Program, 0) for _, spec := range Supported { specificAST := singleConfig.Clone() - err := spec.Rules.Apply(specificAST) + err := spec.Rules.Apply(agentInfo, specificAST) if err != nil { return nil, err } diff --git a/x-pack/elastic-agent/pkg/agent/program/program_test.go b/x-pack/elastic-agent/pkg/agent/program/program_test.go index c15510b6655..8c2cf8c499f 100644 --- a/x-pack/elastic-agent/pkg/agent/program/program_test.go +++ b/x-pack/elastic-agent/pkg/agent/program/program_test.go @@ -437,7 +437,7 @@ func TestConfiguration(t *testing.T) { ast, err := transpiler.NewAST(m) require.NoError(t, err) - programs, err := Programs(ast) + programs, err := Programs(&fakeAgentInfo{}, ast) if test.err { require.Error(t, err) return @@ -478,3 +478,17 @@ func TestConfiguration(t *testing.T) { }) } } + +type fakeAgentInfo struct{} + +func (*fakeAgentInfo) AgentID() string { + return "agent-id" +} + +func (*fakeAgentInfo) Version() string { + return "8.0.0" +} + +func (*fakeAgentInfo) Snapshot() bool { + return false +} diff --git a/x-pack/elastic-agent/pkg/agent/program/supported.go b/x-pack/elastic-agent/pkg/agent/program/supported.go index 3b314bfa3f4..adc13938ae2 100644 --- a/x-pack/elastic-agent/pkg/agent/program/supported.go +++ b/x-pack/elastic-agent/pkg/agent/program/supported.go @@ -21,7 +21,7 @@ func init() { // spec/filebeat.yml // spec/heartbeat.yml // spec/metricbeat.yml - unpacked := packer.MustUnpack("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") + unpacked := packer.MustUnpack("eJy8WF1zozoSfd+fMa93axdEnF226j4YUnzFJmOSSEJvSLIBW2DfALbx1v73LQHmw0lm7uxszcOUByKk7lb36XP631+Kw5r9fZ3zwz7Ny7/Vmfjyry80s0ryso8DNNsxWz/QfBW/Arjl2DtwZ/cYAnX3lBqCZsGJAlFxU70Q5KssE8p6dUhYHhxIZm35wz4mwx4lsSEwc1+wnBxC8HrvPoTa00P8GIJEhKDcRGh24bZV0If94+LZEGsbbjEgB2q/3pvpPHZN4xTiYP+UztPxvmywLe3WJSzjl6d4H7vmPF48z1OewTpCZOZ277gtSoJ0Vdq4vMwfma1fuCX385UQnYuneF+6NrwjyN+QTBTkZf8ov3MdI+F2fO+a3sf+P7vtOtuqibbs7J6Xrun1e7sjuxbPqspsXocoEDfva4L9I8feluBlOtrnk3Mn66t1Jk4f+epv5yczN2oCdZVmomJakFD7dG+mSkxwIkJVzyJ0FtfYMdtSood97GawIo5xjNBMWWBfhBqsIxz08Qyxl7NLF6NrzNHsnc/vbfFUasNLG29yWFv6hTueCJFy7zqlbnbvqRMIJnQQorNK8DWuxoWgswi14Mi2+zhCsxPHwaX72xvBu3vXCWbMfu3ujiTUgWKwUxnn52MTg0wU3IY11m7WOr6gNtxyW6+fUuNAc0PlzrK761KsX5pcT8LsLMi88zWzCo7gKA8NheVQND5d92tyLjj28QawIMhXqOZdnlKDErkfXlUh8rcE+xcMrFMEdelb4dqkIAgqi6w8hJlVhVCZ5mj/d+sUrZqaKkM8v6klI6M2FLyzmeWwGOI7L13HExTpgLRnXt83/yIAZ0+pkYTAF0zzNyE2DhiUYr3q/a0JUo88g5tmbefjOGYREGmIZsnknrfvYz65szYm/fP03uela+sqdwz16lNjByYHBsSRxvtHDhJBt/uY2rAiWrB/NIN/tHsG+uPz/Df3YR6HaLZz7bOgGVciM96tgaiYAxWmKQf34S5emkZCs1Uc2dblGcCZ3INqUJFrNs+n2AOwCLGvRMi/EGTVIYjzx9X+9y9/bSF3k4o1XUfvIFdCDfJEiFdXmG3KMcxgwueHFtZSg7qparnpKXZzX3AHnhaZKOjzTNDMSqkNd1+RTF9fNGtu1+aBoNgoQhyIRQarEHkFQSudZFbBwGu6MOfp4rX9pciqQsQFRbDi5qykIBBfcVwy29pGtdqmjukWrumWwbP89Up5nQTAkkioGO3PHU8lz5O1BQU8j9AsX2RnwTNYfEWBCHOYu0J5DLGnRIgkoba6d20Zk+CyaNoBTAmylO9CR9qkxh+ynDAQFbHh3TUFuSNOMt7U1nN2akrjQLODhJIN04KaIKvEmlHTNrWPfUraeoWBf6QZKSLkKy0UyJYWbEJEFII7+G9h5961z0eiLRtoocg63cLqDWTVHJ0n8BQC/bSGekLt84bb+oba4sIfBph1TUOhl318tZmdxiX2ztaKAv00LmGCky3BhtLkVO4rLIMJxcvm7iO0an57WGvu2TuxTG+gSEKUvKcbWxWq6kWEfWVa7kIhzb2MYpov/1c/hphnMKOa10GqbI1NHXV3RWoKlHvX7kr3dG1B/xzeab3Pj10LVJikLlbrAwbSbvXy2b3d2hvhQNCX935Mzjx9CsXTtuL0+T20j8yqGDgnvKdE84ldTV6vxrFTE+YYA6T2789H0lGr5v/jeDd5QQTNV8eO+jR1Mj7PNQ1ZrxU39Qu3g4OEU6YFuwjd3ZwDQYMDWrBl0j7bP32yj0qc+b3rwB2bT22RZy9AcAxBKf2Iia1vIwDrm30KCtiRZXAXYX/DwPnIwflIZE4175bv/a/1yxr78rt71/Fn8ptrHP5M6+LYFxh80Gq+8x2xLSWEPVb19cMyWFKNiKaFvkxqvKUydpBw2+rxaZHNEorgRWIx+YGWe3N+1TxjX1IAmZey3ygEe5tb+jJQE/ddTXVUQFljQ3Q5fUPVZFu2NAb8gmpwx4GlhCAesAMfVJa9lm3eBXuO3BGunI8cBRnVJAX1ZsN+/pHmQRKhmWBDjewo8N96HJZ0AehHAs5igQ01zH01HNbuuROcMBio7bB3onDH+IMBvRrelQnJymR4nuRLyXAw+n4muE0KqrHeDnpZAh9ZKrGFMqZXxBYDdXGWo//7CrFFNXq+zVEl1Ob9/hwFp2EtrCI8xJcDUTU1/LN02u77+aeUuunzq2lPbThEHkiJl0mcX2tKg7dNz/hTeD3q+z9EFQc+1d9DR9NG9yrWuKHcwsz5nqC7+yn1G85eZD9PAxfmPO8wKV80uMHfQkTewmdWuCaXnEjK4EtksoMZ/95TxmQdvZUfcMZnG0rJ3cYm80si+9PkXStFXavoeR0DUOF4XkXoXH6PA17XchuWzG56T9Vzggc1C9H5csPrbjigeiT2q7421VOI/LcFamXJhJtmakIzKydIlX1nvH8jmaZrZe/iB5qxijb95aQTG6YcsRTfjB8a3uwsj5N45OO+2uTIHb7ygJc2N9u8uK0Tf8OBUCJLrwniYu3Mhx587QmT/mvU8n5w7s8kphEcHEJteVykRY/tn2PqN6Tod7D401r9QJLe1Ozk3GHNCBfy5YR3NDU+5izmxxKsl2oAzpjcJ3v9UIZdMWfzvIu/pvOTa1sVMY19iP0Fwbu955RHjgO5Rpd1RNA5YZqMqy9C7G0js6mhmqDgwGpWSFs90OK2V8t6lHzcl/1u79W7x2ttZevyLWUfFNcLggrLxLYTYFuKpBhRBXe8Qwg6odbOPmJU9wVwIThQmTk7UFv5XrFc10qieaK2pZDvCbmbYqFI35EX9W6BpRYvyk4ff0vIDfvjoOboRvTZek6kYKpnRdOQH9QdQZ5Kao9LMOG2yMKWiDcFxWq9JDioI+R3BWYcmRZM5nltUrTEZDJPm8yY1CNxmvlDRcyGnEnRUK2R2s+PpFCQ8SZ4dS+BhoKgKeZFtjoyTVwkSC1yUVJzJongVbg8DnONjwt+3KwiNNsRHF+bYkNqnlLj6uOlbUCiirJmftMRKXXDHO8YAnhhQO+Lh4LZJgR6RbLzoRWyomIA1tzSE5IHPXHpBWmXb51IqGXuUNTPPzOW6eV7oRAch3f+1Z7OTjVhDzezyw/EzyeCY0s1Y4aBVVDrE2HXnj2cOQKH977PjrQnLC35X9u+YM6qaU69aKqbujh0grPP1XaIMRGQKV7d2KoFRwzOB6atprOqqzAb3dFEZP6QH/0dpgSRBsx+sXh8R9Kxxg/cTjYsgznBST9o+ICYt00pvXtbgA7HtOXumwTw15LGnxTG8PMm/S2h7HiyxtePD/rqazu8+W2RFof3MeoaqTzjYR974/lyK+KqEKliKrw6YjtZOww9JH5zdBYDIVWTCMBNiL06vJ25djnS4wToiewoV642+2JozH9GYI6++xFBezP3/rUiuHm+jOfBv0pI3wwA/s+CZ8ox5Le3uUVy7zjOhYajSM7xvjf0ffJHxNNk3+FuOwI2mr+PSN3HAmriS3XN958SUa1w6oned0XUf/7y3wAAAP//NCXBlQ==") SupportedMap = make(map[string]Spec) for f, v := range unpacked { diff --git a/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_output_true-filebeat.yml b/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_output_true-filebeat.yml index 8edc27061b0..38b251d95dc 100644 --- a/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_output_true-filebeat.yml +++ b/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_output_true-filebeat.yml @@ -16,6 +16,12 @@ filebeat: target: "event" fields: dataset: generic + - add_fields: + target: "elastic" + fields: + agent.id: agent-id + agent.version: 8.0.0 + agent.snapshot: false output: elasticsearch: enabled: true diff --git a/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_true-filebeat.yml b/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_true-filebeat.yml index 8bd5d93a3b9..6e768db6aa4 100644 --- a/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_true-filebeat.yml +++ b/x-pack/elastic-agent/pkg/agent/program/testdata/enabled_true-filebeat.yml @@ -17,6 +17,12 @@ filebeat: target: "event" fields: dataset: generic + - add_fields: + target: "elastic" + fields: + agent.id: agent-id + agent.version: 8.0.0 + agent.snapshot: false output: elasticsearch: hosts: diff --git a/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-filebeat.yml b/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-filebeat.yml index b996e13b531..01ee955e4ec 100644 --- a/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-filebeat.yml +++ b/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-filebeat.yml @@ -18,6 +18,12 @@ filebeat: target: "event" fields: dataset: generic + - add_fields: + target: "elastic" + fields: + agent.id: agent-id + agent.version: 8.0.0 + agent.snapshot: false - type: log paths: - /var/log/hello3.log @@ -36,6 +42,12 @@ filebeat: target: "event" fields: dataset: generic + - add_fields: + target: "elastic" + fields: + agent.id: agent-id + agent.version: 8.0.0 + agent.snapshot: false output: elasticsearch: hosts: diff --git a/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-metricbeat.yml b/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-metricbeat.yml index c62882ff6da..d09e80accf1 100644 --- a/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-metricbeat.yml +++ b/x-pack/elastic-agent/pkg/agent/program/testdata/single_config-metricbeat.yml @@ -15,6 +15,12 @@ metricbeat: target: "event" fields: dataset: docker.status + - add_fields: + target: "elastic" + fields: + agent.id: agent-id + agent.version: 8.0.0 + agent.snapshot: false - module: docker metricsets: [info] index: metrics-generic-default @@ -30,6 +36,12 @@ metricbeat: target: "event" fields: dataset: generic + - add_fields: + target: "elastic" + fields: + agent.id: agent-id + agent.version: 8.0.0 + agent.snapshot: false - module: apache metricsets: [info] index: metrics-generic-testing @@ -48,7 +60,12 @@ metricbeat: target: "event" fields: dataset: generic - + - add_fields: + target: "elastic" + fields: + agent.id: agent-id + agent.version: 8.0.0 + agent.snapshot: false output: elasticsearch: hosts: [127.0.0.1:9200, 127.0.0.1:9300] diff --git a/x-pack/elastic-agent/pkg/agent/transpiler/rules.go b/x-pack/elastic-agent/pkg/agent/transpiler/rules.go index 5ad790eb31e..29ff1786d1e 100644 --- a/x-pack/elastic-agent/pkg/agent/transpiler/rules.go +++ b/x-pack/elastic-agent/pkg/agent/transpiler/rules.go @@ -14,6 +14,13 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" ) +// AgentInfo is an interface to get the agent info. +type AgentInfo interface { + AgentID() string + Version() string + Snapshot() bool +} + // RuleList is a container that allow the same tree to be executed on multiple defined Rule. type RuleList struct { Rules []Rule @@ -21,15 +28,15 @@ type RuleList struct { // Rule defines a rule that can be Applied on the Tree. type Rule interface { - Apply(*AST) error + Apply(AgentInfo, *AST) error } // Apply applies a list of rules over the same tree and use the result of the previous execution // as the input of the next rule, will return early if any error is raise during the execution. -func (r *RuleList) Apply(ast *AST) error { +func (r *RuleList) Apply(agentInfo AgentInfo, ast *AST) error { var err error for _, rule := range r.Rules { - err = rule.Apply(ast) + err = rule.Apply(agentInfo, ast) if err != nil { return err } @@ -73,6 +80,8 @@ func (r *RuleList) MarshalYAML() (interface{}, error) { name = "inject_index" case *InjectStreamProcessorRule: name = "inject_stream_processor" + case *InjectAgentInfoRule: + name = "inject_agent_info" case *MakeArrayRule: name = "make_array" case *RemoveKeyRule: @@ -154,6 +163,8 @@ func (r *RuleList) UnmarshalYAML(unmarshal func(interface{}) error) error { r = &InjectIndexRule{} case "inject_stream_processor": r = &InjectStreamProcessorRule{} + case "inject_agent_info": + r = &InjectAgentInfoRule{} case "make_array": r = &MakeArrayRule{} case "remove_key": @@ -181,7 +192,7 @@ type SelectIntoRule struct { } // Apply applies select into rule. -func (r *SelectIntoRule) Apply(ast *AST) error { +func (r *SelectIntoRule) Apply(_ AgentInfo, ast *AST) error { target := &Dict{} for _, selector := range r.Selectors { @@ -214,7 +225,7 @@ type RemoveKeyRule struct { } // Apply applies remove key rule. -func (r *RemoveKeyRule) Apply(ast *AST) error { +func (r *RemoveKeyRule) Apply(_ AgentInfo, ast *AST) error { sourceMap, ok := ast.root.(*Dict) if !ok { return nil @@ -250,7 +261,7 @@ type MakeArrayRule struct { } // Apply applies make array rule. -func (r *MakeArrayRule) Apply(ast *AST) error { +func (r *MakeArrayRule) Apply(_ AgentInfo, ast *AST) error { sourceNode, found := Lookup(ast, r.Item) if !found { return nil @@ -286,7 +297,7 @@ type CopyToListRule struct { } // Apply copies specified node into every item of the list. -func (r *CopyToListRule) Apply(ast *AST) error { +func (r *CopyToListRule) Apply(_ AgentInfo, ast *AST) error { sourceNode, found := Lookup(ast, r.Item) if !found { // nothing to copy @@ -347,7 +358,7 @@ type CopyAllToListRule struct { } // Apply copies all nodes into every item of the list. -func (r *CopyAllToListRule) Apply(ast *AST) error { +func (r *CopyAllToListRule) Apply(agentInfo AgentInfo, ast *AST) error { // get list of nodes astMap, err := ast.Map() if err != nil { @@ -370,7 +381,7 @@ func (r *CopyAllToListRule) Apply(ast *AST) error { continue } - if err := CopyToList(item, r.To, r.OnConflict).Apply(ast); err != nil { + if err := CopyToList(item, r.To, r.OnConflict).Apply(agentInfo, ast); err != nil { return err } } @@ -393,7 +404,7 @@ type FixStreamRule struct { } // Apply stream fixes. -func (r *FixStreamRule) Apply(ast *AST) error { +func (r *FixStreamRule) Apply(_ AgentInfo, ast *AST) error { const defaultDataset = "generic" const defaultNamespace = "default" @@ -526,7 +537,7 @@ type InjectIndexRule struct { } // Apply injects index into input. -func (r *InjectIndexRule) Apply(ast *AST) error { +func (r *InjectIndexRule) Apply(_ AgentInfo, ast *AST) error { inputsNode, found := Lookup(ast, "inputs") if !found { return nil @@ -583,7 +594,7 @@ type InjectStreamProcessorRule struct { } // Apply injects processor into input. -func (r *InjectStreamProcessorRule) Apply(ast *AST) error { +func (r *InjectStreamProcessorRule) Apply(_ AgentInfo, ast *AST) error { inputsNode, found := Lookup(ast, "inputs") if !found { return nil @@ -665,6 +676,63 @@ func InjectStreamProcessor(onMerge, streamType string) *InjectStreamProcessorRul } } +// InjectAgentInfoRule injects agent information into each rule. +type InjectAgentInfoRule struct{} + +// Apply injects index into input. +func (r *InjectAgentInfoRule) Apply(agentInfo AgentInfo, ast *AST) error { + inputsNode, found := Lookup(ast, "inputs") + if !found { + return nil + } + + inputsList, ok := inputsNode.Value().(*List) + if !ok { + return nil + } + + for _, inputNode := range inputsList.value { + inputMap, ok := inputNode.(*Dict) + if !ok { + continue + } + + // get processors node + processorsNode, found := inputMap.Find("processors") + if !found { + processorsNode = &Key{ + name: "processors", + value: &List{value: make([]Node, 0)}, + } + + inputMap.value = append(inputMap.value, processorsNode) + } + + processorsList, ok := processorsNode.Value().(*List) + if !ok { + return errors.New("InjectAgentInfoRule: processors is not a list") + } + + // elastic.agent + processorMap := &Dict{value: make([]Node, 0)} + processorMap.value = append(processorMap.value, &Key{name: "target", value: &StrVal{value: "elastic"}}) + processorMap.value = append(processorMap.value, &Key{name: "fields", value: &Dict{value: []Node{ + &Key{name: "agent.id", value: &StrVal{value: agentInfo.AgentID()}}, + &Key{name: "agent.version", value: &StrVal{value: agentInfo.Version()}}, + &Key{name: "agent.snapshot", value: &BoolVal{value: agentInfo.Snapshot()}}, + }}}) + addFieldsMap := &Dict{value: []Node{&Key{"add_fields", processorMap}}} + processorsList.value = mergeStrategy("").InjectItem(processorsList.value, addFieldsMap) + } + + return nil +} + +// InjectAgentInfo creates a InjectAgentInfoRule +func InjectAgentInfo() *InjectAgentInfoRule { + return &InjectAgentInfoRule{} +} + // ExtractListItemRule extract items with specified name from a list of maps. // The result is store in a new array. // Example: @@ -679,7 +747,7 @@ type ExtractListItemRule struct { } // Apply extracts items from array. -func (r *ExtractListItemRule) Apply(ast *AST) error { +func (r *ExtractListItemRule) Apply(_ AgentInfo, ast *AST) error { node, found := Lookup(ast, r.Path) if !found { return nil @@ -740,7 +808,7 @@ type RenameRule struct { // Apply renames the last items of a Selector to a new name and keep all the other values and will // return an error on failure. -func (r *RenameRule) Apply(ast *AST) error { +func (r *RenameRule) Apply(_ AgentInfo, ast *AST) error { // Skip rename when node is not found. node, ok := Lookup(ast, r.From) if !ok { @@ -773,7 +841,7 @@ func Copy(from, to Selector) *CopyRule { } // Apply copy a part of a tree into a new destination. -func (r CopyRule) Apply(ast *AST) error { +func (r CopyRule) Apply(_ AgentInfo, ast *AST) error { node, ok := Lookup(ast, r.From) // skip when the `from` node is not found. if !ok { @@ -800,7 +868,7 @@ func Translate(path Selector, mapper map[string]interface{}) *TranslateRule { } // Apply translates matching elements of a translation table for a specific selector. -func (r *TranslateRule) Apply(ast *AST) error { +func (r *TranslateRule) Apply(_ AgentInfo, ast *AST) error { // Skip translate when node is not found. node, ok := Lookup(ast, r.Path) if !ok { @@ -873,7 +941,7 @@ func TranslateWithRegexp(path Selector, re *regexp.Regexp, with string) *Transla } // Apply translates matching elements of a translation table for a specific selector. -func (r *TranslateWithRegexpRule) Apply(ast *AST) error { +func (r *TranslateWithRegexpRule) Apply(_ AgentInfo, ast *AST) error { // Skip translate when node is not found. node, ok := Lookup(ast, r.Path) if !ok { @@ -914,7 +982,7 @@ func Map(path Selector, rules ...Rule) *MapRule { } // Apply maps multiples rules over a subset of the tree. -func (r *MapRule) Apply(ast *AST) error { +func (r *MapRule) Apply(agentInfo AgentInfo, ast *AST) error { node, ok := Lookup(ast, r.Path) // Skip map when node is not found. if !ok { @@ -931,15 +999,15 @@ func (r *MapRule) Apply(ast *AST) error { switch t := n.Value().(type) { case *List: - return mapList(r, t) + return mapList(agentInfo, r, t) case *Dict: - return mapDict(r, t) + return mapDict(agentInfo, r, t) case *Key: switch t := n.Value().(type) { case *List: - return mapList(r, t) + return mapList(agentInfo, r, t) case *Dict: - return mapDict(r, t) + return mapDict(agentInfo, r, t) default: return fmt.Errorf( "cannot iterate over node, invalid type expected 'List' or 'Dict' received '%T'", @@ -954,13 +1022,13 @@ func (r *MapRule) Apply(ast *AST) error { ) } -func mapList(r *MapRule, l *List) error { +func mapList(agentInfo AgentInfo, r *MapRule, l *List) error { values := l.Value().([]Node) for idx, item := range values { newAST := &AST{root: item} for _, rule := range r.Rules { - err := rule.Apply(newAST) + err := rule.Apply(agentInfo, newAST) if err != nil { return err } @@ -970,10 +1038,10 @@ func mapList(r *MapRule, l *List) error { return nil } -func mapDict(r *MapRule, l *Dict) error { +func mapDict(agentInfo AgentInfo, r *MapRule, l *Dict) error { newAST := &AST{root: l} for _, rule := range r.Rules { - err := rule.Apply(newAST) + err := rule.Apply(agentInfo, newAST) if err != nil { return err } @@ -1024,7 +1092,7 @@ func Filter(selectors ...Selector) *FilterRule { } // Apply filters a Tree based on list of selectors. -func (r *FilterRule) Apply(ast *AST) error { +func (r *FilterRule) Apply(_ AgentInfo, ast *AST) error { mergedAST := &AST{root: &Dict{}} var err error for _, selector := range r.Selectors { @@ -1054,7 +1122,7 @@ func FilterValues(selector Selector, key Selector, values ...interface{}) *Filte } // Apply filters a Tree based on list of selectors. -func (r *FilterValuesRule) Apply(ast *AST) error { +func (r *FilterValuesRule) Apply(_ AgentInfo, ast *AST) error { node, ok := Lookup(ast, r.Selector) // Skip map when node is not found. if !ok { @@ -1167,7 +1235,7 @@ func (r *FilterValuesWithRegexpRule) UnmarshalYAML(unmarshal func(interface{}) e } // Apply filters a Tree based on list of selectors. -func (r *FilterValuesWithRegexpRule) Apply(ast *AST) error { +func (r *FilterValuesWithRegexpRule) Apply(_ AgentInfo, ast *AST) error { node, ok := Lookup(ast, r.Selector) // Skip map when node is not found. if !ok { diff --git a/x-pack/elastic-agent/pkg/agent/transpiler/rules_test.go b/x-pack/elastic-agent/pkg/agent/transpiler/rules_test.go index c3207f48cea..d92ba0de985 100644 --- a/x-pack/elastic-agent/pkg/agent/transpiler/rules_test.go +++ b/x-pack/elastic-agent/pkg/agent/transpiler/rules_test.go @@ -165,6 +165,51 @@ inputs: }, }, + "inject agent info": { + givenYAML: ` +inputs: + - name: No processors + type: file + - name: With processors + type: file + processors: + - add_fields: + target: other + fields: + data: more +`, + expectedYAML: ` +inputs: + - name: No processors + type: file + processors: + - add_fields: + target: elastic + fields: + agent.id: agent-id + agent.snapshot: false + agent.version: 8.0.0 + - name: With processors + type: file + processors: + - add_fields: + target: other + fields: + data: more + - add_fields: + target: elastic + fields: + agent.id: agent-id + agent.snapshot: false + agent.version: 8.0.0 +`, + rule: &RuleList{ + Rules: []Rule{ + InjectAgentInfo(), + }, + }, + }, + "extract items from array": { givenYAML: ` streams: @@ -615,7 +660,7 @@ logs: a, err := makeASTFromYAML(test.givenYAML) require.NoError(t, err) - err = test.rule.Apply(a) + err = test.rule.Apply(FakeAgentInfo(), a) require.NoError(t, err) v := &MapVisitor{} @@ -751,3 +796,21 @@ func TestSerialization(t *testing.T) { assert.Equal(t, value, v) }) } + +type fakeAgentInfo struct{} + +func (*fakeAgentInfo) AgentID() string { + return "agent-id" +} + +func (*fakeAgentInfo) Version() string { + return "8.0.0" +} + +func (*fakeAgentInfo) Snapshot() bool { + return false +} + +func FakeAgentInfo() AgentInfo { + return &fakeAgentInfo{} +} diff --git a/x-pack/elastic-agent/spec/filebeat.yml b/x-pack/elastic-agent/spec/filebeat.yml index 1b184b10098..aa09b4f9121 100644 --- a/x-pack/elastic-agent/spec/filebeat.yml +++ b/x-pack/elastic-agent/spec/filebeat.yml @@ -87,6 +87,8 @@ rules: values: - true +- inject_agent_info: {} + - copy: from: inputs to: filebeat diff --git a/x-pack/elastic-agent/spec/metricbeat.yml b/x-pack/elastic-agent/spec/metricbeat.yml index 94b69e9a2f3..a5015a974a5 100644 --- a/x-pack/elastic-agent/spec/metricbeat.yml +++ b/x-pack/elastic-agent/spec/metricbeat.yml @@ -73,6 +73,8 @@ rules: - remove_key: key: use_output +- inject_agent_info: {} + - copy: from: inputs to: metricbeat From 5ef953bf6447ee4200f22308ac9719c97a2a8758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Tue, 6 Oct 2020 15:40:03 +0200 Subject: [PATCH 084/156] feat: add a new step to run the e2e tests for certain parts of Beats (#21100) * feat: add a new step to run the e2e tests for certain parts of Beats We are going to trigger the tests for those parts affected by the elastic-agent, filebeat, or metricbeat, because those are the ones we verify in the e2e-testing suite * chore: do not include heartbeat * feat: trigger the e2e tests * fix: use relative path * chore: use proper target branch name for PRs * chore: use different tag * fix: use proper env variable * chore: pass github checks context to downstream job * chore: revert shared lib version Co-authored-by: Victor Martinez * chore: add BASE_DIR env variable Co-authored-by: Victor Martinez * chore: remove duplicated env * ffix: add param comma separator * fix: wrong copy&paste * chore: move e2e GH check out of the release context * chore: simplify conditional logic * chore: refine execution of test suites * fix: use proper parameter name * chore: set metricbeat version * chore: remove slack notifications on PRs * chore: update parameter * chore: run multiple test suites per beat type Co-authored-by: Victor Martinez --- .ci/packaging.groovy | 50 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/.ci/packaging.groovy b/.ci/packaging.groovy index 2be78aac68f..301ead43bab 100644 --- a/.ci/packaging.groovy +++ b/.ci/packaging.groovy @@ -5,12 +5,14 @@ pipeline { agent none environment { - BASE_DIR = 'src/github.com/elastic/beats' + REPO = 'beats' + BASE_DIR = "src/github.com/elastic/${env.REPO}" JOB_GCS_BUCKET = 'beats-ci-artifacts' JOB_GCS_BUCKET_STASH = 'beats-ci-temp' JOB_GCS_CREDENTIALS = 'beats-ci-gcs-plugin' DOCKERELASTIC_SECRET = 'secret/observability-team/ci/docker-registry/prod' DOCKER_REGISTRY = 'docker.elastic.co' + GITHUB_CHECK_E2E_TESTS_NAME = 'E2E Tests' SNAPSHOT = "true" PIPELINE_LOG_LEVEL = "INFO" } @@ -119,6 +121,7 @@ pipeline { release() pushCIDockerImages() } + runE2ETestForPackages() } } stage('Package Mac OS'){ @@ -209,6 +212,25 @@ def tagAndPush(name){ } } +def runE2ETestForPackages(){ + def suite = '' + + catchError(buildResult: 'UNSTABLE', message: 'Unable to run e2e tests', stageResult: 'FAILURE') { + if ("${env.BEATS_FOLDER}" == "filebeat" || "${env.BEATS_FOLDER}" == "x-pack/filebeat") { + suite = 'helm,ingest-manager' + } else if ("${env.BEATS_FOLDER}" == "metricbeat" || "${env.BEATS_FOLDER}" == "x-pack/metricbeat") { + suite = '' + } else if ("${env.BEATS_FOLDER}" == "x-pack/elastic-agent") { + suite = 'ingest-manager' + } else { + echo("Skipping E2E tests for ${env.BEATS_FOLDER}.") + return + } + + triggerE2ETests(suite) + } +} + def release(){ withBeatsEnv(){ dir("${env.BEATS_FOLDER}") { @@ -218,6 +240,32 @@ def release(){ } } +def triggerE2ETests(String suite) { + echo("Triggering E2E tests for ${env.BEATS_FOLDER}. Test suite: ${suite}.") + + def branchName = isPR() ? "${env.CHANGE_TARGET}" : "${env.JOB_BASE_NAME}" + def e2eTestsPipeline = "e2e-tests/e2e-testing-mbp/${branchName}" + build(job: "${e2eTestsPipeline}", + parameters: [ + booleanParam(name: 'forceSkipGitChecks', value: true), + booleanParam(name: 'forceSkipPresubmit', value: true), + booleanParam(name: 'notifyOnGreenBuilds', value: !isPR()), + booleanParam(name: 'USE_CI_SNAPSHOTS', value: true), + string(name: 'ELASTIC_AGENT_VERSION', value: "pr-${env.CHANGE_ID}"), + string(name: 'METRICBEAT_VERSION', value: "pr-${env.CHANGE_ID}"), + string(name: 'runTestsSuites', value: suite), + string(name: 'GITHUB_CHECK_NAME', value: env.GITHUB_CHECK_E2E_TESTS_NAME), + string(name: 'GITHUB_CHECK_REPO', value: env.REPO), + string(name: 'GITHUB_CHECK_SHA1', value: env.GIT_BASE_COMMIT), + ], + propagate: false, + wait: false + ) + + def notifyContext = "${env.GITHUB_CHECK_E2E_TESTS_NAME} for ${env.BEATS_FOLDER}" + githubNotify(context: "${notifyContext}", description: "${notifyContext} ...", status: 'PENDING', targetUrl: "${env.JENKINS_URL}search/?q=${e2eTestsPipeline.replaceAll('/','+')}") +} + def withMacOSEnv(Closure body){ withEnvMask( vars: [ [var: "KEYCHAIN_PASS", password: getVaultSecret(secret: "secret/jenkins-ci/macos-codesign-keychain").data.password], From 9d2f3b9cfdda63c5ddba93c38ef7e24c6d516a56 Mon Sep 17 00:00:00 2001 From: Chris Mark Date: Tue, 6 Oct 2020 17:28:09 +0300 Subject: [PATCH 085/156] Move Prometheus query & remote_write to GA (#21507) --- CHANGELOG.next.asciidoc | 1 + metricbeat/docs/modules/prometheus/query.asciidoc | 2 -- metricbeat/docs/modules/prometheus/remote_write.asciidoc | 2 -- metricbeat/docs/modules_list.asciidoc | 4 ++-- metricbeat/module/prometheus/fields.go | 2 +- metricbeat/module/prometheus/query/_meta/fields.yml | 2 +- metricbeat/module/prometheus/remote_write/_meta/fields.yml | 2 +- 7 files changed, 6 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index cd1e6c50a4c..0fb2aa0f73d 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -738,6 +738,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add overview and platform health dashboards to Cloud Foundry module. {pull}21124[21124] - Release lambda metricset in aws module as GA. {issue}21251[21251] {pull}21255[21255] - Add dashboard for pubsub metricset in googlecloud module. {pull}21326[21326] {issue}17137[17137] +- Move Prometheus query & remote_write to GA. {pull}21507[21507] - Expand unsupported option from namespace to metrics in the azure module. {pull}21486[21486] - Map cloud data filed `cloud.account.id` to azure subscription. {pull}21483[21483] {issue}21381[21381] diff --git a/metricbeat/docs/modules/prometheus/query.asciidoc b/metricbeat/docs/modules/prometheus/query.asciidoc index 72c0fde9278..ff746df44a7 100644 --- a/metricbeat/docs/modules/prometheus/query.asciidoc +++ b/metricbeat/docs/modules/prometheus/query.asciidoc @@ -5,8 +5,6 @@ This file is generated! See scripts/mage/docs_collector.go [[metricbeat-metricset-prometheus-query]] === Prometheus query metricset -beta[] - include::../../../module/prometheus/query/_meta/docs.asciidoc[] diff --git a/metricbeat/docs/modules/prometheus/remote_write.asciidoc b/metricbeat/docs/modules/prometheus/remote_write.asciidoc index 9d871805344..535fdec82e6 100644 --- a/metricbeat/docs/modules/prometheus/remote_write.asciidoc +++ b/metricbeat/docs/modules/prometheus/remote_write.asciidoc @@ -5,8 +5,6 @@ This file is generated! See scripts/mage/docs_collector.go [[metricbeat-metricset-prometheus-remote_write]] === Prometheus remote_write metricset -beta[] - include::../../../module/prometheus/remote_write/_meta/docs.asciidoc[] diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index 949657459db..5ff2305665f 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -222,8 +222,8 @@ This file is generated! See scripts/mage/docs_collector.go |<> |<> |image:./images/icon-yes.png[Prebuilt dashboards are available] | .3+| .3+| |<> -|<> beta[] -|<> beta[] +|<> +|<> |<> |image:./images/icon-yes.png[Prebuilt dashboards are available] | .4+| .4+| |<> |<> diff --git a/metricbeat/module/prometheus/fields.go b/metricbeat/module/prometheus/fields.go index e93b578c7b7..ff89ddf8ac7 100644 --- a/metricbeat/module/prometheus/fields.go +++ b/metricbeat/module/prometheus/fields.go @@ -32,5 +32,5 @@ func init() { // AssetPrometheus returns asset data. // This is the base64 encoded gzipped contents of module/prometheus. func AssetPrometheus() string { - return "eJzMkkGO2zAMRfc+xYe7G2TmAF70BAXaosuiCBT7O1ZHllSSniC3LxzHGU0yQJF2Uy75RfLxi4945rFBljTSBk5aAeYtsEH95ZKsK6CjtuKz+RQbfKwA4Js5U2grLrNDL2mEw2sVGLucfLSnCtAhiW3bFHu/b9C7oKwAYaBTNti7+Q3NfNxrg++1aqg3qAezXP+ogN4zdNqc5j4iupFX1HPYMc+9JE35nCnL5viAz9JR4BV+zEnMRcNA4QbB7RgUBx8CRmftgN6L2gY2EEI1OCG6NO0CL/1WlKX46eEirDBp95OtFeklsV3UZx4PSbpCfsfmNQpnR5r49jz1BmZR76e52u2Nuh1dzj7uz0/rh/ovoW9of02U4//G+uLCdPr1Kdh627P89VPB//Z639nqZqfyNP8Ac2qwfiVLHy5jdzRX5K9vfUURjsm4PYg3/gvR0genPivYqzNn45TyQrmD9ncAAAD//1baTA8=" + return "eJzMkk1u20AMhfc6xYO6C5wcQIueoEBbdFkUxlh6sqaZv5JUDN++kGU5im2gf5tyyTckP77hI555bFAkR9rAUSvAvAU2qD9dknUFdNRWfDGfU4P3FQB8MWcKbcUVduglRzi8VoGpK9kne6oAHbLYts2p9/sGvQvKChAGOmWDvZve0MynvTb4WquGeoN6MCv1twroPUOnzWnuI5KLvKKewo5l6iV5LOfMumyKd/goHQVe4WPJYi4ZBgo3CG7HoDj4EBCdtQN6L2ob2EAI1eCE6PK4C7z0W1Dm4qeHi7DA5N13trZKz4ntrD7zeMjSreQ7Ni+xcjbSxLfnqTcws/rnNFe7vVG30ZXi0/78tH6o/xL6hvbHSDn+b6wvLoynXx+DLbc9yZ8/rPjfXu+drW52Wp/mL2BODZav5NqHe2NvL30BEcZs3B7EG/+FZ+6DU58F69WXs21KeaH8NuvPAAAA///rUkpn" } diff --git a/metricbeat/module/prometheus/query/_meta/fields.yml b/metricbeat/module/prometheus/query/_meta/fields.yml index acbc35db449..31f29117385 100644 --- a/metricbeat/module/prometheus/query/_meta/fields.yml +++ b/metricbeat/module/prometheus/query/_meta/fields.yml @@ -2,5 +2,5 @@ type: group description: > query metricset - release: beta + release: ga fields: diff --git a/metricbeat/module/prometheus/remote_write/_meta/fields.yml b/metricbeat/module/prometheus/remote_write/_meta/fields.yml index e3b2f050a40..17f5f5fe801 100644 --- a/metricbeat/module/prometheus/remote_write/_meta/fields.yml +++ b/metricbeat/module/prometheus/remote_write/_meta/fields.yml @@ -2,5 +2,5 @@ type: group description: > remote write metrics from Prometheus server - release: beta + release: ga fields: From a2decea3c5011668156711f06fa8a1e6195bc5df Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Tue, 6 Oct 2020 09:01:17 -0600 Subject: [PATCH 086/156] Add support for additional fields from V2 ALB logs (#21540) * Add support for additional fields from V2 ALB logs * Add new fields as optional fields and regenerate -expected.json files * add changelog --- CHANGELOG.next.asciidoc | 1 + filebeat/docs/fields.asciidoc | 40 ++++ .../filebeat/module/aws/elb/_meta/fields.yml | 16 ++ .../module/aws/elb/ingest/pipeline.yml | 14 +- .../aws/elb/test/application-lb-http.log | 2 +- .../application-lb-http.log-expected.json | 50 ++++ .../module/aws/elb/test/example-alb-http.log | 5 +- .../test/example-alb-http.log-expected.json | 215 ++++++++++++++++++ x-pack/filebeat/module/aws/fields.go | 2 +- 9 files changed, 341 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 0fb2aa0f73d..99daa875a00 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -607,6 +607,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add related.hosts ecs field to all modules {pull}21160[21160] - Keep cursor state between httpjson input restarts {pull}20751[20751] - Convert aws s3 to v2 input {pull}20005[20005] +- Add support for additional fields from V2 ALB logs. {pull}21540[21540] - Release Cloud Foundry input as GA. {pull}21525[21525] - New Cisco Umbrella dataset {pull}21504[21504] - New juniper.srx dataset for Juniper SRX logs. {pull}20017[20017] diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index e7c2d35ff37..c294aef0f79 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -1884,6 +1884,46 @@ type: keyword The error reason if the executed action failed. +type: keyword + +-- + +*`aws.elb.target_port`*:: ++ +-- +List of IP addresses and ports for the targets that processed this request. + + +type: keyword + +-- + +*`aws.elb.target_status_code`*:: ++ +-- +List of status codes from the responses of the targets. + + +type: keyword + +-- + +*`aws.elb.classification`*:: ++ +-- +The classification for desync mitigation. + + +type: keyword + +-- + +*`aws.elb.classification_reason`*:: ++ +-- +The classification reason code. + + type: keyword -- diff --git a/x-pack/filebeat/module/aws/elb/_meta/fields.yml b/x-pack/filebeat/module/aws/elb/_meta/fields.yml index 9499f8bbb0e..aac074e9347 100644 --- a/x-pack/filebeat/module/aws/elb/_meta/fields.yml +++ b/x-pack/filebeat/module/aws/elb/_meta/fields.yml @@ -101,3 +101,19 @@ type: keyword description: > The error reason if the executed action failed. + - name: target_port + type: keyword + description: > + List of IP addresses and ports for the targets that processed this request. + - name: target_status_code + type: keyword + description: > + List of status codes from the responses of the targets. + - name: classification + type: keyword + description: > + The classification for desync mitigation. + - name: classification_reason + type: keyword + description: > + The classification reason code. diff --git a/x-pack/filebeat/module/aws/elb/ingest/pipeline.yml b/x-pack/filebeat/module/aws/elb/ingest/pipeline.yml index de772ccdf01..8cb2a914921 100644 --- a/x-pack/filebeat/module/aws/elb/ingest/pipeline.yml +++ b/x-pack/filebeat/module/aws/elb/ingest/pipeline.yml @@ -31,7 +31,7 @@ processors: %{TIMESTAMP_ISO8601:event.start} \"(?:-|%{DATA:_tmp.actions_executed})\" \"(?:-|%{DATA:aws.elb.redirect_url})\" - \"(?:-|%{DATA:aws.elb.error.reason})\" + \"(?:-|%{DATA:aws.elb.error.reason})\"( \"(?:-|%{DATA:_tmp.target_port})\")?( \"(?:-|%{DATA:_tmp.target_status_code})\")?( \"(?:-|%{DATA:aws.elb.classification})\")?( \"(?:-|%{DATA:aws.elb.classification_reason})\")? # TCP from Network Load Balancers (v2 Load Balancers) - >- @@ -141,6 +141,18 @@ processors: separator: ',' ignore_missing: true + - split: + field: '_tmp.target_port' + target_field: 'aws.elb.target_port' + separator: ' ' + ignore_missing: true + + - split: + field: '_tmp.target_status_code' + target_field: 'aws.elb.target_status_code' + separator: ' ' + ignore_missing: true + - date: field: '_tmp.timestamp' formats: diff --git a/x-pack/filebeat/module/aws/elb/test/application-lb-http.log b/x-pack/filebeat/module/aws/elb/test/application-lb-http.log index 88ea2d75c26..5d754c4bbaa 100644 --- a/x-pack/filebeat/module/aws/elb/test/application-lb-http.log +++ b/x-pack/filebeat/module/aws/elb/test/application-lb-http.log @@ -8,4 +8,4 @@ http 2019-10-11T15:03:49.331902Z app/filebeat-aws-elb-test/c86a326e7dc14222 77.2 http 2019-10-11T15:55:09.308183Z app/filebeat-aws-elb-test/c86a326e7dc14222 77.227.156.41:37838 10.0.0.192:80 0.001 0.000 0.000 200 200 125 859 "GET http://filebeat-aws-elb-test-12030537.eu-central-1.elb.amazonaws.com:80/ HTTP/1.1" "curl/7.58.0" - - arn:aws:elasticloadbalancing:eu-central-1:627959692251:targetgroup/test-lb-instances/8f04c4fe71f5f794 "Root=1-5da0a5dd-4d9a423a0e9a782fe2f390af" "-" "-" 0 2019-10-11T15:55:09.307000Z "forward" "-" "-" http 2019-10-11T15:55:11.354283Z app/filebeat-aws-elb-test/c86a326e7dc14222 77.227.156.41:37850 10.0.1.107:80 0.001 0.001 0.000 200 200 125 859 "GET http://filebeat-aws-elb-test-12030537.eu-central-1.elb.amazonaws.com:80/ HTTP/1.1" "curl/7.58.0" - - arn:aws:elasticloadbalancing:eu-central-1:627959692251:targetgroup/test-lb-instances/8f04c4fe71f5f794 "Root=1-5da0a5df-7d64cabe9955b4df9acc800a" "-" "-" 0 2019-10-11T15:55:11.352000Z "forward" "-" "-" http 2019-10-11T15:55:11.987940Z app/filebeat-aws-elb-test/c86a326e7dc14222 77.227.156.41:37856 10.0.0.192:80 0.000 0.001 0.000 200 200 125 859 "GET http://filebeat-aws-elb-test-12030537.eu-central-1.elb.amazonaws.com:80/ HTTP/1.1" "curl/7.58.0" - - arn:aws:elasticloadbalancing:eu-central-1:627959692251:targetgroup/test-lb-instances/8f04c4fe71f5f794 "Root=1-5da0a5df-7c958e828ff43b63d0e0fac4" "-" "-" 0 2019-10-11T15:55:11.987000Z "forward" "-" "-" - +http 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 0.000 0.001 0.000 200 200 34 366 "GET http://www.example.com:80/ HTTP/1.1" "curl/7.46.0" - - arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337262-36d228ad5d99923122bbe354" "-" "-" 0 2018-07-02T22:22:48.364000Z "forward,redirect" "-" "-" "10.0.0.1:80" "200" "-" "-" diff --git a/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json b/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json index 28e1564e928..3682fb6520e 100644 --- a/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json +++ b/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json @@ -500,5 +500,55 @@ ], "tracing.trace.id": "Root=1-5da0a5df-7c958e828ff43b63d0e0fac4", "user_agent.original": "curl/7.58.0" + }, + { + "@timestamp": "2018-07-02T22:23:00.186Z", + "aws.elb.action_executed": [ + "forward", + "redirect" + ], + "aws.elb.backend.http.response.status_code": 200, + "aws.elb.backend.ip": "10.0.0.1", + "aws.elb.backend.port": "80", + "aws.elb.backend_processing_time.sec": 0.001, + "aws.elb.matched_rule_priority": "0", + "aws.elb.name": "app/my-loadbalancer/50dc6c495c0c9188", + "aws.elb.protocol": "http", + "aws.elb.request_processing_time.sec": 0.0, + "aws.elb.response_processing_time.sec": 0.0, + "aws.elb.target_group.arn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067", + "aws.elb.target_port": [ + "10.0.0.1:80" + ], + "aws.elb.target_status_code": [ + "200" + ], + "aws.elb.trace_id": "Root=1-58337262-36d228ad5d99923122bbe354", + "aws.elb.type": "http", + "cloud.provider": "aws", + "event.category": "web", + "event.dataset": "aws.elb", + "event.end": "2018-07-02T22:23:00.186Z", + "event.kind": "event", + "event.module": "aws", + "event.outcome": "success", + "event.start": "2018-07-02T22:22:48.364000Z", + "fileset.name": "elb", + "http.request.body.bytes": 34, + "http.request.method": "GET", + "http.request.referrer": "http://www.example.com:80/", + "http.response.body.bytes": 366, + "http.response.status_code": 200, + "http.version": "1.1", + "input.type": "log", + "log.offset": 4431, + "service.type": "aws", + "source.ip": "192.168.131.39", + "source.port": "2817", + "tags": [ + "forwarded" + ], + "tracing.trace.id": "Root=1-58337262-36d228ad5d99923122bbe354", + "user_agent.original": "curl/7.46.0" } ] \ No newline at end of file diff --git a/x-pack/filebeat/module/aws/elb/test/example-alb-http.log b/x-pack/filebeat/module/aws/elb/test/example-alb-http.log index 9e4526d2d61..94c0ec1360b 100644 --- a/x-pack/filebeat/module/aws/elb/test/example-alb-http.log +++ b/x-pack/filebeat/module/aws/elb/test/example-alb-http.log @@ -7,4 +7,7 @@ http 2018-11-30T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.13 http 2018-11-30T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 - 0.000 0.001 0.000 502 - 34 366 "GET http://www.example.com:80/ HTTP/1.1" "curl/7.46.0" - - arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337364-23a8c76965a2ef7629b185e3" "-" "-" 0 2018-11-30T22:22:48.364000Z "forward" "-" "LambdaInvalidResponse" http 2018-11-30T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 - -1 -1 -1 400 - 0 0 "- http://www.example.com:80- -" "-" - - - "-" "-" "-" 0 2018-11-30T22:22:48.364000Z "-" "-" "-" http 2018-11-30T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 - -1 -1 -1 400 - 0 0 "- - -" "-" - - - "-" "-" "-" 0 2018-11-30T22:22:48.364000Z "-" "-" "-" - +h2 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 10.0.1.252:48160 10.0.0.66:9000 0.000 0.002 0.000 200 200 5 257 "GET https://10.0.2.105:773/ HTTP/2.0" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337327-72bd00b0343d75b906739c42" "-" "-" 1 2018-07-02T22:22:48.364000Z "redirect" "https://example.com:80/" "-" "10.0.0.66:9000" "200" "-" "-" +https 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 0.086 0.048 0.037 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337281-1d84f3d73c47ec4e58577259" "www.example.com" "arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012" 1 2018-07-02T22:22:48.364000Z "authenticate,forward" "-" "-" "10.0.0.1:80" "200" "-" "-" +ws 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 10.0.0.140:40914 10.0.1.192:8010 0.001 0.003 0.000 101 101 218 587 "GET http://10.0.0.30:80/ HTTP/1.1" "-" - - arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337364-23a8c76965a2ef7629b185e3" "-" "-" 1 2018-07-02T22:22:48.364000Z "forward" "-" "-" "10.0.1.192:8010" "101" "-" "-" +wss 2018-07-02T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188 10.0.0.140:44244 10.0.0.171:8010 0.000 0.001 0.000 101 101 218 786 "GET https://10.0.0.30:443/ HTTP/1.1" "-" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337364-23a8c76965a2ef7629b185e3" "-" "-" 1 2018-07-02T22:22:48.364000Z "forward" "-" "-" "10.0.0.171:8010" "101" "-" "-" diff --git a/x-pack/filebeat/module/aws/elb/test/example-alb-http.log-expected.json b/x-pack/filebeat/module/aws/elb/test/example-alb-http.log-expected.json index eb1fad5f705..2c1490142fa 100644 --- a/x-pack/filebeat/module/aws/elb/test/example-alb-http.log-expected.json +++ b/x-pack/filebeat/module/aws/elb/test/example-alb-http.log-expected.json @@ -368,5 +368,220 @@ ], "tracing.trace.id": "-", "user_agent.original": "-" + }, + { + "@timestamp": "2018-07-02T22:23:00.186Z", + "aws.elb.action_executed": [ + "redirect" + ], + "aws.elb.backend.http.response.status_code": 200, + "aws.elb.backend.ip": "10.0.0.66", + "aws.elb.backend.port": "9000", + "aws.elb.backend_processing_time.sec": 0.002, + "aws.elb.matched_rule_priority": "1", + "aws.elb.name": "app/my-loadbalancer/50dc6c495c0c9188", + "aws.elb.protocol": "http", + "aws.elb.redirect_url": "https://example.com:80/", + "aws.elb.request_processing_time.sec": 0.0, + "aws.elb.response_processing_time.sec": 0.0, + "aws.elb.ssl_cipher": "ECDHE-RSA-AES128-GCM-SHA256", + "aws.elb.ssl_protocol": "TLSv1.2", + "aws.elb.target_group.arn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067", + "aws.elb.target_port": [ + "10.0.0.66:9000" + ], + "aws.elb.target_status_code": [ + "200" + ], + "aws.elb.trace_id": "Root=1-58337327-72bd00b0343d75b906739c42", + "aws.elb.type": "h2", + "cloud.provider": "aws", + "event.category": "web", + "event.dataset": "aws.elb", + "event.end": "2018-07-02T22:23:00.186Z", + "event.kind": "event", + "event.module": "aws", + "event.outcome": "success", + "event.start": "2018-07-02T22:22:48.364000Z", + "fileset.name": "elb", + "http.request.body.bytes": 5, + "http.request.method": "GET", + "http.request.referrer": "https://10.0.2.105:773/", + "http.response.body.bytes": 257, + "http.response.status_code": 200, + "http.version": "2.0", + "input.type": "log", + "log.offset": 3284, + "service.type": "aws", + "source.ip": "10.0.1.252", + "source.port": "48160", + "tags": [ + "forwarded" + ], + "tls.cipher": "ECDHE-RSA-AES128-GCM-SHA256", + "tls.version": "1.2", + "tls.version_protocol": "tls", + "tracing.trace.id": "Root=1-58337327-72bd00b0343d75b906739c42", + "user_agent.original": "curl/7.46.0" + }, + { + "@timestamp": "2018-07-02T22:23:00.186Z", + "aws.elb.action_executed": [ + "authenticate", + "forward" + ], + "aws.elb.backend.http.response.status_code": 200, + "aws.elb.backend.ip": "10.0.0.1", + "aws.elb.backend.port": "80", + "aws.elb.backend_processing_time.sec": 0.048, + "aws.elb.chosen_cert.arn": "arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012", + "aws.elb.matched_rule_priority": "1", + "aws.elb.name": "app/my-loadbalancer/50dc6c495c0c9188", + "aws.elb.protocol": "http", + "aws.elb.request_processing_time.sec": 0.086, + "aws.elb.response_processing_time.sec": 0.037, + "aws.elb.ssl_cipher": "ECDHE-RSA-AES128-GCM-SHA256", + "aws.elb.ssl_protocol": "TLSv1.2", + "aws.elb.target_group.arn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067", + "aws.elb.target_port": [ + "10.0.0.1:80" + ], + "aws.elb.target_status_code": [ + "200" + ], + "aws.elb.trace_id": "Root=1-58337281-1d84f3d73c47ec4e58577259", + "aws.elb.type": "https", + "cloud.provider": "aws", + "destination.domain": "www.example.com", + "event.category": "web", + "event.dataset": "aws.elb", + "event.end": "2018-07-02T22:23:00.186Z", + "event.kind": "event", + "event.module": "aws", + "event.outcome": "success", + "event.start": "2018-07-02T22:22:48.364000Z", + "fileset.name": "elb", + "http.request.body.bytes": 0, + "http.request.method": "GET", + "http.request.referrer": "https://www.example.com:443/", + "http.response.body.bytes": 57, + "http.response.status_code": 200, + "http.version": "1.1", + "input.type": "log", + "log.offset": 3750, + "service.type": "aws", + "source.ip": "192.168.131.39", + "source.port": "2817", + "tags": [ + "forwarded" + ], + "tls.cipher": "ECDHE-RSA-AES128-GCM-SHA256", + "tls.version": "1.2", + "tls.version_protocol": "tls", + "tracing.trace.id": "Root=1-58337281-1d84f3d73c47ec4e58577259", + "user_agent.original": "curl/7.46.0" + }, + { + "@timestamp": "2018-07-02T22:23:00.186Z", + "aws.elb.action_executed": [ + "forward" + ], + "aws.elb.backend.http.response.status_code": 101, + "aws.elb.backend.ip": "10.0.1.192", + "aws.elb.backend.port": "8010", + "aws.elb.backend_processing_time.sec": 0.003, + "aws.elb.matched_rule_priority": "1", + "aws.elb.name": "app/my-loadbalancer/50dc6c495c0c9188", + "aws.elb.protocol": "http", + "aws.elb.request_processing_time.sec": 0.001, + "aws.elb.response_processing_time.sec": 0.0, + "aws.elb.target_group.arn": "arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067", + "aws.elb.target_port": [ + "10.0.1.192:8010" + ], + "aws.elb.target_status_code": [ + "101" + ], + "aws.elb.trace_id": "Root=1-58337364-23a8c76965a2ef7629b185e3", + "aws.elb.type": "ws", + "cloud.provider": "aws", + "event.category": "web", + "event.dataset": "aws.elb", + "event.end": "2018-07-02T22:23:00.186Z", + "event.kind": "event", + "event.module": "aws", + "event.outcome": "success", + "event.start": "2018-07-02T22:22:48.364000Z", + "fileset.name": "elb", + "http.request.body.bytes": 218, + "http.request.method": "GET", + "http.request.referrer": "http://10.0.0.30:80/", + "http.response.body.bytes": 587, + "http.response.status_code": 101, + "http.version": "1.1", + "input.type": "log", + "log.offset": 4306, + "service.type": "aws", + "source.ip": "10.0.0.140", + "source.port": "40914", + "tags": [ + "forwarded" + ], + "tracing.trace.id": "Root=1-58337364-23a8c76965a2ef7629b185e3", + "user_agent.original": "-" + }, + { + "@timestamp": "2018-07-02T22:23:00.186Z", + "aws.elb.action_executed": [ + "forward" + ], + "aws.elb.backend.http.response.status_code": 101, + "aws.elb.backend.ip": "10.0.0.171", + "aws.elb.backend.port": "8010", + "aws.elb.backend_processing_time.sec": 0.001, + "aws.elb.matched_rule_priority": "1", + "aws.elb.name": "app/my-loadbalancer/50dc6c495c0c9188", + "aws.elb.protocol": "http", + "aws.elb.request_processing_time.sec": 0.0, + "aws.elb.response_processing_time.sec": 0.0, + "aws.elb.ssl_cipher": "ECDHE-RSA-AES128-GCM-SHA256", + "aws.elb.ssl_protocol": "TLSv1.2", + "aws.elb.target_group.arn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067", + "aws.elb.target_port": [ + "10.0.0.171:8010" + ], + "aws.elb.target_status_code": [ + "101" + ], + "aws.elb.trace_id": "Root=1-58337364-23a8c76965a2ef7629b185e3", + "aws.elb.type": "wss", + "cloud.provider": "aws", + "event.category": "web", + "event.dataset": "aws.elb", + "event.end": "2018-07-02T22:23:00.186Z", + "event.kind": "event", + "event.module": "aws", + "event.outcome": "success", + "event.start": "2018-07-02T22:22:48.364000Z", + "fileset.name": "elb", + "http.request.body.bytes": 218, + "http.request.method": "GET", + "http.request.referrer": "https://10.0.0.30:443/", + "http.response.body.bytes": 786, + "http.response.status_code": 101, + "http.version": "1.1", + "input.type": "log", + "log.offset": 4708, + "service.type": "aws", + "source.ip": "10.0.0.140", + "source.port": "44244", + "tags": [ + "forwarded" + ], + "tls.cipher": "ECDHE-RSA-AES128-GCM-SHA256", + "tls.version": "1.2", + "tls.version_protocol": "tls", + "tracing.trace.id": "Root=1-58337364-23a8c76965a2ef7629b185e3", + "user_agent.original": "-" } ] \ No newline at end of file diff --git a/x-pack/filebeat/module/aws/fields.go b/x-pack/filebeat/module/aws/fields.go index 352932f1b1c..e8968b65e8e 100644 --- a/x-pack/filebeat/module/aws/fields.go +++ b/x-pack/filebeat/module/aws/fields.go @@ -19,5 +19,5 @@ func init() { // AssetAws returns asset data. // This is the base64 encoded gzipped contents of module/aws. func AssetAws() string { - return "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" + return "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" } From bf971f3919f73b1885abffc2683cbcd99af1822b Mon Sep 17 00:00:00 2001 From: Brandon Morelli Date: Tue, 6 Oct 2020 08:09:24 -0700 Subject: [PATCH 087/156] docs: update generate_fields_docs.py (#21359) --- auditbeat/docs/fields.asciidoc | 9 +++++++- filebeat/docs/fields.asciidoc | 9 +++++++- heartbeat/docs/fields.asciidoc | 9 +++++++- journalbeat/docs/fields.asciidoc | 9 +++++++- libbeat/scripts/generate_fields_docs.py | 26 ++++++++++++++++++++++-- metricbeat/docs/fields.asciidoc | 9 +++++++- packetbeat/docs/fields.asciidoc | 9 +++++++- winlogbeat/docs/fields.asciidoc | 9 +++++++- x-pack/functionbeat/docs/fields.asciidoc | 9 +++++++- 9 files changed, 88 insertions(+), 10 deletions(-) diff --git a/auditbeat/docs/fields.asciidoc b/auditbeat/docs/fields.asciidoc index 7ba194357ee..cb95eb4da12 100644 --- a/auditbeat/docs/fields.asciidoc +++ b/auditbeat/docs/fields.asciidoc @@ -2914,8 +2914,15 @@ type: object [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index c294aef0f79..b4f6a158ad7 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -44228,8 +44228,15 @@ type: object [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + diff --git a/heartbeat/docs/fields.asciidoc b/heartbeat/docs/fields.asciidoc index 20e797faf1a..e80238bca4c 100644 --- a/heartbeat/docs/fields.asciidoc +++ b/heartbeat/docs/fields.asciidoc @@ -361,8 +361,15 @@ type: object [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + diff --git a/journalbeat/docs/fields.asciidoc b/journalbeat/docs/fields.asciidoc index bb7627508a4..57f97a4162e 100644 --- a/journalbeat/docs/fields.asciidoc +++ b/journalbeat/docs/fields.asciidoc @@ -914,8 +914,15 @@ type: object [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + diff --git a/libbeat/scripts/generate_fields_docs.py b/libbeat/scripts/generate_fields_docs.py index 89a80d83d27..8e0a7c77c32 100644 --- a/libbeat/scripts/generate_fields_docs.py +++ b/libbeat/scripts/generate_fields_docs.py @@ -1,6 +1,7 @@ import argparse from collections import OrderedDict import os +import re import yaml @@ -20,11 +21,24 @@ def document_fields(output, section, sections, path): output.write("[float]\n") if "description" in section: - if "anchor" in section: + if "anchor" in section and section["name"] == "ECS": output.write("== {} fields\n\n".format(section["name"])) + output.write(""" +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. +""") + elif "anchor" in section: + output.write("== {} fields\n\n".format(section["name"])) + output.write("{}\n\n".format(section["description"])) else: output.write("=== {}\n\n".format(section["name"])) - output.write("{}\n\n".format(section["description"])) + output.write("{}\n\n".format(section["description"])) if "fields" not in section or not section["fields"]: return @@ -70,6 +84,14 @@ def document_field(output, field, field_path): if "path" in field: output.write("alias to: {}\n\n".format(field["path"])) + # For Apm-Server docs only + # Assign an ECS badge for fields containing "overwrite" + if beat_title == "Apm-Server": + if "overwrite" in field: + # And it's not a Kubernetes field + if re.match("^kubernetes.*", field["field_path"]) is None: + output.write("{yes-icon} {ecs-ref}[ECS] field.\n\n") + if "index" in field: if not field["index"]: output.write("{}\n\n".format("Field is not indexed.")) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 26e83c19050..dc7c0c45d3e 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -9371,8 +9371,15 @@ Stats collected from Dropwizard. [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + diff --git a/packetbeat/docs/fields.asciidoc b/packetbeat/docs/fields.asciidoc index 14ed56f1578..22d2b406bf9 100644 --- a/packetbeat/docs/fields.asciidoc +++ b/packetbeat/docs/fields.asciidoc @@ -2128,8 +2128,15 @@ type: object [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + diff --git a/winlogbeat/docs/fields.asciidoc b/winlogbeat/docs/fields.asciidoc index d0b1a0a1473..cc84c0fad8a 100644 --- a/winlogbeat/docs/fields.asciidoc +++ b/winlogbeat/docs/fields.asciidoc @@ -220,8 +220,15 @@ type: object [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + diff --git a/x-pack/functionbeat/docs/fields.asciidoc b/x-pack/functionbeat/docs/fields.asciidoc index 73c93e39a61..7f4aa3d5aaf 100644 --- a/x-pack/functionbeat/docs/fields.asciidoc +++ b/x-pack/functionbeat/docs/fields.asciidoc @@ -216,8 +216,15 @@ type: object [[exported-fields-ecs]] == ECS fields -ECS Fields. +This section defines Elastic Common Schema (ECS) fields—a common set of fields +to be used when storing event data in {es}. + +This is an exhaustive list, and fields listed here are not necessarily used by {beatname_uc}. +The goal of ECS is to enable and encourage users of {es} to normalize their event data, +so that they can better analyze, visualize, and correlate the data represented in their events. + +See the {ecs-ref}[ECS reference] for more information. *`@timestamp`*:: + From 1ce876d1dcf1ada555bbbba11382b63ec8cda95d Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Tue, 6 Oct 2020 16:27:07 +0100 Subject: [PATCH 088/156] [CI] Setup git config globally (#21562) --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 08853ab1453..df75ad2ccd1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -265,8 +265,8 @@ def withBeatsEnv(Map args = [:], Closure body) { // See https://github.com/elastic/beats/issues/17787. sh(label: 'check git config', script: ''' if [ -z "$(git config --get user.email)" ]; then - git config user.email "beatsmachine@users.noreply.github.com" - git config user.name "beatsmachine" + git config --global user.email "beatsmachine@users.noreply.github.com" + git config --global user.name "beatsmachine" fi''') } try { From d6ee968b44dbb9413c8472ca1712914d192cbc00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20P=C3=A9rez-Aradros=20Herce?= Date: Tue, 6 Oct 2020 18:36:24 +0200 Subject: [PATCH 089/156] Add kubernetes composable inputs provider (#21480) * Add kubernetes composable inputs provider --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + x-pack/elastic-agent/pkg/agent/cmd/include.go | 1 + .../composable/providers/kubernetes/config.go | 31 +++ .../providers/kubernetes/kubernetes.go | 215 ++++++++++++++++++ 4 files changed, 248 insertions(+) create mode 100644 x-pack/elastic-agent/pkg/composable/providers/kubernetes/config.go create mode 100644 x-pack/elastic-agent/pkg/composable/providers/kubernetes/kubernetes.go diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 639b1dbad17..897b64c517e 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -28,6 +28,7 @@ - Add support for EQL based condition on inputs {pull}20994[20994] - Send `fleet.host.id` to Endpoint Security {pull}21042[21042] - Add `install` and `uninstall` subcommands {pull}21206[21206] +- Add `kubernetes` composable dynamic provider. {pull}21480[21480] - Send updating state {pull}21461[21461] - Add `elastic.agent.id` and `elastic.agent.version` to published events from filebeat and metricbeat {pull}21543[21543] - Add `upgrade` subcommand to perform upgrade of installed Elastic Agent {pull}21425[21425] diff --git a/x-pack/elastic-agent/pkg/agent/cmd/include.go b/x-pack/elastic-agent/pkg/agent/cmd/include.go index 87506b88415..b955c85418f 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/include.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/include.go @@ -10,6 +10,7 @@ import ( _ "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable/providers/docker" _ "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable/providers/env" _ "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable/providers/host" + _ "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable/providers/kubernetes" _ "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable/providers/local" _ "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable/providers/localdynamic" _ "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable/providers/path" diff --git a/x-pack/elastic-agent/pkg/composable/providers/kubernetes/config.go b/x-pack/elastic-agent/pkg/composable/providers/kubernetes/config.go new file mode 100644 index 00000000000..200bedbe878 --- /dev/null +++ b/x-pack/elastic-agent/pkg/composable/providers/kubernetes/config.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// TODO review the need for this +// +build linux darwin windows + +package kubernetes + +import ( + "time" +) + +// Config for kubernetes provider +type Config struct { + KubeConfig string `config:"kube_config"` + SyncPeriod time.Duration `config:"sync_period"` + CleanupTimeout time.Duration `config:"cleanup_timeout" validate:"positive"` + + // Needed when resource is a pod + Node string `config:"node"` + + // Scope of the provider (cluster or node) + Scope string `config:"scope"` +} + +// InitDefaults initializes the default values for the config. +func (c *Config) InitDefaults() { + c.SyncPeriod = 10 * time.Minute + c.CleanupTimeout = 60 * time.Second +} diff --git a/x-pack/elastic-agent/pkg/composable/providers/kubernetes/kubernetes.go b/x-pack/elastic-agent/pkg/composable/providers/kubernetes/kubernetes.go new file mode 100644 index 00000000000..c777c8a05ce --- /dev/null +++ b/x-pack/elastic-agent/pkg/composable/providers/kubernetes/kubernetes.go @@ -0,0 +1,215 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package kubernetes + +import ( + "fmt" + "time" + + "github.com/elastic/beats/v7/libbeat/common/kubernetes" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/config" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" +) + +func init() { + composable.Providers.AddDynamicProvider("kubernetes", DynamicProviderBuilder) +} + +type dynamicProvider struct { + logger *logger.Logger + config *Config +} + +type eventWatcher struct { + logger *logger.Logger + cleanupTimeout time.Duration + comm composable.DynamicProviderComm +} + +// DynamicProviderBuilder builds the dynamic provider. +func DynamicProviderBuilder(logger *logger.Logger, c *config.Config) (composable.DynamicProvider, error) { + var cfg Config + if c == nil { + c = config.New() + } + err := c.Unpack(&cfg) + if err != nil { + return nil, errors.New(err, "failed to unpack configuration") + } + return &dynamicProvider{logger, &cfg}, nil +} + +// Run runs the environment context provider. +func (p *dynamicProvider) Run(comm composable.DynamicProviderComm) error { + client, err := kubernetes.GetKubernetesClient(p.config.KubeConfig) + if err != nil { + // info only; return nil (do nothing) + p.logger.Debugf("Kubernetes provider skipped, unable to connect: %s", err) + return nil + } + + // Ensure that node is set correctly whenever the scope is set to "node". Make sure that node is empty + // when cluster scope is enforced. + if p.config.Scope == "node" { + p.config.Node = kubernetes.DiscoverKubernetesNode(p.logger, p.config.Node, kubernetes.IsInCluster(p.config.KubeConfig), client) + } else { + p.config.Node = "" + } + p.logger.Infof("Kubernetes provider started with %s scope", p.config.Scope) + p.logger.Debugf("Initializing Kubernetes watcher using node: %v", p.config.Node) + + watcher, err := kubernetes.NewWatcher(client, &kubernetes.Pod{}, kubernetes.WatchOptions{ + SyncTimeout: p.config.SyncPeriod, + Node: p.config.Node, + //Namespace: p.config.Namespace, + }, nil) + if err != nil { + return errors.New(err, "couldn't create kubernetes watcher") + } + + watcher.AddEventHandler(&eventWatcher{p.logger, p.config.CleanupTimeout, comm}) + + err = watcher.Start() + if err != nil { + return errors.New(err, "couldn't start kubernetes watcher") + } + + return nil +} + +func (p *eventWatcher) emitRunning(pod *kubernetes.Pod) { + mapping := map[string]interface{}{ + "namespace": pod.GetNamespace(), + "pod": map[string]interface{}{ + "uid": string(pod.GetUID()), + "name": pod.GetName(), + "labels": pod.GetLabels(), + "ip": pod.Status.PodIP, + }, + } + + processors := []map[string]interface{}{ + { + "add_fields": map[string]interface{}{ + "fields": mapping, + "target": "kubernetes", + }, + }, + } + + // Emit the pod + // We emit Pod + containers to ensure that configs matching Pod only + // get Pod metadata (not specific to any container) + p.comm.AddOrUpdate(string(pod.GetUID()), mapping, processors) + + // Emit all containers in the pod + p.emitContainers(pod, pod.Spec.Containers, pod.Status.ContainerStatuses) + + // TODO deal with init containers stopping after initialization + p.emitContainers(pod, pod.Spec.InitContainers, pod.Status.InitContainerStatuses) +} + +func (p *eventWatcher) emitContainers(pod *kubernetes.Pod, containers []kubernetes.Container, containerstatuses []kubernetes.PodContainerStatus) { + // Collect all runtimes from status information. + containerIDs := map[string]string{} + runtimes := map[string]string{} + for _, c := range containerstatuses { + cid, runtime := kubernetes.ContainerIDWithRuntime(c) + containerIDs[c.Name] = cid + runtimes[c.Name] = runtime + } + + for _, c := range containers { + // If it doesn't have an ID, container doesn't exist in + // the runtime, emit only an event if we are stopping, so + // we are sure of cleaning up configurations. + cid := containerIDs[c.Name] + if cid == "" { + continue + } + + // ID is the combination of pod UID + container name + eventID := fmt.Sprintf("%s.%s", pod.GetObjectMeta().GetUID(), c.Name) + + mapping := map[string]interface{}{ + "namespace": pod.GetNamespace(), + "pod": map[string]interface{}{ + "uid": string(pod.GetUID()), + "name": pod.GetName(), + "labels": pod.GetLabels(), + "ip": pod.Status.PodIP, + }, + "container": map[string]interface{}{ + "id": cid, + "name": c.Name, + "image": c.Image, + "runtime": runtimes[c.Name], + }, + } + + processors := []map[string]interface{}{ + { + "add_fields": map[string]interface{}{ + "fields": mapping, + "target": "kubernetes", + }, + }, + } + + // Emit the container + p.comm.AddOrUpdate(eventID, mapping, processors) + } +} + +func (p *eventWatcher) emitStopped(pod *kubernetes.Pod) { + p.comm.Remove(string(pod.GetUID())) + + for _, c := range pod.Spec.Containers { + // ID is the combination of pod UID + container name + eventID := fmt.Sprintf("%s.%s", pod.GetObjectMeta().GetUID(), c.Name) + p.comm.Remove(eventID) + } + + for _, c := range pod.Spec.InitContainers { + // ID is the combination of pod UID + container name + eventID := fmt.Sprintf("%s.%s", pod.GetObjectMeta().GetUID(), c.Name) + p.comm.Remove(eventID) + } +} + +// OnAdd ensures processing of pod objects that are newly added +func (p *eventWatcher) OnAdd(obj interface{}) { + p.logger.Debugf("pod add: %+v", obj) + p.emitRunning(obj.(*kubernetes.Pod)) +} + +// OnUpdate emits events for a given pod depending on the state of the pod, +// if it is terminating, a stop event is scheduled, if not, a stop and a start +// events are sent sequentially to recreate the resources assotiated to the pod. +func (p *eventWatcher) OnUpdate(obj interface{}) { + pod := obj.(*kubernetes.Pod) + + p.logger.Debugf("pod update for pod: %+v, status: %+v", pod.Name, pod.Status.Phase) + switch pod.Status.Phase { + case kubernetes.PodSucceeded, kubernetes.PodFailed: + time.AfterFunc(p.cleanupTimeout, func() { p.emitStopped(pod) }) + return + case kubernetes.PodPending: + p.logger.Debugf("pod update (pending): don't know what to do with this pod yet, skipping for now: %+v", obj) + return + } + + p.logger.Debugf("pod update: %+v", obj) + p.emitRunning(pod) +} + +// OnDelete stops pod objects that are deleted +func (p *eventWatcher) OnDelete(obj interface{}) { + p.logger.Debugf("pod delete: %+v", obj) + pod := obj.(*kubernetes.Pod) + time.AfterFunc(p.cleanupTimeout, func() { p.emitStopped(pod) }) +} From 306332f8d6bb924c9b9fee834079c788cd6ec2eb Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Tue, 6 Oct 2020 19:20:25 +0200 Subject: [PATCH 090/156] [Ingest Manager] Improved verify experience (#21573) [Ingest Manager] Improved verify experience (#21573) --- .../pkg/agent/application/emitter.go | 13 ++++++++---- .../application/upgrade/step_download.go | 2 +- .../pkg/agent/operation/common_test.go | 2 +- .../pkg/agent/operation/operation_verify.go | 2 +- .../artifact/download/composed/verifier.go | 7 ++++--- .../pkg/artifact/download/fs/verifier.go | 17 +++++++++------- .../pkg/artifact/download/fs/verifier_test.go | 6 +++--- .../artifact/download/http/elastic_test.go | 2 +- .../pkg/artifact/download/http/verifier.go | 20 ++++++++++--------- .../pkg/artifact/download/verifier.go | 2 +- .../pkg/core/plugin/process/app.go | 2 +- .../pkg/core/plugin/process/start.go | 2 +- 12 files changed, 44 insertions(+), 33 deletions(-) diff --git a/x-pack/elastic-agent/pkg/agent/application/emitter.go b/x-pack/elastic-agent/pkg/agent/application/emitter.go index fc103366826..3bd06043c30 100644 --- a/x-pack/elastic-agent/pkg/agent/application/emitter.go +++ b/x-pack/elastic-agent/pkg/agent/application/emitter.go @@ -44,10 +44,11 @@ type emitterController struct { reloadables []reloadable // state - lock sync.RWMutex - config *config.Config - ast *transpiler.AST - vars []*transpiler.Vars + lock sync.RWMutex + updateLock sync.Mutex + config *config.Config + ast *transpiler.AST + vars []*transpiler.Vars } func (e *emitterController) Update(c *config.Config) error { @@ -93,6 +94,10 @@ func (e *emitterController) Set(vars []*transpiler.Vars) { } func (e *emitterController) update() error { + // locking whole update because it can be called concurrently via Set and Update method + e.updateLock.Lock() + defer e.updateLock.Unlock() + e.lock.RLock() cfg := e.config rawAst := e.ast diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go index cf3a3656724..3aea96da0ab 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_download.go @@ -38,7 +38,7 @@ func (u *Upgrader) downloadArtifact(ctx context.Context, version, sourceURI stri return "", errors.New(err, "failed upgrade of agent binary") } - matches, err := verifier.Verify(agentName, version, agentArtifactName) + matches, err := verifier.Verify(agentName, version, agentArtifactName, true) if err != nil { return "", errors.New(err, "failed verification of agent binary") } diff --git a/x-pack/elastic-agent/pkg/agent/operation/common_test.go b/x-pack/elastic-agent/pkg/agent/operation/common_test.go index 6e9b042fe92..e9d40bece87 100644 --- a/x-pack/elastic-agent/pkg/agent/operation/common_test.go +++ b/x-pack/elastic-agent/pkg/agent/operation/common_test.go @@ -143,7 +143,7 @@ var _ download.Downloader = &DummyDownloader{} type DummyVerifier struct{} -func (*DummyVerifier) Verify(p, v, _ string) (bool, error) { +func (*DummyVerifier) Verify(p, v, _ string, _ bool) (bool, error) { return true, nil } diff --git a/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go b/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go index 97cf906cace..7626d339e57 100644 --- a/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go +++ b/x-pack/elastic-agent/pkg/agent/operation/operation_verify.go @@ -66,7 +66,7 @@ func (o *operationVerify) Run(_ context.Context, application Application) (err e } }() - isVerified, err := o.verifier.Verify(o.program.BinaryName(), o.program.Version(), o.program.ArtifactName()) + isVerified, err := o.verifier.Verify(o.program.BinaryName(), o.program.Version(), o.program.ArtifactName(), true) if err != nil { return errors.New(err, fmt.Sprintf("operation '%s' failed to verify %s.%s", o.Name(), o.program.BinaryName(), o.program.Version()), diff --git a/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go index 9d6c4477733..663484130f4 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/composed/verifier.go @@ -29,11 +29,12 @@ func NewVerifier(verifiers ...download.Verifier) *Verifier { } // Verify checks the package from configured source. -func (e *Verifier) Verify(programName, version, artifactName string) (bool, error) { +func (e *Verifier) Verify(programName, version, artifactName string, removeOnFailure bool) (bool, error) { var err error - for _, v := range e.vv { - b, e := v.Verify(programName, version, artifactName) + for i, v := range e.vv { + isLast := (i + 1) == len(e.vv) + b, e := v.Verify(programName, version, artifactName, isLast && removeOnFailure) if e == nil { return b, nil } diff --git a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go index 09462ef3f23..56652d4f69c 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier.go @@ -51,20 +51,23 @@ func NewVerifier(config *artifact.Config, allowEmptyPgp bool, pgp []byte) (*Veri // Verify checks downloaded package on preconfigured // location agains a key stored on elastic.co website. -func (v *Verifier) Verify(programName, version, artifactName string) (bool, error) { +func (v *Verifier) Verify(programName, version, artifactName string, removeOnFailure bool) (isMatch bool, err error) { filename, err := artifact.GetArtifactName(programName, version, v.config.OS(), v.config.Arch()) if err != nil { return false, errors.New(err, "retrieving package name") } fullPath := filepath.Join(v.config.TargetDirectory, filename) + defer func() { + if removeOnFailure && (!isMatch || err != nil) { + // remove bits so they can be redownloaded + os.Remove(fullPath) + os.Remove(fullPath + ".sha512") + os.Remove(fullPath + ".asc") + } + }() - isMatch, err := v.verifyHash(filename, fullPath) - if !isMatch || err != nil { - // remove bits so they can be redownloaded - os.Remove(fullPath) - os.Remove(fullPath + ".sha512") - os.Remove(fullPath + ".asc") + if isMatch, err := v.verifyHash(filename, fullPath); !isMatch || err != nil { return isMatch, err } diff --git a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go index 975d9ecb14d..a79f35bdd6f 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go +++ b/x-pack/elastic-agent/pkg/artifact/download/fs/verifier_test.go @@ -65,7 +65,7 @@ func TestFetchVerify(t *testing.T) { // first download verify should fail: // download skipped, as invalid package is prepared upfront // verify fails and cleans download - matches, err := verifier.Verify(programName, version, artifactName) + matches, err := verifier.Verify(programName, version, artifactName, true) assert.NoError(t, err) assert.Equal(t, false, matches) @@ -88,7 +88,7 @@ func TestFetchVerify(t *testing.T) { _, err = os.Stat(hashTargetFilePath) assert.NoError(t, err) - matches, err = verifier.Verify(programName, version, artifactName) + matches, err = verifier.Verify(programName, version, artifactName, true) assert.NoError(t, err) assert.Equal(t, true, matches) } @@ -162,7 +162,7 @@ func TestVerify(t *testing.T) { t.Fatal(err) } - isOk, err := testVerifier.Verify(beatName, version, artifactName) + isOk, err := testVerifier.Verify(beatName, version, artifactName, true) if err != nil { t.Fatal(err) } diff --git a/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go b/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go index fec1d991c88..0ff4dfd2b93 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go +++ b/x-pack/elastic-agent/pkg/artifact/download/http/elastic_test.go @@ -110,7 +110,7 @@ func TestVerify(t *testing.T) { t.Fatal(err) } - isOk, err := testVerifier.Verify(beatName, version, artifactName) + isOk, err := testVerifier.Verify(beatName, version, artifactName, false) if err != nil { t.Fatal(err) } diff --git a/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go index c0dfef9b30e..b5b5e628b4a 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/http/verifier.go @@ -59,9 +59,7 @@ func NewVerifier(config *artifact.Config, allowEmptyPgp bool, pgp []byte) (*Veri // Verify checks downloaded package on preconfigured // location agains a key stored on elastic.co website. -func (v *Verifier) Verify(programName, version, artifactName string) (bool, error) { - // TODO: think about verifying asc for prepacked beats - +func (v *Verifier) Verify(programName, version, artifactName string, removeOnFailure bool) (isMatch bool, err error) { filename, err := artifact.GetArtifactName(programName, version, v.config.OS(), v.config.Arch()) if err != nil { return false, errors.New(err, "retrieving package name") @@ -72,12 +70,16 @@ func (v *Verifier) Verify(programName, version, artifactName string) (bool, erro return false, errors.New(err, "retrieving package path") } - isMatch, err := v.verifyHash(filename, fullPath) - if !isMatch || err != nil { - // remove bits so they can be redownloaded - os.Remove(fullPath) - os.Remove(fullPath + ".sha512") - os.Remove(fullPath + ".asc") + defer func() { + if removeOnFailure && (!isMatch || err != nil) { + // remove bits so they can be redownloaded + os.Remove(fullPath) + os.Remove(fullPath + ".sha512") + os.Remove(fullPath + ".asc") + } + }() + + if isMatch, err := v.verifyHash(filename, fullPath); !isMatch || err != nil { return isMatch, err } diff --git a/x-pack/elastic-agent/pkg/artifact/download/verifier.go b/x-pack/elastic-agent/pkg/artifact/download/verifier.go index 491979514ea..d7b2bc7a415 100644 --- a/x-pack/elastic-agent/pkg/artifact/download/verifier.go +++ b/x-pack/elastic-agent/pkg/artifact/download/verifier.go @@ -6,5 +6,5 @@ package download // Verifier is an interface verifying GPG key of a downloaded artifact type Verifier interface { - Verify(programName, version, artifactName string) (bool, error) + Verify(programName, version, artifactName string, removeOnFailure bool) (bool, error) } diff --git a/x-pack/elastic-agent/pkg/core/plugin/process/app.go b/x-pack/elastic-agent/pkg/core/plugin/process/app.go index 5f9cf6efb25..8732af24f68 100644 --- a/x-pack/elastic-agent/pkg/core/plugin/process/app.go +++ b/x-pack/elastic-agent/pkg/core/plugin/process/app.go @@ -117,7 +117,7 @@ func (a *Application) Name() string { // Started returns true if the application is started. func (a *Application) Started() bool { - return a.state.Status != state.Stopped + return a.state.Status != state.Stopped && a.state.Status != state.Crashed && a.state.Status != state.Failed } // Stop stops the current application. diff --git a/x-pack/elastic-agent/pkg/core/plugin/process/start.go b/x-pack/elastic-agent/pkg/core/plugin/process/start.go index c5f1ffb3842..bc19910e53c 100644 --- a/x-pack/elastic-agent/pkg/core/plugin/process/start.go +++ b/x-pack/elastic-agent/pkg/core/plugin/process/start.go @@ -39,7 +39,7 @@ func (a *Application) start(ctx context.Context, t app.Taggable, cfg map[string] }() // already started if not stopped or crashed - if a.state.Status != state.Stopped && a.state.Status != state.Crashed && a.state.Status != state.Failed { + if a.Started() { return nil } From 0b9213c5d27d2b1e6141b00285bda419c82dcd41 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Tue, 6 Oct 2020 19:25:54 +0200 Subject: [PATCH 091/156] [Ingest Manager] Use new form of fleet API paths (#21478) [Ingest Manager] Use new form of fleet API paths (#21478) --- .../docker/docker-entrypoint.elastic-agent.tmpl | 8 ++++---- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../pkg/agent/application/enroll_cmd_test.go | 10 +++++----- x-pack/elastic-agent/pkg/fleetapi/ack_cmd.go | 2 +- x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go | 2 +- x-pack/elastic-agent/pkg/fleetapi/checkin_cmd.go | 2 +- .../elastic-agent/pkg/fleetapi/checkin_cmd_test.go | 12 ++++++------ x-pack/elastic-agent/pkg/fleetapi/enroll_cmd.go | 4 ++-- x-pack/elastic-agent/pkg/fleetapi/enroll_cmd_test.go | 4 ++-- 9 files changed, 23 insertions(+), 22 deletions(-) diff --git a/dev-tools/packaging/templates/docker/docker-entrypoint.elastic-agent.tmpl b/dev-tools/packaging/templates/docker/docker-entrypoint.elastic-agent.tmpl index 91f043d2799..d4c8d6e4645 100644 --- a/dev-tools/packaging/templates/docker/docker-entrypoint.elastic-agent.tmpl +++ b/dev-tools/packaging/templates/docker/docker-entrypoint.elastic-agent.tmpl @@ -13,8 +13,8 @@ set -eo pipefail # KIBANA_USERNAME - username for accessing kibana API [elastic] function setup(){ - curl -X POST ${KIBANA_HOST:-http://localhost:5601}/api/ingest_manager/setup -H 'kbn-xsrf: true' -u ${KIBANA_USERNAME:-elastic}:${KIBANA_PASSWORD:-changeme} - curl -X POST ${KIBANA_HOST:-http://localhost:5601}/api/ingest_manager/fleet/setup \ + curl -X POST ${KIBANA_HOST:-http://localhost:5601}/api/fleet/setup -H 'kbn-xsrf: true' -u ${KIBANA_USERNAME:-elastic}:${KIBANA_PASSWORD:-changeme} + curl -X POST ${KIBANA_HOST:-http://localhost:5601}/api/fleet/agents/setup \ -H 'Content-Type: application/json' \ -H 'kbn-xsrf: true' \ -u ${KIBANA_USERNAME:-elastic}:${KIBANA_PASSWORD:-changeme} @@ -27,7 +27,7 @@ function enroll(){ if [[ -n "${FLEET_ENROLLMENT_TOKEN}" ]]; then apikey="${FLEET_ENROLLMENT_TOKEN}" else - enrollResp=$(curl ${KIBANA_HOST:-http://localhost:5601}/api/ingest_manager/fleet/enrollment-api-keys \ + enrollResp=$(curl ${KIBANA_HOST:-http://localhost:5601}/api/fleet/enrollment-api-keys \ -H 'Content-Type: application/json' \ -H 'kbn-xsrf: true' \ -u ${KIBANA_USERNAME:-elastic}:${KIBANA_PASSWORD:-changeme} ) @@ -40,7 +40,7 @@ function enroll(){ local apikeyId=$(echo $enrollResp | jq -r '.list[0].id') echo $apikeyId - enrollResp=$(curl ${KIBANA_HOST:-http://localhost:5601}/api/ingest_manager/fleet/enrollment-api-keys/$apikeyId \ + enrollResp=$(curl ${KIBANA_HOST:-http://localhost:5601}/api/fleet/enrollment-api-keys/$apikeyId \ -H 'Content-Type: application/json' \ -H 'kbn-xsrf: true' \ -u ${KIBANA_USERNAME:-elastic}:${KIBANA_PASSWORD:-changeme} ) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 897b64c517e..a0cd6f6291e 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -28,6 +28,7 @@ - Add support for EQL based condition on inputs {pull}20994[20994] - Send `fleet.host.id` to Endpoint Security {pull}21042[21042] - Add `install` and `uninstall` subcommands {pull}21206[21206] +- Use new form of fleet API paths {pull}21478[21478] - Add `kubernetes` composable dynamic provider. {pull}21480[21480] - Send updating state {pull}21461[21461] - Add `elastic.agent.id` and `elastic.agent.version` to published events from filebeat and metricbeat {pull}21543[21543] diff --git a/x-pack/elastic-agent/pkg/agent/application/enroll_cmd_test.go b/x-pack/elastic-agent/pkg/agent/application/enroll_cmd_test.go index beab1b253d6..080b5efcb69 100644 --- a/x-pack/elastic-agent/pkg/agent/application/enroll_cmd_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/enroll_cmd_test.go @@ -49,7 +49,7 @@ func TestEnroll(t *testing.T) { t.Run("fail to save is propagated", withTLSServer( func(t *testing.T) *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("/api/ingest_manager/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(` { @@ -102,7 +102,7 @@ func TestEnroll(t *testing.T) { t.Run("successfully enroll with TLS and save access api key in the store", withTLSServer( func(t *testing.T) *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("/api/ingest_manager/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(` { @@ -163,7 +163,7 @@ func TestEnroll(t *testing.T) { t.Run("successfully enroll when a slash is defined at the end of host", withServer( func(t *testing.T) *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("/api/ingest_manager/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(` { @@ -223,7 +223,7 @@ func TestEnroll(t *testing.T) { t.Run("successfully enroll without TLS and save access api key in the store", withServer( func(t *testing.T) *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("/api/ingest_manager/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(` { @@ -283,7 +283,7 @@ func TestEnroll(t *testing.T) { t.Run("fail to enroll without TLS", withServer( func(t *testing.T) *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("/api/ingest_manager/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(` { diff --git a/x-pack/elastic-agent/pkg/fleetapi/ack_cmd.go b/x-pack/elastic-agent/pkg/fleetapi/ack_cmd.go index ac568c884d1..5c197289ed9 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/ack_cmd.go +++ b/x-pack/elastic-agent/pkg/fleetapi/ack_cmd.go @@ -14,7 +14,7 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" ) -const ackPath = "/api/ingest_manager/fleet/agents/%s/acks" +const ackPath = "/api/fleet/agents/%s/acks" // AckEvent is an event sent in an ACK request. type AckEvent struct { diff --git a/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go b/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go index 75940e928b7..1f1bfdb21eb 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go +++ b/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go @@ -22,7 +22,7 @@ func TestAck(t *testing.T) { func(t *testing.T) *http.ServeMux { raw := `{"action": "ack"}` mux := http.NewServeMux() - path := fmt.Sprintf("/api/ingest_manager/fleet/agents/%s/acks", agentInfo.AgentID()) + path := fmt.Sprintf("/api/fleet/agents/%s/acks", agentInfo.AgentID()) mux.HandleFunc(path, authHandler(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) diff --git a/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd.go b/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd.go index 58c80b0adf1..9758fd4236c 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd.go +++ b/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd.go @@ -17,7 +17,7 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" ) -const checkingPath = "/api/ingest_manager/fleet/agents/%s/checkin" +const checkingPath = "/api/fleet/agents/%s/checkin" // CheckinRequest consists of multiple events reported to fleet ui. type CheckinRequest struct { diff --git a/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go b/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go index af8b4da81ea..3e88ed29cd1 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go +++ b/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go @@ -34,7 +34,7 @@ func TestCheckin(t *testing.T) { } ` mux := http.NewServeMux() - path := fmt.Sprintf("/api/ingest_manager/fleet/agents/%s/checkin", agentInfo.AgentID()) + path := fmt.Sprintf("/api/fleet/agents/%s/checkin", agentInfo.AgentID()) mux.HandleFunc(path, authHandler(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, raw) @@ -83,7 +83,7 @@ func TestCheckin(t *testing.T) { } ` mux := http.NewServeMux() - path := fmt.Sprintf("/api/ingest_manager/fleet/agents/%s/checkin", agentInfo.AgentID()) + path := fmt.Sprintf("/api/fleet/agents/%s/checkin", agentInfo.AgentID()) mux.HandleFunc(path, authHandler(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, raw) @@ -144,7 +144,7 @@ func TestCheckin(t *testing.T) { } ` mux := http.NewServeMux() - path := fmt.Sprintf("/api/ingest_manager/fleet/agents/%s/checkin", agentInfo.AgentID()) + path := fmt.Sprintf("/api/fleet/agents/%s/checkin", agentInfo.AgentID()) mux.HandleFunc(path, authHandler(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, raw) @@ -176,7 +176,7 @@ func TestCheckin(t *testing.T) { func(t *testing.T) *http.ServeMux { raw := `{ "actions": [] }` mux := http.NewServeMux() - path := fmt.Sprintf("/api/ingest_manager/fleet/agents/%s/checkin", agentInfo.AgentID()) + path := fmt.Sprintf("/api/fleet/agents/%s/checkin", agentInfo.AgentID()) mux.HandleFunc(path, authHandler(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, raw) @@ -199,7 +199,7 @@ func TestCheckin(t *testing.T) { func(t *testing.T) *http.ServeMux { raw := `{"actions": []}` mux := http.NewServeMux() - path := fmt.Sprintf("/api/ingest_manager/fleet/agents/%s/checkin", agentInfo.AgentID()) + path := fmt.Sprintf("/api/fleet/agents/%s/checkin", agentInfo.AgentID()) mux.HandleFunc(path, authHandler(func(w http.ResponseWriter, r *http.Request) { type Request struct { Metadata *info.ECSMeta `json:"local_metadata"` @@ -233,7 +233,7 @@ func TestCheckin(t *testing.T) { func(t *testing.T) *http.ServeMux { raw := `{"actions": []}` mux := http.NewServeMux() - path := fmt.Sprintf("/api/ingest_manager/fleet/agents/%s/checkin", agentInfo.AgentID()) + path := fmt.Sprintf("/api/fleet/agents/%s/checkin", agentInfo.AgentID()) mux.HandleFunc(path, authHandler(func(w http.ResponseWriter, r *http.Request) { type Request struct { Metadata *info.ECSMeta `json:"local_metadata"` diff --git a/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd.go b/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd.go index 3e6336fbc81..29168be0ae4 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd.go +++ b/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd.go @@ -71,7 +71,7 @@ func (p EnrollType) MarshalJSON() ([]byte, error) { // EnrollRequest is the data required to enroll the elastic-agent into Fleet. // // Example: -// POST /api/ingest_manager/fleet/agents/enroll +// POST /api/fleet/agents/enroll // { // "type": "PERMANENT", // "metadata": { @@ -168,7 +168,7 @@ type EnrollCmd struct { // Execute enroll the Agent in the Fleet. func (e *EnrollCmd) Execute(ctx context.Context, r *EnrollRequest) (*EnrollResponse, error) { - const p = "/api/ingest_manager/fleet/agents/enroll" + const p = "/api/fleet/agents/enroll" const key = "Authorization" const prefix = "ApiKey " diff --git a/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd_test.go b/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd_test.go index 6533ad6643e..29bbf7e607e 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd_test.go +++ b/x-pack/elastic-agent/pkg/fleetapi/enroll_cmd_test.go @@ -23,7 +23,7 @@ func TestEnroll(t *testing.T) { t.Run("Successful enroll", withServer( func(t *testing.T) *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("/api/ingest_manager/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") @@ -92,7 +92,7 @@ func TestEnroll(t *testing.T) { t.Run("Raise back any server errors", withServer( func(t *testing.T) *http.ServeMux { mux := http.NewServeMux() - mux.HandleFunc("/api/ingest_manager/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/api/fleet/agents/enroll", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) w.Header().Set("Content-Type", "application/json") w.Write([]byte(`{"statusCode": 500, "error":"Something is really bad here"}`)) From 31cf0acee9666e492d4e98f5aafef6b9989e2a6e Mon Sep 17 00:00:00 2001 From: Marius Iversen Date: Tue, 6 Oct 2020 20:30:22 +0200 Subject: [PATCH 092/156] [Filebeat][S3 Input] Add support for FIPS endpoints (#21585) * adding fips support for s3 input --- CHANGELOG.next.asciidoc | 1 + x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc | 5 +++++ x-pack/filebeat/input/s3/config.go | 2 ++ x-pack/filebeat/input/s3/input.go | 9 ++++++++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 99daa875a00..6d22c4c1bf9 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -612,6 +612,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - New Cisco Umbrella dataset {pull}21504[21504] - New juniper.srx dataset for Juniper SRX logs. {pull}20017[20017] - Adding support for Microsoft 365 Defender (Microsoft Threat Protection) {pull}21446[21446] +- Adding support for FIPS in s3 input {pull}21446[21446] *Heartbeat* diff --git a/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc b/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc index 8891e38fcc4..5cbe4685cb8 100644 --- a/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-aws-s3.asciidoc @@ -42,6 +42,11 @@ The `s3` input supports the following configuration options plus the URL of the AWS SQS queue that messages will be received from. Required. +[float] +==== `fips_enabled` + +Enabling this option changes the service name from `s3` to `s3-fips` for connecting to the correct service endpoint. For example: `s3-fips.us-gov-east-1.amazonaws.com`. + [float] ==== `visibility_timeout` diff --git a/x-pack/filebeat/input/s3/config.go b/x-pack/filebeat/input/s3/config.go index 5f37a436d12..cc3c5318289 100644 --- a/x-pack/filebeat/input/s3/config.go +++ b/x-pack/filebeat/input/s3/config.go @@ -15,6 +15,7 @@ import ( type config struct { QueueURL string `config:"queue_url" validate:"nonzero,required"` VisibilityTimeout time.Duration `config:"visibility_timeout"` + FipsEnabled bool `config:"fips_enabled"` AwsConfig awscommon.ConfigAWS `config:",inline"` ExpandEventListFromField string `config:"expand_event_list_from_field"` APITimeout time.Duration `config:"api_timeout"` @@ -32,6 +33,7 @@ func defaultConfig() config { return config{ VisibilityTimeout: 300 * time.Second, APITimeout: 120 * time.Second, + FipsEnabled: false, } } diff --git a/x-pack/filebeat/input/s3/input.go b/x-pack/filebeat/input/s3/input.go index a6b56d03970..d76e5b8b728 100644 --- a/x-pack/filebeat/input/s3/input.go +++ b/x-pack/filebeat/input/s3/input.go @@ -100,6 +100,13 @@ func (in *s3Input) createCollector(ctx v2.Context, pipeline beat.Pipeline) (*s3C log.Infof("visibility timeout is set to %v seconds", visibilityTimeout) log.Infof("aws api timeout is set to %v", in.config.APITimeout) + s3Servicename := "s3" + if in.config.FipsEnabled { + s3Servicename = "s3-fips" + } + + log.Debug("s3 service name = ", s3Servicename) + return &s3Collector{ cancellation: ctxtool.FromCanceller(ctx.Cancelation), logger: log, @@ -107,7 +114,7 @@ func (in *s3Input) createCollector(ctx v2.Context, pipeline beat.Pipeline) (*s3C publisher: client, visibilityTimeout: visibilityTimeout, sqs: sqs.New(awscommon.EnrichAWSConfigWithEndpoint(in.config.AwsConfig.Endpoint, "sqs", regionName, awsConfig)), - s3: s3.New(awscommon.EnrichAWSConfigWithEndpoint(in.config.AwsConfig.Endpoint, "s3", regionName, awsConfig)), + s3: s3.New(awscommon.EnrichAWSConfigWithEndpoint(in.config.AwsConfig.Endpoint, s3Servicename, regionName, awsConfig)), }, nil } From b4c273c0259c166efc5fbd45903d27a2c1bbe0f2 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Tue, 6 Oct 2020 12:40:21 -0600 Subject: [PATCH 093/156] [Metricbeat] Use timestamp from CloudWatch for events (#21498) --- CHANGELOG.next.asciidoc | 1 + x-pack/metricbeat/module/aws/aws.go | 13 +- .../metricbeat/module/aws/billing/billing.go | 38 ++-- .../module/aws/cloudwatch/cloudwatch.go | 105 ++++++----- .../module/aws/cloudwatch/cloudwatch_test.go | 39 ++++- x-pack/metricbeat/module/aws/ec2/ec2.go | 164 +++++++++--------- x-pack/metricbeat/module/aws/rds/rds.go | 106 +++++------ .../aws/s3_daily_storage/s3_daily_storage.go | 3 +- .../module/aws/s3_request/s3_request.go | 3 +- x-pack/metricbeat/module/aws/sqs/sqs.go | 7 +- 10 files changed, 255 insertions(+), 224 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 6d22c4c1bf9..3099a033153 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -362,6 +362,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix remote_write flaky test. {pull}21173[21173] - Visualization title fixes in aws, azure and googlecloud compute dashboards. {pull}21098[21098] - Add a switch to the driver definition on SQL module to use pretty names {pull}17378[17378] +- Use timestamp from CloudWatch API when creating events. {pull}21498[21498] *Packetbeat* diff --git a/x-pack/metricbeat/module/aws/aws.go b/x-pack/metricbeat/module/aws/aws.go index 9786c4f7b38..167e6a088a0 100644 --- a/x-pack/metricbeat/module/aws/aws.go +++ b/x-pack/metricbeat/module/aws/aws.go @@ -196,11 +196,14 @@ func StringInSlice(str string, list []string) (bool, int) { } // InitEvent initialize mb.Event with basic information like service.name, cloud.provider -func InitEvent(regionName string, accountName string, accountID string) mb.Event { - event := mb.Event{} - event.MetricSetFields = common.MapStr{} - event.ModuleFields = common.MapStr{} - event.RootFields = common.MapStr{} +func InitEvent(regionName string, accountName string, accountID string, timestamp time.Time) mb.Event { + event := mb.Event{ + Timestamp: timestamp, + MetricSetFields: common.MapStr{}, + ModuleFields: common.MapStr{}, + RootFields: common.MapStr{}, + } + event.RootFields.Put("cloud.provider", "aws") if regionName != "" { event.RootFields.Put("cloud.region", regionName) diff --git a/x-pack/metricbeat/module/aws/billing/billing.go b/x-pack/metricbeat/module/aws/billing/billing.go index b9b971e3d34..39d600983d0 100644 --- a/x-pack/metricbeat/module/aws/billing/billing.go +++ b/x-pack/metricbeat/module/aws/billing/billing.go @@ -178,26 +178,28 @@ func (m *MetricSet) getCloudWatchBillingMetrics( // Find a timestamp for all metrics in output timestamp := aws.FindTimestamp(metricDataOutput) - if !timestamp.IsZero() { - for _, output := range metricDataOutput { - if len(output.Values) == 0 { - continue - } - exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) - if exists { - labels := strings.Split(*output.Label, labelSeparator) + if timestamp.IsZero() { + return nil + } + + for _, output := range metricDataOutput { + if len(output.Values) == 0 { + continue + } + exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) + if exists { + labels := strings.Split(*output.Label, labelSeparator) - event := aws.InitEvent("", m.AccountName, m.AccountID) - event.MetricSetFields.Put(labels[0], output.Values[timestampIdx]) + event := aws.InitEvent("", m.AccountName, m.AccountID, timestamp) + event.MetricSetFields.Put(labels[0], output.Values[timestampIdx]) - i := 1 - for i < len(labels)-1 { - event.MetricSetFields.Put(labels[i], labels[i+1]) - i += 2 - } - event.Timestamp = endTime - events = append(events, event) + i := 1 + for i < len(labels)-1 { + event.MetricSetFields.Put(labels[i], labels[i+1]) + i += 2 } + event.Timestamp = endTime + events = append(events, event) } } return events @@ -278,7 +280,7 @@ func (m *MetricSet) getCostGroupBy(svcCostExplorer costexploreriface.ClientAPI, } func (m *MetricSet) addCostMetrics(metrics map[string]costexplorer.MetricValue, groupDefinition costexplorer.GroupDefinition, startDate string, endDate string) mb.Event { - event := aws.InitEvent("", m.AccountName, m.AccountID) + event := aws.InitEvent("", m.AccountName, m.AccountID, time.Now()) // add group definition event.MetricSetFields.Put("group_definition", common.MapStr{ diff --git a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go index 07e1f09acef..af04508a111 100644 --- a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go +++ b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go @@ -499,34 +499,35 @@ func (m *MetricSet) createEvents(svcCloudwatch cloudwatchiface.ClientAPI, svcRes // Find a timestamp for all metrics in output timestamp := aws.FindTimestamp(metricDataResults) + if timestamp.IsZero() { + return nil, nil + } // Create events when there is no tags_filter or resource_type specified. if len(resourceTypeTagFilters) == 0 { - if !timestamp.IsZero() { - for _, output := range metricDataResults { - if len(output.Values) == 0 { - continue - } + for _, output := range metricDataResults { + if len(output.Values) == 0 { + continue + } - exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) - if exists { - labels := strings.Split(*output.Label, labelSeparator) - if len(labels) != 5 { - // when there is no identifier value in label, use region+accountID+namespace instead - identifier := regionName + m.AccountID + labels[namespaceIdx] - if _, ok := events[identifier]; !ok { - events[identifier] = aws.InitEvent(regionName, m.AccountName, m.AccountID) - } - events[identifier] = insertRootFields(events[identifier], output.Values[timestampIdx], labels) - continue + exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) + if exists { + labels := strings.Split(*output.Label, labelSeparator) + if len(labels) != 5 { + // when there is no identifier value in label, use region+accountID+namespace instead + identifier := regionName + m.AccountID + labels[namespaceIdx] + if _, ok := events[identifier]; !ok { + events[identifier] = aws.InitEvent(regionName, m.AccountName, m.AccountID, timestamp) } + events[identifier] = insertRootFields(events[identifier], output.Values[timestampIdx], labels) + continue + } - identifierValue := labels[identifierValueIdx] - if _, ok := events[identifierValue]; !ok { - events[identifierValue] = aws.InitEvent(regionName, m.AccountName, m.AccountID) - } - events[identifierValue] = insertRootFields(events[identifierValue], output.Values[timestampIdx], labels) + identifierValue := labels[identifierValueIdx] + if _, ok := events[identifierValue]; !ok { + events[identifierValue] = aws.InitEvent(regionName, m.AccountName, m.AccountID, timestamp) } + events[identifierValue] = insertRootFields(events[identifierValue], output.Values[timestampIdx], labels) } } return events, nil @@ -556,45 +557,43 @@ func (m *MetricSet) createEvents(svcCloudwatch cloudwatchiface.ClientAPI, svcRes m.logger.Debugf("In region %s, service %s tags match tags_filter", regionName, identifier) } - if !timestamp.IsZero() { - for _, output := range metricDataResults { - if len(output.Values) == 0 { - continue - } + for _, output := range metricDataResults { + if len(output.Values) == 0 { + continue + } - exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) - if exists { - labels := strings.Split(*output.Label, labelSeparator) - if len(labels) != 5 { - // if there is no tag in labels but there is a tagsFilter, then no event should be reported. - if len(tagsFilter) != 0 { - continue - } - - // when there is no identifier value in label, use region+accountID+namespace instead - identifier := regionName + m.AccountID + labels[namespaceIdx] - if _, ok := events[identifier]; !ok { - events[identifier] = aws.InitEvent(regionName, m.AccountName, m.AccountID) - } - events[identifier] = insertRootFields(events[identifier], output.Values[timestampIdx], labels) + exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) + if exists { + labels := strings.Split(*output.Label, labelSeparator) + if len(labels) != 5 { + // if there is no tag in labels but there is a tagsFilter, then no event should be reported. + if len(tagsFilter) != 0 { continue } - identifierValue := labels[identifierValueIdx] - if _, ok := events[identifierValue]; !ok { - // when tagsFilter is not empty but no entry in - // resourceTagMap for this identifier, do not initialize - // an event for this identifier. - if len(tagsFilter) != 0 && resourceTagMap[identifierValue] == nil { - continue - } - events[identifierValue] = aws.InitEvent(regionName, m.AccountName, m.AccountID) + // when there is no identifier value in label, use region+accountID+namespace instead + identifier := regionName + m.AccountID + labels[namespaceIdx] + if _, ok := events[identifier]; !ok { + events[identifier] = aws.InitEvent(regionName, m.AccountName, m.AccountID, timestamp) } - events[identifierValue] = insertRootFields(events[identifierValue], output.Values[timestampIdx], labels) + events[identifier] = insertRootFields(events[identifier], output.Values[timestampIdx], labels) + continue + } - // add tags to event based on identifierValue - insertTags(events, identifierValue, resourceTagMap) + identifierValue := labels[identifierValueIdx] + if _, ok := events[identifierValue]; !ok { + // when tagsFilter is not empty but no entry in + // resourceTagMap for this identifier, do not initialize + // an event for this identifier. + if len(tagsFilter) != 0 && resourceTagMap[identifierValue] == nil { + continue + } + events[identifierValue] = aws.InitEvent(regionName, m.AccountName, m.AccountID, timestamp) } + events[identifierValue] = insertRootFields(events[identifierValue], output.Values[timestampIdx], labels) + + // add tags to event based on identifierValue + insertTags(events, identifierValue, resourceTagMap) } } } diff --git a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go index 393ddecb07e..ecd4bb2f9d1 100644 --- a/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go +++ b/x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go @@ -11,9 +11,6 @@ import ( "testing" "time" - "github.com/elastic/beats/v7/libbeat/logp" - "github.com/elastic/beats/v7/metricbeat/mb" - awssdk "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/cloudwatch" "github.com/aws/aws-sdk-go-v2/service/cloudwatch/cloudwatchiface" @@ -22,12 +19,14 @@ import ( "github.com/pkg/errors" "github.com/stretchr/testify/assert" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws" ) var ( regionName = "us-west-1" - timestamp = time.Now() + timestamp = time.Date(2020, 10, 06, 00, 00, 00, 0, time.UTC) accountID = "123456789012" accountName = "test" @@ -1466,9 +1465,9 @@ func TestInsertTags(t *testing.T) { tagValue3 := "dev" events := map[string]mb.Event{} - events[identifier1] = aws.InitEvent(regionName, accountName, accountID) - events[identifier2] = aws.InitEvent(regionName, accountName, accountID) - events[identifierContainsArn] = aws.InitEvent(regionName, accountName, accountID) + events[identifier1] = aws.InitEvent(regionName, accountName, accountID, timestamp) + events[identifier2] = aws.InitEvent(regionName, accountName, accountID, timestamp) + events[identifierContainsArn] = aws.InitEvent(regionName, accountName, accountID, timestamp) resourceTagMap := map[string][]resourcegroupstaggingapi.Tag{} resourceTagMap["test-s3-1"] = []resourcegroupstaggingapi.Tag{ @@ -1569,3 +1568,29 @@ func TestConfigDimensionValueContainsWildcard(t *testing.T) { }) } } + +func TestCreateEventsTimestamp(t *testing.T) { + m := MetricSet{ + logger: logp.NewLogger("test"), + CloudwatchConfigs: []Config{{Statistic: []string{"Average"}}}, + MetricSet: &aws.MetricSet{Period: 5, AccountID: accountID}, + } + + listMetricWithStatsTotal := []metricsWithStatistics{ + { + cloudwatch.Metric{ + MetricName: awssdk.String("CPUUtilization"), + Namespace: awssdk.String("AWS/EC2"), + }, + []string{"Average"}, + nil, + }, + } + + resourceTypeTagFilters := map[string][]aws.Tag{} + startTime, endTime := aws.GetStartTimeEndTime(m.MetricSet.Period, m.MetricSet.Latency) + + events, err := m.createEvents(&MockCloudWatchClientWithoutDim{}, &MockResourceGroupsTaggingClient{}, listMetricWithStatsTotal, resourceTypeTagFilters, regionName, startTime, endTime) + assert.NoError(t, err) + assert.Equal(t, timestamp, events[regionName+accountID+namespace].Timestamp) +} diff --git a/x-pack/metricbeat/module/aws/ec2/ec2.go b/x-pack/metricbeat/module/aws/ec2/ec2.go index 4e0776072e6..7cb69623a00 100644 --- a/x-pack/metricbeat/module/aws/ec2/ec2.go +++ b/x-pack/metricbeat/module/aws/ec2/ec2.go @@ -175,115 +175,117 @@ func constructMetricQueries(listMetricsOutput []cloudwatch.Metric, instanceID st } func (m *MetricSet) createCloudWatchEvents(getMetricDataResults []cloudwatch.MetricDataResult, instanceOutput map[string]ec2.Instance, regionName string) (map[string]mb.Event, error) { + // monitoring state for each instance + monitoringStates := map[string]string{} + + // Find a timestamp for all metrics in output + timestamp := aws.FindTimestamp(getMetricDataResults) + if timestamp.IsZero() { + return nil, nil + } + // Initialize events and metricSetFieldResults per instanceID events := map[string]mb.Event{} metricSetFieldResults := map[idStat]map[string]interface{}{} for instanceID := range instanceOutput { for _, statistic := range statistics { - events[instanceID] = aws.InitEvent(regionName, m.AccountName, m.AccountID) + events[instanceID] = aws.InitEvent(regionName, m.AccountName, m.AccountID, timestamp) metricSetFieldResults[idStat{instanceID: instanceID, statistic: statistic}] = map[string]interface{}{} } } - // monitoring state for each instance - monitoringStates := map[string]string{} + for _, output := range getMetricDataResults { + if len(output.Values) == 0 { + continue + } - // Find a timestamp for all metrics in output - timestamp := aws.FindTimestamp(getMetricDataResults) - if !timestamp.IsZero() { - for _, output := range getMetricDataResults { - if len(output.Values) == 0 { + exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) + if exists { + label, err := newLabelFromJSON(*output.Label) + if err != nil { + m.logger.Errorf("convert cloudwatch MetricDataResult label failed for label = %s: %w", *output.Label, err) continue } - exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) - if exists { - label, err := newLabelFromJSON(*output.Label) - if err != nil { - m.logger.Errorf("convert cloudwatch MetricDataResult label failed for label = %s: %w", *output.Label, err) + instanceID := label.InstanceID + statistic := label.Statistic + + // Add tags + tags := instanceOutput[instanceID].Tags + if m.TagsFilter != nil { + // Check with each tag filter + // If tag filter doesn't exist in tagKeys/tagValues, + // then do not report this event/instance. + if exists := aws.CheckTagFiltersExist(m.TagsFilter, tags); !exists { + // if tag filter doesn't exist, remove this event initial + // entry to avoid report an empty event. + delete(events, instanceID) continue } + } - instanceID := label.InstanceID - statistic := label.Statistic - - // Add tags - tags := instanceOutput[instanceID].Tags - if m.TagsFilter != nil { - // Check with each tag filter - // If tag filter doesn't exist in tagKeys/tagValues, - // then do not report this event/instance. - if exists := aws.CheckTagFiltersExist(m.TagsFilter, tags); !exists { - // if tag filter doesn't exist, remove this event initial - // entry to avoid report an empty event. - delete(events, instanceID) - continue - } - } - - // By default, replace dot "." using underscore "_" for tag keys. - // Note: tag values are not dedotted. - for _, tag := range tags { - events[instanceID].ModuleFields.Put("tags."+common.DeDot(*tag.Key), *tag.Value) - // add cloud.instance.name and host.name into ec2 events - if *tag.Key == "Name" { - events[instanceID].RootFields.Put("cloud.instance.name", *tag.Value) - events[instanceID].RootFields.Put("host.name", *tag.Value) - } - } - - machineType, err := instanceOutput[instanceID].InstanceType.MarshalValue() - if err != nil { - return events, errors.Wrap(err, "instance.InstanceType.MarshalValue failed") + // By default, replace dot "." using underscore "_" for tag keys. + // Note: tag values are not dedotted. + for _, tag := range tags { + events[instanceID].ModuleFields.Put("tags."+common.DeDot(*tag.Key), *tag.Value) + // add cloud.instance.name and host.name into ec2 events + if *tag.Key == "Name" { + events[instanceID].RootFields.Put("cloud.instance.name", *tag.Value) + events[instanceID].RootFields.Put("host.name", *tag.Value) } + } - events[instanceID].RootFields.Put("cloud.instance.id", instanceID) - events[instanceID].RootFields.Put("cloud.machine.type", machineType) + machineType, err := instanceOutput[instanceID].InstanceType.MarshalValue() + if err != nil { + return events, errors.Wrap(err, "instance.InstanceType.MarshalValue failed") + } - placement := instanceOutput[instanceID].Placement - if placement != nil { - events[instanceID].RootFields.Put("cloud.availability_zone", *placement.AvailabilityZone) - } + events[instanceID].RootFields.Put("cloud.instance.id", instanceID) + events[instanceID].RootFields.Put("cloud.machine.type", machineType) - if len(output.Values) > timestampIdx { - metricSetFieldResults[idStat{instanceID: instanceID, statistic: statistic}][label.MetricName] = fmt.Sprint(output.Values[timestampIdx]) - } + placement := instanceOutput[instanceID].Placement + if placement != nil { + events[instanceID].RootFields.Put("cloud.availability_zone", *placement.AvailabilityZone) + } - instanceStateName, err := instanceOutput[instanceID].State.Name.MarshalValue() - if err != nil { - return events, errors.Wrap(err, "instance.State.Name.MarshalValue failed") - } + if len(output.Values) > timestampIdx { + metricSetFieldResults[idStat{instanceID: instanceID, statistic: statistic}][label.MetricName] = fmt.Sprint(output.Values[timestampIdx]) + } - monitoringState, err := instanceOutput[instanceID].Monitoring.State.MarshalValue() - if err != nil { - return events, errors.Wrap(err, "instance.Monitoring.State.MarshalValue failed") - } + instanceStateName, err := instanceOutput[instanceID].State.Name.MarshalValue() + if err != nil { + return events, errors.Wrap(err, "instance.State.Name.MarshalValue failed") + } - monitoringStates[instanceID] = monitoringState + monitoringState, err := instanceOutput[instanceID].Monitoring.State.MarshalValue() + if err != nil { + return events, errors.Wrap(err, "instance.Monitoring.State.MarshalValue failed") + } - cpuOptions := instanceOutput[instanceID].CpuOptions - if cpuOptions != nil { - events[instanceID].MetricSetFields.Put("instance.core.count", *cpuOptions.CoreCount) - events[instanceID].MetricSetFields.Put("instance.threads_per_core", *cpuOptions.ThreadsPerCore) - } + monitoringStates[instanceID] = monitoringState - publicIP := instanceOutput[instanceID].PublicIpAddress - if publicIP != nil { - events[instanceID].MetricSetFields.Put("instance.public.ip", *publicIP) - } + cpuOptions := instanceOutput[instanceID].CpuOptions + if cpuOptions != nil { + events[instanceID].MetricSetFields.Put("instance.core.count", *cpuOptions.CoreCount) + events[instanceID].MetricSetFields.Put("instance.threads_per_core", *cpuOptions.ThreadsPerCore) + } - privateIP := instanceOutput[instanceID].PrivateIpAddress - if privateIP != nil { - events[instanceID].MetricSetFields.Put("instance.private.ip", *privateIP) - } + publicIP := instanceOutput[instanceID].PublicIpAddress + if publicIP != nil { + events[instanceID].MetricSetFields.Put("instance.public.ip", *publicIP) + } - events[instanceID].MetricSetFields.Put("instance.image.id", *instanceOutput[instanceID].ImageId) - events[instanceID].MetricSetFields.Put("instance.state.name", instanceStateName) - events[instanceID].MetricSetFields.Put("instance.state.code", *instanceOutput[instanceID].State.Code) - events[instanceID].MetricSetFields.Put("instance.monitoring.state", monitoringState) - events[instanceID].MetricSetFields.Put("instance.public.dns_name", *instanceOutput[instanceID].PublicDnsName) - events[instanceID].MetricSetFields.Put("instance.private.dns_name", *instanceOutput[instanceID].PrivateDnsName) + privateIP := instanceOutput[instanceID].PrivateIpAddress + if privateIP != nil { + events[instanceID].MetricSetFields.Put("instance.private.ip", *privateIP) } + + events[instanceID].MetricSetFields.Put("instance.image.id", *instanceOutput[instanceID].ImageId) + events[instanceID].MetricSetFields.Put("instance.state.name", instanceStateName) + events[instanceID].MetricSetFields.Put("instance.state.code", *instanceOutput[instanceID].State.Code) + events[instanceID].MetricSetFields.Put("instance.monitoring.state", monitoringState) + events[instanceID].MetricSetFields.Put("instance.public.dns_name", *instanceOutput[instanceID].PublicDnsName) + events[instanceID].MetricSetFields.Put("instance.private.dns_name", *instanceOutput[instanceID].PrivateDnsName) } } diff --git a/x-pack/metricbeat/module/aws/rds/rds.go b/x-pack/metricbeat/module/aws/rds/rds.go index b381dcac943..3bb14f28de8 100644 --- a/x-pack/metricbeat/module/aws/rds/rds.go +++ b/x-pack/metricbeat/module/aws/rds/rds.go @@ -274,70 +274,72 @@ func (m *MetricSet) createCloudWatchEvents(getMetricDataResults []cloudwatch.Met // Find a timestamp for all metrics in output timestamp := aws.FindTimestamp(getMetricDataResults) - if !timestamp.IsZero() { - for _, output := range getMetricDataResults { - if len(output.Values) == 0 { - continue + if timestamp.IsZero() { + return nil, nil + } + + for _, output := range getMetricDataResults { + if len(output.Values) == 0 { + continue + } + exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) + if exists { + labels := strings.Split(*output.Label, " ") + // Collect dimension values from the labels and initialize events and metricSetFieldResults with dimValues + var dimValues string + for i := 1; i < len(labels); i += 2 { + dimValues = dimValues + labels[i+1] } - exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) - if exists { - labels := strings.Split(*output.Label, " ") - // Collect dimension values from the labels and initialize events and metricSetFieldResults with dimValues - var dimValues string - for i := 1; i < len(labels); i += 2 { - dimValues = dimValues + labels[i+1] - } - if _, ok := events[dimValues]; !ok { - events[dimValues] = aws.InitEvent(regionName, m.AccountName, m.AccountID) - } + if _, ok := events[dimValues]; !ok { + events[dimValues] = aws.InitEvent(regionName, m.AccountName, m.AccountID, timestamp) + } - if _, ok := metricSetFieldResults[dimValues]; !ok { - metricSetFieldResults[dimValues] = map[string]interface{}{} - } + if _, ok := metricSetFieldResults[dimValues]; !ok { + metricSetFieldResults[dimValues] = map[string]interface{}{} + } - if len(output.Values) > timestampIdx && len(labels) > 0 { - if labels[metricNameIdx] == "CPUUtilization" { - metricSetFieldResults[dimValues][labels[metricNameIdx]] = fmt.Sprint(output.Values[timestampIdx] / 100) - } else { - metricSetFieldResults[dimValues][labels[metricNameIdx]] = fmt.Sprint(output.Values[timestampIdx]) - } + if len(output.Values) > timestampIdx && len(labels) > 0 { + if labels[metricNameIdx] == "CPUUtilization" { + metricSetFieldResults[dimValues][labels[metricNameIdx]] = fmt.Sprint(output.Values[timestampIdx] / 100) + } else { + metricSetFieldResults[dimValues][labels[metricNameIdx]] = fmt.Sprint(output.Values[timestampIdx]) + } - for i := 1; i < len(labels); i += 2 { - if labels[i] == "DBInstanceIdentifier" { - dbIdentifier := labels[i+1] - if _, found := events[dbIdentifier]; found { - if _, found := dbInstanceMap[dbIdentifier]; !found { - delete(metricSetFieldResults, dimValues) - continue - } - events[dbIdentifier].RootFields.Put("cloud.availability_zone", dbInstanceMap[dbIdentifier].dbAvailabilityZone) - events[dbIdentifier].MetricSetFields.Put("db_instance.arn", dbInstanceMap[dbIdentifier].dbArn) - events[dbIdentifier].MetricSetFields.Put("db_instance.class", dbInstanceMap[dbIdentifier].dbClass) - events[dbIdentifier].MetricSetFields.Put("db_instance.identifier", dbInstanceMap[dbIdentifier].dbIdentifier) - events[dbIdentifier].MetricSetFields.Put("db_instance.status", dbInstanceMap[dbIdentifier].dbStatus) - - for _, tag := range dbInstanceMap[dbIdentifier].tags { - events[dbIdentifier].ModuleFields.Put("tags."+tag.Key, tag.Value) - } + for i := 1; i < len(labels); i += 2 { + if labels[i] == "DBInstanceIdentifier" { + dbIdentifier := labels[i+1] + if _, found := events[dbIdentifier]; found { + if _, found := dbInstanceMap[dbIdentifier]; !found { + delete(metricSetFieldResults, dimValues) + continue + } + events[dbIdentifier].RootFields.Put("cloud.availability_zone", dbInstanceMap[dbIdentifier].dbAvailabilityZone) + events[dbIdentifier].MetricSetFields.Put("db_instance.arn", dbInstanceMap[dbIdentifier].dbArn) + events[dbIdentifier].MetricSetFields.Put("db_instance.class", dbInstanceMap[dbIdentifier].dbClass) + events[dbIdentifier].MetricSetFields.Put("db_instance.identifier", dbInstanceMap[dbIdentifier].dbIdentifier) + events[dbIdentifier].MetricSetFields.Put("db_instance.status", dbInstanceMap[dbIdentifier].dbStatus) + + for _, tag := range dbInstanceMap[dbIdentifier].tags { + events[dbIdentifier].ModuleFields.Put("tags."+tag.Key, tag.Value) } } - metricSetFieldResults[dimValues][labels[i]] = fmt.Sprint(labels[(i + 1)]) + } + metricSetFieldResults[dimValues][labels[i]] = fmt.Sprint(labels[(i + 1)]) + } + + // if tags_filter is given, then only return metrics with DBInstanceIdentifier as dimension + if m.TagsFilter != nil { + if len(labels) == 1 { + delete(events, dimValues) + delete(metricSetFieldResults, dimValues) } - // if tags_filter is given, then only return metrics with DBInstanceIdentifier as dimension - if m.TagsFilter != nil { - if len(labels) == 1 { + for i := 1; i < len(labels); i += 2 { + if labels[i] != "DBInstanceIdentifier" && i == len(labels)-2 { delete(events, dimValues) delete(metricSetFieldResults, dimValues) } - - for i := 1; i < len(labels); i += 2 { - if labels[i] != "DBInstanceIdentifier" && i == len(labels)-2 { - delete(events, dimValues) - delete(metricSetFieldResults, dimValues) - } - } } } } diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go index 53248284d41..d5efa36fb03 100644 --- a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go +++ b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go @@ -186,8 +186,6 @@ func createMetricDataQuery(metric cloudwatch.Metric, period time.Duration, index } func createCloudWatchEvents(outputs []cloudwatch.MetricDataResult, regionName string, bucketName string, accountName string, accountID string) (event mb.Event, err error) { - event = aws.InitEvent(regionName, accountName, accountID) - // AWS s3_daily_storage metrics mapOfMetricSetFieldResults := make(map[string]interface{}) @@ -214,6 +212,7 @@ func createCloudWatchEvents(outputs []cloudwatch.MetricDataResult, regionName st return } + event = aws.InitEvent(regionName, accountName, accountID, timestamp) event.MetricSetFields = resultMetricSetFields event.RootFields.Put("aws.s3.bucket.name", bucketName) return diff --git a/x-pack/metricbeat/module/aws/s3_request/s3_request.go b/x-pack/metricbeat/module/aws/s3_request/s3_request.go index 63b93f6cdf4..00b82827bbf 100644 --- a/x-pack/metricbeat/module/aws/s3_request/s3_request.go +++ b/x-pack/metricbeat/module/aws/s3_request/s3_request.go @@ -188,8 +188,6 @@ func constructMetricQueries(listMetricsOutputs []cloudwatch.Metric, period time. // CreateS3Events creates s3_request and s3_daily_storage events from Cloudwatch metric data. func createS3RequestEvents(outputs []cloudwatch.MetricDataResult, regionName string, bucketName string, accountName string, accountID string) (event mb.Event, err error) { - event = aws.InitEvent(regionName, accountName, accountID) - // AWS s3_request metrics mapOfMetricSetFieldResults := make(map[string]interface{}) @@ -216,6 +214,7 @@ func createS3RequestEvents(outputs []cloudwatch.MetricDataResult, regionName str return } + event = aws.InitEvent(regionName, accountName, accountID, timestamp) event.MetricSetFields = resultMetricSetFields event.RootFields.Put("aws.s3.bucket.name", bucketName) return diff --git a/x-pack/metricbeat/module/aws/sqs/sqs.go b/x-pack/metricbeat/module/aws/sqs/sqs.go index 6dc0774f66d..5f17eccb4b1 100644 --- a/x-pack/metricbeat/module/aws/sqs/sqs.go +++ b/x-pack/metricbeat/module/aws/sqs/sqs.go @@ -175,9 +175,7 @@ func createMetricDataQuery(metric cloudwatch.Metric, index int, period time.Dura return } -func createEventPerQueue(getMetricDataResults []cloudwatch.MetricDataResult, queueName string, metricsetName string, regionName string, schemaMetricFields s.Schema, accountName string, accountID string) (event mb.Event, err error) { - event = aws.InitEvent(regionName, accountName, accountID) - +func createEventPerQueue(getMetricDataResults []cloudwatch.MetricDataResult, queueName string, regionName string, schemaMetricFields s.Schema, accountName string, accountID string) (event mb.Event, err error) { // AWS sqs metrics mapOfMetricSetFieldResults := make(map[string]interface{}) @@ -204,6 +202,7 @@ func createEventPerQueue(getMetricDataResults []cloudwatch.MetricDataResult, que return } + event = aws.InitEvent(regionName, accountName, accountID, timestamp) event.MetricSetFields = resultMetricSetFields event.MetricSetFields.Put("queue.name", queueName) return @@ -213,7 +212,7 @@ func createSQSEvents(queueURLs []string, metricDataResults []cloudwatch.MetricDa for _, queueURL := range queueURLs { queueURLParsed := strings.Split(queueURL, "/") queueName := queueURLParsed[len(queueURLParsed)-1] - event, err := createEventPerQueue(metricDataResults, queueName, metricsetName, regionName, schemaRequestFields, accountName, accountID) + event, err := createEventPerQueue(metricDataResults, queueName, regionName, schemaRequestFields, accountName, accountID) if err != nil { event.Error = err report.Event(event) From aed4831afd215c8b230cda3836e71712fdf48389 Mon Sep 17 00:00:00 2001 From: Alex K <8418476+fearful-symmetry@users.noreply.github.com> Date: Tue, 6 Oct 2020 12:02:29 -0700 Subject: [PATCH 094/156] Remove nil-zero metrics and linux-exclusive metrics from Metricbeat (#21457) * refactor metricbeat to remove nil-zero metrics and linux-exclusive metrics * update xpack docs * fix non-linux diskstat builds * fix linux test builds * fix python tests * move windows files for disk performance * properly fix test_drop_fields * try to fix different system test * mage fmt * fix windows filesystem tests * fix platform test * add changelog --- CHANGELOG.next.asciidoc | 1 + .../system/diskio/disk_performance_386.go | 0 .../system/diskio/disk_performance_amd64.go | 0 .../metric}/system/diskio/diskstat.go | 11 +- .../metric}/system/diskio/diskstat_linux.go | 81 ++-- .../system/diskio/diskstat_linux_test.go | 60 +-- .../metric}/system/diskio/diskstat_other.go | 14 +- .../metric}/system/diskio/diskstat_windows.go | 14 +- .../system/diskio/diskstat_windows_helper.go | 0 .../system/diskio/diskstat_windows_test.go | 0 metricbeat/docs/fields.asciidoc | 354 +++++++++++++++++- metricbeat/docs/modules/linux.asciidoc | 10 + metricbeat/docs/modules/linux/iostat.asciidoc | 23 ++ metricbeat/docs/modules/linux/memory.asciidoc | 24 ++ metricbeat/docs/modules_list.asciidoc | 4 +- metricbeat/include/list_common.go | 2 + metricbeat/metricbeat.reference.yml | 2 + metricbeat/module/linux/_meta/config.yml | 2 + metricbeat/module/linux/_meta/fields.yml | 1 + metricbeat/module/linux/fields.go | 2 +- .../module/linux/iostat/_meta/data.json | 49 +++ .../module/linux/iostat/_meta/docs.asciidoc | 3 + .../module/linux/iostat/_meta/fields.yml | 61 +++ metricbeat/module/linux/iostat/data.go | 58 +++ metricbeat/module/linux/iostat/iostat.go | 104 +++++ metricbeat/module/linux/iostat/iostat_test.go | 55 +++ .../module/linux/memory/_meta/data.json | 59 +++ .../module/linux/memory/_meta/docs.asciidoc | 3 + .../module/linux/memory/_meta/fields.yml | 78 ++++ metricbeat/module/linux/memory/data.go | 99 +++++ metricbeat/module/linux/memory/memory.go | 62 +++ metricbeat/module/linux/memory/memory_test.go | 55 +++ metricbeat/module/system/cpu/_meta/data.json | 44 +-- metricbeat/module/system/cpu/cpu.go | 48 +-- metricbeat/module/system/cpu/data.go | 112 ++++++ .../module/system/diskio/_meta/data.json | 16 +- metricbeat/module/system/diskio/diskio.go | 57 ++- .../module/system/diskio/diskio_test.go | 40 ++ metricbeat/module/system/fields.go | 2 +- .../module/system/filesystem/_meta/data.json | 27 +- metricbeat/module/system/filesystem/helper.go | 9 +- .../module/system/fsstat/_meta/fields.yml | 2 +- metricbeat/module/system/fsstat/fsstat.go | 26 +- .../module/system/memory/_meta/data.json | 42 +-- metricbeat/module/system/memory/memory.go | 81 +--- .../module/system/process/_meta/data.json | 132 +++---- .../module/system/process/_meta/fields.yml | 16 +- metricbeat/module/system/process/process.go | 36 +- .../system/process_summary/_meta/data.json | 19 +- .../system/process_summary/process_summary.go | 32 +- .../process_summary/process_summary_test.go | 31 +- metricbeat/module/system/system.go | 38 +- metricbeat/module/system/test_system.py | 59 ++- metricbeat/modules.d/linux.yml.disabled | 2 + metricbeat/tests/system/test_processors.py | 15 +- x-pack/metricbeat/metricbeat.reference.yml | 2 + 56 files changed, 1700 insertions(+), 479 deletions(-) rename {metricbeat/module => libbeat/metric}/system/diskio/disk_performance_386.go (100%) rename {metricbeat/module => libbeat/metric}/system/diskio/disk_performance_amd64.go (100%) rename {metricbeat/module => libbeat/metric}/system/diskio/diskstat.go (88%) rename {metricbeat/module => libbeat/metric}/system/diskio/diskstat_linux.go (55%) rename {metricbeat/module => libbeat/metric}/system/diskio/diskstat_linux_test.go (55%) rename {metricbeat/module => libbeat/metric}/system/diskio/diskstat_other.go (79%) rename {metricbeat/module => libbeat/metric}/system/diskio/diskstat_windows.go (78%) rename {metricbeat/module => libbeat/metric}/system/diskio/diskstat_windows_helper.go (100%) rename {metricbeat/module => libbeat/metric}/system/diskio/diskstat_windows_test.go (100%) create mode 100644 metricbeat/docs/modules/linux/iostat.asciidoc create mode 100644 metricbeat/docs/modules/linux/memory.asciidoc create mode 100644 metricbeat/module/linux/iostat/_meta/data.json create mode 100644 metricbeat/module/linux/iostat/_meta/docs.asciidoc create mode 100644 metricbeat/module/linux/iostat/_meta/fields.yml create mode 100644 metricbeat/module/linux/iostat/data.go create mode 100644 metricbeat/module/linux/iostat/iostat.go create mode 100644 metricbeat/module/linux/iostat/iostat_test.go create mode 100644 metricbeat/module/linux/memory/_meta/data.json create mode 100644 metricbeat/module/linux/memory/_meta/docs.asciidoc create mode 100644 metricbeat/module/linux/memory/_meta/fields.yml create mode 100644 metricbeat/module/linux/memory/data.go create mode 100644 metricbeat/module/linux/memory/memory.go create mode 100644 metricbeat/module/linux/memory/memory_test.go create mode 100644 metricbeat/module/system/cpu/data.go diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 3099a033153..6b4a999e0ec 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -93,6 +93,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Move service config under metrics and simplify metric types. {pull}18691[18691] - Fix ECS compliance of user.id field in system/users metricset {pull}19019[19019] - Rename googlecloud stackdriver metricset to metrics. {pull}19718[19718] +- Remove "invalid zero" metrics on Windows and Darwin, don't report linux-only memory and diskio metrics when running under agent. {pull}21457[21457] *Packetbeat* diff --git a/metricbeat/module/system/diskio/disk_performance_386.go b/libbeat/metric/system/diskio/disk_performance_386.go similarity index 100% rename from metricbeat/module/system/diskio/disk_performance_386.go rename to libbeat/metric/system/diskio/disk_performance_386.go diff --git a/metricbeat/module/system/diskio/disk_performance_amd64.go b/libbeat/metric/system/diskio/disk_performance_amd64.go similarity index 100% rename from metricbeat/module/system/diskio/disk_performance_amd64.go rename to libbeat/metric/system/diskio/disk_performance_amd64.go diff --git a/metricbeat/module/system/diskio/diskstat.go b/libbeat/metric/system/diskio/diskstat.go similarity index 88% rename from metricbeat/module/system/diskio/diskstat.go rename to libbeat/metric/system/diskio/diskstat.go index 949d69778fa..3cea37c552a 100644 --- a/metricbeat/module/system/diskio/diskstat.go +++ b/libbeat/metric/system/diskio/diskstat.go @@ -25,11 +25,11 @@ import ( sigar "github.com/elastic/gosigar" ) -// mapping fields which output by `iostat -x` on linux +// IOMetric contains mapping fields which are outputed by `iostat -x` on linux // // Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await r_await w_await svctm %util // sda 0.06 0.78 0.09 0.27 9.42 8.06 48.64 0.00 1.34 0.99 1.45 0.77 0.03 -type DiskIOMetric struct { +type IOMetric struct { ReadRequestMergeCountPerSec float64 `json:"rrqmCps"` WriteRequestMergeCountPerSec float64 `json:"wrqmCps"` ReadRequestCountPerSec float64 `json:"rrqCps"` @@ -46,8 +46,9 @@ type DiskIOMetric struct { BusyPct float64 `json:"busy"` } -type DiskIOStat struct { +// IOStat carries disk statistics for all devices +type IOStat struct { lastDiskIOCounters map[string]disk.IOCountersStat - lastCpu sigar.Cpu - curCpu sigar.Cpu + lastCPU sigar.Cpu + curCPU sigar.Cpu } diff --git a/metricbeat/module/system/diskio/diskstat_linux.go b/libbeat/metric/system/diskio/diskstat_linux.go similarity index 55% rename from metricbeat/module/system/diskio/diskstat_linux.go rename to libbeat/metric/system/diskio/diskstat_linux.go index 4ecfdf700ac..826aed78c27 100644 --- a/metricbeat/module/system/diskio/diskstat_linux.go +++ b/libbeat/metric/system/diskio/diskstat_linux.go @@ -26,7 +26,8 @@ import ( "github.com/elastic/beats/v7/libbeat/metric/system/cpu" ) -func Get_CLK_TCK() uint32 { +// GetCLKTCK emulates the _SC_CLK_TCK syscall +func GetCLKTCK() uint32 { // return uint32(C.sysconf(C._SC_CLK_TCK)) // NOTE: _SC_CLK_TCK should be fetched from sysconf using cgo return uint32(100) @@ -38,77 +39,78 @@ func IOCounters(names ...string) (map[string]disk.IOCountersStat, error) { } // NewDiskIOStat :init DiskIOStat object. -func NewDiskIOStat() *DiskIOStat { - return &DiskIOStat{ +func NewDiskIOStat() *IOStat { + return &IOStat{ lastDiskIOCounters: map[string]disk.IOCountersStat{}, } } // OpenSampling creates current cpu sampling // need call as soon as get IOCounters. -func (stat *DiskIOStat) OpenSampling() error { - return stat.curCpu.Get() +func (stat *IOStat) OpenSampling() error { + return stat.curCPU.Get() } -// CalIOStatistics calculates IO statistics. -func (stat *DiskIOStat) CalIOStatistics(result *DiskIOMetric, counter disk.IOCountersStat) error { +// CalcIOStatistics calculates IO statistics. +func (stat *IOStat) CalcIOStatistics(counter disk.IOCountersStat) (IOMetric, error) { var last disk.IOCountersStat var ok bool // if last counter not found, create one and return all 0 if last, ok = stat.lastDiskIOCounters[counter.Name]; !ok { stat.lastDiskIOCounters[counter.Name] = counter - return nil + return IOMetric{}, nil } // calculate the delta ms between the CloseSampling and OpenSampling - deltams := 1000.0 * float64(stat.curCpu.Total()-stat.lastCpu.Total()) / float64(cpu.NumCores) / float64(Get_CLK_TCK()) + deltams := 1000.0 * float64(stat.curCPU.Total()-stat.lastCPU.Total()) / float64(cpu.NumCores) / float64(GetCLKTCK()) if deltams <= 0 { - return errors.New("The delta cpu time between close sampling and open sampling is less or equal to 0") + return IOMetric{}, errors.New("The delta cpu time between close sampling and open sampling is less or equal to 0") } - rd_ios := counter.ReadCount - last.ReadCount - rd_merges := counter.MergedReadCount - last.MergedReadCount - rd_bytes := counter.ReadBytes - last.ReadBytes - rd_ticks := counter.ReadTime - last.ReadTime - wr_ios := counter.WriteCount - last.WriteCount - wr_merges := counter.MergedWriteCount - last.MergedWriteCount - wr_bytes := counter.WriteBytes - last.WriteBytes - wr_ticks := counter.WriteTime - last.WriteTime + rdIOs := counter.ReadCount - last.ReadCount + rdMerges := counter.MergedReadCount - last.MergedReadCount + rdBytes := counter.ReadBytes - last.ReadBytes + rdTicks := counter.ReadTime - last.ReadTime + wrIOs := counter.WriteCount - last.WriteCount + wrMerges := counter.MergedWriteCount - last.MergedWriteCount + wrBytes := counter.WriteBytes - last.WriteBytes + wrTicks := counter.WriteTime - last.WriteTime ticks := counter.IoTime - last.IoTime aveq := counter.WeightedIO - last.WeightedIO - n_ios := rd_ios + wr_ios - n_ticks := rd_ticks + wr_ticks - n_bytes := rd_bytes + wr_bytes + nIOs := rdIOs + wrIOs + nTicks := rdTicks + wrTicks + nBytes := rdBytes + wrBytes size := float64(0) wait := float64(0) svct := float64(0) - if n_ios > 0 { - size = float64(n_bytes) / float64(n_ios) - wait = float64(n_ticks) / float64(n_ios) - svct = float64(ticks) / float64(n_ios) + if nIOs > 0 { + size = float64(nBytes) / float64(nIOs) + wait = float64(nTicks) / float64(nIOs) + svct = float64(ticks) / float64(nIOs) } queue := float64(aveq) / deltams - per_sec := func(x uint64) float64 { + perSec := func(x uint64) float64 { return 1000.0 * float64(x) / deltams } - result.ReadRequestMergeCountPerSec = per_sec(rd_merges) - result.WriteRequestMergeCountPerSec = per_sec(wr_merges) - result.ReadRequestCountPerSec = per_sec(rd_ios) - result.WriteRequestCountPerSec = per_sec(wr_ios) - result.ReadBytesPerSec = per_sec(rd_bytes) - result.WriteBytesPerSec = per_sec(wr_bytes) + result := IOMetric{} + result.ReadRequestMergeCountPerSec = perSec(rdMerges) + result.WriteRequestMergeCountPerSec = perSec(wrMerges) + result.ReadRequestCountPerSec = perSec(rdIOs) + result.WriteRequestCountPerSec = perSec(wrIOs) + result.ReadBytesPerSec = perSec(rdBytes) + result.WriteBytesPerSec = perSec(wrBytes) result.AvgRequestSize = size result.AvgQueueSize = queue result.AvgAwaitTime = wait - if rd_ios > 0 { - result.AvgReadAwaitTime = float64(rd_ticks) / float64(rd_ios) + if rdIOs > 0 { + result.AvgReadAwaitTime = float64(rdTicks) / float64(rdIOs) } - if wr_ios > 0 { - result.AvgWriteAwaitTime = float64(wr_ticks) / float64(wr_ios) + if wrIOs > 0 { + result.AvgWriteAwaitTime = float64(wrTicks) / float64(wrIOs) } result.AvgServiceTime = svct result.BusyPct = 100.0 * float64(ticks) / deltams @@ -117,10 +119,11 @@ func (stat *DiskIOStat) CalIOStatistics(result *DiskIOMetric, counter disk.IOCou } stat.lastDiskIOCounters[counter.Name] = counter - return nil + return result, nil } -func (stat *DiskIOStat) CloseSampling() { - stat.lastCpu = stat.curCpu +// CloseSampling closes the disk sampler +func (stat *IOStat) CloseSampling() { + stat.lastCPU = stat.curCPU } diff --git a/metricbeat/module/system/diskio/diskstat_linux_test.go b/libbeat/metric/system/diskio/diskstat_linux_test.go similarity index 55% rename from metricbeat/module/system/diskio/diskstat_linux_test.go rename to libbeat/metric/system/diskio/diskstat_linux_test.go index 56a8d9dc7cc..74c0bef231e 100644 --- a/metricbeat/module/system/diskio/diskstat_linux_test.go +++ b/libbeat/metric/system/diskio/diskstat_linux_test.go @@ -27,53 +27,11 @@ import ( "github.com/stretchr/testify/assert" sigar "github.com/elastic/gosigar" - - mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" - "github.com/elastic/beats/v7/metricbeat/module/system" ) -func Test_Get_CLK_TCK(t *testing.T) { +func Test_GetCLKTCK(t *testing.T) { //usually the tick is 100 - assert.Equal(t, uint32(100), Get_CLK_TCK()) -} - -func TestDataNameFilter(t *testing.T) { - oldFS := system.HostFS - newFS := "_meta/testdata" - system.HostFS = &newFS - defer func() { - system.HostFS = oldFS - }() - - conf := map[string]interface{}{ - "module": "system", - "metricsets": []string{"diskio"}, - "diskio.include_devices": []string{"sda", "sda1", "sda2"}, - } - - f := mbtest.NewReportingMetricSetV2Error(t, conf) - data, errs := mbtest.ReportingFetchV2Error(f) - assert.Empty(t, errs) - assert.Equal(t, 3, len(data)) -} - -func TestDataEmptyFilter(t *testing.T) { - oldFS := system.HostFS - newFS := "_meta/testdata" - system.HostFS = &newFS - defer func() { - system.HostFS = oldFS - }() - - conf := map[string]interface{}{ - "module": "system", - "metricsets": []string{"diskio"}, - } - - f := mbtest.NewReportingMetricSetV2Error(t, conf) - data, errs := mbtest.ReportingFetchV2Error(f) - assert.Empty(t, errs) - assert.Equal(t, 10, len(data)) + assert.Equal(t, uint32(100), GetCLKTCK()) } func TestDiskIOStat_CalIOStatistics(t *testing.T) { @@ -85,9 +43,9 @@ func TestDiskIOStat_CalIOStatistics(t *testing.T) { Name: "iostat", } - stat := &DiskIOStat{ + stat := &IOStat{ lastDiskIOCounters: map[string]disk.IOCountersStat{ - "iostat": disk.IOCountersStat{ + "iostat": { ReadCount: 3, WriteCount: 5, ReadTime: 7, @@ -95,17 +53,17 @@ func TestDiskIOStat_CalIOStatistics(t *testing.T) { Name: "iostat", }, }, - lastCpu: sigar.Cpu{Idle: 100}, - curCpu: sigar.Cpu{Idle: 1}, + lastCPU: sigar.Cpu{Idle: 100}, + curCPU: sigar.Cpu{Idle: 1}, } - expected := DiskIOMetric{ + expected := IOMetric{ AvgAwaitTime: 24.0 / 22.0, AvgReadAwaitTime: 1.2, AvgWriteAwaitTime: 1, } - var got DiskIOMetric - err := stat.CalIOStatistics(&got, counter) + + got, err := stat.CalcIOStatistics(counter) if err != nil { t.Fatal(err) } diff --git a/metricbeat/module/system/diskio/diskstat_other.go b/libbeat/metric/system/diskio/diskstat_other.go similarity index 79% rename from metricbeat/module/system/diskio/diskstat_other.go rename to libbeat/metric/system/diskio/diskstat_other.go index d2669117d9e..ad5208b1b4f 100644 --- a/metricbeat/module/system/diskio/diskstat_other.go +++ b/libbeat/metric/system/diskio/diskstat_other.go @@ -25,24 +25,24 @@ import ( ) // NewDiskIOStat :init DiskIOStat object. -func NewDiskIOStat() *DiskIOStat { - return &DiskIOStat{ +func NewDiskIOStat() *IOStat { + return &IOStat{ lastDiskIOCounters: map[string]disk.IOCountersStat{}, } } // OpenSampling stub for linux implementation. -func (stat *DiskIOStat) OpenSampling() error { +func (stat *IOStat) OpenSampling() error { return nil } -// CalIOStatistics stub for linux implementation. -func (stat *DiskIOStat) CalIOStatistics(result *DiskIOMetric, counter disk.IOCountersStat) error { - return errors.New("not implemented out of linux") +// CalcIOStatistics stub for linux implementation. +func (stat *IOStat) CalcIOStatistics(rcounter disk.IOCountersStat) (IOMetric, error) { + return IOMetric{}, errors.New("not implemented out of linux") } // CloseSampling stub for linux implementation. -func (stat *DiskIOStat) CloseSampling() {} +func (stat *IOStat) CloseSampling() {} // IOCounters should map functionality to disk package for linux os. func IOCounters(names ...string) (map[string]disk.IOCountersStat, error) { diff --git a/metricbeat/module/system/diskio/diskstat_windows.go b/libbeat/metric/system/diskio/diskstat_windows.go similarity index 78% rename from metricbeat/module/system/diskio/diskstat_windows.go rename to libbeat/metric/system/diskio/diskstat_windows.go index 1e2b363074b..665caab9130 100644 --- a/metricbeat/module/system/diskio/diskstat_windows.go +++ b/libbeat/metric/system/diskio/diskstat_windows.go @@ -25,24 +25,24 @@ import ( ) // NewDiskIOStat :init DiskIOStat object. -func NewDiskIOStat() *DiskIOStat { - return &DiskIOStat{ +func NewDiskIOStat() *IOStat { + return &IOStat{ lastDiskIOCounters: map[string]disk.IOCountersStat{}, } } // OpenSampling stub for linux implementation. -func (stat *DiskIOStat) OpenSampling() error { +func (stat *IOStat) OpenSampling() error { return nil } -// CalIOStatistics stub for linux implementation. -func (stat *DiskIOStat) CalIOStatistics(result *DiskIOMetric, counter disk.IOCountersStat) error { - return errors.New("iostat is not implement for Windows") +// CalcIOStatistics stub for linux implementation. +func (stat *IOStat) CalcIOStatistics(counter disk.IOCountersStat) (IOMetric, error) { + return IOMetric{}, errors.New("iostat is not implement for Windows") } // CloseSampling stub for linux implementation. -func (stat *DiskIOStat) CloseSampling() {} +func (stat *IOStat) CloseSampling() {} // IOCounters should map functionality to disk package for linux os. func IOCounters(names ...string) (map[string]disk.IOCountersStat, error) { diff --git a/metricbeat/module/system/diskio/diskstat_windows_helper.go b/libbeat/metric/system/diskio/diskstat_windows_helper.go similarity index 100% rename from metricbeat/module/system/diskio/diskstat_windows_helper.go rename to libbeat/metric/system/diskio/diskstat_windows_helper.go diff --git a/metricbeat/module/system/diskio/diskstat_windows_test.go b/libbeat/metric/system/diskio/diskstat_windows_test.go similarity index 100% rename from metricbeat/module/system/diskio/diskstat_windows_test.go rename to libbeat/metric/system/diskio/diskstat_windows_test.go diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index dc7c0c45d3e..7f1d0f69ab9 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -29167,6 +29167,7 @@ linux module [float] === linux +linux system metrics @@ -29264,6 +29265,147 @@ type: long -- +[float] +=== iostat + +iostat + + + +*`linux.iostat.read.request.merges_per_sec`*:: ++ +-- +The number of read requests merged per second that were queued to the device. + + +type: float + +-- + +*`linux.iostat.write.request.merges_per_sec`*:: ++ +-- +The number of write requests merged per second that were queued to the device. + + +type: float + +-- + +*`linux.iostat.read.request.per_sec`*:: ++ +-- +The number of read requests that were issued to the device per second + + +type: float + +-- + +*`linux.iostat.write.request.per_sec`*:: ++ +-- +The number of write requests that were issued to the device per second + + +type: float + +-- + +*`linux.iostat.read.per_sec.bytes`*:: ++ +-- +The number of Bytes read from the device per second. + + +type: float + +format: bytes + +-- + +*`linux.iostat.read.await`*:: ++ +-- +The average time spent for read requests issued to the device to be served. + + +type: float + +-- + +*`linux.iostat.write.per_sec.bytes`*:: ++ +-- +The number of Bytes write from the device per second. + + +type: float + +format: bytes + +-- + +*`linux.iostat.write.await`*:: ++ +-- +The average time spent for write requests issued to the device to be served. + + +type: float + +-- + +*`linux.iostat.request.avg_size`*:: ++ +-- +The average size (in bytes) of the requests that were issued to the device. + + +type: float + +-- + +*`linux.iostat.queue.avg_size`*:: ++ +-- +The average queue length of the requests that were issued to the device. + + +type: float + +-- + +*`linux.iostat.await`*:: ++ +-- +The average time spent for requests issued to the device to be served. + + +type: float + +-- + +*`linux.iostat.service_time`*:: ++ +-- +The average service time (in milliseconds) for I/O requests that were issued to the device. + + +type: float + +-- + +*`linux.iostat.busy`*:: ++ +-- +Percentage of CPU time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100%. + + +type: float + +-- + [float] === ksm @@ -29338,6 +29480,186 @@ type: long -- +[float] +=== memory + +Linux memory data + + + +[float] +=== page_stats + +memory page statistics + + +*`linux.memory.page_stats.pgscan_kswapd.pages`*:: ++ +-- +pages scanned by kswapd + +type: long + +format: number + +-- + +*`linux.memory.page_stats.pgscan_direct.pages`*:: ++ +-- +pages scanned directly + +type: long + +format: number + +-- + +*`linux.memory.page_stats.pgfree.pages`*:: ++ +-- +pages freed by the system + +type: long + +format: number + +-- + +*`linux.memory.page_stats.pgsteal_kswapd.pages`*:: ++ +-- +number of pages reclaimed by kswapd + +type: long + +format: number + +-- + +*`linux.memory.page_stats.pgsteal_direct.pages`*:: ++ +-- +number of pages reclaimed directly + +type: long + +format: number + +-- + +*`linux.memory.page_stats.direct_efficiency.pct`*:: ++ +-- +direct reclaim efficiency percentage. A lower percentage indicates the system is struggling to reclaim memory. + +type: scaled_float + +format: percent + +-- + +*`linux.memory.page_stats.kswapd_efficiency.pct`*:: ++ +-- +kswapd reclaim efficiency percentage. A lower percentage indicates the system is struggling to reclaim memory. + +type: scaled_float + +format: percent + +-- + +[float] +=== hugepages + +This group contains statistics related to huge pages usage on the system. + + +*`linux.memory.hugepages.total`*:: ++ +-- +Number of huge pages in the pool. + + +type: long + +format: number + +-- + +*`linux.memory.hugepages.used.bytes`*:: ++ +-- +Memory used in allocated huge pages. + + +type: long + +format: bytes + +-- + +*`linux.memory.hugepages.used.pct`*:: ++ +-- +Percentage of huge pages used. + + +type: long + +format: percent + +-- + +*`linux.memory.hugepages.free`*:: ++ +-- +Number of available huge pages in the pool. + + +type: long + +format: number + +-- + +*`linux.memory.hugepages.reserved`*:: ++ +-- +Number of reserved but not allocated huge pages in the pool. + + +type: long + +format: number + +-- + +*`linux.memory.hugepages.surplus`*:: ++ +-- +Number of overcommited huge pages. + + +type: long + +format: number + +-- + +*`linux.memory.hugepages.default_size`*:: ++ +-- +Default size for huge pages. + + +type: long + +format: bytes + +-- + [float] === pageinfo @@ -40709,7 +41031,7 @@ type: long *`system.fsstat.total_files`*:: + -- -Total number of files. +Total number of files. Not on Windows. type: long @@ -41571,7 +41893,7 @@ format: bytes *`system.process.memory.rss.bytes`*:: + -- -The Resident Set Size. The amount of memory the process occupied in main memory (RAM). On Windows this represents the current working set size, in bytes. +The Resident Set Size. The amount of memory the process occupied in main memory (RAM). On Windows this represents the current working set size, in bytes. Not available on Windows. type: long @@ -41583,7 +41905,31 @@ format: bytes *`system.process.memory.rss.pct`*:: + -- -The percentage of memory the process occupied in main memory (RAM). +The percentage of memory the process occupied in main memory (RAM). Not available on Windows. + + +type: scaled_float + +format: percent + +-- + +*`system.process.memory.wss.bytes`*:: ++ +-- +The Working Set Size. The amount of memory the process occupied in main memory (RAM). Windows only. + + +type: long + +format: bytes + +-- + +*`system.process.memory.wss.pct`*:: ++ +-- +The percentage of memory the process occupied in main memory (RAM). Windows only. type: scaled_float @@ -41595,7 +41941,7 @@ format: percent *`system.process.memory.share`*:: + -- -The shared memory the process uses. +The shared memory the process uses. Not available on Windows. type: long diff --git a/metricbeat/docs/modules/linux.asciidoc b/metricbeat/docs/modules/linux.asciidoc index d63528730cb..ab911885afd 100644 --- a/metricbeat/docs/modules/linux.asciidoc +++ b/metricbeat/docs/modules/linux.asciidoc @@ -22,8 +22,10 @@ metricbeat.modules: period: 10s metricsets: - "pageinfo" + - "memory" # - ksm # - conntrack + # - iostat enabled: true #hostfs: /hostfs @@ -36,13 +38,21 @@ The following metricsets are available: * <> +* <> + * <> +* <> + * <> include::linux/conntrack.asciidoc[] +include::linux/iostat.asciidoc[] + include::linux/ksm.asciidoc[] +include::linux/memory.asciidoc[] + include::linux/pageinfo.asciidoc[] diff --git a/metricbeat/docs/modules/linux/iostat.asciidoc b/metricbeat/docs/modules/linux/iostat.asciidoc new file mode 100644 index 00000000000..7a41297b819 --- /dev/null +++ b/metricbeat/docs/modules/linux/iostat.asciidoc @@ -0,0 +1,23 @@ +//// +This file is generated! See scripts/mage/docs_collector.go +//// + +[[metricbeat-metricset-linux-iostat]] +=== linux iostat metricset + +beta[] + +include::../../../module/linux/iostat/_meta/docs.asciidoc[] + + +==== Fields + +For a description of each field in the metricset, see the +<> section. + +Here is an example document generated by this metricset: + +[source,json] +---- +include::../../../module/linux/iostat/_meta/data.json[] +---- diff --git a/metricbeat/docs/modules/linux/memory.asciidoc b/metricbeat/docs/modules/linux/memory.asciidoc new file mode 100644 index 00000000000..9ea3d482e57 --- /dev/null +++ b/metricbeat/docs/modules/linux/memory.asciidoc @@ -0,0 +1,24 @@ +//// +This file is generated! See scripts/mage/docs_collector.go +//// + +[[metricbeat-metricset-linux-memory]] +=== linux memory metricset + +beta[] + +include::../../../module/linux/memory/_meta/docs.asciidoc[] + +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. + +==== Fields + +For a description of each field in the metricset, see the +<> section. + +Here is an example document generated by this metricset: + +[source,json] +---- +include::../../../module/linux/memory/_meta/data.json[] +---- diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index 5ff2305665f..b37f7f831a3 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -176,8 +176,10 @@ This file is generated! See scripts/mage/docs_collector.go .2+| .2+| |<> beta[] |<> beta[] |<> beta[] |image:./images/icon-no.png[No prebuilt dashboards] | -.3+| .3+| |<> beta[] +.5+| .5+| |<> beta[] +|<> beta[] |<> beta[] +|<> beta[] |<> beta[] |<> |image:./images/icon-no.png[No prebuilt dashboards] | .2+| .2+| |<> diff --git a/metricbeat/include/list_common.go b/metricbeat/include/list_common.go index 39fadeea0e0..b77bb57f9a6 100644 --- a/metricbeat/include/list_common.go +++ b/metricbeat/include/list_common.go @@ -95,7 +95,9 @@ import ( _ "github.com/elastic/beats/v7/metricbeat/module/kvm/status" _ "github.com/elastic/beats/v7/metricbeat/module/linux" _ "github.com/elastic/beats/v7/metricbeat/module/linux/conntrack" + _ "github.com/elastic/beats/v7/metricbeat/module/linux/iostat" _ "github.com/elastic/beats/v7/metricbeat/module/linux/ksm" + _ "github.com/elastic/beats/v7/metricbeat/module/linux/memory" _ "github.com/elastic/beats/v7/metricbeat/module/linux/pageinfo" _ "github.com/elastic/beats/v7/metricbeat/module/logstash" _ "github.com/elastic/beats/v7/metricbeat/module/logstash/node" diff --git a/metricbeat/metricbeat.reference.yml b/metricbeat/metricbeat.reference.yml index 9b6f37eb447..9df18e4d7f9 100644 --- a/metricbeat/metricbeat.reference.yml +++ b/metricbeat/metricbeat.reference.yml @@ -572,8 +572,10 @@ metricbeat.modules: period: 10s metricsets: - "pageinfo" + - "memory" # - ksm # - conntrack + # - iostat enabled: true #hostfs: /hostfs diff --git a/metricbeat/module/linux/_meta/config.yml b/metricbeat/module/linux/_meta/config.yml index e00fe571846..490d3245c19 100644 --- a/metricbeat/module/linux/_meta/config.yml +++ b/metricbeat/module/linux/_meta/config.yml @@ -2,8 +2,10 @@ period: 10s metricsets: - "pageinfo" + - "memory" # - ksm # - conntrack + # - iostat enabled: true #hostfs: /hostfs diff --git a/metricbeat/module/linux/_meta/fields.yml b/metricbeat/module/linux/_meta/fields.yml index c3fe9657e89..44236f625e9 100644 --- a/metricbeat/module/linux/_meta/fields.yml +++ b/metricbeat/module/linux/_meta/fields.yml @@ -7,4 +7,5 @@ - name: linux type: group description: > + linux system metrics fields: diff --git a/metricbeat/module/linux/fields.go b/metricbeat/module/linux/fields.go index e4935eb2d7f..90e7e3ed940 100644 --- a/metricbeat/module/linux/fields.go +++ b/metricbeat/module/linux/fields.go @@ -32,5 +32,5 @@ func init() { // AssetLinux returns asset data. // This is the base64 encoded gzipped contents of module/linux. func AssetLinux() string { - return "eJy8l0tv4zYQx+/+FIMcF91Hsm8fCgTdRVEUKYIGe+mhwogcWawpUuWQybqfviBl2YoiOUpTiZcgIfWfn/6ch/IStrRbg1YmfF8BeOU1reEs/X62AnCkCZnWkJPHFYAkFk7VXlmzhh9XANA8C5WVQdMKoFCkJa/T1kswWNFRPi6/q2kNG2dDvf/LgOZ9ma6UsMZ4h2J72BmSjKuP3q7BcM0aEu+DdGE4VBW63b29MZxHQse1lwNbgCmyAwywR6/YK8E/pDMkAYWzzPDT9TcQ1hH3tIagu+DS2T7bkVxbsxnYfAQ+rhrFljwn+ZokyEDg7dFWKFBpFRyNghE6vctmwjtykPFO0RHUW6hwS+CsraCwDgzdgTUPfO2ANgozULZsyoAvqQPtMdfjzhU2GDkDDgchiLkIWu+ACZ0oSY6+fkujNsYOXPP/l2JMZAC1I5S75BEJ31wk9u65X54dSMPkfBaTkuaw7rdQ5eRiObd3eleSI9CK/T54+6NhgBOot6jVMyEfyj9w1JfoQaAx1kNOkFwc8ObQAFM+ZI7Yo/MzWJhyHrS121BH+5QoocR0zznBPu6x0zTHHbH6p5OcLe2Wqzmmxn3Zk/PCo+/XzH+eFr/eXHUmwxMHQI0b4oxLdLNk/k0SbqLERhaYXk1gUYPxng2jPDHs9Ztoj8EEM5s134z6O9AJjAoPGLdWo1cDTf/5GNfpakSJZhNd8dZCgez3hdW8/bhLcRpkLNDMMQCPbdOrihgqcptU1006lXhLkMdmFQHMKUxO/SAzVlImSlSz4DZOpsaZ0BxhGpEVfs8icZvZ0zBlqOf1VIZaK4GxacYO0svDbhkoU9g5+uWA9qmmmQcpd1nvgXGgCYZ8QY9QOFvB69pZ8TpFiAEasVgPgQ/tK9+BdZLcEzvsl6vL0XscYp7AndivLhNXeomBE2NYXbSzN2eD+4+k2UTCROGIQJTBbDnm3MWfb15cX/78Nbv55Y+vp9HOF0c7n4p2sTjaxVS0t4ujvZ2K9m5xtHdT0d4vjvZ+KtqHxdE+TEX7uDjax6lonxZH+zQV7fPiaJ8nt9zlx8H52DxooeK3EL96MTjxbf4Xif4/mxNIfsc7QK2twHgK0sDvfAXEqRoD3PvSWP0bAAD//4Pi/m8=" + return "eJzEmd9v2zgSx9/zVwwCHNAWVzfp7/rhgNylOBR3uQu27csudoUxObK5pkiVP+y6f/2CpBXLtmQrcaT6pWgkz3z4neHMkH4Oc1qNQQrlv58BOOEkjeE8/v/8DMCQJLQ0hgk5PAPgZJkRpRNajeEfZwCQvguF5l7SGUAuSHI7jo+eg8KCNubDx61KGsPUaF+u/9Jgc2PXrqyjAgpyRjC7flj3UffDtFLOIJvfPWnyFz6766o+LSzh02R8F6QOY31RoFltPWvDOeI6fNbmQOeg8uwOBqxDJ6wTzP49vkMckBltLfzr9iswbcju2GqCroNzo3fZNuRSq2nDwyPw4VMim5Oz0XxJHLgncHojK+QopPCGWsEIjVxlPeFtOEg5I2gD6jQUOCcwWheQawOKlqDVnq410GShB8qKTShwM6pBO5zIduVy7RXvAcd6xsja3Eu5Akto2Ix46/IrGjFVuiHMj5dilkgBSkPIV1EjYi4FEnfivLs9a5DKknFZSErqQ7r/+WJCJmznKqbLGRkCKaxbO6/+SQxwAHWBUpwIuW9+T1E3QwcMldIOJgRRxQZt7gpgzIfMkHVoXA8SxpwHqfXcl0E+wWYwwxjnCcHa76bSpNcNWfGjlpx3IupQSftoHHuWD3WNkLMjQ988WTcqyEzJZiWZzBJr7CS51Lir7VHpvswI1F3+BZewdmkh+uRQkgFLTCuewr4MufnNk0/7KBQfTgvBaNS4jKURjgZeR/T52AvZiseggdjQCmv3aGvr6hCAYZU/jTwqvgYeTVZur5E8GvY/g/Gkem500cw42p2etCnQjWGfbGsBuESxi3ciOC7I4JTAiYLAlqRcnEa2s6ZR8VQQLZkF8UP7dUDVU8o8puxpCcPpvpP0DxS+2qG4mGahMfWDHizDE6GSfE9DGAJlxx3bTB5raM/c0QdIUlM3exToIbflaYkRnglGWTDbU1IkDwk8JEchpBRp+9mncRGfXvz/NL0n3jafgB9Ef0uGkXIBXufxfBvZuTdCTdcD4BZyexN6MkHFl4K7GXgnpPiBwW1c9OatpyO4Tq9bdN6kVzRj3sRpPUzEwsICpQ9egEltY2gvLy7+ttFjb9Sc26KPOXPb7MGrCYeuub4/4GLiP59vapcQ97xrKDEMhnaGppdD1udoOHkJZ2ZvabexNLGIRn8nw4jQ+Nb2k7djMF71Js1XJb55OoBR4B3GQkt0ouF+4XSM2xgaNkM1Dao4rSFH66oCGVffrlLupcwsQ9XHXcvmhB6qTDpQxCNkSqcZLggm4VwcANQhTBuPnpnSnDI2Q9ELblIyFumIZgjjbUyB37NAXGV2N0zuy3415b6UgmE4n4cKspOHFVJBhd66pHm0avnfdG0d7QPHra8dqp1JyocX0LXHMnbgB5fNaci5bG6XWPJR1O6+waoG6jSYH4tmSvl1osNkBcn1MUAuDDE3PGDyK9tv98ppboiGAwveom5huEi/aRzSzhHKAaO7OZwlWkNMoii6RjrSDhfqdtqjYU8vZJTngglSbDUqWfvNpGUoiWdNo2qdukxT6THs5LuihQ1DZQCnNIIrkHpJpvY3EIrHQmlryRPGTeuMn05lapt3dlN9aS/yKZw/R4Lk+6dIUC1/5qfUlKPt1bs0lIvvYzj/Larw+/mh6v4lHAiiFWBaudDqa1U+9Clc/xIRQNYJ7G080aja4vauP440BKcdyn633bGGXlvQ+tepUmvZnojeEm+8aerM3fblDtg3qQsHhkCLUuo0i2xWcYT80K45wt1xt7SMeVtn4K0sOjgpG7r3+P64+YELFDLOz/fNFEPpouTn8lcUMPEOlHaNSdNtQdabUvqe2+Sx9egFGaaLQnRNe045eumarvs6o5+wZa+T+3SXmWvTyFyf0oXKdR8nhwbbhw4ME8/5Ktv5QjtQBzWu0WG6On9RGs1eRA/BQTIWumEsbCkjJyvQhu/ly7GOcn1z1RrkJuYO3JH95iqdfa63j1zHsOpo5xe7PXgbryUHOxJGCkMEbObV3Iat8vKPi2e3V//+mH3+9OvHw2iXg6NddkV7OTjay65orwZHe9UV7fXgaK+7or0ZHO1NV7S3g6O97Yr2bnC0d13R3g+O9r4r2ofB0T50LrnDt4PLtn5QQSnNyY6eNXZ8PfmT9g4PHUh+wWU1cwqtIDb82hQQumpwsDVpnP0VAAD//2DzKvg=" } diff --git a/metricbeat/module/linux/iostat/_meta/data.json b/metricbeat/module/linux/iostat/_meta/data.json new file mode 100644 index 00000000000..99f23d8cc95 --- /dev/null +++ b/metricbeat/module/linux/iostat/_meta/data.json @@ -0,0 +1,49 @@ +{ + "@timestamp": "2017-10-12T08:05:34.853Z", + "event": { + "dataset": "linux.iostat", + "duration": 115000, + "module": "linux" + }, + "linux": { + "iostat": { + "await": 0, + "busy": 0, + "name": "sr0", + "queue": { + "avg_size": 0 + }, + "read": { + "await": 0, + "per_sec": { + "bytes": 0 + }, + "request": { + "merges_per_sec": 0, + "per_sec": 0 + } + }, + "request": { + "avg_size": 0 + }, + "service_time": 0, + "write": { + "await": 0, + "per_sec": { + "bytes": 0 + }, + "request": { + "merges_per_sec": 0, + "per_sec": 0 + } + } + } + }, + "metricset": { + "name": "iostat", + "period": 10000 + }, + "service": { + "type": "linux" + } +} \ No newline at end of file diff --git a/metricbeat/module/linux/iostat/_meta/docs.asciidoc b/metricbeat/module/linux/iostat/_meta/docs.asciidoc new file mode 100644 index 00000000000..ec4c4de1618 --- /dev/null +++ b/metricbeat/module/linux/iostat/_meta/docs.asciidoc @@ -0,0 +1,3 @@ +The iostat module reports per-disk IO statistics that emulate `iostat -x` on linux. + +NOTE: as of now, this data is part of system/diskio on Metricbeat, but can only be found in the Linux integration in Fleet. In the future, this data will be removed from system/memory. \ No newline at end of file diff --git a/metricbeat/module/linux/iostat/_meta/fields.yml b/metricbeat/module/linux/iostat/_meta/fields.yml new file mode 100644 index 00000000000..a7ded63f8fc --- /dev/null +++ b/metricbeat/module/linux/iostat/_meta/fields.yml @@ -0,0 +1,61 @@ +- name: iostat + type: group + release: beta + description: > + iostat + fields: + - name: read.request.merges_per_sec + type: float + description: > + The number of read requests merged per second that were queued to the device. + - name: write.request.merges_per_sec + type: float + description: > + The number of write requests merged per second that were queued to the device. + - name: read.request.per_sec + type: float + description: > + The number of read requests that were issued to the device per second + - name: write.request.per_sec + type: float + description: > + The number of write requests that were issued to the device per second + - name: read.per_sec.bytes + type: float + description: > + The number of Bytes read from the device per second. + format: bytes + - name: read.await + type: float + description: > + The average time spent for read requests issued to the device to be served. + - name: write.per_sec.bytes + type: float + description: > + The number of Bytes write from the device per second. + format: bytes + - name: write.await + type: float + description: > + The average time spent for write requests issued to the device to be served. + - name: request.avg_size + type: float + description: > + The average size (in bytes) of the requests that were issued to the device. + - name: queue.avg_size + type: float + description: > + The average queue length of the requests that were issued to the device. + - name: await + type: float + description: > + The average time spent for requests issued to the device to be served. + - name: service_time + type: float + description: > + The average service time (in milliseconds) for I/O requests that were issued to the device. + - name: busy + type: float + description: > + Percentage of CPU time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100%. + diff --git a/metricbeat/module/linux/iostat/data.go b/metricbeat/module/linux/iostat/data.go new file mode 100644 index 00000000000..4e546deaa34 --- /dev/null +++ b/metricbeat/module/linux/iostat/data.go @@ -0,0 +1,58 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package iostat + +import ( + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/metric/system/diskio" +) + +// AddLinuxIOStat adds the linux iostat data to the provided map +func AddLinuxIOStat(extraMetrics diskio.IOMetric) common.MapStr { + return common.MapStr{ + "read": common.MapStr{ + "request": common.MapStr{ + "merges_per_sec": extraMetrics.ReadRequestMergeCountPerSec, + "per_sec": extraMetrics.ReadRequestCountPerSec, + }, + "per_sec": common.MapStr{ + "bytes": extraMetrics.ReadBytesPerSec, + }, + "await": extraMetrics.AvgReadAwaitTime, + }, + "write": common.MapStr{ + "request": common.MapStr{ + "merges_per_sec": extraMetrics.WriteRequestMergeCountPerSec, + "per_sec": extraMetrics.WriteRequestCountPerSec, + }, + "per_sec": common.MapStr{ + "bytes": extraMetrics.WriteBytesPerSec, + }, + "await": extraMetrics.AvgWriteAwaitTime, + }, + "queue": common.MapStr{ + "avg_size": extraMetrics.AvgQueueSize, + }, + "request": common.MapStr{ + "avg_size": extraMetrics.AvgRequestSize, + }, + "await": extraMetrics.AvgAwaitTime, + "service_time": extraMetrics.AvgServiceTime, + "busy": extraMetrics.BusyPct, + } +} diff --git a/metricbeat/module/linux/iostat/iostat.go b/metricbeat/module/linux/iostat/iostat.go new file mode 100644 index 00000000000..049b4daadf7 --- /dev/null +++ b/metricbeat/module/linux/iostat/iostat.go @@ -0,0 +1,104 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package iostat + +import ( + "github.com/pkg/errors" + + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/cfgwarn" + "github.com/elastic/beats/v7/libbeat/metric/system/diskio" + "github.com/elastic/beats/v7/metricbeat/mb" +) + +// init registers the MetricSet with the central registry as soon as the program +// starts. The New function will be called later to instantiate an instance of +// the MetricSet for each host defined in the module's configuration. After the +// MetricSet has been created then Fetch will begin to be called periodically. +func init() { + mb.Registry.MustAddMetricSet("linux", "iostat", New) +} + +// MetricSet holds any configuration or state information. It must implement +// the mb.MetricSet interface. And this is best achieved by embedding +// mb.BaseMetricSet because it implements all of the required mb.MetricSet +// interface methods except for Fetch. +type MetricSet struct { + mb.BaseMetricSet + stats *diskio.IOStat + includeDevices []string +} + +// New creates a new instance of the MetricSet. New is responsible for unpacking +// any MetricSet specific configuration options if there are any. +func New(base mb.BaseMetricSet) (mb.MetricSet, error) { + cfgwarn.Beta("The linux iostat metricset is beta.") + + config := struct { + IncludeDevices []string `config:"iostat.include_devices"` + }{IncludeDevices: []string{}} + if err := base.Module().UnpackConfig(&config); err != nil { + return nil, err + } + + return &MetricSet{ + BaseMetricSet: base, + includeDevices: config.IncludeDevices, + stats: diskio.NewDiskIOStat(), + }, nil +} + +// Fetch methods implements the data gathering and data conversion to the right +// format. It publishes the event which is then forwarded to the output. In case +// of an error set the Error field of mb.Event or simply call report.Error(). +func (m *MetricSet) Fetch(report mb.ReporterV2) error { + + IOstats, err := diskio.IOCounters(m.includeDevices...) + if err != nil { + return errors.Wrap(err, "disk io counters") + } + + // Sample the current cpu counter + m.stats.OpenSampling() + + // Store the last cpu counter when finished + defer m.stats.CloseSampling() + + for _, counters := range IOstats { + event := common.MapStr{ + "name": counters.Name, + } + if counters.SerialNumber != "" { + event["serial_number"] = counters.SerialNumber + } + result, err := m.stats.CalcIOStatistics(counters) + if err != nil { + return errors.Wrap(err, "error calculating iostat") + } + IOstats := AddLinuxIOStat(result) + event.DeepUpdate(IOstats) + + isOpen := report.Event(mb.Event{ + MetricSetFields: event, + }) + if !isOpen { + return nil + } + } + return nil +} diff --git a/metricbeat/module/linux/iostat/iostat_test.go b/metricbeat/module/linux/iostat/iostat_test.go new file mode 100644 index 00000000000..6a607fc66d4 --- /dev/null +++ b/metricbeat/module/linux/iostat/iostat_test.go @@ -0,0 +1,55 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build linux + +package iostat + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" +) + +func TestFetch(t *testing.T) { + f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) + events, errs := mbtest.ReportingFetchV2Error(f) + + assert.Empty(t, errs) + if !assert.NotEmpty(t, events) { + t.FailNow() + } + t.Logf("%s/%s event: %+v", f.Module().Name(), f.Name(), + events[0].BeatEvent("linux", "iostat").Fields.StringToPrint()) +} + +func TestData(t *testing.T) { + f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) + err := mbtest.WriteEventsReporterV2Error(f, t, ".") + if err != nil { + t.Fatal("write", err) + } +} + +func getConfig() map[string]interface{} { + return map[string]interface{}{ + "module": "linux", + "metricsets": []string{"iostat"}, + } +} diff --git a/metricbeat/module/linux/memory/_meta/data.json b/metricbeat/module/linux/memory/_meta/data.json new file mode 100644 index 00000000000..79a3d431869 --- /dev/null +++ b/metricbeat/module/linux/memory/_meta/data.json @@ -0,0 +1,59 @@ +{ + "@timestamp": "2017-10-12T08:05:34.853Z", + "event": { + "dataset": "linux.memory", + "duration": 115000, + "module": "linux" + }, + "linux": { + "memory": { + "hugepages": { + "default_size": 2097152, + "free": 0, + "reserved": 0, + "surplus": 0, + "swap": { + "out": { + "fallback": 0, + "pages": 0 + } + }, + "total": 0, + "used": { + "bytes": 0, + "pct": 0 + } + }, + "page_stats": { + "direct_efficiency": { + "pct": 0.9228 + }, + "kswapd_efficiency": { + "pct": 0.7523 + }, + "pgfree": { + "pages": 16061818710 + }, + "pgscan_direct": { + "pages": 1198580 + }, + "pgscan_kswapd": { + "pages": 50222460 + }, + "pgsteal_direct": { + "pages": 1106083 + }, + "pgsteal_kswapd": { + "pages": 37782783 + } + } + } + }, + "metricset": { + "name": "memory", + "period": 10000 + }, + "service": { + "type": "linux" + } +} \ No newline at end of file diff --git a/metricbeat/module/linux/memory/_meta/docs.asciidoc b/metricbeat/module/linux/memory/_meta/docs.asciidoc new file mode 100644 index 00000000000..8b0bbaed750 --- /dev/null +++ b/metricbeat/module/linux/memory/_meta/docs.asciidoc @@ -0,0 +1,3 @@ +The memory metricset extends system/memory and adds linux-specific memory metrics, including Huge Pages and overall paging statistics. + +NOTE: as of now, this data is part of system/memory on Metricbeat, but can only be found in the Linux integration in Fleet. In the future, this data will be removed from system/memory. \ No newline at end of file diff --git a/metricbeat/module/linux/memory/_meta/fields.yml b/metricbeat/module/linux/memory/_meta/fields.yml new file mode 100644 index 00000000000..2490e69aa21 --- /dev/null +++ b/metricbeat/module/linux/memory/_meta/fields.yml @@ -0,0 +1,78 @@ +- name: memory + type: group + release: beta + description: > + Linux memory data + fields: + - name: page_stats + type: group + description: memory page statistics + fields: + - name: pgscan_kswapd.pages + type: long + format: number + description: pages scanned by kswapd + - name: pgscan_direct.pages + type: long + format: number + description: pages scanned directly + - name: pgfree.pages + type: long + format: number + description: pages freed by the system + - name: pgsteal_kswapd.pages + type: long + format: number + description: number of pages reclaimed by kswapd + - name: pgsteal_direct.pages + type: long + format: number + description: number of pages reclaimed directly + - name: direct_efficiency.pct + type: scaled_float + format: percent + description: direct reclaim efficiency percentage. A lower percentage indicates the system is struggling to reclaim memory. + - name: kswapd_efficiency.pct + type: scaled_float + format: percent + description: kswapd reclaim efficiency percentage. A lower percentage indicates the system is struggling to reclaim memory. + - name: hugepages + type: group + prefix: "[float]" + description: This group contains statistics related to huge pages usage on the system. + fields: + - name: total + type: long + format: number + description: > + Number of huge pages in the pool. + - name: used.bytes + type: long + format: bytes + description: > + Memory used in allocated huge pages. + - name: used.pct + type: long + format: percent + description: > + Percentage of huge pages used. + - name: free + type: long + format: number + description: > + Number of available huge pages in the pool. + - name: reserved + type: long + format: number + description: > + Number of reserved but not allocated huge pages in the pool. + - name: surplus + type: long + format: number + description: > + Number of overcommited huge pages. + - name: default_size + type: long + format: bytes + description: > + Default size for huge pages. diff --git a/metricbeat/module/linux/memory/data.go b/metricbeat/module/linux/memory/data.go new file mode 100644 index 00000000000..d3f1a5ef2f8 --- /dev/null +++ b/metricbeat/module/linux/memory/data.go @@ -0,0 +1,99 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build darwin freebsd linux openbsd windows + +package memory + +import ( + "github.com/pkg/errors" + + "github.com/elastic/beats/v7/libbeat/common" + mem "github.com/elastic/beats/v7/libbeat/metric/system/memory" +) + +// FetchLinuxMemStats gets page_stat and huge pages data for linux +func FetchLinuxMemStats(baseMap common.MapStr) error { + + vmstat, err := mem.GetVMStat() + if err != nil { + return errors.Wrap(err, "VMStat") + } + + if vmstat != nil { + pageStats := common.MapStr{ + "pgscan_kswapd": common.MapStr{ + "pages": vmstat.PgscanKswapd, + }, + "pgscan_direct": common.MapStr{ + "pages": vmstat.PgscanDirect, + }, + "pgfree": common.MapStr{ + "pages": vmstat.Pgfree, + }, + "pgsteal_kswapd": common.MapStr{ + "pages": vmstat.PgstealKswapd, + }, + "pgsteal_direct": common.MapStr{ + "pages": vmstat.PgstealDirect, + }, + } + // This is similar to the vmeff stat gathered by sar + // these ratios calculate thhe efficiency of page reclaim + if vmstat.PgscanDirect != 0 { + pageStats["direct_efficiency"] = common.MapStr{ + "pct": common.Round(float64(vmstat.PgstealDirect)/float64(vmstat.PgscanDirect), common.DefaultDecimalPlacesCount), + } + } + + if vmstat.PgscanKswapd != 0 { + pageStats["kswapd_efficiency"] = common.MapStr{ + "pct": common.Round(float64(vmstat.PgstealKswapd)/float64(vmstat.PgscanKswapd), common.DefaultDecimalPlacesCount), + } + } + baseMap["page_stats"] = pageStats + } + + hugePagesStat, err := mem.GetHugeTLBPages() + if err != nil { + return errors.Wrap(err, "hugepages") + } + if hugePagesStat != nil { + mem.AddHugeTLBPagesPercentage(hugePagesStat) + thp := common.MapStr{ + "total": hugePagesStat.Total, + "used": common.MapStr{ + "bytes": hugePagesStat.TotalAllocatedSize, + "pct": hugePagesStat.UsedPercent, + }, + "free": hugePagesStat.Free, + "reserved": hugePagesStat.Reserved, + "surplus": hugePagesStat.Surplus, + "default_size": hugePagesStat.DefaultSize, + } + if vmstat != nil { + thp["swap"] = common.MapStr{ + "out": common.MapStr{ + "pages": vmstat.ThpSwpout, + "fallback": vmstat.ThpSwpoutFallback, + }, + } + } + baseMap["hugepages"] = thp + } + return nil +} diff --git a/metricbeat/module/linux/memory/memory.go b/metricbeat/module/linux/memory/memory.go new file mode 100644 index 00000000000..163e3bea771 --- /dev/null +++ b/metricbeat/module/linux/memory/memory.go @@ -0,0 +1,62 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package memory + +import ( + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/cfgwarn" + "github.com/elastic/beats/v7/metricbeat/mb" +) + +// init registers the MetricSet with the central registry as soon as the program +// starts. The New function will be called later to instantiate an instance of +// the MetricSet for each host defined in the module's configuration. After the +// MetricSet has been created then Fetch will begin to be called periodically. +func init() { + mb.Registry.MustAddMetricSet("linux", "memory", New, mb.DefaultMetricSet()) +} + +// MetricSet holds any configuration or state information. It must implement +// the mb.MetricSet interface. And this is best achieved by embedding +// mb.BaseMetricSet because it implements all of the required mb.MetricSet +// interface methods except for Fetch. +type MetricSet struct { + mb.BaseMetricSet +} + +// New creates a new instance of the MetricSet. New is responsible for unpacking +// any MetricSet specific configuration options if there are any. +func New(base mb.BaseMetricSet) (mb.MetricSet, error) { + cfgwarn.Beta("The linux memory metricset is beta.") + + return &MetricSet{ + BaseMetricSet: base, + }, nil +} + +// Fetch methods implements the data gathering and data conversion to the right +// format. It publishes the event which is then forwarded to the output. In case +// of an error set the Error field of mb.Event or simply call report.Error(). +func (m *MetricSet) Fetch(report mb.ReporterV2) error { + rootEvent := common.MapStr{} + FetchLinuxMemStats(rootEvent) + report.Event(mb.Event{ + MetricSetFields: rootEvent, + }) + return nil +} diff --git a/metricbeat/module/linux/memory/memory_test.go b/metricbeat/module/linux/memory/memory_test.go new file mode 100644 index 00000000000..2980c94841e --- /dev/null +++ b/metricbeat/module/linux/memory/memory_test.go @@ -0,0 +1,55 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build darwin freebsd linux openbsd windows + +package memory + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" +) + +func TestFetch(t *testing.T) { + f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) + events, errs := mbtest.ReportingFetchV2Error(f) + + assert.Empty(t, errs) + if !assert.NotEmpty(t, events) { + t.FailNow() + } + t.Logf("%s/%s event: %+v", f.Module().Name(), f.Name(), + events[0].BeatEvent("linux", "memory").Fields.StringToPrint()) +} + +func TestData(t *testing.T) { + f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) + err := mbtest.WriteEventsReporterV2Error(f, t, ".") + if err != nil { + t.Fatal("write", err) + } +} + +func getConfig() map[string]interface{} { + return map[string]interface{}{ + "module": "linux", + "metricsets": []string{"memory"}, + } +} diff --git a/metricbeat/module/system/cpu/_meta/data.json b/metricbeat/module/system/cpu/_meta/data.json index 4a5fd7c8ff7..cb9548ec6e4 100644 --- a/metricbeat/module/system/cpu/_meta/data.json +++ b/metricbeat/module/system/cpu/_meta/data.json @@ -7,7 +7,7 @@ }, "host": { "cpu": { - "pct": 0.0816 + "pct": 0.1629 } }, "metricset": { @@ -19,68 +19,68 @@ }, "system": { "cpu": { - "cores": 12, + "cores": 4, "idle": { "norm": { - "pct": 0.9184 + "pct": 0.8371 }, - "pct": 11.0208, - "ticks": 1964402 + "pct": 3.3484, + "ticks": 806327077 }, "iowait": { "norm": { "pct": 0 }, "pct": 0, - "ticks": 5083 + "ticks": 312229 }, "irq": { "norm": { - "pct": 0 + "pct": 0.0125 }, - "pct": 0, - "ticks": 0 + "pct": 0.0501, + "ticks": 6548016 }, "nice": { "norm": { "pct": 0 }, "pct": 0, - "ticks": 9752 + "ticks": 517231 }, "softirq": { "norm": { - "pct": 0.0058 + "pct": 0.0025 }, - "pct": 0.0699, - "ticks": 10386 + "pct": 0.01, + "ticks": 1561223 }, "steal": { "norm": { "pct": 0 }, "pct": 0, - "ticks": 0 + "ticks": 156646 }, "system": { "norm": { - "pct": 0.005 + "pct": 0.0551 }, - "pct": 0.06, - "ticks": 22274 + "pct": 0.2206, + "ticks": 31037256 }, "total": { "norm": { - "pct": 0.0816 + "pct": 0.1629 }, - "pct": 0.9792 + "pct": 0.6516 }, "user": { "norm": { - "pct": 0.0708 + "pct": 0.0927 }, - "pct": 0.8493, - "ticks": 123767 + "pct": 0.3709, + "ticks": 139619320 } } } diff --git a/metricbeat/module/system/cpu/cpu.go b/metricbeat/module/system/cpu/cpu.go index 7333df6dec7..7650b65cd80 100644 --- a/metricbeat/module/system/cpu/cpu.go +++ b/metricbeat/module/system/cpu/cpu.go @@ -20,11 +20,8 @@ package cpu import ( - "strings" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/metric/system/cpu" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" @@ -69,50 +66,7 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { return errors.Wrap(err, "failed to fetch CPU times") } - event := common.MapStr{"cores": cpu.NumCores} - hostFields := common.MapStr{} - for _, metric := range m.config.Metrics { - switch strings.ToLower(metric) { - case percentages: - pct := sample.Percentages() - event.Put("user.pct", pct.User) - event.Put("system.pct", pct.System) - event.Put("idle.pct", pct.Idle) - event.Put("iowait.pct", pct.IOWait) - event.Put("irq.pct", pct.IRQ) - event.Put("nice.pct", pct.Nice) - event.Put("softirq.pct", pct.SoftIRQ) - event.Put("steal.pct", pct.Steal) - event.Put("total.pct", pct.Total) - case normalizedPercentages: - normalizedPct := sample.NormalizedPercentages() - event.Put("user.norm.pct", normalizedPct.User) - event.Put("system.norm.pct", normalizedPct.System) - event.Put("idle.norm.pct", normalizedPct.Idle) - event.Put("iowait.norm.pct", normalizedPct.IOWait) - event.Put("irq.norm.pct", normalizedPct.IRQ) - event.Put("nice.norm.pct", normalizedPct.Nice) - event.Put("softirq.norm.pct", normalizedPct.SoftIRQ) - event.Put("steal.norm.pct", normalizedPct.Steal) - event.Put("total.norm.pct", normalizedPct.Total) - hostFields.Put("host.cpu.pct", normalizedPct.Total) - case ticks: - ticks := sample.Ticks() - event.Put("user.ticks", ticks.User) - event.Put("system.ticks", ticks.System) - event.Put("idle.ticks", ticks.Idle) - event.Put("iowait.ticks", ticks.IOWait) - event.Put("irq.ticks", ticks.IRQ) - event.Put("nice.ticks", ticks.Nice) - event.Put("softirq.ticks", ticks.SoftIRQ) - event.Put("steal.ticks", ticks.Steal) - } - } - - r.Event(mb.Event{ - RootFields: hostFields, - MetricSetFields: event, - }) + r.Event(collectCPUMetrics(m.config.Metrics, sample)) return nil } diff --git a/metricbeat/module/system/cpu/data.go b/metricbeat/module/system/cpu/data.go new file mode 100644 index 00000000000..497a91a6173 --- /dev/null +++ b/metricbeat/module/system/cpu/data.go @@ -0,0 +1,112 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build darwin freebsd linux openbsd windows + +package cpu + +import ( + "runtime" + "strings" + + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/metric/system/cpu" + "github.com/elastic/beats/v7/metricbeat/mb" +) + +// CPU metrics are highly OS-specific, so we need to build the event per-OS +func getPlatformCPUMetrics(sample *cpu.Metrics, selectors []string, event common.MapStr) { + for _, metric := range selectors { + switch strings.ToLower(metric) { + case percentages: + pct := sample.Percentages() + event.Put("user.pct", pct.User) + event.Put("system.pct", pct.System) + event.Put("idle.pct", pct.Idle) + event.Put("total.pct", pct.Total) + + if runtime.GOOS != "windows" { + event.Put("nice.pct", pct.Nice) + } + if runtime.GOOS == "linux" || runtime.GOOS == "openbsd" { + event.Put("irq.pct", pct.IRQ) + } + if runtime.GOOS == "linux" || runtime.GOOS == "aix" { + event.Put("iowait.pct", pct.IOWait) + } + if runtime.GOOS == "linux" { + event.Put("softirq.pct", pct.SoftIRQ) + event.Put("steal.pct", pct.Steal) + } + case normalizedPercentages: + normalizedPct := sample.NormalizedPercentages() + event.Put("user.norm.pct", normalizedPct.User) + event.Put("system.norm.pct", normalizedPct.System) + event.Put("idle.norm.pct", normalizedPct.Idle) + event.Put("total.norm.pct", normalizedPct.Total) + + if runtime.GOOS != "windows" { + event.Put("nice.norm.pct", normalizedPct.Nice) + } + if runtime.GOOS == "linux" || runtime.GOOS == "openbsd" { + event.Put("irq.norm.pct", normalizedPct.IRQ) + } + if runtime.GOOS == "linux" || runtime.GOOS == "aix" { + event.Put("iowait.norm.pct", normalizedPct.IOWait) + } + if runtime.GOOS == "linux" { + event.Put("softirq.norm.pct", normalizedPct.SoftIRQ) + event.Put("steal.norm.pct", normalizedPct.Steal) + } + case ticks: + ticks := sample.Ticks() + event.Put("user.ticks", ticks.User) + event.Put("system.ticks", ticks.System) + event.Put("idle.ticks", ticks.Idle) + + if runtime.GOOS != "windows" { + event.Put("nice.ticks", ticks.Nice) + } + if runtime.GOOS == "linux" || runtime.GOOS == "openbsd" { + event.Put("irq.ticks", ticks.IRQ) + } + if runtime.GOOS == "linux" || runtime.GOOS == "aix" { + event.Put("iowait.ticks", ticks.IOWait) + } + if runtime.GOOS == "linux" { + event.Put("softirq.ticks", ticks.SoftIRQ) + event.Put("steal.ticks", ticks.Steal) + } + } + } +} + +// gather CPU metrics +func collectCPUMetrics(selectors []string, sample *cpu.Metrics) mb.Event { + event := common.MapStr{"cores": cpu.NumCores} + getPlatformCPUMetrics(sample, selectors, event) + + //generate the host fields here, since we don't want users disabling it. + normalizedPct := sample.NormalizedPercentages() + hostFields := common.MapStr{} + hostFields.Put("host.cpu.pct", normalizedPct.Total) + + return mb.Event{ + RootFields: hostFields, + MetricSetFields: event, + } +} diff --git a/metricbeat/module/system/diskio/_meta/data.json b/metricbeat/module/system/diskio/_meta/data.json index b9c8533b0c8..a2301ef8888 100644 --- a/metricbeat/module/system/diskio/_meta/data.json +++ b/metricbeat/module/system/diskio/_meta/data.json @@ -15,7 +15,7 @@ "system": { "diskio": { "io": { - "time": 364 + "time": 601740 }, "iostat": { "await": 0, @@ -48,16 +48,16 @@ } } }, - "name": "loop1", + "name": "sdb1", "read": { - "bytes": 5267456, - "count": 4124, - "time": 557 + "bytes": 25128030208, + "count": 3146154, + "time": 833872 }, "write": { - "bytes": 0, - "count": 0, - "time": 0 + "bytes": 34401640448, + "count": 861040, + "time": 11224168 } } } diff --git a/metricbeat/module/system/diskio/diskio.go b/metricbeat/module/system/diskio/diskio.go index 9da3a3c2344..1359180cff6 100644 --- a/metricbeat/module/system/diskio/diskio.go +++ b/metricbeat/module/system/diskio/diskio.go @@ -20,9 +20,14 @@ package diskio import ( + "fmt" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/metric/system/diskio" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" + "github.com/elastic/beats/v7/metricbeat/module/linux/iostat" + "github.com/elastic/beats/v7/metricbeat/module/system" "github.com/pkg/errors" ) @@ -36,9 +41,10 @@ func init() { // MetricSet for fetching system disk IO metrics. type MetricSet struct { mb.BaseMetricSet - statistics *DiskIOStat + statistics *diskio.IOStat includeDevices []string prevCounters diskCounter + IsAgent bool } // diskCounter stores previous disk counter values for calculating gauges in next collection @@ -57,17 +63,23 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return nil, err } + systemModule, ok := base.Module().(*system.Module) + if !ok { + return nil, fmt.Errorf("unexpected module type") + } + return &MetricSet{ BaseMetricSet: base, - statistics: NewDiskIOStat(), + statistics: diskio.NewDiskIOStat(), includeDevices: config.IncludeDevices, prevCounters: diskCounter{}, + IsAgent: systemModule.IsAgent, }, nil } // Fetch fetches disk IO metrics from the OS. func (m *MetricSet) Fetch(r mb.ReporterV2) error { - stats, err := IOCounters(m.includeDevices...) + stats, err := diskio.IOCounters(m.includeDevices...) if err != nil { return errors.Wrap(err, "disk io counters") } @@ -101,40 +113,13 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { diskReadBytes += counters.ReadBytes diskWriteBytes += counters.WriteBytes - var extraMetrics DiskIOMetric - err := m.statistics.CalIOStatistics(&extraMetrics, counters) - if err == nil { - event["iostat"] = common.MapStr{ - "read": common.MapStr{ - "request": common.MapStr{ - "merges_per_sec": extraMetrics.ReadRequestMergeCountPerSec, - "per_sec": extraMetrics.ReadRequestCountPerSec, - }, - "per_sec": common.MapStr{ - "bytes": extraMetrics.ReadBytesPerSec, - }, - "await": extraMetrics.AvgReadAwaitTime, - }, - "write": common.MapStr{ - "request": common.MapStr{ - "merges_per_sec": extraMetrics.WriteRequestMergeCountPerSec, - "per_sec": extraMetrics.WriteRequestCountPerSec, - }, - "per_sec": common.MapStr{ - "bytes": extraMetrics.WriteBytesPerSec, - }, - "await": extraMetrics.AvgWriteAwaitTime, - }, - "queue": common.MapStr{ - "avg_size": extraMetrics.AvgQueueSize, - }, - "request": common.MapStr{ - "avg_size": extraMetrics.AvgRequestSize, - }, - "await": extraMetrics.AvgAwaitTime, - "service_time": extraMetrics.AvgServiceTime, - "busy": extraMetrics.BusyPct, + //Add linux-only data if agent is off as not to make breaking changes. + if !m.IsAgent { + result, err := m.statistics.CalcIOStatistics(counters) + if err != nil { + return errors.Wrap(err, "error calculating iostat") } + event["iostat"] = iostat.AddLinuxIOStat(result) } if counters.SerialNumber != "" { diff --git a/metricbeat/module/system/diskio/diskio_test.go b/metricbeat/module/system/diskio/diskio_test.go index aabc44c374b..b5494ac4bfe 100644 --- a/metricbeat/module/system/diskio/diskio_test.go +++ b/metricbeat/module/system/diskio/diskio_test.go @@ -27,8 +27,48 @@ import ( "github.com/stretchr/testify/assert" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + "github.com/elastic/beats/v7/metricbeat/module/system" ) +func TestDataNameFilter(t *testing.T) { + oldFS := system.HostFS + newFS := "_meta/testdata" + system.HostFS = &newFS + defer func() { + system.HostFS = oldFS + }() + + conf := map[string]interface{}{ + "module": "system", + "metricsets": []string{"diskio"}, + "diskio.include_devices": []string{"sda", "sda1", "sda2"}, + } + + f := mbtest.NewReportingMetricSetV2Error(t, conf) + data, errs := mbtest.ReportingFetchV2Error(f) + assert.Empty(t, errs) + assert.Equal(t, 3, len(data)) +} + +func TestDataEmptyFilter(t *testing.T) { + oldFS := system.HostFS + newFS := "_meta/testdata" + system.HostFS = &newFS + defer func() { + system.HostFS = oldFS + }() + + conf := map[string]interface{}{ + "module": "system", + "metricsets": []string{"diskio"}, + } + + f := mbtest.NewReportingMetricSetV2Error(t, conf) + data, errs := mbtest.ReportingFetchV2Error(f) + assert.Empty(t, errs) + assert.Equal(t, 10, len(data)) +} + func TestFetch(t *testing.T) { f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) events, errs := mbtest.ReportingFetchV2Error(f) diff --git a/metricbeat/module/system/fields.go b/metricbeat/module/system/fields.go index 28135f5fa95..d78002d2847 100644 --- a/metricbeat/module/system/fields.go +++ b/metricbeat/module/system/fields.go @@ -32,5 +32,5 @@ func init() { // AssetSystem returns asset data. // This is the base64 encoded gzipped contents of module/system. func AssetSystem() string { - return "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" + return "eJzsff+PGzey5+/5KwgfFhm/m5E93mzevvnhAMfzcjeAEw9sB/uAw0GmuksS37DJDsmWrPz1BxbZ39nqbqmlkYMMFtlkRiI/9YXFqmKxeEOeYHdH9E4bSL4jxDDD4Y68+IS/ePEdITHoSLHUMCnuyP/6jhBC3B+JNtRkmiRgFIv0NeHsCci7x98IFTFJIJFqRzJNV3BNzJoaQhWQSHIOkYGYLJVMiFkDkSkoaphYeRSz7wjRa6nMPJJiyVZ3xKgMviNEAQeq4Y6s6HeELBnwWN8hoBsiaAIVMuyP2aX2s0pmqf9NgBT788V97QuJpDCUCU24jCj3o+X0zfznq/NW546kguKXodn3IKiguLHjVKBYfnoEZCkVoUQzseKA8xG5JJQkGTcMv1fhYP5TZ1r+0ySiSgiLa7/OSeFSrBp/2EON/bHQ31lUIksWoEpUtU/+D/IIKgJh6Ap0EFCmQc3SyARh6YhyiOdLLmnzA0upEmruSOrGHwf+8xryL9IVMtqSY1gCRKcgDGECgRGd0gg6aKtRYFj0pKdhrQVHE5kJcyQwry+XyNwnUAL4GComZHAvh0egEyyCy+OwFITL7U2qmFTM7EiqZARagx5Czdk4fShKFvML5DmiGgD8fIo8AJDcUmYukJeCWGDkSgoSM/30chgd57QR4/Cp3y+PyRrUhkXWNbMu3ZqKmNv/WFMVb603x4QBpbLU9K5H9fv5WD8Zai2X5luSi8V7GIXPLZsDkBug/PIkwwRhYiN5JgxVO2cCFjuMczZMmYxy/MZ2zTjgb9e71LJES9WabEt1jV/SrEHlW6BUs9YX3m4o43TBgUjBd3bz/E2wr4MYeU67eLkMKmK5NDsqlIvSrBVNWqpsxKyPi85smDeloFxslgsKRyepAu29L5SA1GbmPizFjbDrh7M/oBkmksrK0GTLOCdrugEboNKvLMkSsqE8w0Xz5fb167+Rf3PTfcGxW4OV89TGpVwBjXfE0CerH0z7UZkwktAoQrVztmXTHjSAxUL5U4em5INopwj0dWvYncxIRIUTWpXlRfJmpYAaUPYXwvGN/CwVga80STlcE7Ykf28N61TKfp0a8uPrv1lo11avnHL5tMcsSrNZzs0vTnsWQG7/2SmcP1cI++cKEr/d8OvPEu18Q17rX355gMK/vNtpvFsjzYUy0vqCoIkjG3fUh5gDKs7Dh39ZK9TllPxaekaD/BPrSV0kC8amqS+WkLEb/WUSctRuf5kkDd/yLxT/Afv+ZVIy+eb/TZF5qAdwmUR+q27ApXFziBdwnSdCNMQ5k8ucDQbXAdobHsPnVnbvWzmZvuQz3W/jFPQCDxMv+hDuuY9CDt8Rnxv5oZvcX2cPVZ5YPWXyuyYrxhw/2CEq5w/2P8nDh6KMbGANXv4z/ozC/jMozyfYbaVqHhz4/PEd0TG9HS9uJM9O2adsoBjlc7d5joA3EML32s+Ql7uRz2umSUJ3REhDFmCVY8Nit41Tzkumt8b0OfoeghTQeIYHHhMuHvSUKh6GncSqjJWQVRmdRVbDlxnnux58W8UMnBwgznIgQuTgYmeGn6jlrmDoSweAx2EQRh02+SDIeyayr+6IizWnIg0/UENkpPIj4WFPypnXNEGo1lliOYOfIpr9gX7oP27fDJLg8zPI4jAgpuFRPthANrVG7WcbqpXdd06o9gnjNiaIpIi13968WcEVO0iwzwbRrdleZ/HUAMMYY2n3wYdXH/oB2uhthtJW8HsG2swSUCvQ8xTUXEMUxB6KMHvAN4/qcZn7KTXBOfGUnDhK3IntFhSQ3zPIICZG4mKIYcN6YxtPllOR89KFc56asJq8ziqoEj3TuoW+QucBAjqvZKalBCXiCdiz20xAxk/lflv4vi3MTd89vKX1EkRtfDEtIXQDiq6gGtMspWpoWVAiRloP1AYsEI9Z/2eUilOxU4rFkXQ+uTQWzUSCyVc83azm1kc5DSno/Vwx4dj70orJoh5oAYZRgjb8xHTgHISDWJn1SYg45zKfVpFc+gLmnV7W8UrkZnCEWGWqulsvkaiHVx+mlcci07vpqHkMZ+7jTFkncbtm0bpOQvemeLWgIt6y2KxJZhhnf1A7LTKh/NTLGbl3H9fUZMp9REZRZgMXVzNXljxqEnGpUfT1KsacJSCMkunumGRSmbby1yHbY45PENF80PmCmUlTfwVaO7AVWRtuCeP5j4JKvB7nteUmNWwDufakUvIiZP/h9X/82JLyknGo3XwlB2UNy2Fatcvln6YoYS6IPlNOAROEeKpT4beRNuTPRKrYhnGwcQaeTeU73iwI3S3S+cgE56gkZrWk9o58eRXD5pX96+2XICI77wmg2DGaUOCr+SEMAhPu81SyjkzfwVhwYGtpcewWb8JoUFtPmDaw4xMhY9BWW+waxd+0M+cVSAqeVdv3a7VFN5+aaxV+KYBDmIZ8PxPXnIwrvNvPsUzDeRPHdsKR8J5/d2uA3lenUKiithvMUfuYVyk3UmUrq2xi+UkYXa0UrGhxFEY5dyancbml/OrRt3cOPQz5tW5+PBqylFkzMq4tnyOW9eeA2dMz8qvEgoR/MRHLbYf+uakDQd2+VRCWdJsRoFFeJRdILCPdyg4EpED2W+S9rOlD38IZiiaIZypaxMaaaAK0i+fZAOLK7QEYMs/nQ+jM4BUCTXmmkacv2yEQlzQ+xpzYkM+Okce0RxqAF7cvxhpl+ycmVvMljYxUdzbUG2eY31fgF+Emp9qQhInMQHgNv/jHJSH9h8faYXBe3F4U2tsA3DBuLEl8Lp0I6AKJWVGjMKzUsE3Oc4kirDBTUPRs2tWhVUfShB8KU3TaS8Qt6+y6hB3l7rkhWikL339sgnTF2cIQ3Ncc7v5+UucLP36zW+wgWGeMcl28Vlb6oUflZV7ERq4CyyVLYwkaC7GYiHgWFx+OpHBVH4td7k5GNFqDJlS0/a9FtlyC0uRKQxG7etbQyGSUzxpuyMWHZ4ME62g7zF9vI3mLo5UdAiHGOlLLuT4vfq+3HFwR5AweqSeows+KDj4YosAbQ+0y/cwqEYgIyALMFvxNeK/SWOVQzd14CQWbJNif5idJDCmIWOeW98MnlzdLpAISg6GM62uSohkk0RqipyJmrujwlw6VIM8fQ3l2h5f8g8FzEcqjjGNgv6BWLBVe1MvGnHXI+w38Akl54IEpgVepktGrBBImlvK6zQv7I1V1QvxaFRyGJ6VRKYwIW9ZHt8CthSoE2o697M8HQT58+i/CkFBKdJY0DWCuQ0zQCI8SchX6UMTt1/778Ht7YXspykIt/NeHqkWHeSNDTBzpNXNkYJTYPmtprdK+guEtbVq2bpuXKliyr3fkxf9Fsv5f072qp1as5uEopdtiPRWmDYu0OwIqzw8tjlo/1VybQ8nT/szHM8ftJTFDVem5zDo6PuPwPpdFLA9pR8GVmZmlrcvjAzDXMEW5E4ZDIYTUmtzM9CNg4nQAmOifXwGN6Rrrz46GgbwvBiT1AQcgwC1idM5vHwQckayrZ+zfmtXOhi3C4kifrmCOQd9h3mq+ZWP1SmGRR1rYdKUjKuZPFvaBipVzM3hbpYXa631EhXCRjJu6D2DMFEQHWoBjALp5ebNMp4oPg4GzAbOzFcmUVilFi3cGKD+jdMvsikOrIOKUJUMljWjPJ+putL1idx+Yw3LJIgYi2p3RHrm5c7SkxFCxRzPylnC5BVW1UUzELMJL3KXyWM9aG5WtVngx0shi3KYRa7LAifN5WODmPjsLgnZ8na0gpKxnd8AtEK/Jz+17D1t/4Y21PD6uEOQLMVIp+aX74r9UkkVMEMq5jFBEJTlTRKY9BBzl29RLSWt61VmxSyaKLaZRnTLTdLASKXAVys9LSI6CLDLjUi4BfRpJmc5UyrMTb659hMkNqEgmCRu9NGJY0oybUNHGYBqOWN/3bnpX6LqUahx4u3HNqvFmE3how2ghq4g+FMNW6O2w8qQRiIR4QfqY2YI1BFHFSlDOFzR6mmTqd3lgXWEN1ugnmcYr7TrlzP7LEjvLbmlahVe0AwCzlaqKaPwpnx+jcsznf1NtbFB7Hyf/OzajWDYqWc7X0wDMeuTBLx6oNsEPaXAgM3PWmsTmLW0NoqtpYSXd85wIFUTA+u/HuLRY9AST3k2oBkY49kCGnQ6JKpAMZAwTM1BKqtOwxQ3t2684REysBsjqXJg0iLgfEROzWElrrE+CiIlIJlgS72VXXpry0w7g2CkBysys5H6A1YN5pgnlW7prb5avbax1T9XWOvwiJj99uicLiGimwZ9eWddNQSqVKdM33a1sGvvRXGdJQgdUnxSbxQIMHbZf/eJ3JHeZx8W/Ky4XlBemHY/mmNkN3H9YOvu3oLjk4r+hFdH0COzh0eXMQYW7wploytk+v+uZLounnO63+/7p5pwZmHjO98zA/olZlEwqxXe/BCgtHFDXiuoor8uPUfG6/G+sy0Vjauh19YHC6+rLj41nE8m0XhfljDYtRkrNuqB7FvhqwlbuRmXxpGR7RmzIOMLRG1J143mGQzfuML1QmRBMrF6E61rTjscY+8lvf3MI9ekREx444+rwGdtfHTJjlMSciYllvMw4JzbypiK+scO7VJWRVurKuESCw33tS9BwWwjU9FC1yhIsFtKQUkX93hasxmcrIRXM6UJu4I68ef3DP8MWT4M6YCm57uGHraNoe6hY7e7IxMofWdTLQ4fODmIz3My6X86P1AAQG6aksJIjG6oYXXCf2wtqgXtQx5rQUOcqWmkWSH5WAD99ur92ZUvOyH74RP4rbDLqbxeR6XLm7x5/u9EpRGzJomqyPC37Ho5Nh3d2nyWjTr27z5IDrSBN1SLva0vbBOt6CKPTeiK0xZtEFqw7bdBMROC0x9uLLl43gV7eUX6jG6f31wtZIKVFsXuWxrhbPphKoKBZwjhVvjAqOO3f7CwFI6sTxEynnO7KSMHINDfZeTvOdufFMHM7Okl/UxyGTS39UB+5Gp5VXuJq3Tco6/0tF5khioquxCcWRr5ud6tosnhP62dyZrsQbgndBOx04pR4XW3wXvHu4ae1HqEuLyW6uO30jkFnMW3zF71yJmKHXDs1dFxQbV3+IMPrdNx54Nj9qG+/69uvnulwpNSAvE2xj7Gq7F5TXS3wddXNjcrzd3g0RN6tqVoBuTKBixTFyNS5K3k0RwVdgbKzEHfAhKXOmHD3IUyO5GXxIp/PurpLTEz3a6rS+tlOmC2TP4JmsV1an8CQT+wPmDWsRYDvMoqylLlj6YTaf7jPXH18+8vLXolEmVJ2Qu/0Eg3uDOy6UtL+a7UmvPPudZOPl7c7jWfeeMq3z6hBjuZ/eUlOp0K5/kjB91QObS9A5tNIfRi9ek3VcxljnDsOkZbp4Su2OLINR8oH3Kz6mXEoPiOVjyHyTJxz66yFQbG4DDXTFaTLQKN7d1fGenc+Dp16U5UpiKPcpka3mToPNI4/2FfiLGFmpuVydI3QUNWRS+NmySvJeqAXXndwyFo2oTJ2RAVZAInW1h2Pm5EANYSKHfptfaxY01YyZCpW2KFPxYrK2JYV+OTCAoii+Ts6SkrTkUAJLbyDl2R+EmQXEOLRZYtTNxO218VGguiPUf3kLnYlgM8ItEb03yp62Cgoz8BaTrj119xAes1SLJ1rDSikuLHs8CMjAzXUJkD+1SwamoWx+Z5Wvpb0ZF4HMJh4bXq4R8fUapLERj6OGk2o1jJimEbdMrN2bphlczj2fcCsATZxFN8bQvNRH+5dMs+3MM9Hx9GQ7vwSYXBUuthz2E9qdUNmfTom2dHza2Vej5r9Bv2vdbZwcfj32rVEch3YRrEMZzsH09o5TzKu9KubY1GalbwgOlpDnHHQGItTfI3AxTdUPxUVg34dBcd8676T22cpjJKce8u2lUXOv5hK6Wvy7udPaEA+fg4Pav+uDRWxA5O/hcF3ZEmZKofydiZV0toLJgXlgXJ85A42mPBRY552yG8r52IsrtZuga3WZkY+fq7ACI6rgHKfw2iA0mB05X32YIYm6LmS8j2sugCQyf5+f96xlZIV24CwPiqT+6puh1X5BQ0aGbBeSVMDH+7zfGVTe/YC6DAXB0Ho8ukJeTzEbHSOFjIne4mMlnrmBRYssCWjCxv3kIrzoCz8E30Ji5TMn4jA0lS5JQpWGafK7oqdQzmWfK9zO2Ek6rICLTMVgSZ6LTMeo18CRQXyCJ78nklDT8+Sz40UUSdj3EKmPHyhHCHlZpJW16jKRL4+pQC/NskV1SSGJXNuXzeXq8rR1XkjxD0M4k7Nu7cCazhXoHxWDBNrPm0J1uAVCwnxVA1e56C1Lra501hj66xynpRPFnvr2M3JNPNMce53XuT7hlilZ6t11Rvdy15lLni9Fuuym78d6xXTd2MXqjIzlQkMtS6BGXj8I8UKtEHvg4lMZtqvuc6BmWiEKPVFvKYb6OLaQDa5Rk0OxqnZVN6X8KYGy6w3lGs0OrUFYxdF3cR0Gze7tJEVwGm6/1JPm3SzVtIYDvHZmWB1RXdJdeHa03hs5AqJZPq6c9z8Os3WFT5Y254XbZo17DyDvq5phn088SG85V67VDF3VqtrEnL5AKYI7oVDzX+T4+LkW2hx0pI/H+A6+18xQQQVsvYkgl9phTx6HIyQnIbFTDTaky8eFDf5KCjv0h2o+ct//vKmi59n9qZ9BcN5vMbqW9cVRa+1XbMmoBo/9+j7qDXuStimobWgpQq+AI4lRImMu27phPH5WofzIbxyJQ0vx0BNQYUzLGR/YV3+UyuwO16zCipb1rMgWwoCNFrjRxsatmf7ZrpfxfYWL5Bx1tNfavZpYVc7/ZcBPZEBHW8oE0hmeILWeaJMhqzQvjPHEYRXW4T6w73FrjP9Vb7eNZrghH69HKLXUGQFqz0jp6bcnXddItVl6sVtMvWeh5bavJ7cxu3d2yeN1vDSl/a089V40FPx3DM9dH+w3FtSxrPT51PqZ70+cmnUKrljv6uGTF+SbavwvPxRgM23hhOst5dmG9aQ94LMi4pqhgK7UGIjLdc636+hzvGmXFsFsy7VrrTKc+xm3GZWjSl7HIljmXXxpijPJHmFazINhb0/TzK1AdLbSzJBzcWGAu0c8aoldTRWI43S06X6K76I+mRuy9Pl+y1NFvS6L52jjufMxRsTuWzwZ5+B6M4SHmI4ni7TdWnKbUrfxY49N1F6kaaiZiPsJvP53WPZL7v15tkYQi/VNFRtQpPigI3oSY4dZj2RTd+CnfDMavKpZTD6uHSwp1Fw6zKNRlOQ3YdV4/0Ll7B0HeXnVMhwK5/BDJhQV94KKXaJzHTpgbrOx1IQ3wGfA9XmRkEEwvDdDa62q/cff+tmEGfa1K5qJ+lSkyu9TiB5eT3WGNWYZ6P0MzPvZ8bhZkGjp7JsvWTO+4+/FeQeQBXy+sz0PNoNAieeWkZrBoqqaM0iyueOVfPLMo3VtHERieWwvfdUNOyo2Aln+7pPbidhl95eJrfKiGww3zqHrPPzML7lb3N8O5a0eE2kai5qK687wG2uyIM49Qxms5tTYYMa5NEB2pFgs8fLoviTf4PeUXvjIBL/f/g4bLcpntbmYJN/7Bd69iIZayNocbuiHp0axVYrUBDbT+xLgCH0kfrw31LNvwG6EWgP4eTFL/ZTL9x/arK2KiTKuys+GeDe6+E7vMNi5L7w1z13hM1U8HJNzKq3OwZqlJ53pl1OUHiGvVTtP7H6TFZe+WLuUl7e2esAOrp6xJ6aEJlVgrRjSdl3F3wQKefYFv3Rm10higqdUjx3KZrXv7wmQnbnfad1XJXWczvzxXDt10b3VbkktGBkkF/jSme2NL0YWj8Vxx4HSi8TsGGRwWffLoWoXyrp2IgKIY27q+Af9BhEaU7lgj+xkA0fUS7zE5dRtd/zX1UyU1fJHFAk46oJL0VjXRa52fYZbc0SlHLZPvfYqEywLGyBShXbxdc5OdlzWDOKTUyep+qyZMDDqw95R1wpsMzfcttVyFnyDycc67ChvFrva4+xEYzkLNq1G+/mN7QDjXeZ4XBHHr1/+WlgZ949TPFD1HrDVy5Ggy7a1gQfqD75Q9F9HQUbcixhI1ymW3grN04cYRMhqbyaUe/zMwgLi1sFSccDsYOOQqE5QHoKluQDj0Njpmy+XQHjxh2F5Q+ZLNj0EnLDjkISA52eJTE+xBhGQR7M95psQO1IJjh7Au5dHWbcrXQbllKFb8QwQbRM/F06yolmJvMmlRmS0J0PYsOkZeJJyG0zuDyeupKwyrWRtXu4EFtR81h87302oxhsrN1XNiTziNomWtGadzTa7Da+f/J3Nvp4RZOiD6Tb6rqWJDWt23lHzJs3d79xohiAgMMGwpvHwR1prSzcuHUAYQ7sRDS3sGVYTw9C8c4XItrBiRv8mjCH5ePbh3tClaI7d68yzkRMhQm/WRAz/ZQfn020jKrvWrmcrZtkz/yn3OBxhoqQ8C4D08aGzfswYQw9PUtw2LifJUvK+GRbWWV+N27//Li+9Jim+sd3eyYJxaY9im4RhbO34Zb/GF5MqzmVtAoOXlWateQxpuHJ7es3P9zY8CeHsA+eXZ8ncEg8Pu9ge4gulazwRpidtwdtYZ9ANWzXZI91VEOEvM+Lm02fYdPCCo/KNtUmtLJJSBrPj3qh4DNe/6YxqW1M++Y8erp8LxwxZbY4nkqdLW7GETnHBsnBOQP9cVsT4kmJoUmaT4hdlr0vhn3YZr5TUg4Fk+Nu76EizuOra+ej2v8ZTbK03aWt6HL/FaJ5JOOj+PTp4X+/+z/v74kdp2xN5hF+r12DxvZjIhWXMb/pH0TR2zLNr7ii21irW1dYcv3NxqI086V/wduVwzvYld3Y6/cNO2f2ByD7CyyHz18rimydoDcnxzK4GZ64HDVrpeoMC+uGC6b10lInjkFp3/zBpFzPOm8XDMr9nrvWwmUgO04WK6jCr7ydDlf+OFcPsu6n8AZDC07b94xl11uGh83qz58qc7b9C2mBHRP6fn736EfRpZPjzPtxeUX3EEpXYNb9oIpfOLOu73c9pBIEsaQJa/WKG4rAfu6YybmMKJ+xcFPO1q+Lx5Vu/+PN7PXszeyWSEXevH59e/f6/qd/3r396T/v7/75j7//eHd3O861fW9xkIdHQuNY+V6jrGjmRwV5eNz8YCd7eNz8WHxoCG2pVM0F0aniBX1v3hwC307Vg0lBIg1cAMM/IpCJOe6pOwvLPQHDeb6WOoyq553Zf//x5s3t7c3t7b/f/P3HmdjO/F9mkWy9Ut+D+fHzR6IgkioObvoql8mMPOArjHJhKHZp2zBKFGxA6fb2/PBIuJRPnQdmDTaA4fE85Zmey1FPdZXv7h5KPr7ltFxC5A9K0xuXQoslesJX8Pn9/cvcxfe8sEJzFaZSAElk+5oSpwvgtbffrnEAO9r/vMXQ88VSytmCqtlKcipWM6lWsxeWvy+qv2gdehfPSNkxYjCgEibyt4Ls8CSSCfiuw1QQSBYQxxCTSKa7IjFITavNEH5hbUx69+pVmi04i3S2XLKviGOwLs/xBdVDA5S2cv6nHc5/aJGT6dpLFTJBDfTqRvxFjR7E3c/m9e1x4x/c2wvAP0h0IIhAIuIwFFO/kfdz5X08Uht6Lw74eujzjzY2zrCc5hh+YPug0SoR/tb4iTvTSj1TLzPO5yNUoe4Ddx/Pf8K/k6Hv5o44nZdL16Y/959ZeSbvEwRHedDtlqQH93N/i3oshPOom0LozUnsDct9p9C+gDhc/WGBIQ+70VV7+2sDgSKBCbEUU6Dz0/nO8JRycQ8NHyqbno5O3QyZ4FGRX+oXw6uhZJ7wuS7bbZepmaIZqa/DxfJUl1BL3fOBf8CMvJNKgU6x8ZqReb8pDXiu/cpazFd6p18JMK9YuvnhlYnSeQLJjHzoaPvfXeYXbv57dCf2fumSgQkgqdI13V/n3S3pgWgRsVvrXkh+Woityuei7ebvXgq6bMjUBOT2pJ/vw+zKCfBZaPvsTBMeaOsRML1uHXadAGB5DlaZdhQ3Iy41zLe0s3XISdA2EFobMS+RzIMHQnXchiWXAbsAMgS13om5Dj99dVbQOY6hmBVEzceOnwWzxTEE85IJlEkzFXR20AWQMaib+Z9nQ/1mCGpOtZnTKHQCc1bQOY4hmK2tOcsO0m/ymFiFEBdBWjyp+/rb/Z/EfbWEPKP7msWX6L7uly4Z6L6e2/nrQr3nX4rVkTYesRidJfjihvhS72bgrzOIVa4q7lM+l3DkUZtvzD5LwtUMgaOBfPnkX238mYk0M/P8QwnjnIXLBwYUdH74lNOKLzuUQ7XLpTINSvfy/oBiqfdytYL4pngzH7RmUjQTyPt43JFOO7jMtbyE5cEEZ9XQejzqiHnfiurRCJcrZi1Xc4o9972OpPn+p0z7Skb3ytoADgQOYY9EYb+ez1zVhg4BhGpFjpFBoXxDS1PqxxNBJAspObTyA71I7NcIEzGLnGWi+cnQXo4cU+IWlkje+bVR+LYHQySn1oqKNJyBjgOzlGXvNG5tVgfXVK8B3/Ukj8NsgpPRfOSRa+8W+rZ2LOjPpMuWqQ1A5b/8/wAAAP//AKSNsw==" } diff --git a/metricbeat/module/system/filesystem/_meta/data.json b/metricbeat/module/system/filesystem/_meta/data.json index 2cb9f0897ac..4f13fff0465 100644 --- a/metricbeat/module/system/filesystem/_meta/data.json +++ b/metricbeat/module/system/filesystem/_meta/data.json @@ -1,33 +1,30 @@ { "@timestamp": "2017-10-12T08:05:34.853Z", - "agent": { - "hostname": "host.example.com", - "name": "host.example.com" - }, "event": { "dataset": "system.filesystem", "duration": 115000, "module": "system" }, "metricset": { - "name": "filesystem" + "name": "filesystem", + "period": 10000 }, "service": { "type": "system" }, "system": { "filesystem": { - "available": 53067177984, - "device_name": "/dev/dm-5", - "files": 0, - "free": 54342492160, - "free_files": 0, - "mount_point": "/var/lib/lxd/storage-pools/default", - "total": 86301999104, - "type": "btrfs", + "available": 148708327424, + "device_name": "/dev/mapper/fedora-root", + "files": 105089024, + "free": 148708327424, + "free_files": 103974920, + "mount_point": "/", + "total": 215211835392, + "type": "xfs", "used": { - "bytes": 31959506944, - "pct": 0.3759 + "bytes": 66503507968, + "pct": 0.309 } } } diff --git a/metricbeat/module/system/filesystem/helper.go b/metricbeat/module/system/filesystem/helper.go index d64ef95f562..4d53ddf2a79 100644 --- a/metricbeat/module/system/filesystem/helper.go +++ b/metricbeat/module/system/filesystem/helper.go @@ -145,20 +145,23 @@ func AddFileSystemUsedPercentage(f *FSStat) { // GetFilesystemEvent turns a stat struct into a MapStr func GetFilesystemEvent(fsStat *FSStat) common.MapStr { - return common.MapStr{ + evt := common.MapStr{ "type": fsStat.SysTypeName, "device_name": fsStat.DevName, "mount_point": fsStat.Mount, "total": fsStat.Total, - "free": fsStat.Free, "available": fsStat.Avail, "files": fsStat.Files, - "free_files": fsStat.FreeFiles, "used": common.MapStr{ "pct": fsStat.UsedPercent, "bytes": fsStat.Used, }, } + if runtime.GOOS != "windows" { + evt.Put("free", fsStat.Free) + evt.Put("free_files", fsStat.FreeFiles) + } + return evt } // Predicate is a function predicate for use with filesystems. It returns true diff --git a/metricbeat/module/system/fsstat/_meta/fields.yml b/metricbeat/module/system/fsstat/_meta/fields.yml index d9d2b0e7ce1..d9bd3acd7f3 100644 --- a/metricbeat/module/system/fsstat/_meta/fields.yml +++ b/metricbeat/module/system/fsstat/_meta/fields.yml @@ -10,7 +10,7 @@ description: Number of file systems found. - name: total_files type: long - description: Total number of files. + description: Total number of files. Not on Windows. - name: total_size format: bytes type: group diff --git a/metricbeat/module/system/fsstat/fsstat.go b/metricbeat/module/system/fsstat/fsstat.go index a8a1eaa0c94..0f43cf4af55 100644 --- a/metricbeat/module/system/fsstat/fsstat.go +++ b/metricbeat/module/system/fsstat/fsstat.go @@ -20,6 +20,7 @@ package fsstat import ( + "runtime" "strings" "github.com/elastic/beats/v7/libbeat/common" @@ -91,16 +92,23 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { totalSizeUsed += stat.Used } - r.Event(mb.Event{ - MetricSetFields: common.MapStr{ - "total_size": common.MapStr{ - "free": totalSizeFree, - "used": totalSizeUsed, - "total": totalSize, - }, - "count": len(fss), - "total_files": totalFiles, + event := common.MapStr{ + "total_size": common.MapStr{ + "free": totalSizeFree, + "used": totalSizeUsed, + "total": totalSize, }, + "count": len(fss), + "total_files": totalFiles, + } + + //We don't get the `Files` field on Windows + if runtime.GOOS == "windows" { + event["total_files"] = totalFiles + } + + r.Event(mb.Event{ + MetricSetFields: event, }) return nil diff --git a/metricbeat/module/system/memory/_meta/data.json b/metricbeat/module/system/memory/_meta/data.json index 01231bede4c..06abee40a35 100644 --- a/metricbeat/module/system/memory/_meta/data.json +++ b/metricbeat/module/system/memory/_meta/data.json @@ -15,13 +15,13 @@ "system": { "memory": { "actual": { - "free": 14247317504, + "free": 8461623296, "used": { - "bytes": 1407057920, - "pct": 0.0899 + "bytes": 7159164928, + "pct": 0.4583 } }, - "free": 4859097088, + "free": 1299234816, "hugepages": { "default_size": 2097152, "free": 0, @@ -41,49 +41,49 @@ }, "page_stats": { "direct_efficiency": { - "pct": 0.9976 + "pct": 0.9242 }, "kswapd_efficiency": { - "pct": 0.6213 + "pct": 0.7518 }, "pgfree": { - "pages": 4382105954 + "pages": 15924304810 }, "pgscan_direct": { - "pages": 485820 + "pages": 1185751 }, "pgscan_kswapd": { - "pages": 77390925 + "pages": 50008148 }, "pgsteal_direct": { - "pages": 484631 + "pages": 1095884 }, "pgsteal_kswapd": { - "pages": 48081976 + "pages": 37594071 } }, "swap": { - "free": 7846490112, + "free": 7823421440, "in": { - "pages": 1111 + "pages": 2702 }, "out": { - "pages": 20255 + "pages": 23582 }, "readahead": { - "cached": 28, - "pages": 65 + "cached": 554, + "pages": 986 }, "total": 7897870336, "used": { - "bytes": 51380224, - "pct": 0.0065 + "bytes": 74448896, + "pct": 0.0094 } }, - "total": 15654375424, + "total": 15620788224, "used": { - "bytes": 10795278336, - "pct": 0.6896 + "bytes": 14321553408, + "pct": 0.9168 } } } diff --git a/metricbeat/module/system/memory/memory.go b/metricbeat/module/system/memory/memory.go index 90283f801be..27e76b85489 100644 --- a/metricbeat/module/system/memory/memory.go +++ b/metricbeat/module/system/memory/memory.go @@ -20,12 +20,16 @@ package memory import ( + "fmt" + + "github.com/pkg/errors" + "github.com/elastic/beats/v7/libbeat/common" mem "github.com/elastic/beats/v7/libbeat/metric/system/memory" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/mb/parse" - - "github.com/pkg/errors" + linux "github.com/elastic/beats/v7/metricbeat/module/linux/memory" + "github.com/elastic/beats/v7/metricbeat/module/system" ) func init() { @@ -38,11 +42,18 @@ func init() { // MetricSet for fetching system memory metrics. type MetricSet struct { mb.BaseMetricSet + IsFleet bool } // New is a mb.MetricSetFactory that returns a memory.MetricSet. func New(base mb.BaseMetricSet) (mb.MetricSet, error) { - return &MetricSet{base}, nil + + systemModule, ok := base.Module().(*system.Module) + if !ok { + return nil, fmt.Errorf("unexpected module type") + } + + return &MetricSet{BaseMetricSet: base, IsFleet: systemModule.IsAgent}, nil } // Fetch fetches memory metrics from the OS. @@ -103,70 +114,18 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { "pages": vmstat.SwapRa, "cached": vmstat.SwapRaHit, } - pageStats := common.MapStr{ - "pgscan_kswapd": common.MapStr{ - "pages": vmstat.PgscanKswapd, - }, - "pgscan_direct": common.MapStr{ - "pages": vmstat.PgscanDirect, - }, - "pgfree": common.MapStr{ - "pages": vmstat.Pgfree, - }, - "pgsteal_kswapd": common.MapStr{ - "pages": vmstat.PgstealKswapd, - }, - "pgsteal_direct": common.MapStr{ - "pages": vmstat.PgstealDirect, - }, - } - // This is similar to the vmeff stat gathered by sar - // these ratios calculate thhe efficiency of page reclaim - if vmstat.PgscanDirect != 0 { - pageStats["direct_efficiency"] = common.MapStr{ - "pct": common.Round(float64(vmstat.PgstealDirect)/float64(vmstat.PgscanDirect), common.DefaultDecimalPlacesCount), - } - } + } - if vmstat.PgscanKswapd != 0 { - pageStats["kswapd_efficiency"] = common.MapStr{ - "pct": common.Round(float64(vmstat.PgstealKswapd)/float64(vmstat.PgscanKswapd), common.DefaultDecimalPlacesCount), - } + // for backwards compatibility, only report if we're not in fleet mode + if !m.IsFleet { + err := linux.FetchLinuxMemStats(memory) + if err != nil { + return errors.Wrap(err, "error getting page stats") } - - memory["page_stats"] = pageStats } memory["swap"] = swap - hugePagesStat, err := mem.GetHugeTLBPages() - if err != nil { - return errors.Wrap(err, "hugepages") - } - if hugePagesStat != nil { - mem.AddHugeTLBPagesPercentage(hugePagesStat) - thp := common.MapStr{ - "total": hugePagesStat.Total, - "used": common.MapStr{ - "bytes": hugePagesStat.TotalAllocatedSize, - "pct": hugePagesStat.UsedPercent, - }, - "free": hugePagesStat.Free, - "reserved": hugePagesStat.Reserved, - "surplus": hugePagesStat.Surplus, - "default_size": hugePagesStat.DefaultSize, - } - if vmstat != nil { - thp["swap"] = common.MapStr{ - "out": common.MapStr{ - "pages": vmstat.ThpSwpout, - "fallback": vmstat.ThpSwpoutFallback, - }, - } - } - memory["hugepages"] = thp - } - r.Event(mb.Event{ MetricSetFields: memory, }) diff --git a/metricbeat/module/system/process/_meta/data.json b/metricbeat/module/system/process/_meta/data.json index 78ece4aa114..84b74110683 100644 --- a/metricbeat/module/system/process/_meta/data.json +++ b/metricbeat/module/system/process/_meta/data.json @@ -1,29 +1,26 @@ { "@timestamp": "2017-10-12T08:05:34.853Z", - "agent": { - "hostname": "host.example.com", - "name": "host.example.com" - }, "event": { "dataset": "system.process", "duration": 115000, "module": "system" }, "metricset": { - "name": "process" + "name": "process", + "period": 10000 }, "process": { "args": [ - "/usr/bin/dockerd", - "-H", - "unix://" + "/usr/lib/systemd/systemd", + "--switched-root", + "--system", + "--deserialize", + "28" ], - "executable": "/usr/bin/dockerd-ce", - "name": "dockerd", - "pgid": 2080, - "pid": 2080, - "ppid": 1, - "working_directory": "/" + "name": "systemd", + "pgid": 1, + "pid": 1, + "ppid": 0 }, "service": { "type": "system" @@ -32,11 +29,11 @@ "process": { "cgroup": { "blkio": { - "id": "docker.service", - "path": "/system.slice/docker.service", + "id": "init.scope", + "path": "/init.scope", "total": { - "bytes": 844576104448, - "ios": 54869430 + "bytes": 7453696, + "ios": 548 } }, "cpu": { @@ -49,8 +46,8 @@ }, "shares": 1024 }, - "id": "docker.service", - "path": "/system.slice/docker.service", + "id": "init.scope", + "path": "/init.scope", "rt": { "period": { "us": 0 @@ -68,38 +65,38 @@ } }, "cpuacct": { - "id": "docker.service", - "path": "/system.slice/docker.service", + "id": "init.scope", + "path": "/init.scope", "percpu": { - "1": 7058282754012, - "2": 7053634662537, - "3": 7069386293853, - "4": 7050055153087 + "1": 3930656993407, + "2": 4025787490535, + "3": 4064460082910, + "4": 3387847262532 }, "stats": { "system": { - "ns": 7202920000000 + "ns": 4996000000000 }, "user": { - "ns": 19573240000000 + "ns": 10329380000000 } }, "total": { - "ns": 28231358863489 + "ns": 15408751829384 } }, - "id": "docker.service", + "id": "init.scope", "memory": { - "id": "docker.service", + "id": "init.scope", "kmem": { "failures": 0, "limit": { "bytes": 9223372036854771712 }, "usage": { - "bytes": 21139456, + "bytes": 9404416, "max": { - "bytes": 480030720 + "bytes": 14987264 } } }, @@ -121,95 +118,88 @@ "bytes": 9223372036854771712 }, "usage": { - "bytes": 3337703424, + "bytes": 29437952, "max": { - "bytes": 5245300736 + "bytes": 70705152 } } }, "memsw": { "failures": 0, "limit": { - "bytes": 0 + "bytes": 9223372036854771712 }, "usage": { - "bytes": 0, + "bytes": 30392320, "max": { - "bytes": 0 + "bytes": 70705152 } } }, - "path": "/system.slice/docker.service", + "path": "/init.scope", "stats": { "active_anon": { - "bytes": 779677696 + "bytes": 3444736 }, "active_file": { - "bytes": 1753378816 + "bytes": 10563584 }, "cache": { - "bytes": 2127810560 + "bytes": 10752000 }, "hierarchical_memory_limit": { "bytes": 9223372036854771712 }, "hierarchical_memsw_limit": { - "bytes": 0 + "bytes": 9223372036854771712 }, "inactive_anon": { - "bytes": 409075712 + "bytes": 6197248 }, "inactive_file": { - "bytes": 374431744 + "bytes": 327680 }, - "major_page_faults": 53164, + "major_page_faults": 198, "mapped_file": { - "bytes": 7491584 + "bytes": 9867264 }, - "page_faults": 21923702, - "pages_in": 57261049, - "pages_out": 56521859, + "page_faults": 3626304, + "pages_in": 1095732, + "pages_out": 1090806, "rss": { - "bytes": 1188753408 + "bytes": 9592832 }, "rss_huge": { - "bytes": 56623104 + "bytes": 0 }, "swap": { - "bytes": 0 + "bytes": 675840 }, "unevictable": { "bytes": 0 } } }, - "path": "/system.slice/docker.service" + "path": "/init.scope" }, - "cmdline": "/usr/bin/dockerd -H unix://", + "cmdline": "/usr/lib/systemd/systemd --switched-root --system --deserialize 28", "cpu": { - "start_time": "2019-01-08T17:06:39.000Z", + "start_time": "2020-08-27T01:05:16.000Z", "total": { "norm": { - "pct": 0.0049 + "pct": 0.0056 }, - "pct": 0.0195, - "value": 27827810 + "pct": 0.0222, + "value": 15389060 } }, - "fd": { - "limit": { - "hard": 1048576, - "soft": 1048576 - }, - "open": 68 - }, "memory": { "rss": { - "bytes": 1187336192, - "pct": 0.0716 + "bytes": 12853248, + "pct": 0.0008 }, - "share": 8253440, - "size": 4438523904 + "share": 7118848, + "size": 176881664 }, "state": "sleeping" } @@ -217,4 +207,4 @@ "user": { "name": "root" } -} +} \ No newline at end of file diff --git a/metricbeat/module/system/process/_meta/fields.yml b/metricbeat/module/system/process/_meta/fields.yml index 51ab8b81e09..fe941031551 100644 --- a/metricbeat/module/system/process/_meta/fields.yml +++ b/metricbeat/module/system/process/_meta/fields.yml @@ -96,17 +96,27 @@ type: long format: bytes description: > - The Resident Set Size. The amount of memory the process occupied in main memory (RAM). On Windows this represents the current working set size, in bytes. + The Resident Set Size. The amount of memory the process occupied in main memory (RAM). On Windows this represents the current working set size, in bytes. Not available on Windows. - name: rss.pct type: scaled_float format: percent description: > - The percentage of memory the process occupied in main memory (RAM). + The percentage of memory the process occupied in main memory (RAM). Not available on Windows. + - name: wss.bytes + type: long + format: bytes + description: > + The Working Set Size. The amount of memory the process occupied in main memory (RAM). Windows only. + - name: wss.pct + type: scaled_float + format: percent + description: > + The percentage of memory the process occupied in main memory (RAM). Windows only. - name: share type: long format: bytes description: > - The shared memory the process uses. + The shared memory the process uses. Not available on Windows. - name: fd type: group description: > diff --git a/metricbeat/module/system/process/process.go b/metricbeat/module/system/process/process.go index 9c754177372..804c62d06d6 100644 --- a/metricbeat/module/system/process/process.go +++ b/metricbeat/module/system/process/process.go @@ -46,9 +46,10 @@ func init() { // MetricSet that fetches process metrics. type MetricSet struct { mb.BaseMetricSet - stats *process.Stats - cgroup *cgroup.Reader - perCPU bool + stats *process.Stats + cgroup *cgroup.Reader + perCPU bool + IsAgent bool } // New creates and returns a new MetricSet. @@ -58,6 +59,11 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { return nil, err } + systemModule, ok := base.Module().(*system.Module) + if !ok { + return nil, fmt.Errorf("unexpected module type") + } + m := &MetricSet{ BaseMetricSet: base, stats: &process.Stats{ @@ -67,7 +73,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { CacheCmdLine: config.CacheCmdLine, IncludeTop: config.IncludeTop, }, - perCPU: config.IncludePerCPU, + perCPU: config.IncludePerCPU, + IsAgent: systemModule.IsAgent, } err := m.stats.Init() if err != nil { @@ -75,11 +82,6 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { } if runtime.GOOS == "linux" { - systemModule, ok := base.Module().(*system.Module) - if !ok { - return nil, fmt.Errorf("unexpected module type") - } - if config.Cgroups == nil || *config.Cgroups { debugf("process cgroup data collection is enabled, using hostfs='%v'", systemModule.HostFS) m.cgroup, err = cgroup.NewReader(systemModule.HostFS, true) @@ -148,6 +150,22 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { rootFields.Put("process.args", args) } + // This is a temporary fix until we make these changes global across libbeat + // This logic should happen in libbeat getProcessEvent() + + // There's some more Windows memory quirks we need to deal with. + // "rss" is a linux concept, but "wss" is a direct match on Windows. + // "share" is also unavailable on Windows. + + if m.IsAgent { + if runtime.GOOS == "windows" { + proc.Delete("memory.share") + if setSize := getAndRemove(proc, "memory.rss"); setSize != nil { + proc.Put("memory.wss", setSize) + } + } + } + e := mb.Event{ RootFields: rootFields, MetricSetFields: proc, diff --git a/metricbeat/module/system/process_summary/_meta/data.json b/metricbeat/module/system/process_summary/_meta/data.json index 363e5f77a0d..159defcb769 100644 --- a/metricbeat/module/system/process_summary/_meta/data.json +++ b/metricbeat/module/system/process_summary/_meta/data.json @@ -1,16 +1,13 @@ { "@timestamp": "2017-10-12T08:05:34.853Z", - "agent": { - "hostname": "host.example.com", - "name": "host.example.com" - }, "event": { "dataset": "system.process.summary", "duration": 115000, "module": "system" }, "metricset": { - "name": "process_summary" + "name": "process_summary", + "period": 10000 }, "service": { "type": "system" @@ -19,13 +16,13 @@ "process": { "summary": { "dead": 0, - "idle": 112, - "running": 0, - "sleeping": 288, + "idle": 63, + "running": 3, + "sleeping": 117, "stopped": 0, - "total": 401, - "unknown": 0, - "zombie": 1 + "total": 185, + "unknown": 2, + "zombie": 0 } } } diff --git a/metricbeat/module/system/process_summary/process_summary.go b/metricbeat/module/system/process_summary/process_summary.go index 071a7b2a660..5edb31f9182 100644 --- a/metricbeat/module/system/process_summary/process_summary.go +++ b/metricbeat/module/system/process_summary/process_summary.go @@ -20,6 +20,8 @@ package process_summary import ( + "runtime" + "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/common" @@ -79,7 +81,7 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { state := sigar.ProcState{} err = state.Get(pid) if err != nil { - summary.unknown += 1 + summary.unknown++ continue } @@ -104,15 +106,25 @@ func (m *MetricSet) Fetch(r mb.ReporterV2) error { } } - event := common.MapStr{ - "total": len(pids), - "sleeping": summary.sleeping, - "running": summary.running, - "idle": summary.idle, - "stopped": summary.stopped, - "zombie": summary.zombie, - "unknown": summary.unknown, - "dead": summary.dead, + event := common.MapStr{} + if runtime.GOOS == "windows" { + event = common.MapStr{ + "total": len(pids), + "sleeping": summary.sleeping, + "running": summary.running, + "unknown": summary.unknown, + } + } else { + event = common.MapStr{ + "total": len(pids), + "sleeping": summary.sleeping, + "running": summary.running, + "idle": summary.idle, + "stopped": summary.stopped, + "zombie": summary.zombie, + "unknown": summary.unknown, + "dead": summary.dead, + } } r.Event(mb.Event{ diff --git a/metricbeat/module/system/process_summary/process_summary_test.go b/metricbeat/module/system/process_summary/process_summary_test.go index 55afce8f190..c95e361224c 100644 --- a/metricbeat/module/system/process_summary/process_summary_test.go +++ b/metricbeat/module/system/process_summary/process_summary_test.go @@ -20,6 +20,7 @@ package process_summary import ( + "runtime" "testing" "github.com/stretchr/testify/assert" @@ -53,18 +54,26 @@ func TestFetch(t *testing.T) { event, ok := summary.(common.MapStr) require.True(t, ok) - assert.Contains(t, event, "total") - assert.Contains(t, event, "sleeping") - assert.Contains(t, event, "running") - assert.Contains(t, event, "idle") - assert.Contains(t, event, "stopped") - assert.Contains(t, event, "zombie") - assert.Contains(t, event, "unknown") + if runtime.GOOS == "windows" { + assert.Contains(t, event, "total") + assert.Contains(t, event, "sleeping") + assert.Contains(t, event, "running") + assert.Contains(t, event, "unknown") + total := event["sleeping"].(int) + event["running"].(int) + event["unknown"].(int) + assert.Equal(t, event["total"].(int), total) + } else { + assert.Contains(t, event, "total") + assert.Contains(t, event, "sleeping") + assert.Contains(t, event, "running") + assert.Contains(t, event, "idle") + assert.Contains(t, event, "stopped") + assert.Contains(t, event, "zombie") + assert.Contains(t, event, "unknown") + total := event["sleeping"].(int) + event["running"].(int) + event["idle"].(int) + + event["stopped"].(int) + event["zombie"].(int) + event["unknown"].(int) - total := event["sleeping"].(int) + event["running"].(int) + event["idle"].(int) + - event["stopped"].(int) + event["zombie"].(int) + event["unknown"].(int) - - assert.Equal(t, event["total"].(int), total) + assert.Equal(t, event["total"].(int), total) + } } func getConfig() map[string]interface{} { diff --git a/metricbeat/module/system/system.go b/metricbeat/module/system/system.go index edb9f55bf6b..f1f060a90bc 100644 --- a/metricbeat/module/system/system.go +++ b/metricbeat/module/system/system.go @@ -21,10 +21,12 @@ import ( "flag" "sync" + "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/metricbeat/mb" ) var ( + // HostFS is an alternate mountpoint for the filesytem root, for when metricbeat is running inside a container. HostFS = flag.String("system.hostfs", "", "mountpoint of the host's filesystem for use in monitoring a host from within a container") ) @@ -37,16 +39,48 @@ func init() { } } +// Module represents the system module type Module struct { mb.BaseModule - HostFS string // Mountpoint of the host's filesystem for use in monitoring inside a container. + HostFS string // Mountpoint of the host's filesystem for use in monitoring inside a container. + IsAgent bool // Looks to see if metricbeat is running under agent. Useful if we have breaking changes in one but not the other. } +// NewModule instatiates the system module func NewModule(base mb.BaseModule) (mb.Module, error) { // This only needs to be configured once for all system modules. once.Do(func() { initModule() }) - return &Module{BaseModule: base, HostFS: *HostFS}, nil + return &Module{BaseModule: base, HostFS: *HostFS, IsAgent: checkMgmtFlags()}, nil +} + +// checkMgmtFlags checks to see if metricbeat is running under Agent +// The management setting is stored in the main Beat runtime object, but we can't see that from a module +// So instead we check the CLI flags, since Agent starts metricbeat with "-E", "management.mode=x-pack-fleet", "-E", "management.enabled=true" +func checkMgmtFlags() bool { + type management struct { + Mode string `config:"management.mode"` + Enabled bool `config:"management.enabled"` + } + var managementSettings management + + cfgFlag := flag.Lookup("E") + if cfgFlag == nil { + return false + } + + CfgObject, _ := cfgFlag.Value.(*common.SettingsFlag) + cliCfg := CfgObject.Config() + + err := cliCfg.Unpack(&managementSettings) + if err != nil { + return false + } + + if managementSettings.Enabled == true && managementSettings.Mode == "x-pack-fleet" { + return true + } + return false } diff --git a/metricbeat/module/system/test_system.py b/metricbeat/module/system/test_system.py index f689b99fb4c..0cfb820c18a 100644 --- a/metricbeat/module/system/test_system.py +++ b/metricbeat/module/system/test_system.py @@ -7,13 +7,23 @@ import unittest -SYSTEM_CPU_FIELDS = ["cores", "idle.pct", "iowait.pct", "irq.pct", "nice.pct", - "softirq.pct", "steal.pct", "system.pct", "user.pct", "total.pct"] +SYSTEM_CPU_FIELDS_LINUX = ["cores", "idle.pct", "iowait.pct", "irq.pct", "nice.pct", + "softirq.pct", "steal.pct", "system.pct", "user.pct", "total.pct"] -SYSTEM_CPU_FIELDS_ALL = ["cores", "idle.pct", "idle.ticks", "iowait.pct", "iowait.ticks", "irq.pct", "irq.ticks", "nice.pct", "nice.ticks", - "softirq.pct", "softirq.ticks", "steal.pct", "steal.ticks", "system.pct", "system.ticks", "user.pct", "user.ticks", - "idle.norm.pct", "iowait.norm.pct", "irq.norm.pct", "nice.norm.pct", "softirq.norm.pct", - "steal.norm.pct", "system.norm.pct", "user.norm.pct", "total.norm.pct", "total.value"] +SYSTEM_CPU_FIELDS_WINDOWS = ["cores", "idle.pct", "system.pct", "user.pct", "total.pct"] + +SYSTEM_CPU_FIELDS_DARWIN = ["cores", "idle.pct", "system.pct", "user.pct", "total.pct", "nice.pct"] + +SYSTEM_CPU_FIELDS_LINUX_ALL = ["cores", "idle.pct", "idle.ticks", "iowait.pct", "iowait.ticks", "irq.pct", "irq.ticks", "nice.pct", "nice.ticks", + "softirq.pct", "softirq.ticks", "steal.pct", "steal.ticks", "system.pct", "system.ticks", "user.pct", "user.ticks", + "idle.norm.pct", "iowait.norm.pct", "irq.norm.pct", "nice.norm.pct", "softirq.norm.pct", + "steal.norm.pct", "system.norm.pct", "user.norm.pct", "total.norm.pct", "total.value"] + +SYSTEM_CPU_FIELDS_WINDOWS_ALL = ["cores", "idle.pct", "idle.ticks", "system.pct", "system.ticks", "user.pct", "user.ticks", + "idle.norm.pct", "system.norm.pct", "user.norm.pct", "total.norm.pct", "total.value"] + +SYSTEM_CPU_FIELDS_DARWIN_ALL = ["cores", "idle.pct", "idle.ticks", "nice.pct", "nice.ticks", "system.pct", "system.ticks", "user.pct", "user.ticks", + "idle.norm.pct", "nice.norm.pct", "system.norm.pct", "user.norm.pct", "total.norm.pct", "total.value"] SYSTEM_LOAD_FIELDS = ["cores", "1", "5", "15", "norm.1", "norm.5", "norm.15"] @@ -37,6 +47,10 @@ "free_files", "mount_point", "total", "used.bytes", "used.pct"] +SYSTEM_FILESYSTEM_FIELDS_WINDOWS = ["available", "device_name", "type", "files", + "mount_point", "total", "used.bytes", + "used.pct"] + SYSTEM_FSSTAT_FIELDS = ["count", "total_files", "total_size"] SYSTEM_MEMORY_FIELDS = ["swap", "actual.free", "free", "total", "used.bytes", "used.pct", "actual.used.bytes", @@ -82,7 +96,12 @@ def test_cpu(self): if "system" in evt: cpu = evt["system"]["cpu"] - self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS), cpu.keys()) + if sys.platform.startswith("linux"): + self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS_LINUX), cpu.keys()) + elif sys.platform.startswith("darwin"): + self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS_DARWIN), cpu.keys()) + elif sys.platform.startswith("win"): + self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS_WINDOWS), cpu.keys()) else: host_cpu = evt["host"]["cpu"] self.assertCountEqual(self.de_dot(SYSTEM_CPU_HOST_FIELDS), host_cpu.keys()) @@ -111,7 +130,12 @@ def test_cpu_ticks_option(self): for evt in output: self.assert_fields_are_documented(evt) cpuStats = evt["system"]["cpu"] - self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS_ALL), cpuStats.keys()) + if sys.platform.startswith("linux"): + self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS_LINUX_ALL), cpuStats.keys()) + elif sys.platform.startswith("win"): + self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS_WINDOWS_ALL), cpuStats.keys()) + elif sys.platform.startswith("darwin"): + self.assertCountEqual(self.de_dot(SYSTEM_CPU_FIELDS_DARWIN_ALL), cpuStats.keys()) @unittest.skipUnless(re.match("(?i)win|linux|darwin|freebsd|openbsd", sys.platform), "os") def test_core(self): @@ -261,7 +285,10 @@ def test_filesystem(self): for evt in output: self.assert_fields_are_documented(evt) filesystem = evt["system"]["filesystem"] - self.assertCountEqual(self.de_dot(SYSTEM_FILESYSTEM_FIELDS), filesystem.keys()) + if sys.platform.startswith("win"): + self.assertCountEqual(self.de_dot(SYSTEM_FILESYSTEM_FIELDS_WINDOWS), filesystem.keys()) + else: + self.assertCountEqual(self.de_dot(SYSTEM_FILESYSTEM_FIELDS), filesystem.keys()) @unittest.skipUnless(re.match("(?i)win|linux|darwin|freebsd|openbsd", sys.platform), "os") def test_fsstat(self): @@ -378,13 +405,17 @@ def test_process_summary(self): assert isinstance(summary["total"], int) assert isinstance(summary["sleeping"], int) assert isinstance(summary["running"], int) - assert isinstance(summary["idle"], int) - assert isinstance(summary["stopped"], int) - assert isinstance(summary["zombie"], int) assert isinstance(summary["unknown"], int) - assert summary["total"] == summary["sleeping"] + summary["running"] + \ - summary["idle"] + summary["stopped"] + summary["zombie"] + summary["unknown"] + if not sys.platform.startswith("win"): + assert isinstance(summary["idle"], int) + assert isinstance(summary["stopped"], int) + assert isinstance(summary["zombie"], int) + assert summary["total"] == summary["sleeping"] + summary["running"] + \ + summary["idle"] + summary["stopped"] + summary["zombie"] + summary["unknown"] + + if sys.platform.startswith("windows"): + assert summary["total"] == summary["sleeping"] + summary["running"] + summary["unknown"] @unittest.skipUnless(re.match("(?i)win|linux|darwin|freebsd", sys.platform), "os") def test_process(self): diff --git a/metricbeat/modules.d/linux.yml.disabled b/metricbeat/modules.d/linux.yml.disabled index a01989aa0c9..22e675cafff 100644 --- a/metricbeat/modules.d/linux.yml.disabled +++ b/metricbeat/modules.d/linux.yml.disabled @@ -5,8 +5,10 @@ period: 10s metricsets: - "pageinfo" + - "memory" # - ksm # - conntrack + # - iostat enabled: true #hostfs: /hostfs diff --git a/metricbeat/tests/system/test_processors.py b/metricbeat/tests/system/test_processors.py index 2f7d131d119..a680c049d67 100644 --- a/metricbeat/tests/system/test_processors.py +++ b/metricbeat/tests/system/test_processors.py @@ -12,13 +12,13 @@ def test_drop_fields(self): self.render_config_template( modules=[{ "name": "system", - "metricsets": ["cpu"], + "metricsets": ["network"], "period": "1s" }], processors=[{ "drop_fields": { "when": "range.system.cpu.system.pct.lt: 0.1", - "fields": ["system.cpu.load"], + "fields": ["system.network.in"], }, }] ) @@ -27,7 +27,7 @@ def test_drop_fields(self): proc.check_kill_and_wait() output = self.read_output_json() - self.assertEqual(len(output), 1) + self.assertGreater(len(output), 1) evt = output[0] self.assert_fields_are_documented(evt) @@ -37,12 +37,9 @@ def test_drop_fields(self): 'agent', '@timestamp', 'system', 'metricset.module', 'metricset.rtt', 'metricset.name', 'host', 'service', 'ecs', 'event' ]), evt.keys()) - cpu = evt["system"]["cpu"] - print(list(cpu.keys())) - self.assertCountEqual(self.de_dot([ - "system", "cores", "user", "softirq", "iowait", - "idle", "irq", "steal", "nice", "total" - ]), cpu.keys()) + network = evt["system"]["network"] + print(list(network.keys())) + self.assertCountEqual(self.de_dot(["name", "out", "in"]), network.keys()) def test_dropfields_with_condition(self): """ diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index 17c9234ea9f..bd99c2cf508 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -902,8 +902,10 @@ metricbeat.modules: period: 10s metricsets: - "pageinfo" + - "memory" # - ksm # - conntrack + # - iostat enabled: true #hostfs: /hostfs From fac0347d36205abd3e9e1ac377fdd9d263b8c9f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20Fl=C3=BChmann?= Date: Wed, 7 Oct 2020 01:56:39 +0200 Subject: [PATCH 095/156] docs: Update timestamp.asciidoc (#20395) --- libbeat/processors/timestamp/docs/timestamp.asciidoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libbeat/processors/timestamp/docs/timestamp.asciidoc b/libbeat/processors/timestamp/docs/timestamp.asciidoc index 83421c584a7..eb5ba628995 100644 --- a/libbeat/processors/timestamp/docs/timestamp.asciidoc +++ b/libbeat/processors/timestamp/docs/timestamp.asciidoc @@ -50,7 +50,7 @@ If a layout does not contain a year then the current year in the specified Here is an example that parses the `start_time` field and writes the result to the `@timestamp` field then deletes the `start_time` field. When the -processor is loaded it will immediately validate that the two `test` timestamps +processor is loaded, it will immediately validate that the two `test` timestamps parse with this configuration. [source,yaml] @@ -61,9 +61,11 @@ processors: layouts: - '2006-01-02T15:04:05Z' - '2006-01-02T15:04:05.999Z' + - '2006-01-02T15:04:05.999-07:00' test: - '2019-06-22T16:33:51Z' - '2019-11-18T04:59:51.123Z' + - '2020-08-03T07:10:20.123456+02:00' - drop_fields: fields: [start_time] ---- From b58aeb6e4b928659572df8d70118d7e31f26e1ef Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Wed, 7 Oct 2020 12:33:19 +0200 Subject: [PATCH 096/156] Fix badger build in 386 (#21613) Use a fork with the latest released version including the fix for the issue with 32-bit architectures. Fix uses uint32 instead of 32-bit int to avoid overflow in constant with max uint32. --- NOTICE.txt | 6 +++--- go.mod | 1 + go.sum | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/NOTICE.txt b/NOTICE.txt index 0017abeba1a..b62c4b5d202 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -4473,12 +4473,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/dgraph-io/badger/v2 -Version: v2.2007.2 +Dependency : github.com/elastic/badger/v2 +Version: v2.2007.2-beats Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/dgraph-io/badger/v2@v2.2007.2/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/badger/v2@v2.2007.2-beats/LICENSE: Apache License Version 2.0, January 2004 diff --git a/go.mod b/go.mod index bb31374384a..0f0bdb3a422 100644 --- a/go.mod +++ b/go.mod @@ -191,6 +191,7 @@ replace ( github.com/Azure/go-autorest => github.com/Azure/go-autorest v12.2.0+incompatible github.com/Shopify/sarama => github.com/elastic/sarama v1.19.1-0.20200629123429-0e7b69039eec github.com/cucumber/godog => github.com/cucumber/godog v0.8.1 + github.com/dgraph-io/badger/v2 => github.com/elastic/badger/v2 v2.2007.2-beats github.com/docker/docker => github.com/docker/engine v0.0.0-20191113042239-ea84732a7725 github.com/docker/go-plugins-helpers => github.com/elastic/go-plugins-helpers v0.0.0-20200207104224-bdf17607b79f github.com/dop251/goja => github.com/andrewkroh/goja v0.0.0-20190128172624-dd2ac4456e20 diff --git a/go.sum b/go.sum index 8113d42f321..6f737d7cee2 100644 --- a/go.sum +++ b/go.sum @@ -201,8 +201,6 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e/go.mod h1:xb github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2 h1:6+hM8KeYKV0Z9EIINNqIEDyyIRAcNc2FW+/TUYNmWyw= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= -github.com/dgraph-io/badger/v2 v2.2007.2 h1:EjjK0KqwaFMlPin1ajhP943VPENHJdEz1KLIegjaI3k= -github.com/dgraph-io/badger/v2 v2.2007.2/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -241,6 +239,8 @@ github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.1-0.20200121105743-0d940dd29fd2 h1:DW6WrARxK5J+o8uAKCiACi5wy9EK1UzrsCpGBPsKHAA= github.com/eclipse/paho.mqtt.golang v1.2.1-0.20200121105743-0d940dd29fd2/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= +github.com/elastic/badger/v2 v2.2007.2-beats h1:/rV4bM6fdYvPQhFf2bHHivIb0H4nX8Or7nkWbQ/Q6Ko= +github.com/elastic/badger/v2 v2.2007.2-beats/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3 h1:lnDkqiRFKm0rxdljqrj3lotWinO9+jFmeDXIC4gvIQs= github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3/go.mod h1:aPqzac6AYkipvp4hufTyMj5PDIphF3+At8zr7r51xjY= github.com/elastic/ecs v1.6.0 h1:8NmgfnsjmKXh9hVsK3H2tZtfUptepNc3msJOAynhtmc= From 3e86c2af0594d792f62af39a0b0e6b530e9aa90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Wed, 7 Oct 2020 13:02:34 +0200 Subject: [PATCH 097/156] [E2E Tests] fix: set versions ony for PRs (#21608) * fix: set versions ony for PRs We want to use default versions per branch when running after a merge * fix: add trailing comma Co-authored-by: Victor Martinez Co-authored-by: Victor Martinez --- .ci/packaging.groovy | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/.ci/packaging.groovy b/.ci/packaging.groovy index 301ead43bab..26916372b70 100644 --- a/.ci/packaging.groovy +++ b/.ci/packaging.groovy @@ -245,19 +245,25 @@ def triggerE2ETests(String suite) { def branchName = isPR() ? "${env.CHANGE_TARGET}" : "${env.JOB_BASE_NAME}" def e2eTestsPipeline = "e2e-tests/e2e-testing-mbp/${branchName}" + + def parameters = [ + booleanParam(name: 'forceSkipGitChecks', value: true), + booleanParam(name: 'forceSkipPresubmit', value: true), + booleanParam(name: 'notifyOnGreenBuilds', value: !isPR()), + string(name: 'runTestsSuites', value: suite), + string(name: 'GITHUB_CHECK_NAME', value: env.GITHUB_CHECK_E2E_TESTS_NAME), + string(name: 'GITHUB_CHECK_REPO', value: env.REPO), + string(name: 'GITHUB_CHECK_SHA1', value: env.GIT_BASE_COMMIT), + ] + if (isPR()) { + def version = "pr-${env.CHANGE_ID}" + parameters.push(booleanParam(name: 'USE_CI_SNAPSHOTS', value: true)) + parameters.push(string(name: 'ELASTIC_AGENT_VERSION', value: "${version}")) + parameters.push(string(name: 'METRICBEAT_VERSION', value: "${version}")) + } + build(job: "${e2eTestsPipeline}", - parameters: [ - booleanParam(name: 'forceSkipGitChecks', value: true), - booleanParam(name: 'forceSkipPresubmit', value: true), - booleanParam(name: 'notifyOnGreenBuilds', value: !isPR()), - booleanParam(name: 'USE_CI_SNAPSHOTS', value: true), - string(name: 'ELASTIC_AGENT_VERSION', value: "pr-${env.CHANGE_ID}"), - string(name: 'METRICBEAT_VERSION', value: "pr-${env.CHANGE_ID}"), - string(name: 'runTestsSuites', value: suite), - string(name: 'GITHUB_CHECK_NAME', value: env.GITHUB_CHECK_E2E_TESTS_NAME), - string(name: 'GITHUB_CHECK_REPO', value: env.REPO), - string(name: 'GITHUB_CHECK_SHA1', value: env.GIT_BASE_COMMIT), - ], + parameters: parameters, propagate: false, wait: false ) From 36953dfe6a587c0083cacb350f4d274e09d634a4 Mon Sep 17 00:00:00 2001 From: Dan Roscigno Date: Wed, 7 Oct 2020 09:59:05 -0400 Subject: [PATCH 098/156] Add `add_observer_metadata` `geo.name` to Quickstart (#21501) * Add `add_observer_metadata` `geo.name` to Quickstart The observer location is very important in the Uptime app and the out-of-the-box machine learning job. * Update getting-started.asciidoc The instructions about editing heartbeat.yml were too wordy * tighten it up! Co-authored-by: DeDe Morton Co-authored-by: DeDe Morton --- heartbeat/docs/getting-started.asciidoc | 40 +++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/heartbeat/docs/getting-started.asciidoc b/heartbeat/docs/getting-started.asciidoc index 21da1fb0547..1cd73dbb04f 100644 --- a/heartbeat/docs/getting-started.asciidoc +++ b/heartbeat/docs/getting-started.asciidoc @@ -96,9 +96,43 @@ was started. Heartbeat adds the `@every` keyword to the syntax provided by the include::{libbeat-dir}/shared/config-check.asciidoc[] +[float] +[[configurelocation]] +=== Step 4: Configure the Heartbeat location + +Heartbeat can be deployed in multiple locations so that you can detect +differences in availability and response times across those locations. +Configure the Heartbeat location to allow {kib} to display location-specific +information on Uptime maps and perform Uptime anomaly detection based +on location. + +To configure the location of a Heartbeat instance, modify the +`add_observer_metadata` processor in +{beatname_lc}.yml+. The following +example specifies the `geo.name` of the `add_observer_metadata` processor as +`us-east-1a`: + +[source,yaml] +---------------------------------------------------------------------- +# ============================ Processors ============================ + +processors: + - add_observer_metadata: + # Optional, but recommended geo settings for the location Heartbeat is running in + geo: <1> + # Token describing this location + name: us-east-1a <2> + # Lat, Lon " + #location: "37.926868, -78.024902" <3> +---------------------------------------------------------------------- +<1> Uncomment the `geo` setting. +<2> Uncomment `name` and assign the name of the location of the Heartbeat server. +<3> Optionally uncomment `location` and assign the latitude and longitude. + +include::{libbeat-dir}/shared/config-check.asciidoc[] + [float] [[setup-assets]] -=== Step 4: Set up assets +=== Step 5: Set up assets {beatname_uc} comes with predefined assets for parsing, indexing, and visualizing your data. To load these assets: @@ -128,7 +162,7 @@ environment. If you're using a different output, such as {ls}, see [float] [[start]] -=== Step 5: Start Heartbeat +=== Step 6: Start Heartbeat Before starting {beatname_uc}, modify the user credentials in +{beatname_lc}.yml+ and specify a user who is @@ -145,7 +179,7 @@ events to your defined output. [float] [[view-data]] -=== Step 6: View your data in {kib} +=== Step 7: View your data in {kib} {beatname_uc} comes with pre-built {kib} dashboards and UIs for visualizing the status of your services. The dashboards are available in the From 00d0419b9d1cadc4b2feb3c0676d7661d4786cfa Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Wed, 7 Oct 2020 15:03:22 +0100 Subject: [PATCH 099/156] [CI] Change notification channel (#21559) --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index df75ad2ccd1..17041987b27 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,7 +24,7 @@ pipeline { PIPELINE_LOG_LEVEL = 'INFO' PYTEST_ADDOPTS = "${params.PYTEST_ADDOPTS}" RUNBLD_DISABLE_NOTIFICATIONS = 'true' - SLACK_CHANNEL = "#beats-ci-builds" + SLACK_CHANNEL = "#beats-build" TERRAFORM_VERSION = "0.12.24" XPACK_MODULE_PATTERN = '^x-pack\\/[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' } @@ -122,7 +122,7 @@ pipeline { runbld(stashedTestReports: stashedTestReports, project: env.REPO) } cleanup { - notifyBuildResult(prComment: true, slackComment: true) + notifyBuildResult(prComment: true, slackComment: true, slackNotify: (isBranch() || isTag())) } } } From 030077ce9098bbb419fe92843a2ce3ad25860b20 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Wed, 7 Oct 2020 08:22:34 -0600 Subject: [PATCH 100/156] [Filebeat S3] Change log.file.path to be nested object (#21624) --- x-pack/filebeat/input/s3/collector.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/filebeat/input/s3/collector.go b/x-pack/filebeat/input/s3/collector.go index 2976dd52a5b..bf294f94245 100644 --- a/x-pack/filebeat/input/s3/collector.go +++ b/x-pack/filebeat/input/s3/collector.go @@ -556,8 +556,10 @@ func createEvent(log string, offset int, info s3Info, objectHash string, s3Ctx * Fields: common.MapStr{ "message": log, "log": common.MapStr{ - "offset": int64(offset), - "file.path": constructObjectURL(info), + "offset": int64(offset), + "file": common.MapStr{ + "path": constructObjectURL(info), + }, }, "aws": common.MapStr{ "s3": common.MapStr{ From 048a404985dae344e340b82ddd14698f7fa86bed Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Wed, 7 Oct 2020 08:25:54 -0600 Subject: [PATCH 101/156] Add fips_enabled into all aws filesets (#21626) --- x-pack/filebeat/module/aws/cloudtrail/config/s3.yml | 4 ++++ x-pack/filebeat/module/aws/cloudwatch/config/s3.yml | 4 ++++ x-pack/filebeat/module/aws/ec2/config/s3.yml | 4 ++++ x-pack/filebeat/module/aws/elb/config/s3.yml | 4 ++++ x-pack/filebeat/module/aws/s3access/config/s3.yml | 4 ++++ x-pack/filebeat/module/aws/vpcflow/config/input.yml | 4 ++++ 6 files changed, 24 insertions(+) diff --git a/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml b/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml index 7c455f64f26..ac1caacf21c 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml +++ b/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml @@ -51,6 +51,10 @@ session_token: {{ .session_token }} role_arn: {{ .role_arn }} {{ end }} +{{ if .fips_enabled }} +fips_enabled: {{ .fips_enabled }} +{{ end }} + tags: {{.tags | tojson}} publisher_pipeline.disable_host: {{ inList .tags "forwarded" }} diff --git a/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml b/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml index 5d2d75dc5d8..bdb0ff350f0 100644 --- a/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml +++ b/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml @@ -37,6 +37,10 @@ session_token: {{ .session_token }} role_arn: {{ .role_arn }} {{ end }} +{{ if .fips_enabled }} +fips_enabled: {{ .fips_enabled }} +{{ end }} + tags: {{.tags | tojson}} publisher_pipeline.disable_host: {{ inList .tags "forwarded" }} diff --git a/x-pack/filebeat/module/aws/ec2/config/s3.yml b/x-pack/filebeat/module/aws/ec2/config/s3.yml index 5d2d75dc5d8..bdb0ff350f0 100644 --- a/x-pack/filebeat/module/aws/ec2/config/s3.yml +++ b/x-pack/filebeat/module/aws/ec2/config/s3.yml @@ -37,6 +37,10 @@ session_token: {{ .session_token }} role_arn: {{ .role_arn }} {{ end }} +{{ if .fips_enabled }} +fips_enabled: {{ .fips_enabled }} +{{ end }} + tags: {{.tags | tojson}} publisher_pipeline.disable_host: {{ inList .tags "forwarded" }} diff --git a/x-pack/filebeat/module/aws/elb/config/s3.yml b/x-pack/filebeat/module/aws/elb/config/s3.yml index 5d2d75dc5d8..bdb0ff350f0 100644 --- a/x-pack/filebeat/module/aws/elb/config/s3.yml +++ b/x-pack/filebeat/module/aws/elb/config/s3.yml @@ -37,6 +37,10 @@ session_token: {{ .session_token }} role_arn: {{ .role_arn }} {{ end }} +{{ if .fips_enabled }} +fips_enabled: {{ .fips_enabled }} +{{ end }} + tags: {{.tags | tojson}} publisher_pipeline.disable_host: {{ inList .tags "forwarded" }} diff --git a/x-pack/filebeat/module/aws/s3access/config/s3.yml b/x-pack/filebeat/module/aws/s3access/config/s3.yml index 5d2d75dc5d8..bdb0ff350f0 100644 --- a/x-pack/filebeat/module/aws/s3access/config/s3.yml +++ b/x-pack/filebeat/module/aws/s3access/config/s3.yml @@ -37,6 +37,10 @@ session_token: {{ .session_token }} role_arn: {{ .role_arn }} {{ end }} +{{ if .fips_enabled }} +fips_enabled: {{ .fips_enabled }} +{{ end }} + tags: {{.tags | tojson}} publisher_pipeline.disable_host: {{ inList .tags "forwarded" }} diff --git a/x-pack/filebeat/module/aws/vpcflow/config/input.yml b/x-pack/filebeat/module/aws/vpcflow/config/input.yml index d0c18047ca4..628196b7d3e 100644 --- a/x-pack/filebeat/module/aws/vpcflow/config/input.yml +++ b/x-pack/filebeat/module/aws/vpcflow/config/input.yml @@ -39,6 +39,10 @@ session_token: {{ .session_token }} role_arn: {{ .role_arn }} {{ end }} +{{ if .fips_enabled }} +fips_enabled: {{ .fips_enabled }} +{{ end }} + {{ else if eq .input "file" }} type: log From cf5fafb157c127c0159e55697ac8a2baf9f1e710 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Wed, 7 Oct 2020 17:56:16 +0200 Subject: [PATCH 102/156] Add openstack ssl provider in add_cloud_metadata (#21590) Add a new provider to query metadata from OpenStack deployments using HTTPS. Add the usual SSL settings available in other features that support TLS. --- CHANGELOG.next.asciidoc | 1 + .../add_cloud_metadata/add_cloud_metadata.go | 16 ++++++++-- .../processors/add_cloud_metadata/config.go | 9 ++++-- .../docs/add_cloud_metadata.asciidoc | 4 +++ .../add_cloud_metadata/http_fetcher.go | 11 +++++-- .../provider_openstack_nova.go | 18 +++++++---- .../provider_openstack_nova_test.go | 30 ++++++++++++++++--- .../add_cloud_metadata/providers.go | 25 +++++++++------- 8 files changed, 87 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 6b4a999e0ec..cc8fb52396a 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -453,6 +453,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Cloud Foundry metadata is cached to disk. {pull}20775[20775] - Add option to select the type of index template to load: legacy, component, index. {pull}21212[21212] - Release `add_cloudfoundry_metadata` as GA. {pull}21525[21525] +- Add support for OpenStack SSL metadata APIs in `add_cloud_metadata`. {pull}21590[21590] *Auditbeat* diff --git a/libbeat/processors/add_cloud_metadata/add_cloud_metadata.go b/libbeat/processors/add_cloud_metadata/add_cloud_metadata.go index de1a8063667..5376d563fca 100644 --- a/libbeat/processors/add_cloud_metadata/add_cloud_metadata.go +++ b/libbeat/processors/add_cloud_metadata/add_cloud_metadata.go @@ -26,6 +26,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/transport/tlscommon" "github.com/elastic/beats/v7/libbeat/logp" "github.com/elastic/beats/v7/libbeat/processors" jsprocessor "github.com/elastic/beats/v7/libbeat/processors/script/javascript/module/processor" @@ -53,6 +54,7 @@ type addCloudMetadata struct { type initData struct { fetchers []metadataFetcher timeout time.Duration + tlsConfig *tlscommon.TLSConfig overwrite bool } @@ -63,14 +65,24 @@ func New(c *common.Config) (processors.Processor, error) { return nil, errors.Wrap(err, "failed to unpack add_cloud_metadata config") } + tlsConfig, err := tlscommon.LoadTLSConfig(config.TLS) + if err != nil { + return nil, errors.Wrap(err, "TLS configuration load") + } + initProviders := selectProviders(config.Providers, cloudMetaProviders) fetchers, err := setupFetchers(initProviders, c) if err != nil { return nil, err } p := &addCloudMetadata{ - initData: &initData{fetchers, config.Timeout, config.Overwrite}, - logger: logp.NewLogger("add_cloud_metadata"), + initData: &initData{ + fetchers: fetchers, + timeout: config.Timeout, + tlsConfig: tlsConfig, + overwrite: config.Overwrite, + }, + logger: logp.NewLogger("add_cloud_metadata"), } go p.init() diff --git a/libbeat/processors/add_cloud_metadata/config.go b/libbeat/processors/add_cloud_metadata/config.go index 08f4a241483..93a31137592 100644 --- a/libbeat/processors/add_cloud_metadata/config.go +++ b/libbeat/processors/add_cloud_metadata/config.go @@ -20,12 +20,15 @@ package add_cloud_metadata import ( "fmt" "time" + + "github.com/elastic/beats/v7/libbeat/common/transport/tlscommon" ) type config struct { - Timeout time.Duration `config:"timeout"` // Amount of time to wait for responses from the metadata services. - Overwrite bool `config:"overwrite"` // Overwrite if cloud.* fields already exist. - Providers providerList `config:"providers"` // List of providers to probe + Timeout time.Duration `config:"timeout"` // Amount of time to wait for responses from the metadata services. + TLS *tlscommon.Config `config:"ssl"` // TLS configuration + Overwrite bool `config:"overwrite"` // Overwrite if cloud.* fields already exist. + Providers providerList `config:"providers"` // List of providers to probe } type providerList []string diff --git a/libbeat/processors/add_cloud_metadata/docs/add_cloud_metadata.asciidoc b/libbeat/processors/add_cloud_metadata/docs/add_cloud_metadata.asciidoc index 41c0dd6d9f3..44497f31539 100644 --- a/libbeat/processors/add_cloud_metadata/docs/add_cloud_metadata.asciidoc +++ b/libbeat/processors/add_cloud_metadata/docs/add_cloud_metadata.asciidoc @@ -52,12 +52,16 @@ List of names the `providers` setting supports: - "aws", or "ec2" for Amazon Web Services (enabled by default). - "gcp" for Google Copmute Enging (enabled by default). - "openstack", or "nova" for Openstack Nova (enabled by default). +- "openstack-ssl", or "nova-ssl" for Openstack Nova when SSL metadata APIs are enabled (enabled by default). - "tencent", or "qcloud" for Tencent Cloud (disabled by default). The third optional configuration setting is `overwrite`. When `overwrite` is `true`, `add_cloud_metadata` overwrites existing `cloud.*` fields (`false` by default). +The `add_cloud_metadata` processor supports SSL options to configure the http +client used to query cloud metadata. See <> for more information. + The metadata that is added to events varies by hosting provider. Below are examples for each of the supported providers. diff --git a/libbeat/processors/add_cloud_metadata/http_fetcher.go b/libbeat/processors/add_cloud_metadata/http_fetcher.go index e9b18478661..e337edd5be9 100644 --- a/libbeat/processors/add_cloud_metadata/http_fetcher.go +++ b/libbeat/processors/add_cloud_metadata/http_fetcher.go @@ -27,6 +27,7 @@ import ( "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/transport/tlscommon" ) type httpMetadataFetcher struct { @@ -127,9 +128,15 @@ func (f *httpMetadataFetcher) fetchRaw( // getMetadataURLs loads config and generates the metadata URLs. func getMetadataURLs(c *common.Config, defaultHost string, metadataURIs []string) ([]string, error) { + return getMetadataURLsWithScheme(c, "http", defaultHost, metadataURIs) +} + +// getMetadataURLsWithScheme loads config and generates the metadata URLs. +func getMetadataURLsWithScheme(c *common.Config, scheme string, defaultHost string, metadataURIs []string) ([]string, error) { var urls []string config := struct { - MetadataHostAndPort string `config:"host"` // Specifies the host and port of the metadata service (for testing purposes only). + MetadataHostAndPort string `config:"host"` // Specifies the host and port of the metadata service (for testing purposes only). + TLSConfig *tlscommon.Config `config:"ssl"` }{ MetadataHostAndPort: defaultHost, } @@ -138,7 +145,7 @@ func getMetadataURLs(c *common.Config, defaultHost string, metadataURIs []string return urls, errors.Wrap(err, "failed to unpack add_cloud_metadata config") } for _, uri := range metadataURIs { - urls = append(urls, "http://"+config.MetadataHostAndPort+uri) + urls = append(urls, scheme+"://"+config.MetadataHostAndPort+uri) } return urls, nil } diff --git a/libbeat/processors/add_cloud_metadata/provider_openstack_nova.go b/libbeat/processors/add_cloud_metadata/provider_openstack_nova.go index 17bc5abf689..7c9a997e0e2 100644 --- a/libbeat/processors/add_cloud_metadata/provider_openstack_nova.go +++ b/libbeat/processors/add_cloud_metadata/provider_openstack_nova.go @@ -32,16 +32,24 @@ const ( // OpenStack Nova Metadata Service // Document https://docs.openstack.org/nova/latest/user/metadata-service.html var openstackNovaMetadataFetcher = provider{ - Name: "openstack-nova", + Name: "openstack-nova", + Local: true, + Create: buildOpenstackNovaCreate("http"), +} - Local: true, +var openstackNovaSSLMetadataFetcher = provider{ + Name: "openstack-nova-ssl", + Local: true, + Create: buildOpenstackNovaCreate("https"), +} - Create: func(provider string, c *common.Config) (metadataFetcher, error) { +func buildOpenstackNovaCreate(scheme string) func(provider string, c *common.Config) (metadataFetcher, error) { + return func(provider string, c *common.Config) (metadataFetcher, error) { osSchema := func(m map[string]interface{}) common.MapStr { return common.MapStr(m) } - urls, err := getMetadataURLs(c, metadataHost, []string{ + urls, err := getMetadataURLsWithScheme(c, scheme, metadataHost, []string{ osMetadataInstanceIDURI, osMetadataInstanceTypeURI, osMetadataHostnameURI, @@ -71,5 +79,5 @@ var openstackNovaMetadataFetcher = provider{ } fetcher := &httpMetadataFetcher{"openstack", nil, responseHandlers, osSchema} return fetcher, nil - }, + } } diff --git a/libbeat/processors/add_cloud_metadata/provider_openstack_nova_test.go b/libbeat/processors/add_cloud_metadata/provider_openstack_nova_test.go index d5c38a8437b..0a63c026cde 100644 --- a/libbeat/processors/add_cloud_metadata/provider_openstack_nova_test.go +++ b/libbeat/processors/add_cloud_metadata/provider_openstack_nova_test.go @@ -29,8 +29,8 @@ import ( "github.com/elastic/beats/v7/libbeat/logp" ) -func initOpenstackNovaTestServer() *httptest.Server { - return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { +func openstackNovaMetadataHandler() http.HandlerFunc { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.RequestURI == osMetadataInstanceIDURI { w.Write([]byte("i-0000ffac")) return @@ -49,13 +49,13 @@ func initOpenstackNovaTestServer() *httptest.Server { } http.Error(w, "not found", http.StatusNotFound) - })) + }) } func TestRetrieveOpenstackNovaMetadata(t *testing.T) { logp.TestingSetup() - server := initOpenstackNovaTestServer() + server := httptest.NewServer(openstackNovaMetadataHandler()) defer server.Close() config, err := common.NewConfigFrom(map[string]interface{}{ @@ -66,6 +66,28 @@ func TestRetrieveOpenstackNovaMetadata(t *testing.T) { t.Fatal(err) } + assertOpenstackNova(t, config) +} + +func TestRetrieveOpenstackNovaMetadataWithHTTPS(t *testing.T) { + logp.TestingSetup() + + server := httptest.NewTLSServer(openstackNovaMetadataHandler()) + defer server.Close() + + config, err := common.NewConfigFrom(map[string]interface{}{ + "host": server.Listener.Addr().String(), + "ssl.verification_mode": "none", + }) + + if err != nil { + t.Fatal(err) + } + + assertOpenstackNova(t, config) +} + +func assertOpenstackNova(t *testing.T, config *common.Config) { p, err := New(config) if err != nil { t.Fatal(err) diff --git a/libbeat/processors/add_cloud_metadata/providers.go b/libbeat/processors/add_cloud_metadata/providers.go index f93e8cf78f4..ea03b64258a 100644 --- a/libbeat/processors/add_cloud_metadata/providers.go +++ b/libbeat/processors/add_cloud_metadata/providers.go @@ -51,17 +51,19 @@ type result struct { } var cloudMetaProviders = map[string]provider{ - "alibaba": alibabaCloudMetadataFetcher, - "ecs": alibabaCloudMetadataFetcher, - "azure": azureVMMetadataFetcher, - "digitalocean": doMetadataFetcher, - "aws": ec2MetadataFetcher, - "ec2": ec2MetadataFetcher, - "gcp": gceMetadataFetcher, - "openstack": openstackNovaMetadataFetcher, - "nova": openstackNovaMetadataFetcher, - "qcloud": qcloudMetadataFetcher, - "tencent": qcloudMetadataFetcher, + "alibaba": alibabaCloudMetadataFetcher, + "ecs": alibabaCloudMetadataFetcher, + "azure": azureVMMetadataFetcher, + "digitalocean": doMetadataFetcher, + "aws": ec2MetadataFetcher, + "ec2": ec2MetadataFetcher, + "gcp": gceMetadataFetcher, + "openstack": openstackNovaMetadataFetcher, + "nova": openstackNovaMetadataFetcher, + "openstack-ssl": openstackNovaSSLMetadataFetcher, + "nova-ssl": openstackNovaSSLMetadataFetcher, + "qcloud": qcloudMetadataFetcher, + "tencent": qcloudMetadataFetcher, } func selectProviders(configList providerList, providers map[string]provider) map[string]provider { @@ -138,6 +140,7 @@ func (p *addCloudMetadata) fetchMetadata() *result { Timeout: p.initData.timeout, KeepAlive: 0, }).DialContext, + TLSClientConfig: p.initData.tlsConfig.ToConfig(), }, } From 7028e2c9779bff69f7d526af69eb804c024e5776 Mon Sep 17 00:00:00 2001 From: Marc Guasch Date: Wed, 7 Oct 2020 18:47:33 +0200 Subject: [PATCH 103/156] Fix cyberark/corepas pipeline (#21643) --- .../cyberark/corepas/ingest/pipeline.yml | 2 +- .../corepas/test/generated.log-expected.json | 394 +++++++++--------- 2 files changed, 198 insertions(+), 198 deletions(-) diff --git a/x-pack/filebeat/module/cyberark/corepas/ingest/pipeline.yml b/x-pack/filebeat/module/cyberark/corepas/ingest/pipeline.yml index ffe90e79f85..4e401931415 100644 --- a/x-pack/filebeat/module/cyberark/corepas/ingest/pipeline.yml +++ b/x-pack/filebeat/module/cyberark/corepas/ingest/pipeline.yml @@ -55,7 +55,7 @@ processors: ignore_missing: true - append: field: related.hosts - value: '{{host.hostname server.domain}}' + value: '{{host.hostname}}' allow_duplicates: false if: ctx?.host?.hostname != null && ctx.host?.hostname != '' - append: diff --git a/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json b/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json index 4056ed473ca..90805d72bcd 100644 --- a/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json +++ b/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json @@ -20,9 +20,9 @@ "10.208.15.216" ], "related.user": [ + "quasiarc", "itv", - "utl", - "quasiarc" + "utl" ], "rsa.db.index": "nes", "rsa.internal.event_desc": "pexe", @@ -67,13 +67,13 @@ "iatnu3810.mail.localdomain" ], "related.ip": [ - "10.92.136.230", - "10.175.75.18" + "10.175.75.18", + "10.92.136.230" ], "related.user": [ - "dolore", + "orev", "nnumqu", - "orev" + "dolore" ], "rsa.db.database": "umdo", "rsa.db.index": "vol", @@ -130,13 +130,13 @@ "anti4454.api.example" ], "related.ip": [ - "10.46.185.46", - "10.51.132.10" + "10.51.132.10", + "10.46.185.46" ], "related.user": [ - "incid", + "serror", "nse", - "serror" + "incid" ], "rsa.db.database": "byC", "rsa.db.index": "tur", @@ -197,9 +197,9 @@ "10.53.192.140" ], "related.user": [ + "psumquia", "atcup", - "ptass", - "psumquia" + "ptass" ], "rsa.db.database": "aperi", "rsa.db.index": "llumd", @@ -253,9 +253,9 @@ "10.81.199.122" ], "related.user": [ + "oremips", "eos", - "giatq", - "oremips" + "giatq" ], "rsa.db.index": "tempo", "rsa.internal.event_desc": "uian", @@ -304,9 +304,9 @@ "10.139.186.201" ], "related.user": [ - "uam", "tcupida", - "aboris" + "aboris", + "uam" ], "rsa.db.database": "isiu", "rsa.db.index": "iatisu", @@ -367,9 +367,9 @@ "10.104.111.129" ], "related.user": [ + "ele", "etconsec", - "ipis", - "ele" + "ipis" ], "rsa.db.database": "riat", "rsa.db.index": "umdolor", @@ -423,9 +423,9 @@ "10.116.120.216" ], "related.user": [ - "quiratio", + "animi", "umdo", - "animi" + "quiratio" ], "rsa.db.index": "oll", "rsa.internal.event_desc": "rumet", @@ -470,13 +470,13 @@ "isqu7224.localdomain" ], "related.ip": [ - "10.57.40.29", - "10.62.54.220" + "10.62.54.220", + "10.57.40.29" ], "related.user": [ "psum", - "rnatura", - "taevi" + "taevi", + "rnatura" ], "rsa.db.database": "emeumfug", "rsa.db.index": "omn", @@ -530,9 +530,9 @@ "10.74.237.180" ], "related.user": [ - "ema", + "tnon", "cup", - "tnon" + "ema" ], "rsa.db.index": "remeumf", "rsa.internal.event_desc": "lup", @@ -618,8 +618,8 @@ "10.74.253.127" ], "related.user": [ - "onproide", "icab", + "onproide", "tema" ], "rsa.db.index": "mqui", @@ -664,8 +664,8 @@ "tlabo6088.www.localdomain" ], "related.ip": [ - "10.189.109.245", - "10.92.8.15" + "10.92.8.15", + "10.189.109.245" ], "related.user": [ "inima", @@ -766,8 +766,8 @@ "10.18.109.121" ], "related.user": [ - "hil", "tatn", + "hil", "pida" ], "rsa.db.index": "quip", @@ -817,9 +817,9 @@ "10.63.37.192" ], "related.user": [ + "reetd", "iunt", - "equep", - "reetd" + "equep" ], "rsa.db.database": "aliqu", "rsa.db.index": "mipsumd", @@ -880,9 +880,9 @@ "10.47.202.102" ], "related.user": [ - "run", + "ice", "ntor", - "ice" + "run" ], "rsa.db.database": "ite", "rsa.db.index": "iquipex", @@ -942,8 +942,8 @@ "10.106.239.55" ], "related.user": [ - "itquiin", - "serunt" + "serunt", + "itquiin" ], "rsa.db.database": "itame", "rsa.db.index": "oluptas", @@ -999,13 +999,13 @@ "etMalor4236.www5.host" ], "related.ip": [ - "10.125.160.129", - "10.53.168.235" + "10.53.168.235", + "10.125.160.129" ], "related.user": [ + "one", "abi", - "ione", - "one" + "ione" ], "rsa.db.database": "sperna", "rsa.db.index": "estia", @@ -1066,8 +1066,8 @@ "10.227.177.121" ], "related.user": [ - "liqui", "tasuntex", + "liqui", "iduntu" ], "rsa.db.database": "rvel", @@ -1125,16 +1125,16 @@ "process.name": "laboree.exe", "process.pid": 6501, "related.hosts": [ - "", + "xeacomm6855.api.corp", "nsecte3304.mail.corp" ], "related.ip": [ - "10.167.85.181", - "10.98.182.220" + "10.98.182.220", + "10.167.85.181" ], "related.user": [ - "fde", - "econs" + "econs", + "fde" ], "rsa.db.database": "equat", "rsa.internal.event_desc": "orpor", @@ -1189,9 +1189,9 @@ "10.89.208.95" ], "related.user": [ - "iciadese", "icabo", - "sintoc" + "sintoc", + "iciadese" ], "rsa.db.index": "eni", "rsa.internal.event_desc": "rcitati", @@ -1240,9 +1240,9 @@ "10.72.148.32" ], "related.user": [ - "uteirure", "tDuisaut", - "luptatev" + "luptatev", + "uteirure" ], "rsa.db.database": "uamest", "rsa.db.index": "uae", @@ -1362,12 +1362,12 @@ "tnonpro7635.localdomain" ], "related.ip": [ - "10.192.34.76", - "10.213.144.249" + "10.213.144.249", + "10.192.34.76" ], "related.user": [ - "lore", "temqu", + "lore", "iquipe" ], "rsa.db.database": "gnamal", @@ -1482,9 +1482,9 @@ "10.143.193.199" ], "related.user": [ - "tqu", + "niamqui", "quid", - "niamqui" + "tqu" ], "rsa.db.index": "inci", "rsa.internal.event_desc": "eroinBCS", @@ -1533,9 +1533,9 @@ "10.65.175.9" ], "related.user": [ + "umqu", "ritatise", - "essequam", - "umqu" + "essequam" ], "rsa.db.database": "ender", "rsa.db.index": "entorev", @@ -1589,9 +1589,9 @@ "10.205.72.243" ], "related.user": [ - "isiuta", "tatn", - "umdolo" + "umdolo", + "isiuta" ], "rsa.db.index": "proide", "rsa.internal.event_desc": "ameiusm", @@ -1633,9 +1633,9 @@ "10.107.9.163" ], "related.user": [ - "sit", + "mac", "mquisno", - "mac" + "sit" ], "rsa.db.index": "sit", "rsa.internal.event_desc": "tdol", @@ -1677,9 +1677,9 @@ "10.80.101.72" ], "related.user": [ + "asiarc", "umSe", - "quidexea", - "asiarc" + "quidexea" ], "rsa.db.index": "veli", "rsa.internal.event_desc": "quatu", @@ -1728,9 +1728,9 @@ "10.39.10.155" ], "related.user": [ - "urExcept", + "ptass", "aboreetd", - "ptass" + "urExcept" ], "rsa.db.database": "teirured", "rsa.db.index": "dolorem", @@ -1828,9 +1828,9 @@ "10.71.238.250" ], "related.user": [ + "reseo", "moenimi", - "aec", - "reseo" + "aec" ], "rsa.db.index": "mac", "rsa.internal.event_desc": "quamest", @@ -1875,13 +1875,13 @@ "rum5798.home" ], "related.ip": [ - "10.226.20.199", - "10.226.101.180" + "10.226.101.180", + "10.226.20.199" ], "related.user": [ - "ritt", "rationev", - "veniamqu" + "veniamqu", + "ritt" ], "rsa.db.database": "conse", "rsa.db.index": "imveniam", @@ -1943,9 +1943,9 @@ "10.134.65.15" ], "related.user": [ - "quaUten", + "cab", "utaliqu", - "cab" + "quaUten" ], "rsa.db.database": "isciv", "rsa.db.index": "nofd", @@ -2002,8 +2002,8 @@ "10.70.147.120" ], "related.user": [ - "cidunt", "tten", + "cidunt", "emqu" ], "rsa.db.index": "eaqu", @@ -2053,9 +2053,9 @@ "10.178.242.100" ], "related.user": [ + "idid", "dqu", - "loi", - "idid" + "loi" ], "rsa.db.database": "tenatuse", "rsa.db.index": "ullamcor", @@ -2109,9 +2109,9 @@ "10.211.179.168" ], "related.user": [ - "ritati", "untincul", - "mmodoc" + "mmodoc", + "ritati" ], "rsa.db.index": "emvele", "rsa.internal.event_desc": "oluptas", @@ -2153,9 +2153,9 @@ "10.30.243.163" ], "related.user": [ - "illu", "mven", - "dolore" + "dolore", + "illu" ], "rsa.db.index": "idol", "rsa.internal.event_desc": "lore", @@ -2200,12 +2200,12 @@ "dictasun3878.internal.localhost" ], "related.ip": [ - "10.212.214.4", - "10.6.79.159" + "10.6.79.159", + "10.212.214.4" ], "related.user": [ - "amvo", "quid", + "amvo", "midestl" ], "rsa.db.database": "urExce", @@ -2267,8 +2267,8 @@ "10.237.170.202" ], "related.user": [ - "liquide", "rcit", + "liquide", "atDu" ], "rsa.db.database": "taedict", @@ -2330,8 +2330,8 @@ "10.228.118.81" ], "related.user": [ - "emoe", "tatemU", + "emoe", "itasper" ], "rsa.db.database": "toditaut", @@ -2389,13 +2389,13 @@ "esseq7889.www.invalid" ], "related.ip": [ - "10.49.71.118", - "10.234.165.130" + "10.234.165.130", + "10.49.71.118" ], "related.user": [ "henderit", - "emip", - "iuntNequ" + "iuntNequ", + "emip" ], "rsa.db.database": "veniamqu", "rsa.db.index": "atquo", @@ -2449,9 +2449,9 @@ "10.199.5.49" ], "related.user": [ - "emip", "turadipi", - "olorema" + "olorema", + "emip" ], "rsa.db.index": "ataevi", "rsa.internal.event_desc": "minim", @@ -2493,9 +2493,9 @@ "10.193.219.34" ], "related.user": [ - "uamei", + "olorem", "utlabo", - "olorem" + "uamei" ], "rsa.db.index": "nse", "rsa.internal.event_desc": "orisni", @@ -2540,12 +2540,12 @@ "tem6815.home" ], "related.ip": [ - "10.174.185.109", - "10.120.167.217" + "10.120.167.217", + "10.174.185.109" ], "related.user": [ - "dolorem", "rsp", + "dolorem", "animid" ], "rsa.db.database": "tsuntinc", @@ -2603,12 +2603,12 @@ "mporainc2064.home" ], "related.ip": [ - "10.141.213.219", - "10.117.137.159" + "10.117.137.159", + "10.141.213.219" ], "related.user": [ - "accusa", "atev", + "accusa", "ate" ], "rsa.db.database": "nibus", @@ -2666,13 +2666,13 @@ "caboNem1043.internal.home" ], "related.ip": [ - "10.166.90.130", - "10.94.224.229" + "10.94.224.229", + "10.166.90.130" ], "related.user": [ "eavol", - "etconsec", - "rem" + "rem", + "etconsec" ], "rsa.db.database": "oditempo", "rsa.db.index": "deF", @@ -2731,13 +2731,13 @@ "tatio6513.www.invalid" ], "related.ip": [ - "10.201.81.46", - "10.38.28.151" + "10.38.28.151", + "10.201.81.46" ], "related.user": [ + "mipsumqu", "incidid", - "tiumto", - "mipsumqu" + "tiumto" ], "rsa.db.database": "abor", "rsa.db.index": "adol", @@ -2796,12 +2796,12 @@ "dolori6232.api.invalid" ], "related.ip": [ - "10.214.245.95", - "10.255.28.56" + "10.255.28.56", + "10.214.245.95" ], "related.user": [ - "umdolors", "rerepre", + "umdolors", "uptatem" ], "rsa.db.database": "odt", @@ -2900,8 +2900,8 @@ "10.141.200.133" ], "related.user": [ - "iame", "ess", + "iame", "enim" ], "rsa.db.index": "nofdeFi", @@ -2945,8 +2945,8 @@ ], "related.user": [ "runtmo", - "illoi", - "ugi" + "ugi", + "illoi" ], "rsa.db.index": "eetdo", "rsa.internal.event_desc": "quaer", @@ -2991,13 +2991,13 @@ "mestq2106.api.host" ], "related.ip": [ - "10.41.89.217", - "10.39.143.155" + "10.39.143.155", + "10.41.89.217" ], "related.user": [ - "sedquiac", "tem", - "tperspic" + "tperspic", + "sedquiac" ], "rsa.db.database": "radipis", "rsa.db.index": "nse", @@ -3058,8 +3058,8 @@ "10.5.5.1" ], "related.user": [ - "minim", "CSe", + "minim", "unt" ], "rsa.db.database": "atu", @@ -3121,9 +3121,9 @@ "10.168.132.175" ], "related.user": [ - "eursinto", + "iamea", "giatquov", - "iamea" + "eursinto" ], "rsa.db.database": "ici", "rsa.db.index": "iquaUt", @@ -3177,9 +3177,9 @@ "10.123.154.17" ], "related.user": [ + "quiac", "dolorsi", - "lmo", - "quiac" + "lmo" ], "rsa.db.index": "idunt", "rsa.internal.event_desc": "usantiu", @@ -3270,9 +3270,9 @@ "10.126.205.76" ], "related.user": [ - "rsitvol", "Nemoenim", - "iati" + "iati", + "rsitvol" ], "rsa.db.index": "eFini", "rsa.internal.event_desc": "acom", @@ -3317,13 +3317,13 @@ "fic5107.home" ], "related.ip": [ - "10.169.101.161", - "10.164.66.154" + "10.164.66.154", + "10.169.101.161" ], "related.user": [ - "orissu", + "eufug", "ine", - "eufug" + "orissu" ], "rsa.db.database": "stquidol", "rsa.db.index": "imadmini", @@ -3377,8 +3377,8 @@ "10.70.83.200" ], "related.user": [ - "metco", "riat", + "metco", "ihilmole" ], "rsa.db.index": "urQuis", @@ -3424,13 +3424,13 @@ "onpr47.api.home" ], "related.ip": [ - "10.207.97.192", - "10.134.55.11" + "10.134.55.11", + "10.207.97.192" ], "related.user": [ + "madminim", "tanimid", - "mmod", - "madminim" + "mmod" ], "rsa.db.database": "tetura", "rsa.db.index": "uptasnul", @@ -3492,8 +3492,8 @@ ], "related.user": [ "eritq", - "oinBCSed", - "texplica" + "texplica", + "oinBCSed" ], "rsa.db.database": "lit", "rsa.db.index": "ritati", @@ -3550,8 +3550,8 @@ "eufugia4481.corp" ], "related.ip": [ - "10.41.232.147", - "10.61.175.217" + "10.61.175.217", + "10.41.232.147" ], "related.user": [ "runtm", @@ -3610,9 +3610,9 @@ "10.150.30.95" ], "related.user": [ - "mini", + "atnonpr", "uisnos", - "atnonpr" + "mini" ], "rsa.db.index": "smod", "rsa.internal.event_desc": "isn", @@ -3654,9 +3654,9 @@ "10.98.71.45" ], "related.user": [ - "fugitse", "CSe", - "onse" + "onse", + "fugitse" ], "rsa.db.index": "Dui", "rsa.internal.event_desc": "isci", @@ -3742,8 +3742,8 @@ "10.197.203.167" ], "related.user": [ - "iumdo", "uta", + "iumdo", "eserun" ], "rsa.db.index": "smo", @@ -3786,9 +3786,9 @@ "10.187.170.23" ], "related.user": [ - "ibusBo", + "enima", "sectetu", - "enima" + "ibusBo" ], "rsa.db.index": "uido", "rsa.internal.event_desc": "lab", @@ -3837,9 +3837,9 @@ "10.250.248.215" ], "related.user": [ - "aevitaed", "tinculpa", - "quaeratv" + "quaeratv", + "aevitaed" ], "rsa.db.database": "lica", "rsa.db.index": "uisnos", @@ -3895,8 +3895,8 @@ "osa3211.www5.example" ], "related.ip": [ - "10.147.154.118", - "10.146.57.23" + "10.146.57.23", + "10.147.154.118" ], "related.user": [ "tateveli", @@ -3997,9 +3997,9 @@ "10.154.172.82" ], "related.user": [ - "onnumqua", + "tetura", "nesci", - "tetura" + "onnumqua" ], "rsa.db.index": "oinBCSed", "rsa.internal.event_desc": "ntor", @@ -4042,8 +4042,8 @@ ], "related.user": [ "tpers", - "midestl", - "expl" + "expl", + "midestl" ], "rsa.db.index": "olu", "rsa.internal.event_desc": "odocons", @@ -4085,8 +4085,8 @@ "10.178.160.245" ], "related.user": [ - "fdeFinib", "turQuis", + "fdeFinib", "olupta" ], "rsa.db.index": "rsint", @@ -4195,13 +4195,13 @@ "nimve2787.mail.test" ], "related.ip": [ - "10.65.207.234", - "10.222.32.183" + "10.222.32.183", + "10.65.207.234" ], "related.user": [ "eve", - "itame", - "eruntmo" + "eruntmo", + "itame" ], "rsa.db.database": "udexerc", "rsa.db.index": "volup", @@ -4255,9 +4255,9 @@ "10.16.181.60" ], "related.user": [ + "olore", "gnama", - "oinven", - "olore" + "oinven" ], "rsa.db.index": "uatu", "rsa.internal.event_desc": "nderiti", @@ -4343,9 +4343,9 @@ "10.204.214.98" ], "related.user": [ + "eprehe", "porissus", - "tdolo", - "eprehe" + "tdolo" ], "rsa.db.index": "abo", "rsa.internal.event_desc": "ecte", @@ -4387,8 +4387,8 @@ "10.223.178.192" ], "related.user": [ - "etc", "evel", + "etc", "moenimip" ], "rsa.db.index": "iarchit", @@ -4434,13 +4434,13 @@ "ama6820.mail.example" ], "related.ip": [ - "10.26.137.126", - "10.26.33.181" + "10.26.33.181", + "10.26.137.126" ], "related.user": [ - "taevit", "ati", - "audant" + "audant", + "taevit" ], "rsa.db.database": "com", "rsa.db.index": "mveni", @@ -4560,13 +4560,13 @@ "lit4112.www.localhost" ], "related.ip": [ - "10.107.24.54", - "10.10.174.253" + "10.10.174.253", + "10.107.24.54" ], "related.user": [ "itinvo", - "uptasn", - "hend" + "hend", + "uptasn" ], "rsa.db.database": "lup", "rsa.db.index": "isau", @@ -4621,9 +4621,9 @@ "10.87.92.17" ], "related.user": [ + "eeufug", "luptate", - "tamr", - "eeufug" + "tamr" ], "rsa.db.index": "oreeufug", "rsa.internal.event_desc": "ura", @@ -4676,9 +4676,9 @@ "10.161.51.135" ], "related.user": [ - "Finibus", "accus", - "asper" + "asper", + "Finibus" ], "rsa.db.database": "litani", "rsa.db.index": "arch", @@ -4732,9 +4732,9 @@ "10.51.17.32" ], "related.user": [ - "itten", "mquido", - "llum" + "llum", + "itten" ], "rsa.db.index": "uscipit", "rsa.internal.event_desc": "llitani", @@ -4777,8 +4777,8 @@ ], "related.user": [ "ollita", - "mmodicon", - "cusa" + "cusa", + "mmodicon" ], "rsa.db.index": "ercitati", "rsa.internal.event_desc": "pteurs", @@ -4824,13 +4824,13 @@ "uidol6868.mail.localdomain" ], "related.ip": [ - "10.114.0.148", - "10.198.187.144" + "10.198.187.144", + "10.114.0.148" ], "related.user": [ "equatD", - "rsitamet", - "ons" + "ons", + "rsitamet" ], "rsa.db.database": "periam", "rsa.db.index": "umiurer", @@ -4888,9 +4888,9 @@ "10.61.140.120" ], "related.user": [ - "loru", + "naaliq", "equa", - "naaliq" + "loru" ], "rsa.db.index": "umfugiat", "rsa.internal.event_desc": "ora", @@ -4935,13 +4935,13 @@ "ptat4878.lan" ], "related.ip": [ - "10.149.238.108", - "10.93.24.151" + "10.93.24.151", + "10.149.238.108" ], "related.user": [ "ite", - "nven", - "sequamn" + "sequamn", + "nven" ], "rsa.db.database": "fugi", "rsa.db.index": "nesciu", @@ -4995,9 +4995,9 @@ "10.101.45.225" ], "related.user": [ - "emi", "uinesc", - "cipitla" + "cipitla", + "emi" ], "rsa.db.index": "caecat", "rsa.internal.event_desc": "tsunt", @@ -5040,9 +5040,9 @@ "10.2.204.161" ], "related.user": [ - "quela", + "eumfugia", "ore", - "eumfugia" + "quela" ], "rsa.db.index": "olup", "rsa.internal.event_desc": "quuntur", @@ -5139,8 +5139,8 @@ "10.151.110.250" ], "related.user": [ - "neavol", "tla", + "neavol", "pidatatn" ], "rsa.db.database": "itaedict", @@ -5258,9 +5258,9 @@ "10.128.102.130" ], "related.user": [ - "que", + "sequatu", "ore", - "sequatu" + "que" ], "rsa.db.index": "exerci", "rsa.internal.event_desc": "olu", @@ -5309,8 +5309,8 @@ "10.200.162.248" ], "related.user": [ - "onnu", "reseo", + "onnu", "doloremi" ], "rsa.db.database": "billo", @@ -5365,8 +5365,8 @@ "10.103.215.159" ], "related.user": [ - "volup", "apa", + "volup", "atatn" ], "rsa.db.index": "atcupi", From 189171723ce69e3a235ef16a80c870db74fba682 Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Wed, 7 Oct 2020 18:52:51 -0500 Subject: [PATCH 104/156] [Elastic Agent] Reload fleet.kibana.hosts from policy change (#21599) * Update the connected client for kibana from policy change. * Fix vet. * Add changelog. * Add protocol compare. * Rollback protocol and hosts on failure. --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../pkg/agent/application/fleet_acker.go | 4 + .../pkg/agent/application/fleet_gateway.go | 4 + .../handler_action_policy_change.go | 107 +++++++++++++++++- .../handler_action_policy_change_test.go | 45 +++++++- .../pkg/agent/application/managed_mode.go | 16 ++- .../agent/application/managed_mode_test.go | 12 +- .../pkg/agent/storage/storage.go | 8 +- 8 files changed, 182 insertions(+), 15 deletions(-) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index a0cd6f6291e..73dfe8ff9a4 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -33,3 +33,4 @@ - Send updating state {pull}21461[21461] - Add `elastic.agent.id` and `elastic.agent.version` to published events from filebeat and metricbeat {pull}21543[21543] - Add `upgrade` subcommand to perform upgrade of installed Elastic Agent {pull}21425[21425] +- Update `fleet.yml` and Kibana hosts when a policy change updates the Kibana hosts {pull}21599[21599] diff --git a/x-pack/elastic-agent/pkg/agent/application/fleet_acker.go b/x-pack/elastic-agent/pkg/agent/application/fleet_acker.go index ba324f2d7de..4544fa8a772 100644 --- a/x-pack/elastic-agent/pkg/agent/application/fleet_acker.go +++ b/x-pack/elastic-agent/pkg/agent/application/fleet_acker.go @@ -39,6 +39,10 @@ func newActionAcker( }, nil } +func (f *actionAcker) SetClient(client clienter) { + f.client = client +} + func (f *actionAcker) Ack(ctx context.Context, action fleetapi.Action) error { // checkin agentID := f.agentInfo.AgentID() diff --git a/x-pack/elastic-agent/pkg/agent/application/fleet_gateway.go b/x-pack/elastic-agent/pkg/agent/application/fleet_gateway.go index 4bb9d2e6280..21e7bfd4589 100644 --- a/x-pack/elastic-agent/pkg/agent/application/fleet_gateway.go +++ b/x-pack/elastic-agent/pkg/agent/application/fleet_gateway.go @@ -253,3 +253,7 @@ func (f *fleetGateway) stop() { close(f.done) f.wg.Wait() } + +func (f *fleetGateway) SetClient(client clienter) { + f.client = client +} diff --git a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go index 81dc1444816..8821700ee74 100644 --- a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go +++ b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go @@ -5,17 +5,36 @@ package application import ( + "bytes" "context" "fmt" + "io" + "sort" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" + + "gopkg.in/yaml.v2" + + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configuration" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/storage" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/config" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/fleetapi" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/kibana" ) +type clientSetter interface { + SetClient(clienter) +} + type handlerPolicyChange struct { - log *logger.Logger - emitter emitterFunc + log *logger.Logger + emitter emitterFunc + agentInfo *info.AgentInfo + config *configuration.Configuration + store storage.Store + setters []clientSetter } func (h *handlerPolicyChange) Handle(ctx context.Context, a action, acker fleetAcker) error { @@ -31,9 +50,93 @@ func (h *handlerPolicyChange) Handle(ctx context.Context, a action, acker fleetA } h.log.Debugf("handlerPolicyChange: emit configuration for action %+v", a) + err = h.handleKibanaHosts(c) + if err != nil { + return err + } if err := h.emitter(c); err != nil { return err } return acker.Ack(ctx, action) } + +func (h *handlerPolicyChange) handleKibanaHosts(c *config.Config) (err error) { + cfg, err := configuration.NewFromConfig(c) + if err != nil { + return errors.New(err, "could not parse the configuration from the policy", errors.TypeConfig) + } + if kibanaEqual(h.config.Fleet.Kibana, cfg.Fleet.Kibana) { + // already the same hosts + return nil + } + + // only set protocol/hosts as that is all Fleet currently sends + prevProtocol := h.config.Fleet.Kibana.Protocol + prevHosts := h.config.Fleet.Kibana.Hosts + h.config.Fleet.Kibana.Protocol = cfg.Fleet.Kibana.Protocol + h.config.Fleet.Kibana.Hosts = cfg.Fleet.Kibana.Hosts + + // rollback on failure + defer func() { + if err != nil { + h.config.Fleet.Kibana.Protocol = prevProtocol + h.config.Fleet.Kibana.Hosts = prevHosts + } + }() + + client, err := fleetapi.NewAuthWithConfig(h.log, h.config.Fleet.AccessAPIKey, h.config.Fleet.Kibana) + if err != nil { + return errors.New( + err, "fail to create API client with updated hosts", + errors.TypeNetwork, errors.M("hosts", h.config.Fleet.Kibana.Hosts)) + } + reader, err := fleetToReader(h.agentInfo, h.config) + if err != nil { + return errors.New( + err, "fail to persist updated API client hosts", + errors.TypeUnexpected, errors.M("hosts", h.config.Fleet.Kibana.Hosts)) + } + err = h.store.Save(reader) + if err != nil { + return errors.New( + err, "fail to persist updated API client hosts", + errors.TypeFilesystem, errors.M("hosts", h.config.Fleet.Kibana.Hosts)) + } + for _, setter := range h.setters { + setter.SetClient(client) + } + return nil +} + +func kibanaEqual(k1 *kibana.Config, k2 *kibana.Config) bool { + if k1.Protocol != k2.Protocol { + return false + } + + sort.Strings(k1.Hosts) + sort.Strings(k2.Hosts) + if len(k1.Hosts) != len(k2.Hosts) { + return false + } + for i, v := range k1.Hosts { + if v != k2.Hosts[i] { + return false + } + } + return true +} + +func fleetToReader(agentInfo *info.AgentInfo, cfg *configuration.Configuration) (io.Reader, error) { + configToStore := map[string]interface{}{ + "fleet": cfg.Fleet, + "agent": map[string]interface{}{ + "id": agentInfo.AgentID(), + }, + } + data, err := yaml.Marshal(configToStore) + if err != nil { + return nil, err + } + return bytes.NewReader(data), nil +} diff --git a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go index ce4802b68e6..c30f886b0d1 100644 --- a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go @@ -9,6 +9,10 @@ import ( "sync" "testing" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configuration" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/storage" + "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -31,6 +35,8 @@ func (m *mockEmitter) Emitter(policy *config.Config) error { func TestPolicyChange(t *testing.T) { log, _ := logger.New("") ack := newNoopAcker() + agentInfo, _ := info.NewAgentInfo() + nullStore := &storage.NullStore{} t.Run("Receive a config change and successfully emits a raw configuration", func(t *testing.T) { emitter := &mockEmitter{} @@ -42,7 +48,14 @@ func TestPolicyChange(t *testing.T) { Policy: conf, } - handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} + cfg := configuration.DefaultConfiguration() + handler := &handlerPolicyChange{ + log: log, + emitter: emitter.Emitter, + agentInfo: agentInfo, + config: cfg, + store: nullStore, + } err := handler.Handle(context.Background(), action, ack) require.NoError(t, err) @@ -60,7 +73,14 @@ func TestPolicyChange(t *testing.T) { Policy: conf, } - handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} + cfg := configuration.DefaultConfiguration() + handler := &handlerPolicyChange{ + log: log, + emitter: emitter.Emitter, + agentInfo: agentInfo, + config: cfg, + store: nullStore, + } err := handler.Handle(context.Background(), action, ack) require.Error(t, err) @@ -69,6 +89,9 @@ func TestPolicyChange(t *testing.T) { func TestPolicyAcked(t *testing.T) { log, _ := logger.New("") + agentInfo, _ := info.NewAgentInfo() + nullStore := &storage.NullStore{} + t.Run("Config change should not ACK on error", func(t *testing.T) { tacker := &testAcker{} @@ -83,7 +106,14 @@ func TestPolicyAcked(t *testing.T) { Policy: config, } - handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} + cfg := configuration.DefaultConfiguration() + handler := &handlerPolicyChange{ + log: log, + emitter: emitter.Emitter, + agentInfo: agentInfo, + config: cfg, + store: nullStore, + } err := handler.Handle(context.Background(), action, tacker) require.Error(t, err) @@ -105,7 +135,14 @@ func TestPolicyAcked(t *testing.T) { Policy: config, } - handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} + cfg := configuration.DefaultConfiguration() + handler := &handlerPolicyChange{ + log: log, + emitter: emitter.Emitter, + agentInfo: agentInfo, + config: cfg, + store: nullStore, + } err := handler.Handle(context.Background(), action, tacker) require.NoError(t, err) diff --git a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go index 647eae6d4e6..e38685741c3 100644 --- a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go +++ b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go @@ -209,12 +209,17 @@ func newManaged( acker, combinedReporter) + policyChanger := &handlerPolicyChange{ + log: log, + emitter: emit, + agentInfo: agentInfo, + config: cfg, + store: store, + setters: []clientSetter{acker}, + } actionDispatcher.MustRegister( &fleetapi.ActionPolicyChange{}, - &handlerPolicyChange{ - log: log, - emitter: emit, - }, + policyChanger, ) actionDispatcher.MustRegister( @@ -264,6 +269,9 @@ func newManaged( if err != nil { return nil, err } + // add the gateway to setters, so the gateway can be updated + // when the hosts for Kibana are updated by the policy. + policyChanger.setters = append(policyChanger.setters, gateway) managedApplication.gateway = gateway return managedApplication, nil diff --git a/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go b/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go index 65cb27547ff..4325c5ce7a6 100644 --- a/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go @@ -9,11 +9,14 @@ import ( "encoding/json" "testing" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configuration" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configrequest" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/storage" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/composable" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/fleetapi" @@ -34,6 +37,7 @@ func TestManagedModeRouting(t *testing.T) { log, _ := logger.New("") router, _ := newRouter(log, streamFn) agentInfo, _ := info.NewAgentInfo() + nullStore := &storage.NullStore{} composableCtrl, _ := composable.New(log, nil) emit, err := emitter(ctx, log, agentInfo, composableCtrl, router, &configModifiers{Decorators: []decoratorFunc{injectMonitoring}}) require.NoError(t, err) @@ -41,11 +45,15 @@ func TestManagedModeRouting(t *testing.T) { actionDispatcher, err := newActionDispatcher(ctx, log, &handlerDefault{log: log}) require.NoError(t, err) + cfg := configuration.DefaultConfiguration() actionDispatcher.MustRegister( &fleetapi.ActionPolicyChange{}, &handlerPolicyChange{ - log: log, - emitter: emit, + log: log, + emitter: emit, + agentInfo: agentInfo, + config: cfg, + store: nullStore, }, ) diff --git a/x-pack/elastic-agent/pkg/agent/storage/storage.go b/x-pack/elastic-agent/pkg/agent/storage/storage.go index b37c6e06ab3..2435311486a 100644 --- a/x-pack/elastic-agent/pkg/agent/storage/storage.go +++ b/x-pack/elastic-agent/pkg/agent/storage/storage.go @@ -20,7 +20,9 @@ import ( const perms os.FileMode = 0600 -type store interface { +// Store saves the io.Reader. +type Store interface { + // Save the io.Reader. Save(io.Reader) error } @@ -62,12 +64,12 @@ type ReplaceOnSuccessStore struct { target string replaceWith []byte - wrapped store + wrapped Store } // NewReplaceOnSuccessStore takes a target file and a replacement content and will replace the target // file content if the wrapped store execution is done without any error. -func NewReplaceOnSuccessStore(target string, replaceWith []byte, wrapped store) *ReplaceOnSuccessStore { +func NewReplaceOnSuccessStore(target string, replaceWith []byte, wrapped Store) *ReplaceOnSuccessStore { return &ReplaceOnSuccessStore{ target: target, replaceWith: replaceWith, From 53892413e05b63d588e728d3252d145bb4247a59 Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Thu, 8 Oct 2020 09:54:42 +0200 Subject: [PATCH 105/156] chore: add versions 7.1x (#21670) --- .ci/jobs/apm-beats-update.yml | 5 ++++- .ci/jobs/beats.yml | 5 ++++- .ci/jobs/packaging.yml | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.ci/jobs/apm-beats-update.yml b/.ci/jobs/apm-beats-update.yml index 2ae688ffab7..678a9fbcd67 100644 --- a/.ci/jobs/apm-beats-update.yml +++ b/.ci/jobs/apm-beats-update.yml @@ -18,7 +18,7 @@ discover-pr-forks-trust: 'permission' discover-pr-origin: 'merge-current' discover-tags: true - head-filter-regex: '(master|7\.[x789]|8\.\d+|PR-.*|v\d+\.\d+\.\d+)' + head-filter-regex: '(master|7\.[x789]|7\.1\d|8\.\d+|PR-.*|v\d+\.\d+\.\d+)' disable-pr-notifications: true notification-context: 'apm-beats-update' repo: 'beats' @@ -38,6 +38,9 @@ - regex-name: regex: '7\.[x789]' case-sensitive: true + - regex-name: + regex: '7\.1\d' + case-sensitive: true - regex-name: regex: '8\.\d+' case-sensitive: true diff --git a/.ci/jobs/beats.yml b/.ci/jobs/beats.yml index 6f59a9bcdf8..27095b2fecb 100644 --- a/.ci/jobs/beats.yml +++ b/.ci/jobs/beats.yml @@ -17,7 +17,7 @@ discover-pr-forks-strategy: 'merge-current' discover-pr-forks-trust: 'permission' discover-pr-origin: 'merge-current' - head-filter-regex: '(master|7\.[x789]|8\.\d+|PR-.*|v\d+\.\d+\.\d+)' + head-filter-regex: '(master|7\.[x789]|7\.1\d|8\.\d+|PR-.*|v\d+\.\d+\.\d+)' discover-tags: true notification-context: "beats-ci" repo: 'beats' @@ -38,6 +38,9 @@ - regex-name: regex: '7\.[x789]' case-sensitive: true + - regex-name: + regex: '7\.1\d' + case-sensitive: true - regex-name: regex: '8\.\d+' case-sensitive: true diff --git a/.ci/jobs/packaging.yml b/.ci/jobs/packaging.yml index fd6fb9f90c6..baa3ce45035 100644 --- a/.ci/jobs/packaging.yml +++ b/.ci/jobs/packaging.yml @@ -14,7 +14,7 @@ discover-pr-forks-trust: 'permission' discover-pr-origin: 'merge-current' discover-tags: true - head-filter-regex: '(master|7\.[x789]|8\.\d+|PR-.*|v\d+\.\d+\.\d+)' + head-filter-regex: '(master|7\.[x789]|7\.1\d|8\.\d+|PR-.*|v\d+\.\d+\.\d+)' disable-pr-notifications: true notification-context: 'beats-packaging' repo: 'beats' @@ -34,6 +34,9 @@ - regex-name: regex: '7\.[x789]' case-sensitive: true + - regex-name: + regex: '7\.1\d' + case-sensitive: true - regex-name: regex: '8\.\d+' case-sensitive: true From 47546025421fa6cfb3945799968313b18ad82783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Thu, 8 Oct 2020 11:51:10 +0200 Subject: [PATCH 106/156] Fix flaky FSWatch/FSScanner tests (#21625) ## What does this PR do? Unit tests in for `fswatch.go` do not depend on the order of the returned events anymore. Closes #21489 --- filebeat/input/filestream/fswatch_test.go | 32 ++++--------------- .../filestream/fswatch_test_non_windows.go | 2 +- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go index d6286a273eb..2435fad1500 100644 --- a/filebeat/input/filestream/fswatch_test.go +++ b/filebeat/input/filestream/fswatch_test.go @@ -38,8 +38,6 @@ var ( ) func TestFileScanner(t *testing.T) { - t.Skip("Flaky test: https://github.com/elastic/beats/issues/21489") - testCases := map[string]struct { paths []string excludedFiles []match.Matcher @@ -89,7 +87,7 @@ func TestFileScanner(t *testing.T) { for p, _ := range files { paths = append(paths, p) } - assert.True(t, checkIfSameContents(test.expectedFiles, paths)) + assert.ElementsMatch(t, paths, test.expectedFiles) }) } } @@ -116,26 +114,7 @@ func removeFilesOfScannerTest(t *testing.T) { } } -// only handles sets -func checkIfSameContents(one, other []string) bool { - if len(one) != len(other) { - return false - } - - mustFind := len(one) - for _, oneElem := range one { - for _, otherElem := range other { - if oneElem == otherElem { - mustFind-- - } - } - } - return mustFind == 0 -} - func TestFileWatchNewDeleteModified(t *testing.T) { - t.Skip("Flaky test: https://github.com/elastic/beats/issues/21489") - oldTs := time.Now() newTs := oldTs.Add(5 * time.Second) testCases := map[string]struct { @@ -226,10 +205,13 @@ func TestFileWatchNewDeleteModified(t *testing.T) { go w.watch(context.Background()) - for _, expectedEvent := range test.expectedEvents { - evt := w.Event() - assert.Equal(t, expectedEvent, evt) + count := len(test.expectedEvents) + actual := make([]loginp.FSEvent, count) + for i := 0; i < count; i++ { + actual[i] = w.Event() } + + assert.ElementsMatch(t, actual, test.expectedEvents) }) } } diff --git a/filebeat/input/filestream/fswatch_test_non_windows.go b/filebeat/input/filestream/fswatch_test_non_windows.go index eecfeddf930..3c316efdfc9 100644 --- a/filebeat/input/filestream/fswatch_test_non_windows.go +++ b/filebeat/input/filestream/fswatch_test_non_windows.go @@ -88,7 +88,7 @@ func TestFileScannerSymlinks(t *testing.T) { for p, _ := range files { paths = append(paths, p) } - assert.Equal(t, test.expectedFiles, paths) + assert.ElementsMatch(t, test.expectedFiles, paths) }) } } From 1f29969264b64cbcfa09df86ffc228161d4d2e3f Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 8 Oct 2020 10:57:41 +0100 Subject: [PATCH 107/156] Docker build resiliance with a retry (#21587) --- dev-tools/mage/integtest_docker.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dev-tools/mage/integtest_docker.go b/dev-tools/mage/integtest_docker.go index 2ed09db711e..8b366bad315 100644 --- a/dev-tools/mage/integtest_docker.go +++ b/dev-tools/mage/integtest_docker.go @@ -27,6 +27,7 @@ import ( "runtime" "strings" "sync" + "time" "github.com/pkg/errors" @@ -246,5 +247,17 @@ func dockerComposeBuildImages() error { os.Stderr, "docker-compose", args..., ) + + // This sleep is to avoid hitting the docker build issues when resources are not available. + if err != nil { + fmt.Println(">> Building docker images again") + time.Sleep(10) + _, err = sh.Exec( + composeEnv, + out, + os.Stderr, + "docker-compose", args..., + ) + } return err } From f344a6769eaa04c6f3fc960551b5b8a8fa8100c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Thu, 8 Oct 2020 13:16:16 +0200 Subject: [PATCH 108/156] [CI: Packaging] fix: push ubi8 images too (#21621) * fix: push ubi8 images too * chore: enhance retries Co-authored-by: Victor Martinez * chore: use variables in log * chore: add "-oss" images Co-authored-by: Victor Martinez --- .ci/packaging.groovy | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/.ci/packaging.groovy b/.ci/packaging.groovy index 26916372b70..81ff5b1994a 100644 --- a/.ci/packaging.groovy +++ b/.ci/packaging.groovy @@ -198,17 +198,30 @@ def tagAndPush(name){ tagName = "pr-${env.CHANGE_ID}" } - def oldName = "${DOCKER_REGISTRY}/beats/${name}:${libbetaVer}" - def newName = "${DOCKER_REGISTRY}/observability-ci/${name}:${tagName}" - def commitName = "${DOCKER_REGISTRY}/observability-ci/${name}:${env.GIT_BASE_COMMIT}" dockerLogin(secret: "${DOCKERELASTIC_SECRET}", registry: "${DOCKER_REGISTRY}") - retry(3){ - sh(label:'Change tag and push', script: """ - docker tag ${oldName} ${newName} - docker push ${newName} - docker tag ${oldName} ${commitName} - docker push ${commitName} - """) + + // supported image flavours + def variants = ["", "-oss", "-ubi8"] + variants.each { variant -> + def oldName = "${DOCKER_REGISTRY}/beats/${name}${variant}:${libbetaVer}" + def newName = "${DOCKER_REGISTRY}/observability-ci/${name}${variant}:${tagName}" + def commitName = "${DOCKER_REGISTRY}/observability-ci/${name}${variant}:${env.GIT_BASE_COMMIT}" + + def iterations = 0 + retryWithSleep(retries: 3, seconds: 5, backoff: true) + iterations++ + def status = sh(label:'Change tag and push', script: """ + docker tag ${oldName} ${newName} + docker push ${newName} + docker tag ${oldName} ${commitName} + docker push ${commitName} + """, returnStatus: true) + if ( status > 0 && iterations < 3) { + error('tag and push failed, retry') + } else if ( status > 0 ) { + log(level: 'WARN', text: "${name} doesn't have ${variant} docker images. See https://github.com/elastic/beats/pull/21621") + } + } } } From d5e89d961ade56b5edf1fe5059e15e64f6426071 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 8 Oct 2020 12:16:53 +0100 Subject: [PATCH 109/156] backport: add 7.10 branch (#21635) --- .backportrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.backportrc.json b/.backportrc.json index 3dce189d671..8bfd891160c 100644 --- a/.backportrc.json +++ b/.backportrc.json @@ -1,6 +1,6 @@ { "upstream": "elastic/beats", - "branches": [{ "name": "7.9"}, { "name": "7.8"}, { "name": "7.7"}, { "name": "7.x"}], + "branches": [ { "name": "7.x", "checked": true }, "7.10", "7.9", "7.8", "7.7"], "labels": ["backport"], "autoAssign": true, "prTitle": "Cherry-pick to {targetBranch}: {commitMessages}" From df03addd29f2d051ea54c55ba10273eaf44d2bfa Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Thu, 8 Oct 2020 14:10:28 +0200 Subject: [PATCH 110/156] Skip publisher flaky tests (#21657) --- libbeat/publisher/pipeline/controller_test.go | 8 +++++--- libbeat/publisher/pipeline/output_test.go | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libbeat/publisher/pipeline/controller_test.go b/libbeat/publisher/pipeline/controller_test.go index fba98018894..1e400476a30 100644 --- a/libbeat/publisher/pipeline/controller_test.go +++ b/libbeat/publisher/pipeline/controller_test.go @@ -31,7 +31,8 @@ import ( "github.com/elastic/beats/v7/libbeat/publisher" "github.com/elastic/beats/v7/libbeat/publisher/queue" "github.com/elastic/beats/v7/libbeat/publisher/queue/memqueue" - "github.com/elastic/beats/v7/libbeat/tests/resources" + + //"github.com/elastic/beats/v7/libbeat/tests/resources" "github.com/stretchr/testify/require" ) @@ -46,8 +47,9 @@ func TestOutputReload(t *testing.T) { t.Run(name, func(t *testing.T) { testutil.SeedPRNG(t) - goroutines := resources.NewGoroutinesChecker() - defer goroutines.Check(t) + // Flaky check: https://github.com/elastic/beats/issues/21656 + //goroutines := resources.NewGoroutinesChecker() + //defer goroutines.Check(t) err := quick.Check(func(q uint) bool { numEventsToPublish := 15000 + (q % 500) // 15000 to 19999 diff --git a/libbeat/publisher/pipeline/output_test.go b/libbeat/publisher/pipeline/output_test.go index 5be34fa9436..7bde6e137ab 100644 --- a/libbeat/publisher/pipeline/output_test.go +++ b/libbeat/publisher/pipeline/output_test.go @@ -95,6 +95,8 @@ func TestMakeClientWorker(t *testing.T) { } func TestReplaceClientWorker(t *testing.T) { + t.Skip("Flaky test: https://github.com/elastic/beats/issues/17965") + tests := map[string]func(mockPublishFn) outputs.Client{ "client": newMockClient, "network_client": newMockNetworkClient, From 38c6a7026c5eaf419fc2f000f6b3b5cab9105f16 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 8 Oct 2020 14:08:57 +0100 Subject: [PATCH 111/156] [CI] Support Windows-2016 in pipeline 2.0 (#21337) --- .ci/jobs/beats-windows-mbp.yml | 56 -- .ci/windows.groovy | 874 --------------------------- auditbeat/Jenkinsfile.yml | 11 + filebeat/Jenkinsfile.yml | 1 + heartbeat/Jenkinsfile.yml | 11 + metricbeat/Jenkinsfile.yml | 11 + packetbeat/Jenkinsfile.yml | 11 + winlogbeat/Jenkinsfile.yml | 11 + x-pack/auditbeat/Jenkinsfile.yml | 11 + x-pack/elastic-agent/Jenkinsfile.yml | 11 + x-pack/filebeat/Jenkinsfile.yml | 11 + x-pack/functionbeat/Jenkinsfile.yml | 11 + x-pack/metricbeat/Jenkinsfile.yml | 11 + x-pack/packetbeat/Jenkinsfile.yml | 11 + x-pack/winlogbeat/Jenkinsfile.yml | 11 + 15 files changed, 133 insertions(+), 930 deletions(-) delete mode 100644 .ci/jobs/beats-windows-mbp.yml delete mode 100644 .ci/windows.groovy diff --git a/.ci/jobs/beats-windows-mbp.yml b/.ci/jobs/beats-windows-mbp.yml deleted file mode 100644 index 7ea26c9ba18..00000000000 --- a/.ci/jobs/beats-windows-mbp.yml +++ /dev/null @@ -1,56 +0,0 @@ ---- -- job: - name: Beats/beats-windows-mbp - display-name: Beats Pipeline for Windows - description: Jenkins pipeline for the Beats project running on windows agents. - view: Beats - project-type: multibranch - script-path: .ci/windows.groovy - scm: - - github: - branch-discovery: no-pr - discover-pr-forks-strategy: merge-current - discover-pr-forks-trust: permission - discover-pr-origin: merge-current - discover-tags: false - # Run MBP for the master branch and PRs - head-filter-regex: '(master|PR-.*)' - notification-context: 'beats-ci/windows' - repo: beats - repo-owner: elastic - credentials-id: github-app-beats-ci - ssh-checkout: - credentials: f6c7695a-671e-4f4f-a331-acdce44ff9ba - build-strategies: - - tags: - ignore-tags-older-than: -1 - ignore-tags-newer-than: -1 - - regular-branches: true - - change-request: - ignore-target-only-changes: true - property-strategies: - # Builds for PRs won't be triggered automatically. - # Only the master branch will be triggered automatically. - named-branches: - defaults: - - suppress-scm-triggering: true - exceptions: - - exception: - branch-name: master - properties: - - suppress-scm-triggering: false - clean: - after: true - before: true - prune: true - shallow-clone: true - depth: 10 - do-not-fetch-tags: true - submodule: - disable: false - recursive: true - parent-credentials: true - timeout: 100 - timeout: '15' - use-author: true - wipe-workspace: 'True' diff --git a/.ci/windows.groovy b/.ci/windows.groovy deleted file mode 100644 index 92826e80926..00000000000 --- a/.ci/windows.groovy +++ /dev/null @@ -1,874 +0,0 @@ -#!/usr/bin/env groovy - -@Library('apm@current') _ - -import groovy.transform.Field - -/** - This is required to store the stashed id with the test results to be digested with runbld -*/ -@Field def stashedTestReports = [:] - -/** - List of supported windows versions to be tested with - NOTE: - - 'windows-10' is too slow - - 'windows-2012-r2', 'windows-2008-r2', 'windows-7', 'windows-7-32-bit' are disabled - since we are working on releasing each windows version incrementally. -*/ -@Field def windowsVersions = ['windows-2019', 'windows-2016', 'windows-2012-r2'] - -pipeline { - agent { label 'ubuntu && immutable' } - environment { - BASE_DIR = 'src/github.com/elastic/beats' - GOX_FLAGS = "-arch amd64" - DOCKER_COMPOSE_VERSION = "1.21.0" - TERRAFORM_VERSION = "0.12.24" - PIPELINE_LOG_LEVEL = "INFO" - DOCKERELASTIC_SECRET = 'secret/observability-team/ci/docker-registry/prod' - DOCKER_REGISTRY = 'docker.elastic.co' - AWS_ACCOUNT_SECRET = 'secret/observability-team/ci/elastic-observability-aws-account-auth' - RUNBLD_DISABLE_NOTIFICATIONS = 'true' - JOB_GCS_BUCKET = 'beats-ci-temp' - JOB_GCS_CREDENTIALS = 'beats-ci-gcs-plugin' - } - options { - timeout(time: 2, unit: 'HOURS') - buildDiscarder(logRotator(numToKeepStr: '20', artifactNumToKeepStr: '20', daysToKeepStr: '30')) - timestamps() - ansiColor('xterm') - disableResume() - durabilityHint('PERFORMANCE_OPTIMIZED') - quietPeriod(10) - rateLimitBuilds(throttle: [count: 60, durationName: 'hour', userBoost: true]) - } - triggers { - issueCommentTrigger('(?i).*(?:jenkins\\W+)?run\\W+(?:the\\W+)?tests(?:\\W+please)?.*') - } - parameters { - booleanParam(name: 'runAllStages', defaultValue: false, description: 'Allow to run all stages.') - booleanParam(name: 'windowsTest', defaultValue: true, description: 'Allow Windows stages.') - booleanParam(name: 'macosTest', defaultValue: true, description: 'Allow macOS stages.') - - booleanParam(name: 'allCloudTests', defaultValue: false, description: 'Run all cloud integration tests.') - booleanParam(name: 'awsCloudTests', defaultValue: false, description: 'Run AWS cloud integration tests.') - string(name: 'awsRegion', defaultValue: 'eu-central-1', description: 'Default AWS region to use for testing.') - - booleanParam(name: 'debug', defaultValue: false, description: 'Allow debug logging for Jenkins steps') - booleanParam(name: 'dry_run', defaultValue: false, description: 'Skip build steps, it is for testing pipeline flow') - } - stages { - /** - Checkout the code and stash it, to use it on other stages. - */ - stage('Checkout') { - options { skipDefaultCheckout() } - steps { - pipelineManager([ cancelPreviousRunningBuilds: [ when: 'PR' ] ]) - deleteDir() - gitCheckout(basedir: "${BASE_DIR}", githubNotifyFirstTimeContributor: true) - stashV2(name: 'source', bucket: "${JOB_GCS_BUCKET}", credentialsId: "${JOB_GCS_CREDENTIALS}") - dir("${BASE_DIR}"){ - loadConfigEnvVars() - } - whenTrue(params.debug){ - dumpFilteredEnvironment() - } - } - } - stage('Lint'){ - options { skipDefaultCheckout() } - steps { - // NOTE: commented to run the windows pipeline a bit faster. - // when required then it can be enabled. - // makeTarget("Lint", "check") - echo 'SKIPPED' - } - } - stage('Build and Test Windows'){ - failFast false - parallel { - stage('Elastic Agent x-pack Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_ELASTIC_AGENT_XPACK != "false" && params.windowsTest - } - } - steps { - mageTargetWin("Elastic Agent x-pack Windows Unit test", "x-pack/elastic-agent", "build unitTest") - } - } - stage('Filebeat Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_FILEBEAT != "false" && params.windowsTest - } - } - steps { - mageTargetWin("Filebeat oss Windows Unit test", "filebeat", "build unitTest") - } - } - stage('Filebeat x-pack Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_FILEBEAT_XPACK != "false" && params.windowsTest - } - } - steps { - mageTargetWin("Filebeat x-pack Windows", "x-pack/filebeat", "build unitTest") - } - } - stage('Heartbeat'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_HEARTBEAT != "false" - } - } - stages { - stage('Heartbeat Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - } - } - steps { - mageTargetWin("Heartbeat oss Windows Unit test", "heartbeat", "build unitTest") - } - } - } - } - stage('Auditbeat oss Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_AUDITBEAT != "false" && params.windowsTest - } - } - steps { - mageTargetWin("Auditbeat oss Windows Unit test", "auditbeat", "build unitTest") - } - } - stage('Auditbeat x-pack Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_AUDITBEAT_XPACK != "false" && params.windowsTest - } - } - steps { - mageTargetWin("Auditbeat x-pack Windows", "x-pack/auditbeat", "build unitTest") - } - } - stage('Metricbeat Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_METRICBEAT != "false" && params.windowsTest - } - } - steps { - mageTargetWin("Metricbeat Windows Unit test", "metricbeat", "build unitTest") - } - } - stage('Metricbeat x-pack Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_METRICBEAT_XPACK != "false" && params.windowsTest - } - } - steps { - mageTargetWin("Metricbeat x-pack Windows", "x-pack/metricbeat", "build unitTest") - } - } - stage('Winlogbeat'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_WINLOGBEAT != "false" - } - } - stages { - stage('Winlogbeat Windows'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - } - } - steps { - mageTargetWin("Winlogbeat Windows Unit test", "winlogbeat", "build unitTest") - } - } - } - } - stage('Winlogbeat Windows x-pack'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return params.windowsTest && env.BUILD_WINLOGBEAT_XPACK != "false" - } - } - steps { - mageTargetWin("Winlogbeat x-pack Windows", "x-pack/winlogbeat", "build unitTest") - } - } - stage('Functionbeat'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - // NOTE: commented to run all the windows stages. - //return env.BUILD_FUNCTIONBEAT_XPACK != "false" - } - } - stages { - stage('Functionbeat Windows x-pack'){ - options { skipDefaultCheckout() } - when { - beforeAgent true - expression { - return params.windowsTest - } - } - steps { - mageTargetWin("Functionbeat x-pack Windows Unit test", "x-pack/functionbeat", "build unitTest") - } - } - } - } - } - } - } - post { - always { - runbld() - } - cleanup { - notifyBuildResult(prComment: true) - } - } -} - -def delete() { - dir("${env.BASE_DIR}") { - fixPermissions("${WORKSPACE}") - } - deleteDir() -} - -def fixPermissions(location) { - sh(label: 'Fix permissions', script: """#!/usr/bin/env bash - source ./dev-tools/common.bash - docker_setup - script/fix_permissions.sh ${location}""", returnStatus: true) -} - -def makeTarget(String context, String target, boolean clean = true) { - withGithubNotify(context: "${context}") { - withBeatsEnv(true) { - whenTrue(params.debug) { - dumpFilteredEnvironment() - dumpMage() - } - sh(label: "Make ${target}", script: "make ${target}") - whenTrue(clean) { - fixPermissions("${HOME}") - } - } - } -} - -def mageTarget(String context, String directory, String target) { - withGithubNotify(context: "${context}") { - withBeatsEnv(true) { - whenTrue(params.debug) { - dumpFilteredEnvironment() - dumpMage() - } - - def verboseFlag = params.debug ? "-v" : "" - dir(directory) { - sh(label: "Mage ${target}", script: "mage ${verboseFlag} ${target}") - } - } - } -} - -def mageTargetWin(String context, String directory, String target) { - withGithubNotify(context: "${context}") { - def tasks = [:] - windowsVersions.each { os -> - tasks["${context}-${os}"] = mageTargetWin(context, directory, target, os) - } - parallel(tasks) - } -} - -def mageTargetWin(String context, String directory, String target, String label) { - return { - log(level: 'INFO', text: "context=${context} directory=${directory} target=${target} os=${label}") - def immutable = label.equals('windows-7-32-bit') ? 'windows-immutable-32-bit' : 'windows-immutable' - - // NOTE: skip filebeat with windows-2016/2012-r2 since there are some test failures. - // See https://github.com/elastic/beats/issues/19787 https://github.com/elastic/beats/issues/19641 - if (directory.equals('filebeat') && (label.equals('windows-2016') || label.equals('windows-2012-r2'))) { - log(level: 'WARN', text: "Skipped stage for the 'filebeat' with '${label}' as long as there are test failures to be analysed.") - } else { - node("${immutable} && ${label}"){ - withBeatsEnvWin() { - whenTrue(params.debug) { - dumpFilteredEnvironment() - dumpMageWin() - } - - def verboseFlag = params.debug ? "-v" : "" - dir(directory) { - bat(label: "Mage ${target}", script: "mage ${verboseFlag} ${target}") - } - } - } - } - } -} - -def withBeatsEnv(boolean archive, Closure body) { - def os = goos() - def goRoot = "${env.WORKSPACE}/.gvm/versions/go${GO_VERSION}.${os}.amd64" - - withEnv([ - "HOME=${env.WORKSPACE}", - "GOPATH=${env.WORKSPACE}", - "GOROOT=${goRoot}", - "PATH=${env.WORKSPACE}/bin:${goRoot}/bin:${env.PATH}", - "MAGEFILE_CACHE=${WORKSPACE}/.magefile", - "TEST_COVERAGE=true", - "RACE_DETECTOR=true", - "PYTHON_ENV=${WORKSPACE}/python-env", - "TEST_TAGS=${env.TEST_TAGS},oracle", - "DOCKER_PULL=0", - ]) { - deleteDir() - unstashV2(name: 'source', bucket: "${JOB_GCS_BUCKET}", credentialsId: "${JOB_GCS_CREDENTIALS}") - if(isDockerInstalled()){ - dockerLogin(secret: "${DOCKERELASTIC_SECRET}", registry: "${DOCKER_REGISTRY}") - } - dir("${env.BASE_DIR}") { - installTools() - // TODO (2020-04-07): This is a work-around to fix the Beat generator tests. - // See https://github.com/elastic/beats/issues/17787. - setGitConfig() - try { - if(!params.dry_run){ - body() - } - } finally { - if (archive) { - catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') { - junitAndStore(allowEmptyResults: true, keepLongStdio: true, testResults: "**/build/TEST*.xml") - archiveArtifacts(allowEmptyArchive: true, artifacts: '**/build/TEST*.out') - } - } - reportCoverage() - } - } - } -} - -def withBeatsEnvWin(Closure body) { - final String chocoPath = 'C:\\ProgramData\\chocolatey\\bin' - final String chocoPython3Path = 'C:\\Python38;C:\\Python38\\Scripts' - // NOTE: to support Windows 7 32 bits the arch in the go context path is required. - def arch = is32bit() ? '386' : 'amd64' - def goRoot = "${env.USERPROFILE}\\.gvm\\versions\\go${GO_VERSION}.windows.${arch}" - - withEnv([ - "HOME=${env.WORKSPACE}", - "DEV_ARCH=${arch}", - "DEV_OS=windows", - "GOPATH=${env.WORKSPACE}", - "GOROOT=${goRoot}", - "PATH=${env.WORKSPACE}\\bin;${goRoot}\\bin;${chocoPath};${chocoPython3Path};C:\\tools\\mingw64\\bin;${env.PATH}", - "MAGEFILE_CACHE=${env.WORKSPACE}\\.magefile", - "TEST_COVERAGE=true", - "RACE_DETECTOR=true", - ]){ - deleteDir() - unstashV2(name: 'source', bucket: "${JOB_GCS_BUCKET}", credentialsId: "${JOB_GCS_CREDENTIALS}") - dir("${env.BASE_DIR}"){ - installTools() - try { - if(!params.dry_run){ - body() - } - } finally { - catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') { - junitAndStore(allowEmptyResults: true, keepLongStdio: true, testResults: "**\\build\\TEST*.xml") - archiveArtifacts(allowEmptyArchive: true, artifacts: '**\\build\\TEST*.out') - } - } - } - } -} - -def installTools() { - def i = 2 // Number of retries - if(isUnix()) { - retry(i) { sh(label: "Install Go ${GO_VERSION}", script: ".ci/scripts/install-go.sh") } - retry(i) { sh(label: "Install docker-compose ${DOCKER_COMPOSE_VERSION}", script: ".ci/scripts/install-docker-compose.sh") } - retry(i) { sh(label: "Install Terraform ${TERRAFORM_VERSION}", script: ".ci/scripts/install-terraform.sh") } - retry(i) { sh(label: "Install Mage", script: "make mage") } - } else { - retry(i) { bat(label: "Install Go/Mage/Python ${GO_VERSION}", script: ".ci/scripts/install-tools.bat") } - } -} - -def is32bit(){ - def labels = env.NODE_LABELS - return labels.contains('i386') -} - -def goos(){ - def labels = env.NODE_LABELS - - if (labels.contains('linux')) { - return 'linux' - } else if (labels.contains('windows')) { - return 'windows' - } else if (labels.contains('darwin')) { - return 'darwin' - } - - error("Unhandled OS name in NODE_LABELS: " + labels) -} - -def dumpMage(){ - echo "### MAGE DUMP ###" - sh(label: "Dump mage variables", script: "mage dumpVariables") - echo "### END MAGE DUMP ###" -} - -def dumpMageWin(){ - echo "### MAGE DUMP ###" - bat(label: "Dump mage variables", script: "mage dumpVariables") - echo "### END MAGE DUMP ###" -} - -def dumpFilteredEnvironment(){ - echo "### ENV DUMP ###" - echo "PATH: ${env.PATH}" - echo "HOME: ${env.HOME}" - echo "USERPROFILE: ${env.USERPROFILE}" - echo "BUILD_DIR: ${env.BUILD_DIR}" - echo "COVERAGE_DIR: ${env.COVERAGE_DIR}" - echo "BEATS: ${env.BEATS}" - echo "PROJECTS: ${env.PROJECTS}" - echo "PROJECTS_ENV: ${env.PROJECTS_ENV}" - echo "PYTHON_ENV: ${env.PYTHON_ENV}" - echo "PYTHON_EXE: ${env.PYTHON_EXE}" - echo "PYTHON_ENV_EXE: ${env.PYTHON_ENV_EXE}" - echo "VENV_PARAMS: ${env.VENV_PARAMS}" - echo "FIND: ${env.FIND}" - echo "GOLINT: ${env.GOLINT}" - echo "GOLINT_REPO: ${env.GOLINT_REPO}" - echo "REVIEWDOG: ${env.REVIEWDOG}" - echo "REVIEWDOG_OPTIONS: ${env.REVIEWDOG_OPTIONS}" - echo "REVIEWDOG_REPO: ${env.REVIEWDOG_REPO}" - echo "XPACK_SUFFIX: ${env.XPACK_SUFFIX}" - echo "PKG_BUILD_DIR: ${env.PKG_BUILD_DIR}" - echo "PKG_UPLOAD_DIR: ${env.PKG_UPLOAD_DIR}" - echo "COVERAGE_TOOL: ${env.COVERAGE_TOOL}" - echo "COVERAGE_TOOL_REPO: ${env.COVERAGE_TOOL_REPO}" - echo "TESTIFY_TOOL_REPO: ${env.TESTIFY_TOOL_REPO}" - echo "NOW: ${env.NOW}" - echo "GOBUILD_FLAGS: ${env.GOBUILD_FLAGS}" - echo "GOIMPORTS: ${env.GOIMPORTS}" - echo "GOIMPORTS_REPO: ${env.GOIMPORTS_REPO}" - echo "GOIMPORTS_LOCAL_PREFIX: ${env.GOIMPORTS_LOCAL_PREFIX}" - echo "PROCESSES: ${env.PROCESSES}" - echo "TIMEOUT: ${env.TIMEOUT}" - echo "PYTHON_TEST_FILES: ${env.PYTHON_TEST_FILES}" - echo "PYTEST_ADDOPTS: ${env.PYTEST_ADDOPTS}" - echo "PYTEST_OPTIONS: ${env.PYTEST_OPTIONS}" - echo "TEST_ENVIRONMENT: ${env.TEST_ENVIRONMENT}" - echo "SYSTEM_TESTS: ${env.SYSTEM_TESTS}" - echo "STRESS_TESTS: ${env.STRESS_TESTS}" - echo "STRESS_TEST_OPTIONS: ${env.STRESS_TEST_OPTIONS}" - echo "TEST_TAGS: ${env.TEST_TAGS}" - echo "GOX_OS: ${env.GOX_OS}" - echo "GOX_OSARCH: ${env.GOX_OSARCH}" - echo "GOX_FLAGS: ${env.GOX_FLAGS}" - echo "TESTING_ENVIRONMENT: ${env.TESTING_ENVIRONMENT}" - echo "BEAT_VERSION: ${env.BEAT_VERSION}" - echo "COMMIT_ID: ${env.COMMIT_ID}" - echo "DOCKER_COMPOSE_PROJECT_NAME: ${env.DOCKER_COMPOSE_PROJECT_NAME}" - echo "DOCKER_COMPOSE: ${env.DOCKER_COMPOSE}" - echo "DOCKER_CACHE: ${env.DOCKER_CACHE}" - echo "GOPACKAGES_COMMA_SEP: ${env.GOPACKAGES_COMMA_SEP}" - echo "PIP_INSTALL_PARAMS: ${env.PIP_INSTALL_PARAMS}" - echo "### END ENV DUMP ###" -} - -def k8sTest(versions){ - versions.each{ v -> - stage("k8s ${v}"){ - withEnv(["K8S_VERSION=${v}", "KIND_VERSION=v0.7.0", "KUBECONFIG=${env.WORKSPACE}/kubecfg"]){ - withGithubNotify(context: "K8s ${v}") { - withBeatsEnv(false) { - sh(label: "Install kind", script: ".ci/scripts/install-kind.sh") - sh(label: "Install kubectl", script: ".ci/scripts/install-kubectl.sh") - sh(label: "Setup kind", script: ".ci/scripts/kind-setup.sh") - sh(label: "Integration tests", script: "MODULE=kubernetes make -C metricbeat integration-tests") - sh(label: "Deploy to kubernetes",script: "make -C deploy/kubernetes test") - sh(label: 'Delete cluster', script: 'kind delete cluster') - } - } - } - } - } -} - -def reportCoverage(){ - catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') { - retry(2){ - sh(label: 'Report to Codecov', script: ''' - curl -sSLo codecov https://codecov.io/bash - for i in auditbeat filebeat heartbeat libbeat metricbeat packetbeat winlogbeat journalbeat - do - FILE="${i}/build/coverage/full.cov" - if [ -f "${FILE}" ]; then - bash codecov -f "${FILE}" - fi - done - ''') - } - } -} - -// isChanged treats the patterns as regular expressions. In order to check if -// any file in a directoy is modified use `^/.*`. -def isChanged(patterns){ - return ( - params.runAllStages - || isGitRegionMatch(patterns: patterns, comparator: 'regexp') - ) -} - -def isChangedOSSCode(patterns) { - def allPatterns = [ - "^Jenkinsfile", - "^go.mod", - "^libbeat/.*", - "^testing/.*", - "^dev-tools/.*", - "^\\.ci/scripts/.*", - ] - allPatterns.addAll(patterns) - return isChanged(allPatterns) -} - -def isChangedXPackCode(patterns) { - def allPatterns = [ - "^Jenkinsfile", - "^go.mod", - "^libbeat/.*", - "^dev-tools/.*", - "^testing/.*", - "^x-pack/libbeat/.*", - "^\\.ci/scripts/.*", - ] - allPatterns.addAll(patterns) - return isChanged(allPatterns) -} - -// withCloudTestEnv executes a closure with credentials for cloud test -// environments. -def withCloudTestEnv(Closure body) { - def maskedVars = [] - def testTags = "${env.TEST_TAGS}" - - // AWS - if (params.allCloudTests || params.awsCloudTests) { - testTags = "${testTags},aws" - def aws = getVaultSecret(secret: "${AWS_ACCOUNT_SECRET}").data - if (!aws.containsKey('access_key')) { - error("${AWS_ACCOUNT_SECRET} doesn't contain 'access_key'") - } - if (!aws.containsKey('secret_key')) { - error("${AWS_ACCOUNT_SECRET} doesn't contain 'secret_key'") - } - maskedVars.addAll([ - [var: "AWS_REGION", password: params.awsRegion], - [var: "AWS_ACCESS_KEY_ID", password: aws.access_key], - [var: "AWS_SECRET_ACCESS_KEY", password: aws.secret_key], - ]) - } - - withEnv([ - "TEST_TAGS=${testTags}", - ]) { - withEnvMask(vars: maskedVars) { - body() - } - } -} - -def terraformInit(String directory) { - dir(directory) { - sh(label: "Terraform Init on ${directory}", script: "terraform init") - } -} - -def terraformApply(String directory) { - terraformInit(directory) - dir(directory) { - sh(label: "Terraform Apply on ${directory}", script: "terraform apply -auto-approve") - } -} - -// Start testing environment on cloud using terraform. Terraform files are -// stashed so they can be used by other stages. They are also archived in -// case manual cleanup is needed. -// -// Example: -// startCloudTestEnv('x-pack-metricbeat', [ -// [cond: params.awsCloudTests, dir: 'x-pack/metricbeat/module/aws'], -// ]) -// ... -// terraformCleanup('x-pack-metricbeat', 'x-pack/metricbeat') -def startCloudTestEnv(String name, environments = []) { - withCloudTestEnv() { - withBeatsEnv(false) { - def runAll = params.runAllCloudTests - try { - for (environment in environments) { - if (environment.cond || runAll) { - retry(2) { - terraformApply(environment.dir) - } - } - } - } finally { - // Archive terraform states in case manual cleanup is needed. - archiveArtifacts(allowEmptyArchive: true, artifacts: '**/terraform.tfstate') - } - stash(name: "terraform-${name}", allowEmpty: true, includes: '**/terraform.tfstate,**/.terraform/**') - } - } -} - - -// Looks for all terraform states in directory and runs terraform destroy for them, -// it uses terraform states previously stashed by startCloudTestEnv. -def terraformCleanup(String stashName, String directory) { - stage("Remove cloud scenarios in ${directory}"){ - withCloudTestEnv() { - withBeatsEnv(false) { - unstash("terraform-${stashName}") - retry(2) { - sh(label: "Terraform Cleanup", script: ".ci/scripts/terraform-cleanup.sh ${directory}") - } - } - } - } -} - -def loadConfigEnvVars(){ - def empty = [] - env.GO_VERSION = readFile(".go-version").trim() - - withEnv(["HOME=${env.WORKSPACE}"]) { - retry(2) { sh(label: "Install Go ${env.GO_VERSION}", script: ".ci/scripts/install-go.sh") } - } - - // Libbeat is the core framework of Beats. It has no additional dependencies - // on other projects in the Beats repository. - env.BUILD_LIBBEAT = isChangedOSSCode(empty) - env.BUILD_LIBBEAT_XPACK = isChangedXPackCode(empty) - - // Auditbeat depends on metricbeat as framework, but does not include any of - // the modules from Metricbeat. - // The Auditbeat x-pack build contains all functionality from OSS Auditbeat. - env.BUILD_AUDITBEAT = isChangedOSSCode(getVendorPatterns('auditbeat')) - env.BUILD_AUDITBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/auditbeat')) - - // Dockerlogbeat is a standalone Beat that only relies on libbeat. - env.BUILD_DOCKERLOGBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/dockerlogbeat')) - - // Filebeat depends on libbeat only. - // The Filebeat x-pack build contains all functionality from OSS Filebeat. - env.BUILD_FILEBEAT = isChangedOSSCode(getVendorPatterns('filebeat')) - env.BUILD_FILEBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/filebeat')) - - // Metricbeat depends on libbeat only. - // The Metricbeat x-pack build contains all functionality from OSS Metricbeat. - env.BUILD_METRICBEAT = isChangedOSSCode(getVendorPatterns('metricbeat')) - env.BUILD_METRICBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/metricbeat')) - - // Functionbeat is a standalone beat that depends on libbeat only. - // Functionbeat is available as x-pack build only. - env.BUILD_FUNCTIONBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/functionbeat')) - - // Heartbeat depends on libbeat only. - // The Heartbeat x-pack build contains all functionality from OSS Heartbeat. - env.BUILD_HEARTBEAT = isChangedOSSCode(getVendorPatterns('heartbeat')) - env.BUILD_HEARTBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/heartbeat')) - - // Journalbeat depends on libbeat only. - // The Journalbeat x-pack build contains all functionality from OSS Journalbeat. - env.BUILD_JOURNALBEAT = isChangedOSSCode(getVendorPatterns('journalbeat')) - env.BUILD_JOURNALBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/journalbeat')) - - // Packetbeat depends on libbeat only. - // The Packetbeat x-pack build contains all functionality from OSS Packetbeat. - env.BUILD_PACKETBEAT = isChangedOSSCode(getVendorPatterns('packetbeat')) - env.BUILD_PACKETBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/packetbeat')) - - // Winlogbeat depends on libbeat only. - // The Winlogbeat x-pack build contains all functionality from OSS Winlogbeat. - env.BUILD_WINLOGBEAT = isChangedOSSCode(getVendorPatterns('winlogbeat')) - env.BUILD_WINLOGBEAT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/winlogbeat')) - - // Elastic-agent is a self-contained product, that depends on libbeat only. - // The agent acts as a supervisor for other Beats like Filebeat or Metricbeat. - // The agent is available as x-pack build only. - env.BUILD_ELASTIC_AGENT_XPACK = isChangedXPackCode(getVendorPatterns('x-pack/elastic-agent')) - - // The Kubernetes test use Filebeat and Metricbeat, but only need to be run - // if the deployment scripts have been updated. No Beats specific testing is - // involved. - env.BUILD_KUBERNETES = isChanged(["^deploy/kubernetes/.*"]) - - def generatorPatterns = ['^generator/.*'] - generatorPatterns.addAll(getVendorPatterns('generator/common/beatgen')) - generatorPatterns.addAll(getVendorPatterns('metricbeat/beater')) - env.BUILD_GENERATOR = isChangedOSSCode(generatorPatterns) - - // Skip all the stages for changes only related to the documentation - env.ONLY_DOCS = isDocChangedOnly() - - // Run the ITs by running only if the changeset affects a specific module. - // For such, it's required to look for changes under the module folder and exclude anything else - // such as ascidoc and png files. - env.MODULE = getGitMatchingGroup(pattern: '[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*', exclude: '^(((?!\\/module\\/).)*$|.*\\.asciidoc|.*\\.png)') -} - -/** - This method verifies if the changeset for the current pull request affect only changes related - to documentation, such as asciidoc and png files. -*/ -def isDocChangedOnly(){ - if (params.runAllStages || !env.CHANGE_ID?.trim()) { - log(level: 'INFO', text: 'Speed build for docs only is disabled for branches/tags or when forcing with the runAllStages parameter.') - return 'false' - } else { - log(level: "INFO", text: 'Check if the speed build for docs is enabled.') - return isGitRegionMatch(patterns: ['.*\\.(asciidoc|png)'], shouldMatchAll: true) - } -} - -/** - This method grab the dependencies of a Go module and transform them on regexp -*/ -def getVendorPatterns(beatName){ - def os = goos() - def goRoot = "${env.WORKSPACE}/.gvm/versions/go${GO_VERSION}.${os}.amd64" - def output = "" - - withEnv([ - "HOME=${env.WORKSPACE}/${env.BASE_DIR}", - "PATH=${env.WORKSPACE}/bin:${goRoot}/bin:${env.PATH}", - ]) { - output = sh(label: 'Get vendor dependency patterns', returnStdout: true, script: """ - go list -deps ./${beatName} \ - | grep 'elastic/beats' \ - | sed -e "s#github.com/elastic/beats/v7/##g" \ - | awk '{print "^" \$1 "/.*"}' - """) - } - return output?.split('\n').collect{ item -> item as String } -} - -def setGitConfig(){ - sh(label: 'check git config', script: ''' - if [ -z "$(git config --get user.email)" ]; then - git config user.email "beatsmachine@users.noreply.github.com" - git config user.name "beatsmachine" - fi - ''') -} - -def isDockerInstalled(){ - return sh(label: 'check for Docker', script: 'command -v docker', returnStatus: true) -} - -def junitAndStore(Map params = [:]){ - junit(params) - // STAGE_NAME env variable could be null in some cases, so let's use the currentmilliseconds - def stageName = env.STAGE_NAME ? env.STAGE_NAME.replaceAll("[\\W]|_",'-') : "uncategorized-${new java.util.Date().getTime()}" - stash(includes: params.testResults, allowEmpty: true, name: stageName, useDefaultExcludes: true) - stashedTestReports[stageName] = stageName -} - -def runbld() { - catchError(buildResult: 'SUCCESS', message: 'runbld post build action failed.') { - if (stashedTestReports) { - dir("${env.BASE_DIR}") { - sh(label: 'Prepare workspace context', - script: 'find . -type f -name "TEST*.xml" -path "*/build/*" -delete') - // Unstash the test reports - stashedTestReports.each { k, v -> - dir(k) { - unstash(v) - } - } - sh(label: 'Process JUnit reports with runbld', - script: '''\ - cat >./runbld-script < Date: Thu, 8 Oct 2020 15:27:14 +0200 Subject: [PATCH 112/156] Fix function that parses from/to/contact headers (#21672) --- packetbeat/protos/sip/plugin.go | 35 +++++++++++++++++++++------- packetbeat/protos/sip/plugin_test.go | 12 +++++++--- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/packetbeat/protos/sip/plugin.go b/packetbeat/protos/sip/plugin.go index e4cc0364d9a..14b56aeda45 100644 --- a/packetbeat/protos/sip/plugin.go +++ b/packetbeat/protos/sip/plugin.go @@ -499,27 +499,46 @@ func populateBodyFields(m *message, pbf *pb.Fields, fields *ProtocolFields) { func parseFromToContact(fromTo common.NetString) (displayInfo, uri common.NetString, params map[string]common.NetString) { params = make(map[string]common.NetString) - pos := bytes.IndexByte(fromTo, '<') - if pos == -1 { - pos = bytes.IndexByte(fromTo, ' ') - } + fromTo = bytes.TrimSpace(fromTo) + + var uriIsWrapped bool + pos := func() int { + // look for the beginning of a url wrapped in <...> + if pos := bytes.IndexByte(fromTo, '<'); pos > -1 { + uriIsWrapped = true + return pos + } + // if there is no < char, it means there is no display info, and + // that the url starts from the beginning + // https://tools.ietf.org/html/rfc3261#section-20.10 + return 0 + }() displayInfo = bytes.Trim(fromTo[:pos], "'\"\t ") endURIPos := func() int { - if fromTo[pos] == '<' { + if uriIsWrapped { return bytes.IndexByte(fromTo, '>') } return bytes.IndexByte(fromTo, ';') }() + // not wrapped and no header params if endURIPos == -1 { - uri = bytes.TrimRight(fromTo[pos:], ">") - return + uri = fromTo[pos:] + return displayInfo, uri, params } - pos += 1 + + // if wrapped, we want to get over the < char + if uriIsWrapped { + pos += 1 + } + + // if wrapped, we will get the string between <...> + // if not wrapped, we will get the value before the header params (until ;) uri = fromTo[pos:endURIPos] + // parse the header params pos = endURIPos + 1 for _, param := range bytes.Split(fromTo[pos:], []byte(";")) { kv := bytes.SplitN(param, []byte("="), 2) diff --git a/packetbeat/protos/sip/plugin_test.go b/packetbeat/protos/sip/plugin_test.go index fc9ee53aff2..d8c09f5b307 100644 --- a/packetbeat/protos/sip/plugin_test.go +++ b/packetbeat/protos/sip/plugin_test.go @@ -65,11 +65,11 @@ func TestParseFromTo(t *testing.T) { assert.Equal(t, common.NetString(nil), params["tag"]) // From - displayInfo, uri, params = parseFromToContact(common.NetString("\"PCMU/8000\" ;tag=1")) + displayInfo, uri, params = parseFromToContact(common.NetString("\"PCMU/8000\" ;tag=1")) assert.Equal(t, common.NetString("PCMU/8000"), displayInfo) assert.Equal(t, common.NetString("sip:sipp@10.0.2.15:5060"), uri) assert.Equal(t, common.NetString("1"), params["tag"]) - displayInfo, uri, params = parseFromToContact(common.NetString("\"Matthew Hodgson\" ;tag=5c7cdb68")) + displayInfo, uri, params = parseFromToContact(common.NetString(" \"Matthew Hodgson\" ;tag=5c7cdb68")) assert.Equal(t, common.NetString("Matthew Hodgson"), displayInfo) assert.Equal(t, common.NetString("sip:matthew@mxtelecom.com"), uri) assert.Equal(t, common.NetString("5c7cdb68"), params["tag"]) @@ -83,7 +83,7 @@ func TestParseFromTo(t *testing.T) { assert.Equal(t, common.NetString(nil), params["tag"]) // Contact - displayInfo, uri, _ = parseFromToContact(common.NetString("")) + displayInfo, uri, _ = parseFromToContact(common.NetString(" ")) assert.Equal(t, common.NetString(nil), displayInfo) assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060;transport=udp"), uri) displayInfo, uri, params = parseFromToContact(common.NetString(";expires=1200;q=0.500")) @@ -100,6 +100,12 @@ func TestParseFromTo(t *testing.T) { assert.Equal(t, common.NetString("Mr. Watson"), displayInfo) assert.Equal(t, common.NetString("mailto:watson@bell-telephone.com"), uri) assert.Equal(t, common.NetString("0.1"), params["q"]) + + // url is not bounded by <...> + displayInfo, uri, params = parseFromToContact(common.NetString(" sip:test@10.0.2.15:5060;transport=udp")) + assert.Equal(t, common.NetString(nil), displayInfo) + assert.Equal(t, common.NetString("sip:test@10.0.2.15:5060"), uri) + assert.Equal(t, common.NetString("udp"), params["transport"]) } func TestParseUDP(t *testing.T) { From 5b69349d02b3fc92605ccfe796b6dd558fa18846 Mon Sep 17 00:00:00 2001 From: Lee Hinman <57081003+leehinman@users.noreply.github.com> Date: Thu, 8 Oct 2020 09:27:33 -0500 Subject: [PATCH 113/156] [Winlogbeat] Remove brittle configuration validation from wineventlog (#21593) * Remove brittle configuration validation from wineventlog - removed config keys checking - update unit tests Closes #21220 --- winlogbeat/eventlog/eventlogging.go | 5 +--- winlogbeat/eventlog/factory.go | 28 +++---------------- winlogbeat/eventlog/wineventlog.go | 6 +--- .../eventlog/wineventlog_expirimental.go | 2 +- winlogbeat/tests/system/test_eventlogging.py | 19 ------------- winlogbeat/tests/system/test_wineventlog.py | 17 ----------- 6 files changed, 7 insertions(+), 70 deletions(-) diff --git a/winlogbeat/eventlog/eventlogging.go b/winlogbeat/eventlog/eventlogging.go index 963797264b2..01465d933fc 100644 --- a/winlogbeat/eventlog/eventlogging.go +++ b/winlogbeat/eventlog/eventlogging.go @@ -40,9 +40,6 @@ const ( eventLoggingAPIName = "eventlogging" ) -var eventLoggingConfigKeys = common.MakeStringSet(append(commonConfigKeys, - "ignore_older", "read_buffer_size", "format_buffer_size")...) - type eventLoggingConfig struct { ConfigCommon `config:",inline"` IgnoreOlder time.Duration `config:"ignore_older"` @@ -284,7 +281,7 @@ func newEventLogging(options *common.Config) (EventLog, error) { ReadBufferSize: win.MaxEventBufferSize, FormatBufferSize: win.MaxFormatMessageBufferSize, } - if err := readConfig(options, &c, eventLoggingConfigKeys); err != nil { + if err := readConfig(options, &c); err != nil { return nil, err } diff --git a/winlogbeat/eventlog/factory.go b/winlogbeat/eventlog/factory.go index f66c158b2f2..9ee8e0d144f 100644 --- a/winlogbeat/eventlog/factory.go +++ b/winlogbeat/eventlog/factory.go @@ -22,14 +22,9 @@ import ( "sort" "strings" - "github.com/joeshaw/multierror" - "github.com/elastic/beats/v7/libbeat/common" ) -var commonConfigKeys = []string{"type", "api", "name", "fields", "fields_under_root", - "tags", "processors", "index", "id", "meta", "revision"} - // ConfigCommon is the common configuration data used to instantiate a new // EventLog. Each implementation is free to support additional configuration // options. @@ -42,33 +37,18 @@ type validator interface { Validate() error } -func readConfig( - c *common.Config, - config interface{}, - validKeys common.StringSet, -) error { +func readConfig(c *common.Config, config interface{}) error { if err := c.Unpack(config); err != nil { return fmt.Errorf("failed unpacking config. %v", err) } - var errs multierror.Errors - if len(validKeys) > 0 { - // Check for invalid keys. - for _, k := range c.GetFields() { - if !validKeys.Has(k) { - errs = append(errs, fmt.Errorf("invalid event log key '%s' "+ - "found. Valid keys are %s", k, strings.Join(validKeys.ToSlice(), ", "))) - } - } - } - if v, ok := config.(validator); ok { if err := v.Validate(); err != nil { - errs = append(errs, err) + return err } } - return errs.Err() + return nil } // Producer produces a new event log instance for reading event log records. @@ -114,7 +94,7 @@ func New(options *common.Config) (EventLog, error) { } var config ConfigCommon - if err := readConfig(options, &config, nil); err != nil { + if err := readConfig(options, &config); err != nil { return nil, err } diff --git a/winlogbeat/eventlog/wineventlog.go b/winlogbeat/eventlog/wineventlog.go index db00f239974..7ee6c62cf18 100644 --- a/winlogbeat/eventlog/wineventlog.go +++ b/winlogbeat/eventlog/wineventlog.go @@ -47,10 +47,6 @@ const ( winEventLogAPIName = "wineventlog" ) -var winEventLogConfigKeys = common.MakeStringSet(append(commonConfigKeys, - "batch_read_size", "ignore_older", "include_xml", "event_id", "forwarded", - "level", "provider", "no_more_events")...) - type winEventLogConfig struct { ConfigCommon `config:",inline"` BatchReadSize int `config:"batch_read_size"` // Maximum number of events that Read will return. @@ -366,7 +362,7 @@ func (l *winEventLog) buildRecordFromXML(x []byte, recoveredErr error) (Record, // using the Windows Event Log. func newWinEventLog(options *common.Config) (EventLog, error) { c := defaultWinEventLogConfig - if err := readConfig(options, &c, winEventLogConfigKeys); err != nil { + if err := readConfig(options, &c); err != nil { return nil, err } diff --git a/winlogbeat/eventlog/wineventlog_expirimental.go b/winlogbeat/eventlog/wineventlog_expirimental.go index 5952aad0f5a..301b2cf4f0b 100644 --- a/winlogbeat/eventlog/wineventlog_expirimental.go +++ b/winlogbeat/eventlog/wineventlog_expirimental.go @@ -243,7 +243,7 @@ func newWinEventLogExp(options *common.Config) (EventLog, error) { cfgwarn.Experimental("The %s event log reader is experimental.", winEventLogExpAPIName) c := winEventLogConfig{BatchReadSize: 512} - if err := readConfig(options, &c, winEventLogConfigKeys); err != nil { + if err := readConfig(options, &c); err != nil { return nil, err } diff --git a/winlogbeat/tests/system/test_eventlogging.py b/winlogbeat/tests/system/test_eventlogging.py index dd763104fa5..0d486656054 100644 --- a/winlogbeat/tests/system/test_eventlogging.py +++ b/winlogbeat/tests/system/test_eventlogging.py @@ -156,25 +156,6 @@ def test_ignore_older(self): self.assertEqual(evts[0]["winlog.event_id"], 10) self.assertEqual(evts[0]["event.code"], 10) - def test_unknown_eventlog_config(self): - """ - eventlogging - Unknown config parameter - """ - self.render_config_template( - event_logs=[ - { - "name": self.providerName, - "api": self.api, - "event_id": "10, 12", - "level": "info", - "provider": ["me"], - "include_xml": True, - } - ] - ) - self.start_beat().check_wait(exit_code=1) - assert self.log_contains("4 errors: invalid event log key") - def test_utf16_characters(self): """ eventlogging - UTF-16 characters diff --git a/winlogbeat/tests/system/test_wineventlog.py b/winlogbeat/tests/system/test_wineventlog.py index ea390475279..363e90edbd2 100644 --- a/winlogbeat/tests/system/test_wineventlog.py +++ b/winlogbeat/tests/system/test_wineventlog.py @@ -311,23 +311,6 @@ def test_query_multi_param(self): self.assertTrue(len(evts), 1) self.assertEqual(evts[0]["message"], "selected") - def test_unknown_eventlog_config(self): - """ - wineventlog - Unknown config parameter - """ - self.render_config_template( - event_logs=[ - { - "name": self.providerName, - "api": self.api, - "forwarded": False, - "invalid": "garbage"} - ] - ) - self.start_beat().check_wait(exit_code=1) - assert self.log_contains( - "1 error: invalid event log key 'invalid' found.") - def test_utf16_characters(self): """ wineventlog - UTF-16 characters From e4df4501bdbf9edb89421746f559a89688fff71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Thu, 8 Oct 2020 19:46:45 +0200 Subject: [PATCH 114/156] fix: remove extra curly brace in script (#21692) * fix: remove extra curly brace * chore: proper indent --- .ci/packaging.groovy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.ci/packaging.groovy b/.ci/packaging.groovy index 81ff5b1994a..c65fd7f8b56 100644 --- a/.ci/packaging.groovy +++ b/.ci/packaging.groovy @@ -215,12 +215,12 @@ def tagAndPush(name){ docker push ${newName} docker tag ${oldName} ${commitName} docker push ${commitName} - """, returnStatus: true) - if ( status > 0 && iterations < 3) { - error('tag and push failed, retry') - } else if ( status > 0 ) { - log(level: 'WARN', text: "${name} doesn't have ${variant} docker images. See https://github.com/elastic/beats/pull/21621") - } + """, returnStatus: true) + + if ( status > 0 && iterations < 3) { + error('tag and push failed, retry') + } else if ( status > 0 ) { + log(level: 'WARN', text: "${name} doesn't have ${variant} docker images. See https://github.com/elastic/beats/pull/21621") } } } From 1abe97b20d708d9dd61018163a7d45616b415c59 Mon Sep 17 00:00:00 2001 From: Adrian Serrano Date: Fri, 9 Oct 2020 09:33:35 +0200 Subject: [PATCH 115/156] Make o365audit input cancellable (#21647) PR #21258 introduced a restart mechanism for o365input so that it didn't stop working once a fatal error was found. This updates the restart delay to use a cancellation-context-aware method so that the input doesn't block Filebeat termination. --- x-pack/filebeat/input/o365audit/input.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/x-pack/filebeat/input/o365audit/input.go b/x-pack/filebeat/input/o365audit/input.go index 67013dc6a71..2cf76de9ee3 100644 --- a/x-pack/filebeat/input/o365audit/input.go +++ b/x-pack/filebeat/input/o365audit/input.go @@ -21,14 +21,12 @@ import ( "github.com/elastic/beats/v7/libbeat/logp" "github.com/elastic/beats/v7/x-pack/filebeat/input/o365audit/poll" "github.com/elastic/go-concert/ctxtool" + "github.com/elastic/go-concert/timed" ) const ( pluginName = "o365audit" fieldsPrefix = pluginName - - // How long to retry when a fatal error is encountered in the input. - failureRetryInterval = time.Minute * 5 ) type o365input struct { @@ -126,8 +124,8 @@ func (inp *o365input) Run( } publisher.Publish(event, nil) ctx.Logger.Errorf("Input failed: %v", err) - ctx.Logger.Infof("Restarting in %v", failureRetryInterval) - time.Sleep(failureRetryInterval) + ctx.Logger.Infof("Restarting in %v", inp.config.API.ErrorRetryInterval) + timed.Wait(ctx.Cancelation, inp.config.API.ErrorRetryInterval) } } return nil From 3aceb31568b531063369c191636a36b68f48ae59 Mon Sep 17 00:00:00 2001 From: Andrew Wilkins Date: Mon, 12 Oct 2020 12:34:58 +0800 Subject: [PATCH 116/156] libbeat/logp: introduce Logger.WithOptions (#21671) * libbeat/logp: introduce Logger.WithOptions Add a Logger.WithOptions method, which clones the logger and applies given options. For example, this can be used to obtain a clone of the logger with sampling/rate limiting applied. --- libbeat/logp/logger.go | 6 +++++ libbeat/logp/logger_test.go | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 libbeat/logp/logger_test.go diff --git a/libbeat/logp/logger.go b/libbeat/logp/logger.go index 6f1c42fe022..2bbe6b3ce53 100644 --- a/libbeat/logp/logger.go +++ b/libbeat/logp/logger.go @@ -50,6 +50,12 @@ func NewLogger(selector string, options ...LogOption) *Logger { return newLogger(loadLogger().rootLogger, selector, options...) } +// WithOptions returns a clone of l with options applied. +func (l *Logger) WithOptions(options ...LogOption) *Logger { + cloned := l.logger.WithOptions(options...) + return &Logger{cloned, cloned.Sugar()} +} + // With creates a child logger and adds structured context to it. Fields added // to the child don't affect the parent, and vice versa. func (l *Logger) With(args ...interface{}) *Logger { diff --git a/libbeat/logp/logger_test.go b/libbeat/logp/logger_test.go new file mode 100644 index 00000000000..eaf8a1070ce --- /dev/null +++ b/libbeat/logp/logger_test.go @@ -0,0 +1,52 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package logp + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + "go.uber.org/zap/zaptest/observer" +) + +func TestLoggerWithOptions(t *testing.T) { + core1, observed1 := observer.New(zapcore.DebugLevel) + core2, observed2 := observer.New(zapcore.DebugLevel) + + logger1 := NewLogger("bo", zap.WrapCore(func(in zapcore.Core) zapcore.Core { + return zapcore.NewTee(in, core1) + })) + logger2 := logger1.WithOptions(zap.WrapCore(func(in zapcore.Core) zapcore.Core { + return zapcore.NewTee(in, core2) + })) + + logger1.Info("hello logger1") // should just go to the first observer + logger2.Info("hello logger1 and logger2") // should go to both observers + + observedEntries1 := observed1.All() + require.Len(t, observedEntries1, 2) + assert.Equal(t, "hello logger1", observedEntries1[0].Message) + assert.Equal(t, "hello logger1 and logger2", observedEntries1[1].Message) + + observedEntries2 := observed2.All() + require.Len(t, observedEntries2, 1) + assert.Equal(t, "hello logger1 and logger2", observedEntries2[0].Message) +} From d35dfb53111a86ed0e484f8450ffcf1474be60e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Mon, 12 Oct 2020 10:53:59 +0200 Subject: [PATCH 117/156] Add configuration of filestream input (#21565) --- .../config/filebeat.inputs.reference.yml.tmpl | 140 ++++++++++++++++++ .../_meta/config/filebeat.inputs.yml.tmpl | 29 ++++ filebeat/filebeat.reference.yml | 140 ++++++++++++++++++ filebeat/filebeat.yml | 29 ++++ filebeat/input/filestream/config.go | 18 +-- filebeat/input/filestream/input.go | 16 +- x-pack/filebeat/filebeat.reference.yml | 140 ++++++++++++++++++ x-pack/filebeat/filebeat.yml | 29 ++++ 8 files changed, 524 insertions(+), 17 deletions(-) diff --git a/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl b/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl index c920b7dbec8..7eceb559f16 100644 --- a/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl +++ b/filebeat/_meta/config/filebeat.inputs.reference.yml.tmpl @@ -11,6 +11,7 @@ filebeat.inputs: # # Possible options are: # * log: Reads every line of the log file (default) +# * filestream: Improved version of log input. Experimental. # * stdin: Reads the standard in #------------------------------ Log input -------------------------------- @@ -231,6 +232,145 @@ filebeat.inputs: # Defines if inputs is enabled #enabled: true +#--------------------------- Filestream input ---------------------------- +- type: filestream + + # Change to true to enable this input configuration. + enabled: false + + # Paths that should be crawled and fetched. Glob based paths. + # To fetch all ".log" files from a specific level of subdirectories + # /var/log/*/*.log can be used. + # For each file found under this path, a harvester is started. + # Make sure not file is defined twice as this can lead to unexpected behaviour. + paths: + - /var/log/*.log + #- c:\programdata\elasticsearch\logs\* + + # Configure the file encoding for reading files with international characters + # following the W3C recommendation for HTML5 (http://www.w3.org/TR/encoding). + # Some sample encodings: + # plain, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, + # hz-gb-2312, euc-kr, euc-jp, iso-2022-jp, shift-jis, ... + #encoding: plain + + + # Exclude lines. A list of regular expressions to match. It drops the lines that are + # matching any regular expression from the list. The include_lines is called before + # exclude_lines. By default, no lines are dropped. + #exclude_lines: ['^DBG'] + + # Include lines. A list of regular expressions to match. It exports the lines that are + # matching any regular expression from the list. The include_lines is called before + # exclude_lines. By default, all the lines are exported. + #include_lines: ['^ERR', '^WARN'] + + ### Prospector options + + # How often the input checks for new files in the paths that are specified + # for harvesting. Specify 1s to scan the directory as frequently as possible + # without causing Filebeat to scan too frequently. Default: 10s. + #prospector.scanner.check_interval: 10s + + # Exclude files. A list of regular expressions to match. Filebeat drops the files that + # are matching any regular expression from the list. By default, no files are dropped. + #prospector.scanner.exclude_files: ['.gz$'] + + # Expand "**" patterns into regular glob patterns. + #prospector.scanner.recursive_glob: true + + # If symlinks is enabled, symlinks are opened and harvested. The harvester is opening the + # original for harvesting but will report the symlink name as source. + #prospector.scanner.symlinks: false + + ### State options + + # Files for the modification data is older then clean_inactive the state from the registry is removed + # By default this is disabled. + #clean_inactive: 0 + + # Removes the state for file which cannot be found on disk anymore immediately + #clean_removed: true + + # Method to determine if two files are the same or not. By default + # the Beat considers two files the same if their inode and device id are the same. + #file_identity.native: ~ + + # Optional additional fields. These fields can be freely picked + # to add additional information to the crawled log files for filtering + #fields: + # level: debug + # review: 1 + + # Set to true to publish fields with null values in events. + #keep_null: false + + # By default, all events contain `host.name`. This option can be set to true + # to disable the addition of this field to all events. The default value is + # false. + #publisher_pipeline.disable_host: false + + # Ignore files which were modified more then the defined timespan in the past. + # ignore_older is disabled by default, so no files are ignored by setting it to 0. + # Time strings like 2h (2 hours), 5m (5 minutes) can be used. + #ignore_older: 0 + + # Defines the buffer size every harvester uses when fetching the file + #harvester_buffer_size: 16384 + + # Maximum number of bytes a single log event can have + # All bytes after max_bytes are discarded and not sent. The default is 10MB. + # This is especially useful for multiline log messages which can get large. + #message_max_bytes: 10485760 + + # Characters which separate the lines. Valid values: auto, line_feed, vertical_tab, form_feed, + # carriage_return, carriage_return_line_feed, next_line, line_separator, paragraph_separator. + #line_terminator: auto + + # The Ingest Node pipeline ID associated with this input. If this is set, it + # overwrites the pipeline option from the Elasticsearch output. + #pipeline: + + # Backoff values define how aggressively filebeat crawls new files for updates + # The default values can be used in most cases. Backoff defines how long it is waited + # to check a file again after EOF is reached. Default is 1s which means the file + # is checked every second if new lines were added. This leads to a near real time crawling. + # Every time a new line appears, backoff is reset to the initial value. + #backoff.init: 1s + + # Max backoff defines what the maximum backoff time is. After having backed off multiple times + # from checking the files, the waiting time will never exceed max_backoff independent of the + # backoff factor. Having it set to 10s means in the worst case a new line can be added to a log + # file after having backed off multiple times, it takes a maximum of 10s to read the new line + #backoff.max: 10s + + ### Harvester closing options + + # Close inactive closes the file handler after the predefined period. + # The period starts when the last line of the file was, not the file ModTime. + # Time strings like 2h (2 hours), 5m (5 minutes) can be used. + #close.on_state_change.inactive: 5m + + # Close renamed closes a file handler when the file is renamed or rotated. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.on_state_change.renamed: false + + # When enabling this option, a file handler is closed immediately in case a file can't be found + # any more. In case the file shows up again later, harvesting will continue at the last known position + # after scan_frequency. + #close.on_state_change.removed: true + + # Closes the file handler as soon as the harvesters reaches the end of the file. + # By default this option is disabled. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.reader.eof: false + + # Close timeout closes the harvester after the predefined time. + # This is independent if the harvester did finish reading the file or not. + # By default this option is disabled. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.reader.after_interval: 0 + #----------------------------- Stdin input ------------------------------- # Configuration to use stdin input #- type: stdin diff --git a/filebeat/_meta/config/filebeat.inputs.yml.tmpl b/filebeat/_meta/config/filebeat.inputs.yml.tmpl index a7bd1b5eaa6..70d52cbb9c6 100644 --- a/filebeat/_meta/config/filebeat.inputs.yml.tmpl +++ b/filebeat/_meta/config/filebeat.inputs.yml.tmpl @@ -49,3 +49,32 @@ filebeat.inputs: # that was (not) matched before or after or as long as a pattern is not matched based on negate. # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash #multiline.match: after + +# filestream is an experimental input. It is going to replace log input in the future. +- type: filestream + + # Change to true to enable this input configuration. + enabled: false + + # Paths that should be crawled and fetched. Glob based paths. + paths: + - /var/log/*.log + #- c:\programdata\elasticsearch\logs\* + + # Exclude lines. A list of regular expressions to match. It drops the lines that are + # matching any regular expression from the list. + #exclude_lines: ['^DBG'] + + # Include lines. A list of regular expressions to match. It exports the lines that are + # matching any regular expression from the list. + #include_lines: ['^ERR', '^WARN'] + + # Exclude files. A list of regular expressions to match. Filebeat drops the files that + # are matching any regular expression from the list. By default, no files are dropped. + #prospector.scanner.exclude_files: ['.gz$'] + + # Optional additional fields. These fields can be freely picked + # to add additional information to the crawled log files for filtering + #fields: + # level: debug + # review: 1 diff --git a/filebeat/filebeat.reference.yml b/filebeat/filebeat.reference.yml index bf29e0715ed..3a0d1d5d19c 100644 --- a/filebeat/filebeat.reference.yml +++ b/filebeat/filebeat.reference.yml @@ -398,6 +398,7 @@ filebeat.inputs: # # Possible options are: # * log: Reads every line of the log file (default) +# * filestream: Improved version of log input. Experimental. # * stdin: Reads the standard in #------------------------------ Log input -------------------------------- @@ -618,6 +619,145 @@ filebeat.inputs: # Defines if inputs is enabled #enabled: true +#--------------------------- Filestream input ---------------------------- +- type: filestream + + # Change to true to enable this input configuration. + enabled: false + + # Paths that should be crawled and fetched. Glob based paths. + # To fetch all ".log" files from a specific level of subdirectories + # /var/log/*/*.log can be used. + # For each file found under this path, a harvester is started. + # Make sure not file is defined twice as this can lead to unexpected behaviour. + paths: + - /var/log/*.log + #- c:\programdata\elasticsearch\logs\* + + # Configure the file encoding for reading files with international characters + # following the W3C recommendation for HTML5 (http://www.w3.org/TR/encoding). + # Some sample encodings: + # plain, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, + # hz-gb-2312, euc-kr, euc-jp, iso-2022-jp, shift-jis, ... + #encoding: plain + + + # Exclude lines. A list of regular expressions to match. It drops the lines that are + # matching any regular expression from the list. The include_lines is called before + # exclude_lines. By default, no lines are dropped. + #exclude_lines: ['^DBG'] + + # Include lines. A list of regular expressions to match. It exports the lines that are + # matching any regular expression from the list. The include_lines is called before + # exclude_lines. By default, all the lines are exported. + #include_lines: ['^ERR', '^WARN'] + + ### Prospector options + + # How often the input checks for new files in the paths that are specified + # for harvesting. Specify 1s to scan the directory as frequently as possible + # without causing Filebeat to scan too frequently. Default: 10s. + #prospector.scanner.check_interval: 10s + + # Exclude files. A list of regular expressions to match. Filebeat drops the files that + # are matching any regular expression from the list. By default, no files are dropped. + #prospector.scanner.exclude_files: ['.gz$'] + + # Expand "**" patterns into regular glob patterns. + #prospector.scanner.recursive_glob: true + + # If symlinks is enabled, symlinks are opened and harvested. The harvester is opening the + # original for harvesting but will report the symlink name as source. + #prospector.scanner.symlinks: false + + ### State options + + # Files for the modification data is older then clean_inactive the state from the registry is removed + # By default this is disabled. + #clean_inactive: 0 + + # Removes the state for file which cannot be found on disk anymore immediately + #clean_removed: true + + # Method to determine if two files are the same or not. By default + # the Beat considers two files the same if their inode and device id are the same. + #file_identity.native: ~ + + # Optional additional fields. These fields can be freely picked + # to add additional information to the crawled log files for filtering + #fields: + # level: debug + # review: 1 + + # Set to true to publish fields with null values in events. + #keep_null: false + + # By default, all events contain `host.name`. This option can be set to true + # to disable the addition of this field to all events. The default value is + # false. + #publisher_pipeline.disable_host: false + + # Ignore files which were modified more then the defined timespan in the past. + # ignore_older is disabled by default, so no files are ignored by setting it to 0. + # Time strings like 2h (2 hours), 5m (5 minutes) can be used. + #ignore_older: 0 + + # Defines the buffer size every harvester uses when fetching the file + #harvester_buffer_size: 16384 + + # Maximum number of bytes a single log event can have + # All bytes after max_bytes are discarded and not sent. The default is 10MB. + # This is especially useful for multiline log messages which can get large. + #message_max_bytes: 10485760 + + # Characters which separate the lines. Valid values: auto, line_feed, vertical_tab, form_feed, + # carriage_return, carriage_return_line_feed, next_line, line_separator, paragraph_separator. + #line_terminator: auto + + # The Ingest Node pipeline ID associated with this input. If this is set, it + # overwrites the pipeline option from the Elasticsearch output. + #pipeline: + + # Backoff values define how aggressively filebeat crawls new files for updates + # The default values can be used in most cases. Backoff defines how long it is waited + # to check a file again after EOF is reached. Default is 1s which means the file + # is checked every second if new lines were added. This leads to a near real time crawling. + # Every time a new line appears, backoff is reset to the initial value. + #backoff.init: 1s + + # Max backoff defines what the maximum backoff time is. After having backed off multiple times + # from checking the files, the waiting time will never exceed max_backoff independent of the + # backoff factor. Having it set to 10s means in the worst case a new line can be added to a log + # file after having backed off multiple times, it takes a maximum of 10s to read the new line + #backoff.max: 10s + + ### Harvester closing options + + # Close inactive closes the file handler after the predefined period. + # The period starts when the last line of the file was, not the file ModTime. + # Time strings like 2h (2 hours), 5m (5 minutes) can be used. + #close.on_state_change.inactive: 5m + + # Close renamed closes a file handler when the file is renamed or rotated. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.on_state_change.renamed: false + + # When enabling this option, a file handler is closed immediately in case a file can't be found + # any more. In case the file shows up again later, harvesting will continue at the last known position + # after scan_frequency. + #close.on_state_change.removed: true + + # Closes the file handler as soon as the harvesters reaches the end of the file. + # By default this option is disabled. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.reader.eof: false + + # Close timeout closes the harvester after the predefined time. + # This is independent if the harvester did finish reading the file or not. + # By default this option is disabled. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.reader.after_interval: 0 + #----------------------------- Stdin input ------------------------------- # Configuration to use stdin input #- type: stdin diff --git a/filebeat/filebeat.yml b/filebeat/filebeat.yml index 2a3e678c542..9a29bc76962 100644 --- a/filebeat/filebeat.yml +++ b/filebeat/filebeat.yml @@ -62,6 +62,35 @@ filebeat.inputs: # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash #multiline.match: after +# filestream is an experimental input. It is going to replace log input in the future. +- type: filestream + + # Change to true to enable this input configuration. + enabled: false + + # Paths that should be crawled and fetched. Glob based paths. + paths: + - /var/log/*.log + #- c:\programdata\elasticsearch\logs\* + + # Exclude lines. A list of regular expressions to match. It drops the lines that are + # matching any regular expression from the list. + #exclude_lines: ['^DBG'] + + # Include lines. A list of regular expressions to match. It exports the lines that are + # matching any regular expression from the list. + #include_lines: ['^ERR', '^WARN'] + + # Exclude files. A list of regular expressions to match. Filebeat drops the files that + # are matching any regular expression from the list. By default, no files are dropped. + #prospector.scanner.exclude_files: ['.gz$'] + + # Optional additional fields. These fields can be freely picked + # to add additional information to the crawled log files for filtering + #fields: + # level: debug + # review: 1 + # ============================== Filebeat modules ============================== filebeat.config.modules: diff --git a/filebeat/input/filestream/config.go b/filebeat/input/filestream/config.go index 3ec076196f0..c2b1e838ee5 100644 --- a/filebeat/input/filestream/config.go +++ b/filebeat/input/filestream/config.go @@ -30,10 +30,11 @@ import ( // Config stores the options of a file stream. type config struct { + readerConfig + Paths []string `config:"paths"` Close closerConfig `config:"close"` FileWatcher *common.ConfigNamespace `config:"file_watcher"` - Reader readerConfig `config:"readers"` FileIdentity *common.ConfigNamespace `config:"file_identity"` CleanInactive time.Duration `config:"clean_inactive" validate:"min=0"` CleanRemoved bool `config:"clean_removed"` @@ -47,18 +48,17 @@ type closerConfig struct { } type readerCloserConfig struct { - AfterInterval time.Duration - OnEOF bool + AfterInterval time.Duration `config:"after_interval"` + OnEOF bool `config:"on_eof"` } type stateChangeCloserConfig struct { - CheckInterval time.Duration - Inactive time.Duration - Removed bool - Renamed bool + CheckInterval time.Duration `config:"check_interval" validate:"nonzero"` + Inactive time.Duration `config:"inactive"` + Removed bool `config:"removed"` + Renamed bool `config:"renamed"` } -// TODO should this be inline? type readerConfig struct { Backoff backoffConfig `config:"backoff"` BufferSize int `config:"buffer_size"` @@ -79,9 +79,9 @@ type backoffConfig struct { func defaultConfig() config { return config{ + readerConfig: defaultReaderConfig(), Paths: []string{}, Close: defaultCloserConfig(), - Reader: defaultReaderConfig(), CleanInactive: 0, CleanRemoved: true, HarvesterLimit: 0, diff --git a/filebeat/input/filestream/input.go b/filebeat/input/filestream/input.go index b6c6598c50b..9f715d1183e 100644 --- a/filebeat/input/filestream/input.go +++ b/filebeat/input/filestream/input.go @@ -94,19 +94,19 @@ func configure(cfg *common.Config) (loginp.Prospector, loginp.Harvester, error) return nil, nil, err } - encodingFactory, ok := encoding.FindEncoding(config.Reader.Encoding) + encodingFactory, ok := encoding.FindEncoding(config.Encoding) if !ok || encodingFactory == nil { - return nil, nil, fmt.Errorf("unknown encoding('%v')", config.Reader.Encoding) + return nil, nil, fmt.Errorf("unknown encoding('%v')", config.Encoding) } return prospector, &filestream{ - readerConfig: config.Reader, - bufferSize: config.Reader.BufferSize, + readerConfig: config.readerConfig, + bufferSize: config.BufferSize, encodingFactory: encodingFactory, - lineTerminator: config.Reader.LineTerminator, - excludeLines: config.Reader.ExcludeLines, - includeLines: config.Reader.IncludeLines, - maxBytes: config.Reader.MaxBytes, + lineTerminator: config.LineTerminator, + excludeLines: config.ExcludeLines, + includeLines: config.IncludeLines, + maxBytes: config.MaxBytes, closerConfig: config.Close, }, nil } diff --git a/x-pack/filebeat/filebeat.reference.yml b/x-pack/filebeat/filebeat.reference.yml index 2ffff82135e..49ede1c7d24 100644 --- a/x-pack/filebeat/filebeat.reference.yml +++ b/x-pack/filebeat/filebeat.reference.yml @@ -1783,6 +1783,7 @@ filebeat.inputs: # # Possible options are: # * log: Reads every line of the log file (default) +# * filestream: Improved version of log input. Experimental. # * stdin: Reads the standard in #------------------------------ Log input -------------------------------- @@ -2003,6 +2004,145 @@ filebeat.inputs: # Defines if inputs is enabled #enabled: true +#--------------------------- Filestream input ---------------------------- +- type: filestream + + # Change to true to enable this input configuration. + enabled: false + + # Paths that should be crawled and fetched. Glob based paths. + # To fetch all ".log" files from a specific level of subdirectories + # /var/log/*/*.log can be used. + # For each file found under this path, a harvester is started. + # Make sure not file is defined twice as this can lead to unexpected behaviour. + paths: + - /var/log/*.log + #- c:\programdata\elasticsearch\logs\* + + # Configure the file encoding for reading files with international characters + # following the W3C recommendation for HTML5 (http://www.w3.org/TR/encoding). + # Some sample encodings: + # plain, utf-8, utf-16be-bom, utf-16be, utf-16le, big5, gb18030, gbk, + # hz-gb-2312, euc-kr, euc-jp, iso-2022-jp, shift-jis, ... + #encoding: plain + + + # Exclude lines. A list of regular expressions to match. It drops the lines that are + # matching any regular expression from the list. The include_lines is called before + # exclude_lines. By default, no lines are dropped. + #exclude_lines: ['^DBG'] + + # Include lines. A list of regular expressions to match. It exports the lines that are + # matching any regular expression from the list. The include_lines is called before + # exclude_lines. By default, all the lines are exported. + #include_lines: ['^ERR', '^WARN'] + + ### Prospector options + + # How often the input checks for new files in the paths that are specified + # for harvesting. Specify 1s to scan the directory as frequently as possible + # without causing Filebeat to scan too frequently. Default: 10s. + #prospector.scanner.check_interval: 10s + + # Exclude files. A list of regular expressions to match. Filebeat drops the files that + # are matching any regular expression from the list. By default, no files are dropped. + #prospector.scanner.exclude_files: ['.gz$'] + + # Expand "**" patterns into regular glob patterns. + #prospector.scanner.recursive_glob: true + + # If symlinks is enabled, symlinks are opened and harvested. The harvester is opening the + # original for harvesting but will report the symlink name as source. + #prospector.scanner.symlinks: false + + ### State options + + # Files for the modification data is older then clean_inactive the state from the registry is removed + # By default this is disabled. + #clean_inactive: 0 + + # Removes the state for file which cannot be found on disk anymore immediately + #clean_removed: true + + # Method to determine if two files are the same or not. By default + # the Beat considers two files the same if their inode and device id are the same. + #file_identity.native: ~ + + # Optional additional fields. These fields can be freely picked + # to add additional information to the crawled log files for filtering + #fields: + # level: debug + # review: 1 + + # Set to true to publish fields with null values in events. + #keep_null: false + + # By default, all events contain `host.name`. This option can be set to true + # to disable the addition of this field to all events. The default value is + # false. + #publisher_pipeline.disable_host: false + + # Ignore files which were modified more then the defined timespan in the past. + # ignore_older is disabled by default, so no files are ignored by setting it to 0. + # Time strings like 2h (2 hours), 5m (5 minutes) can be used. + #ignore_older: 0 + + # Defines the buffer size every harvester uses when fetching the file + #harvester_buffer_size: 16384 + + # Maximum number of bytes a single log event can have + # All bytes after max_bytes are discarded and not sent. The default is 10MB. + # This is especially useful for multiline log messages which can get large. + #message_max_bytes: 10485760 + + # Characters which separate the lines. Valid values: auto, line_feed, vertical_tab, form_feed, + # carriage_return, carriage_return_line_feed, next_line, line_separator, paragraph_separator. + #line_terminator: auto + + # The Ingest Node pipeline ID associated with this input. If this is set, it + # overwrites the pipeline option from the Elasticsearch output. + #pipeline: + + # Backoff values define how aggressively filebeat crawls new files for updates + # The default values can be used in most cases. Backoff defines how long it is waited + # to check a file again after EOF is reached. Default is 1s which means the file + # is checked every second if new lines were added. This leads to a near real time crawling. + # Every time a new line appears, backoff is reset to the initial value. + #backoff.init: 1s + + # Max backoff defines what the maximum backoff time is. After having backed off multiple times + # from checking the files, the waiting time will never exceed max_backoff independent of the + # backoff factor. Having it set to 10s means in the worst case a new line can be added to a log + # file after having backed off multiple times, it takes a maximum of 10s to read the new line + #backoff.max: 10s + + ### Harvester closing options + + # Close inactive closes the file handler after the predefined period. + # The period starts when the last line of the file was, not the file ModTime. + # Time strings like 2h (2 hours), 5m (5 minutes) can be used. + #close.on_state_change.inactive: 5m + + # Close renamed closes a file handler when the file is renamed or rotated. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.on_state_change.renamed: false + + # When enabling this option, a file handler is closed immediately in case a file can't be found + # any more. In case the file shows up again later, harvesting will continue at the last known position + # after scan_frequency. + #close.on_state_change.removed: true + + # Closes the file handler as soon as the harvesters reaches the end of the file. + # By default this option is disabled. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.reader.eof: false + + # Close timeout closes the harvester after the predefined time. + # This is independent if the harvester did finish reading the file or not. + # By default this option is disabled. + # Note: Potential data loss. Make sure to read and understand the docs for this option. + #close.reader.after_interval: 0 + #----------------------------- Stdin input ------------------------------- # Configuration to use stdin input #- type: stdin diff --git a/x-pack/filebeat/filebeat.yml b/x-pack/filebeat/filebeat.yml index 2a3e678c542..9a29bc76962 100644 --- a/x-pack/filebeat/filebeat.yml +++ b/x-pack/filebeat/filebeat.yml @@ -62,6 +62,35 @@ filebeat.inputs: # Note: After is the equivalent to previous and before is the equivalent to to next in Logstash #multiline.match: after +# filestream is an experimental input. It is going to replace log input in the future. +- type: filestream + + # Change to true to enable this input configuration. + enabled: false + + # Paths that should be crawled and fetched. Glob based paths. + paths: + - /var/log/*.log + #- c:\programdata\elasticsearch\logs\* + + # Exclude lines. A list of regular expressions to match. It drops the lines that are + # matching any regular expression from the list. + #exclude_lines: ['^DBG'] + + # Include lines. A list of regular expressions to match. It exports the lines that are + # matching any regular expression from the list. + #include_lines: ['^ERR', '^WARN'] + + # Exclude files. A list of regular expressions to match. Filebeat drops the files that + # are matching any regular expression from the list. By default, no files are dropped. + #prospector.scanner.exclude_files: ['.gz$'] + + # Optional additional fields. These fields can be freely picked + # to add additional information to the crawled log files for filtering + #fields: + # level: debug + # review: 1 + # ============================== Filebeat modules ============================== filebeat.config.modules: From f3d18f91c1aeb4d49d2214f519430e02a173b357 Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Mon, 12 Oct 2020 10:05:51 -0400 Subject: [PATCH 118/156] [Elastic Agent] Fix issue where inputs without processors defined would panic (#21628) * Fix #21581. * Add changelog entry. * Add test for processors as a map. --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../pkg/agent/application/emitter.go | 11 +- .../pkg/agent/application/emitter_test.go | 175 ++++++++++++++++++ 3 files changed, 183 insertions(+), 4 deletions(-) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 73dfe8ff9a4..eb98ef39ded 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -14,6 +14,7 @@ - Thread safe sorted set {pull}21290[21290] - Copy Action store on upgrade {pull}21298[21298] - Include inputs in action store actions {pull}21298[21298] +- Fix issue where inputs without processors defined would panic {pull}21628[21628] ==== New features diff --git a/x-pack/elastic-agent/pkg/agent/application/emitter.go b/x-pack/elastic-agent/pkg/agent/application/emitter.go index 3bd06043c30..07f8e1f460b 100644 --- a/x-pack/elastic-agent/pkg/agent/application/emitter.go +++ b/x-pack/elastic-agent/pkg/agent/application/emitter.go @@ -219,17 +219,20 @@ func promoteProcessors(dict *transpiler.Dict) *transpiler.Dict { if p == nil { return dict } + var currentList *transpiler.List current, ok := dict.Find("processors") - currentList, isList := current.Value().(*transpiler.List) - if !isList { - return dict + if ok { + currentList, ok = current.Value().(*transpiler.List) + if !ok { + return dict + } } ast, _ := transpiler.NewAST(map[string]interface{}{ "processors": p, }) procs, _ := transpiler.Lookup(ast, "processors") nodes := nodesFromList(procs.Value().(*transpiler.List)) - if ok { + if ok && currentList != nil { nodes = append(nodes, nodesFromList(currentList)...) } dictNodes := dict.Value().([]transpiler.Node) diff --git a/x-pack/elastic-agent/pkg/agent/application/emitter_test.go b/x-pack/elastic-agent/pkg/agent/application/emitter_test.go index 32770eaa5df..b2286552f9f 100644 --- a/x-pack/elastic-agent/pkg/agent/application/emitter_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/emitter_test.go @@ -479,6 +479,181 @@ func TestRenderInputs(t *testing.T) { }), }, }, + "inputs without processors and vars with processors": { + input: transpiler.NewKey("inputs", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("type", transpiler.NewStrVal("logfile")), + transpiler.NewKey("streams", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("paths", transpiler.NewList([]transpiler.Node{ + transpiler.NewStrVal("/var/log/${var1.name}.log"), + })), + }), + })), + }), + })), + expected: transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("type", transpiler.NewStrVal("logfile")), + transpiler.NewKey("streams", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("paths", transpiler.NewList([]transpiler.Node{ + transpiler.NewStrVal("/var/log/value1.log"), + })), + }), + })), + transpiler.NewKey("processors", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("add_fields", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("fields", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("custom", transpiler.NewStrVal("value1")), + })), + transpiler.NewKey("to", transpiler.NewStrVal("dynamic")), + })), + }), + })), + }), + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("type", transpiler.NewStrVal("logfile")), + transpiler.NewKey("streams", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("paths", transpiler.NewList([]transpiler.Node{ + transpiler.NewStrVal("/var/log/value2.log"), + })), + }), + })), + transpiler.NewKey("processors", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("add_fields", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("fields", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("custom", transpiler.NewStrVal("value2")), + })), + transpiler.NewKey("to", transpiler.NewStrVal("dynamic")), + })), + }), + })), + }), + }), + varsArray: []*transpiler.Vars{ + mustMakeVarsP(map[string]interface{}{ + "var1": map[string]interface{}{ + "name": "value1", + }, + }, + "var1", + []map[string]interface{}{ + { + "add_fields": map[string]interface{}{ + "fields": map[string]interface{}{ + "custom": "value1", + }, + "to": "dynamic", + }, + }, + }), + mustMakeVarsP(map[string]interface{}{ + "var1": map[string]interface{}{ + "name": "value2", + }, + }, + "var1", + []map[string]interface{}{ + { + "add_fields": map[string]interface{}{ + "fields": map[string]interface{}{ + "custom": "value2", + }, + "to": "dynamic", + }, + }, + }), + }, + }, + "processors incorrectly a map": { + input: transpiler.NewKey("inputs", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("type", transpiler.NewStrVal("logfile")), + transpiler.NewKey("streams", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("paths", transpiler.NewList([]transpiler.Node{ + transpiler.NewStrVal("/var/log/${var1.name}.log"), + })), + }), + })), + transpiler.NewKey("processors", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("add_fields", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("invalid", transpiler.NewStrVal("value")), + })), + })), + }), + })), + expected: transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("type", transpiler.NewStrVal("logfile")), + transpiler.NewKey("streams", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("paths", transpiler.NewList([]transpiler.Node{ + transpiler.NewStrVal("/var/log/value1.log"), + })), + }), + })), + transpiler.NewKey("processors", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("add_fields", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("invalid", transpiler.NewStrVal("value")), + })), + })), + }), + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("type", transpiler.NewStrVal("logfile")), + transpiler.NewKey("streams", transpiler.NewList([]transpiler.Node{ + transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("paths", transpiler.NewList([]transpiler.Node{ + transpiler.NewStrVal("/var/log/value2.log"), + })), + }), + })), + transpiler.NewKey("processors", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("add_fields", transpiler.NewDict([]transpiler.Node{ + transpiler.NewKey("invalid", transpiler.NewStrVal("value")), + })), + })), + }), + }), + varsArray: []*transpiler.Vars{ + mustMakeVarsP(map[string]interface{}{ + "var1": map[string]interface{}{ + "name": "value1", + }, + }, + "var1", + []map[string]interface{}{ + { + "add_fields": map[string]interface{}{ + "fields": map[string]interface{}{ + "custom": "value1", + }, + "to": "dynamic", + }, + }, + }), + mustMakeVarsP(map[string]interface{}{ + "var1": map[string]interface{}{ + "name": "value2", + }, + }, + "var1", + []map[string]interface{}{ + { + "add_fields": map[string]interface{}{ + "fields": map[string]interface{}{ + "custom": "value2", + }, + "to": "dynamic", + }, + }, + }), + }, + }, } for name, test := range testcases { From cf11c8b5fcae3e3eed12769308f40878b893ef0f Mon Sep 17 00:00:00 2001 From: DeDe Morton Date: Mon, 12 Oct 2020 11:55:28 -0700 Subject: [PATCH 119/156] Fix conditional coding to remove seccomp info from Winlogbeat (#21652) --- libbeat/docs/shared-securing-beat.asciidoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libbeat/docs/shared-securing-beat.asciidoc b/libbeat/docs/shared-securing-beat.asciidoc index b8dcc3b1957..e1c47d91f2c 100644 --- a/libbeat/docs/shared-securing-beat.asciidoc +++ b/libbeat/docs/shared-securing-beat.asciidoc @@ -29,11 +29,13 @@ For secure communication between APM Server and APM Agents, see <> endif::[] +endif::[] // APM HTTPS information ifdef::beat-specific-security[] @@ -70,5 +72,7 @@ endif::[] // Linux Seccomp ifndef::serverless[] +ifndef::win_only[] include::./security/linux-seccomp.asciidoc[] endif::[] +endif::[] From 9ab0a918237369343cab4e7d17ac09d08e887625 Mon Sep 17 00:00:00 2001 From: Adrian Serrano Date: Tue, 13 Oct 2020 00:43:40 +0200 Subject: [PATCH 120/156] Fix concurrent map read and write in socket dataset (#21690) This fixes a panic caused by a concurrent map read and write in Auditbeat's system/socket dataset. Fixes #21192 --- CHANGELOG.next.asciidoc | 1 + .../auditbeat/module/system/socket/events.go | 4 +-- .../module/system/socket/socket_linux.go | 2 +- .../auditbeat/module/system/socket/state.go | 11 ++++++-- .../module/system/socket/state_test.go | 26 +++++++++++++++++++ 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index cc8fb52396a..f01136c441e 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -195,6 +195,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - auditd: Fix typo in `event.action` of `removed-user-role-from`. {pull}19300[19300] - auditd: Fix typo in `event.action` of `used-suspicious-link`. {pull}19300[19300] - system/socket: Fix kprobe grouping to allow running more than one instance. {pull}20325[20325] +- system/socket: Fixed a crash due to concurrent map read and write. {issue}21192[21192] {pull}21690[21690] *Filebeat* diff --git a/x-pack/auditbeat/module/system/socket/events.go b/x-pack/auditbeat/module/system/socket/events.go index 76d91a8db24..c1937cb0302 100644 --- a/x-pack/auditbeat/module/system/socket/events.go +++ b/x-pack/auditbeat/module/system/socket/events.go @@ -872,8 +872,8 @@ type execveCall struct { creds *commitCreds } -func (e *execveCall) getProcess() process { - p := process{ +func (e *execveCall) getProcess() *process { + p := &process{ pid: e.Meta.PID, path: readCString(e.Path[:]), created: kernelTime(e.Meta.Timestamp), diff --git a/x-pack/auditbeat/module/system/socket/socket_linux.go b/x-pack/auditbeat/module/system/socket/socket_linux.go index 78fdd8ae4ca..11f8a22289e 100644 --- a/x-pack/auditbeat/module/system/socket/socket_linux.go +++ b/x-pack/auditbeat/module/system/socket/socket_linux.go @@ -158,7 +158,7 @@ func (m *MetricSet) Run(r mb.PushReporterV2) { } else { for _, p := range procs { if i, err := p.Info(); err == nil { - process := process{ + process := &process{ name: i.Name, pid: uint32(i.PID), args: i.Args, diff --git a/x-pack/auditbeat/module/system/socket/state.go b/x-pack/auditbeat/module/system/socket/state.go index c7b3ac761a7..fa612b56e1a 100644 --- a/x-pack/auditbeat/module/system/socket/state.go +++ b/x-pack/auditbeat/module/system/socket/state.go @@ -214,6 +214,9 @@ func (f *flow) Timestamp() time.Time { } type process struct { + // RWMutex is used to arbitrate reads and writes to resolvedDomains. + sync.RWMutex + pid uint32 name, path string args []string @@ -229,6 +232,8 @@ type process struct { } func (p *process) addTransaction(tr dns.Transaction) { + p.Lock() + defer p.Unlock() if p.resolvedDomains == nil { p.resolvedDomains = make(map[string]string) } @@ -239,6 +244,8 @@ func (p *process) addTransaction(tr dns.Transaction) { // ResolveIP returns the domain associated with the given IP. func (p *process) ResolveIP(ip net.IP) (domain string, found bool) { + p.RLock() + defer p.RUnlock() domain, found = p.resolvedDomains[ip.String()] return } @@ -542,13 +549,13 @@ func (s *state) ExpireOlder() { s.dns.CleanUp() } -func (s *state) CreateProcess(p process) error { +func (s *state) CreateProcess(p *process) error { if p.pid == 0 { return errors.New("can't create process with PID 0") } s.Lock() defer s.Unlock() - s.processes[p.pid] = &p + s.processes[p.pid] = p if p.createdTime == (time.Time{}) { p.createdTime = s.kernTimestampToTime(p.created) } diff --git a/x-pack/auditbeat/module/system/socket/state_test.go b/x-pack/auditbeat/module/system/socket/state_test.go index 75b73a374d1..89ba0cde9db 100644 --- a/x-pack/auditbeat/module/system/socket/state_test.go +++ b/x-pack/auditbeat/module/system/socket/state_test.go @@ -11,6 +11,7 @@ import ( "fmt" "net" "os" + "sync" "testing" "time" @@ -835,3 +836,28 @@ func TestSocketReuse(t *testing.T) { } assert.Len(t, flows, 1) } + +func TestProcessDNSRace(t *testing.T) { + p := new(process) + var wg sync.WaitGroup + wg.Add(2) + address := func(i byte) net.IP { return net.IPv4(172, 16, 0, i) } + go func() { + for i := byte(255); i > 0; i-- { + p.addTransaction(dns.Transaction{ + Client: net.UDPAddr{IP: net.IPv4(10, 20, 30, 40)}, + Server: net.UDPAddr{IP: net.IPv4(10, 20, 30, 41)}, + Domain: "example.net", + Addresses: []net.IP{address(i)}, + }) + } + wg.Done() + }() + go func() { + for i := byte(255); i > 0; i-- { + p.ResolveIP(address(i)) + } + wg.Done() + }() + wg.Wait() +} From 5e786b383598d252cf200ed22f213d8d5f33ee0d Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Tue, 13 Oct 2020 09:17:00 +0200 Subject: [PATCH 121/156] [Ingest Manager] Syncing unpacked files (#21706) [Ingest Manager] Syncing unpacked files (#21706) --- .../pkg/artifact/install/tar/tar_installer.go | 6 ++++++ .../pkg/artifact/install/zip/zip_installer.go | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go b/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go index 5c7f0f593a3..b9e621c71ac 100644 --- a/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go +++ b/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go @@ -102,6 +102,12 @@ func unpack(r io.Reader, dir string) error { if closeErr := wf.Close(); closeErr != nil && err == nil { err = closeErr } + + // sometimes we try executing binary too fast and run into text file busy after unpacking + // syncing prevents this + if syncErr := wf.Sync(); syncErr != nil && err == nil { + err = syncErr + } if err != nil { return fmt.Errorf("TarInstaller: error writing to %s: %v", abs, err) } diff --git a/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go b/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go index ffc90f2dce8..29cdb66f852 100644 --- a/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go +++ b/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go @@ -102,9 +102,16 @@ func (i *Installer) unzip(artifactPath string) error { return err } defer func() { - if cerr := f.Close(); cerr != nil { - err = multierror.Append(err, cerr) + if closeErr := f.Close(); closeErr != nil { + err = multierror.Append(err, closeErr) } + + // sometimes we try executing binary too fast and run into text file busy after unpacking + // syncing prevents this + if syncErr := f.Sync(); syncErr != nil { + err = multierror.Append(err, syncErr) + } + }() if _, err = io.Copy(f, rc); err != nil { From ed772cd8fe1c478318eb5b9622e022412b577df2 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Tue, 13 Oct 2020 12:17:29 +0200 Subject: [PATCH 122/156] [Ingest Manager] Change Sync/Close call order (#21735) [Ingest Manager] Change Sync/Close call order (#21735) --- .../pkg/artifact/install/tar/tar_installer.go | 14 +++++++++----- .../pkg/artifact/install/zip/zip_installer.go | 11 ++++------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go b/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go index b9e621c71ac..74a74e4c6bc 100644 --- a/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go +++ b/x-pack/elastic-agent/pkg/artifact/install/tar/tar_installer.go @@ -99,15 +99,19 @@ func unpack(r io.Reader, dir string) error { } _, err = io.Copy(wf, tr) + + if err == nil { + // sometimes we try executing binary too fast and run into text file busy after unpacking + // syncing prevents this + if syncErr := wf.Sync(); syncErr != nil { + err = syncErr + } + } + if closeErr := wf.Close(); closeErr != nil && err == nil { err = closeErr } - // sometimes we try executing binary too fast and run into text file busy after unpacking - // syncing prevents this - if syncErr := wf.Sync(); syncErr != nil && err == nil { - err = syncErr - } if err != nil { return fmt.Errorf("TarInstaller: error writing to %s: %v", abs, err) } diff --git a/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go b/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go index 29cdb66f852..b565f630a73 100644 --- a/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go +++ b/x-pack/elastic-agent/pkg/artifact/install/zip/zip_installer.go @@ -105,18 +105,15 @@ func (i *Installer) unzip(artifactPath string) error { if closeErr := f.Close(); closeErr != nil { err = multierror.Append(err, closeErr) } - - // sometimes we try executing binary too fast and run into text file busy after unpacking - // syncing prevents this - if syncErr := f.Sync(); syncErr != nil { - err = multierror.Append(err, syncErr) - } - }() if _, err = io.Copy(f, rc); err != nil { return err } + + // sometimes we try executing binary too fast and run into text file busy after unpacking + // syncing prevents this + f.Sync() } return nil } From 5536fb6cf02480c3db685aa4f27889266cd20a32 Mon Sep 17 00:00:00 2001 From: Chris Mark Date: Tue, 13 Oct 2020 13:28:11 +0300 Subject: [PATCH 123/156] Add istiod metricset (#21519) --- CHANGELOG.next.asciidoc | 1 + .../docs/images/metricbeat-istio-overview.png | Bin 0 -> 187983 bytes metricbeat/docs/modules/istio.asciidoc | 24 +- metricbeat/docs/modules_list.asciidoc | 2 +- x-pack/metricbeat/metricbeat.reference.yml | 7 + .../module/istio/_meta/config.reference.yml | 7 + .../metricbeat/module/istio/_meta/config.yml | 7 + .../module/istio/_meta/docs.asciidoc | 17 +- .../dashboard/Metricbeat-istio-overview.json | 1762 +++++++++++++++++ x-pack/metricbeat/module/istio/fields.go | 2 +- .../module/istio/istiod/_meta/docs.ascoodoc | 4 + .../module/istio/istiod/_meta/fields.yml | 1 + .../istio/istiod/_meta/testdata/config.yml | 5 + .../istiod/_meta/testdata/istiod.v1.7.1.plain | 499 +++++ .../istiod.v1.7.1.plain-expected.json | 843 ++++++++ .../module/istio/istiod/istiod_test.go | 32 + .../module/istio/istiod/manifest.yml | 11 + x-pack/metricbeat/module/istio/module.yaml | 1 - x-pack/metricbeat/module/istio/module.yml | 3 + .../metricbeat/modules.d/istio.yml.disabled | 7 + 20 files changed, 3228 insertions(+), 7 deletions(-) create mode 100644 metricbeat/docs/images/metricbeat-istio-overview.png create mode 100644 x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json create mode 100644 x-pack/metricbeat/module/istio/istiod/_meta/docs.ascoodoc create mode 100644 x-pack/metricbeat/module/istio/istiod/_meta/fields.yml create mode 100644 x-pack/metricbeat/module/istio/istiod/_meta/testdata/config.yml create mode 100644 x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain create mode 100644 x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain-expected.json create mode 100644 x-pack/metricbeat/module/istio/istiod/istiod_test.go create mode 100644 x-pack/metricbeat/module/istio/istiod/manifest.yml delete mode 100644 x-pack/metricbeat/module/istio/module.yaml create mode 100644 x-pack/metricbeat/module/istio/module.yml diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index f01136c441e..4ca46560ab5 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -453,6 +453,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add Cloud Foundry tags in related events. {pull}21177[21177] - Cloud Foundry metadata is cached to disk. {pull}20775[20775] - Add option to select the type of index template to load: legacy, component, index. {pull}21212[21212] +- Add istiod metricset. {pull}21519[21519] - Release `add_cloudfoundry_metadata` as GA. {pull}21525[21525] - Add support for OpenStack SSL metadata APIs in `add_cloud_metadata`. {pull}21590[21590] diff --git a/metricbeat/docs/images/metricbeat-istio-overview.png b/metricbeat/docs/images/metricbeat-istio-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..139fe9260d49bd0d0034ad292987f67be37468ce GIT binary patch literal 187983 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�)!0&tU;~T5q=NGJC@b*1d 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 literal 0 HcmV?d00001 diff --git a/metricbeat/docs/modules/istio.asciidoc b/metricbeat/docs/modules/istio.asciidoc index 52be7886e04..bfda2a9588d 100644 --- a/metricbeat/docs/modules/istio.asciidoc +++ b/metricbeat/docs/modules/istio.asciidoc @@ -8,15 +8,28 @@ This file is generated! See scripts/mage/docs_collector.go beta[] -This is the Istio module. The Istio module collects metrics from the +This is the Istio module. +This module is compatible with versions before `1.5` of Istio where microservices architecture is used. If using +versions priot to `1.5` then `mesh`, `mixer`, `pilot`, `galley`, `citadel` metricsets should be used. +wehre the Istio module collects metrics from the Istio https://istio.io/v1.4/docs/tasks/observability/metrics/querying-metrics/#about-the-prometheus-add-on[prometheus exporters endpoints]. +For versions after `1.5`, `istiod` metricset can be used which collects metrics directly from Istio Daemon. The default metricsets are `mesh`, `mixer`, `pilot`, `galley`, `citadel`. [float] === Compatibility -The Istio module is tested with Istio `1.4`. +The Istio module is tested with Istio `1.4` for `mesh`, `mixer`, `pilot`, `galley`, `citadel`. +The Istio module is tested with Istio `1.7` for `istiod`. + +[float] +=== Dashboard + +The Istio module includes a predefined dashboard with overview information about Istio Daemon. +This dashboard is only compatible with versions of Istio after `1.5` which should be monitored with `istiod` metricset. + +image::./images/metricbeat-istio-overview.png[] [float] @@ -62,6 +75,13 @@ metricbeat.modules: period: 10s # use istio-pilot.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ["localhost:15014"] + +# Istio istiod to monitor the Istio Daemon for versions after 1.5 of Istio. +- module: istio + metricsets: ['istiod'] + period: 10s + # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset + hosts: ['localhost:15014'] ---- [float] diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index b37f7f831a3..1bc81071e76 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -132,7 +132,7 @@ This file is generated! See scripts/mage/docs_collector.go .3+| .3+| |<> beta[] |<> beta[] |<> beta[] -|<> beta[] |image:./images/icon-no.png[No prebuilt dashboards] | +|<> beta[] |image:./images/icon-yes.png[Prebuilt dashboards are available] | .5+| .5+| |<> beta[] |<> beta[] |<> beta[] diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index bd99c2cf508..b7b62643353 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -693,6 +693,13 @@ metricbeat.modules: # use istio-pilot.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ["localhost:15014"] +# Istio istiod to monitor the Istio Daemon for versions after 1.5 of Istio. +- module: istio + metricsets: ['istiod'] + period: 10s + # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset + hosts: ['localhost:15014'] + #------------------------------- Jolokia Module ------------------------------- - module: jolokia #metricsets: ["jmx"] diff --git a/x-pack/metricbeat/module/istio/_meta/config.reference.yml b/x-pack/metricbeat/module/istio/_meta/config.reference.yml index c3e940f80e5..146728fdfcd 100644 --- a/x-pack/metricbeat/module/istio/_meta/config.reference.yml +++ b/x-pack/metricbeat/module/istio/_meta/config.reference.yml @@ -32,3 +32,10 @@ period: 10s # use istio-pilot.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ["localhost:15014"] + +# Istio istiod to monitor the Istio Daemon for versions after 1.5 of Istio. +- module: istio + metricsets: ['istiod'] + period: 10s + # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset + hosts: ['localhost:15014'] diff --git a/x-pack/metricbeat/module/istio/_meta/config.yml b/x-pack/metricbeat/module/istio/_meta/config.yml index c3e940f80e5..146728fdfcd 100644 --- a/x-pack/metricbeat/module/istio/_meta/config.yml +++ b/x-pack/metricbeat/module/istio/_meta/config.yml @@ -32,3 +32,10 @@ period: 10s # use istio-pilot.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ["localhost:15014"] + +# Istio istiod to monitor the Istio Daemon for versions after 1.5 of Istio. +- module: istio + metricsets: ['istiod'] + period: 10s + # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset + hosts: ['localhost:15014'] diff --git a/x-pack/metricbeat/module/istio/_meta/docs.asciidoc b/x-pack/metricbeat/module/istio/_meta/docs.asciidoc index 0a52294d1fc..cfba8ec7ce8 100644 --- a/x-pack/metricbeat/module/istio/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/istio/_meta/docs.asciidoc @@ -1,9 +1,22 @@ -This is the Istio module. The Istio module collects metrics from the +This is the Istio module. +This module is compatible with versions before `1.5` of Istio where microservices architecture is used. If using +versions priot to `1.5` then `mesh`, `mixer`, `pilot`, `galley`, `citadel` metricsets should be used. +wehre the Istio module collects metrics from the Istio https://istio.io/v1.4/docs/tasks/observability/metrics/querying-metrics/#about-the-prometheus-add-on[prometheus exporters endpoints]. +For versions after `1.5`, `istiod` metricset can be used which collects metrics directly from Istio Daemon. The default metricsets are `mesh`, `mixer`, `pilot`, `galley`, `citadel`. [float] === Compatibility -The Istio module is tested with Istio `1.4`. +The Istio module is tested with Istio `1.4` for `mesh`, `mixer`, `pilot`, `galley`, `citadel`. +The Istio module is tested with Istio `1.7` for `istiod`. + +[float] +=== Dashboard + +The Istio module includes a predefined dashboard with overview information about Istio Daemon. +This dashboard is only compatible with versions of Istio after `1.5` which should be monitored with `istiod` metricset. + +image::./images/metricbeat-istio-overview.png[] diff --git a/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json b/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json new file mode 100644 index 00000000000..72b995c2382 --- /dev/null +++ b/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json @@ -0,0 +1,1762 @@ +{ + "objects": [ + { + "attributes": { + "description": "Overview of the Istiod Service status", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "optionsJSON": { + "hidePanelTitles": false, + "useMargins": true + }, + "panelsJSON": [ + { + "embeddableConfig": { + "title": "Pilot Proxy Queue Time" + }, + "gridData": { + "h": 9, + "i": "cd1bbc4f-95de-4156-a3ef-c091cf6402c0", + "w": 12, + "x": 0, + "y": 0 + }, + "panelIndex": "cd1bbc4f-95de-4156-a3ef-c091cf6402c0", + "panelRefName": "panel_0", + "title": "Pilot Proxy Queue Time", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds Push Time" + }, + "gridData": { + "h": 9, + "i": "06af11e6-e026-48db-a06b-b34b402b535b", + "w": 12, + "x": 12, + "y": 0 + }, + "panelIndex": "06af11e6-e026-48db-a06b-b34b402b535b", + "panelRefName": "panel_1", + "title": "Pilot xds Push Time", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds Pushes" + }, + "gridData": { + "h": 9, + "i": "d9a49bf0-f88b-4d4f-a1e2-74fbd482f77c", + "w": 11, + "x": 24, + "y": 0 + }, + "panelIndex": "d9a49bf0-f88b-4d4f-a1e2-74fbd482f77c", + "panelRefName": "panel_2", + "title": "Pilot xds Pushes", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot Inbound Updates" + }, + "gridData": { + "h": 9, + "i": "a8e47ef0-03db-419f-890f-0880d674682c", + "w": 13, + "x": 35, + "y": 0 + }, + "panelIndex": "a8e47ef0-03db-419f-890f-0880d674682c", + "panelRefName": "panel_3", + "title": "Pilot Inbound Updates", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Citadel Cert Issuane" + }, + "gridData": { + "h": 9, + "i": "e708abfa-5a95-483c-9bb2-4470ee913f3c", + "w": 12, + "x": 0, + "y": 9 + }, + "panelIndex": "e708abfa-5a95-483c-9bb2-4470ee913f3c", + "panelRefName": "panel_4", + "title": "Citadel Cert Issuane", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Galley Validation Failed" + }, + "gridData": { + "h": 9, + "i": "724f0f9e-2186-4ddd-859c-edb2649b8c0f", + "w": 12, + "x": 12, + "y": 9 + }, + "panelIndex": "724f0f9e-2186-4ddd-859c-edb2649b8c0f", + "panelRefName": "panel_5", + "title": "Galley Validation Failed", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pods witout IP", + "vis": null + }, + "gridData": { + "h": 9, + "i": "32eaa989-a4f9-4d31-97cb-684f31488aa8", + "w": 8, + "x": 24, + "y": 9 + }, + "panelIndex": "32eaa989-a4f9-4d31-97cb-684f31488aa8", + "panelRefName": "panel_6", + "title": "Pods witout IP", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot Virtual Services", + "vis": null + }, + "gridData": { + "h": 9, + "i": "6a8463fe-b7cb-4cd8-bf01-f7ca6a185178", + "w": 8, + "x": 32, + "y": 9 + }, + "panelIndex": "6a8463fe-b7cb-4cd8-bf01-f7ca6a185178", + "panelRefName": "panel_7", + "title": "Pilot Virtual Services", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot Services", + "vis": null + }, + "gridData": { + "h": 9, + "i": "51ecc2f8-3c3f-4a80-b4b6-b52db10e68ad", + "w": 8, + "x": 40, + "y": 9 + }, + "panelIndex": "51ecc2f8-3c3f-4a80-b4b6-b52db10e68ad", + "panelRefName": "panel_8", + "title": "Pilot Services", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot Conflict Inbound Listener", + "vis": null + }, + "gridData": { + "h": 9, + "i": "0a63d980-8d93-4ce1-b5a1-ab77e589ceec", + "w": 9, + "x": 0, + "y": 18 + }, + "panelIndex": "0a63d980-8d93-4ce1-b5a1-ab77e589ceec", + "panelRefName": "panel_9", + "title": "Pilot Conflict Inbound Listener", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot eds instances", + "vis": null + }, + "gridData": { + "h": 9, + "i": "9fbfca4c-37b5-4a1a-924e-49fc9ef2294c", + "w": 10, + "x": 9, + "y": 18 + }, + "panelIndex": "9fbfca4c-37b5-4a1a-924e-49fc9ef2294c", + "panelRefName": "panel_10", + "title": "Pilot eds instances", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds endpoints" + }, + "gridData": { + "h": 9, + "i": "d6b2845f-9582-4863-853e-ab753f3d763e", + "w": 14, + "x": 19, + "y": 18 + }, + "panelIndex": "d6b2845f-9582-4863-853e-ab753f3d763e", + "panelRefName": "panel_11", + "title": "Pilot xds endpoints", + "version": "7.8.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds expired" + }, + "gridData": { + "h": 9, + "i": "3d0dec37-26c3-490b-a45f-48b6d1baa160", + "w": 15, + "x": 33, + "y": 18 + }, + "panelIndex": "3d0dec37-26c3-490b-a45f-48b6d1baa160", + "panelRefName": "panel_12", + "title": "Pilot xds expired", + "version": "7.8.0" + } + ], + "timeRestore": false, + "title": "[Metricbeat Istio] Overview", + "version": 1 + }, + "id": "d899d3f0-0883-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "dashboard": "7.3.0" + }, + "references": [ + { + "id": "dd1392f0-07d8-11eb-a3fd-1b45ec532bb3", + "name": "panel_0", + "type": "visualization" + }, + { + "id": "b5b3abb0-087c-11eb-a3fd-1b45ec532bb3", + "name": "panel_1", + "type": "visualization" + }, + { + "id": "f858c200-087e-11eb-a3fd-1b45ec532bb3", + "name": "panel_2", + "type": "visualization" + }, + { + "id": "aa997510-087d-11eb-a3fd-1b45ec532bb3", + "name": "panel_3", + "type": "visualization" + }, + { + "id": "506c8490-087f-11eb-a3fd-1b45ec532bb3", + "name": "panel_4", + "type": "visualization" + }, + { + "id": "98b01f00-087f-11eb-a3fd-1b45ec532bb3", + "name": "panel_5", + "type": "visualization" + }, + { + "id": "4275f710-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_6", + "type": "visualization" + }, + { + "id": "96bfe060-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_7", + "type": "visualization" + }, + { + "id": "6cfbe3f0-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_8", + "type": "visualization" + }, + { + "id": "d62a1e60-0881-11eb-a3fd-1b45ec532bb3", + "name": "panel_9", + "type": "visualization" + }, + { + "id": "12cdcce0-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_10", + "type": "visualization" + }, + { + "id": "e5f3e870-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_11", + "type": "visualization" + }, + { + "id": "0ed17c80-0883-11eb-a3fd-1b45ec532bb3", + "name": "panel_12", + "type": "visualization" + } + ], + "type": "dashboard", + "updated_at": "2020-10-07T10:23:52.518Z", + "version": "WzQ0OTIsMV0=" + }, + { + "attributes": { + "description": "Time in seconds, a proxy is in the push queue before being dequeued.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Proxy Queue Time [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "queue_time", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_proxy_queue_time.histogram.values", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "03ef6580-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "071fe4f0-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "0b7164c0-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "90" + }, + { + "id": "0f611580-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "136f98e0-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot Proxy Queue Time [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "dd1392f0-07d8-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T10:23:11.367Z", + "version": "WzQ0ODMsMV0=" + }, + { + "attributes": { + "description": "Total time in seconds Pilot takes to push lds, rds, cds and eds.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot xds Push Time [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "prometheus.labels.type: \"rds\" OR prometheus.labels.type: \"lds\" OR prometheus.labels.type: \"cds\" OR prometheus.labels.type: \"eds\"" + }, + "formatter": "s,s,", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds_push_time", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds_push_time.histogram.values", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_size": "20", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot xds Push Time [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "b5b3abb0-087c-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T10:23:48.176Z", + "version": "WzQ0ODgsMV0=" + }, + { + "attributes": { + "description": "Pilot build and send errors for lds, rds, cds and eds.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot xds Pushes [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" + }, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds_pushes", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds_pushes.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "4", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot xds Pushes [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "f858c200-087e-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T09:24:59.040Z", + "version": "WzQzOTAsMV0=" + }, + { + "attributes": { + "description": "Total number of updates received by pilot.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Inbound Updates [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" + }, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_inbound_updates", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_inbound_updates.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "10", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot Inbound Updates [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "aa997510-087d-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T09:21:43.250Z", + "version": "WzQzODcsMV0=" + }, + { + "attributes": { + "description": "The number of certificates issuances that have succeeded.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Citadel Cert Issuance [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" + }, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "success_cert_issuance", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.citadel_server_success_cert_issuance_count.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "4", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Citadel Cert Issuance [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "506c8490-087f-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T10:15:51.172Z", + "version": "WzQ0NzYsMV0=" + }, + { + "attributes": { + "description": "Resource validation failed.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Galley Validation Failed [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" + }, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "galley_validation_failed", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.galley_validation_failed.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.resource", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "10", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Galley Validation Failed [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "98b01f00-087f-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T09:30:05.212Z", + "version": "WzQzOTksMV0=" + }, + { + "attributes": { + "description": "Pods not found in the endpoint table, possibly invalid.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Pods without IP [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot No IP pods", + "field": "prometheus.pilot_no_ip.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 + } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" + }, + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Pods without IP [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "4275f710-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-07T09:48:31.873Z", + "version": "WzQ0MjcsMV0=" + }, + { + "attributes": { + "description": "Total virtual services known to pilot.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Virtual Services [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot Virtual Services", + "field": "prometheus.pilot_virt_services.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 + } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" + }, + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Virtual Services [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "96bfe060-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-07T09:50:53.286Z", + "version": "WzQ0MzMsMV0=" + }, + { + "attributes": { + "description": "Total services known to pilot.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Services [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot Services", + "field": "prometheus.pilot_services.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 + } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" + }, + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Services [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "6cfbe3f0-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-07T10:04:27.677Z", + "version": "WzQ0NTksMV0=" + }, + { + "attributes": { + "description": "Number of conflicting inbound listeners.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Conflict Inbound Listener [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot conflict inbound listener", + "field": "prometheus.pilot_conflict_inbound_listener.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 + } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" + }, + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Conflict Inbound Listener [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "d62a1e60-0881-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-07T09:45:30.182Z", + "version": "WzQ0MjAsMV0=" + }, + { + "attributes": { + "description": "Number of clusters without instances.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot eds Instances [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot eds instnaces", + "field": "prometheus.pilot_eds_no_instances.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 + } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" + }, + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot eds Instances [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "12cdcce0-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-07T09:47:11.918Z", + "version": "WzQ0MjQsMV0=" + }, + { + "attributes": { + "description": "Number of endpoints connected to this pilot using XDS.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot XDS endpoints [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds.value", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "avg" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot XDS endpoints [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "e5f3e870-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T09:53:38.583Z", + "version": "WzQ0NDEsMV0=" + }, + { + "attributes": { + "description": "Total number of XDS requests with an expired nonce.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot XDS expired [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds_expired_nonce", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds_expired_nonce.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "avg" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot XDS expired [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "0ed17c80-0883-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "references": [], + "type": "visualization", + "updated_at": "2020-10-07T09:54:14.728Z", + "version": "WzQ0NDMsMV0=" + } + ], + "version": "7.8.0" +} diff --git a/x-pack/metricbeat/module/istio/fields.go b/x-pack/metricbeat/module/istio/fields.go index 40a9baed3f5..ccd41e55fe8 100644 --- a/x-pack/metricbeat/module/istio/fields.go +++ b/x-pack/metricbeat/module/istio/fields.go @@ -19,5 +19,5 @@ func init() { // AssetIstio returns asset data. // This is the base64 encoded gzipped contents of module/istio. func AssetIstio() string { - return "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" + return "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" } diff --git a/x-pack/metricbeat/module/istio/istiod/_meta/docs.ascoodoc b/x-pack/metricbeat/module/istio/istiod/_meta/docs.ascoodoc new file mode 100644 index 00000000000..61170c60413 --- /dev/null +++ b/x-pack/metricbeat/module/istio/istiod/_meta/docs.ascoodoc @@ -0,0 +1,4 @@ +This is the istiod metricset of the module istio. +This metricset collects metrics from the Istio Daemon of Istio versions higher than 1.5 + +Tested with Istio 1.7 diff --git a/x-pack/metricbeat/module/istio/istiod/_meta/fields.yml b/x-pack/metricbeat/module/istio/istiod/_meta/fields.yml new file mode 100644 index 00000000000..8033a27f5ac --- /dev/null +++ b/x-pack/metricbeat/module/istio/istiod/_meta/fields.yml @@ -0,0 +1 @@ +- release: beta diff --git a/x-pack/metricbeat/module/istio/istiod/_meta/testdata/config.yml b/x-pack/metricbeat/module/istio/istiod/_meta/testdata/config.yml new file mode 100644 index 00000000000..376691991b5 --- /dev/null +++ b/x-pack/metricbeat/module/istio/istiod/_meta/testdata/config.yml @@ -0,0 +1,5 @@ +type: http +url: "/metrics" +suffix: plain +remove_fields_from_comparison: ["prometheus.labels.instance"] +omit_documented_fields_check: ["prometheus.labels.*"] diff --git a/x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain b/x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain new file mode 100644 index 00000000000..4ec26bf4a2c --- /dev/null +++ b/x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain @@ -0,0 +1,499 @@ +# HELP citadel_server_csr_count The number of CSRs received by Citadel server. +# TYPE citadel_server_csr_count counter +citadel_server_csr_count 8 +# HELP citadel_server_root_cert_expiry_timestamp The unix timestamp, in seconds, when Citadel root cert will expire. A negative time indicates the cert is expired. +# TYPE citadel_server_root_cert_expiry_timestamp gauge +citadel_server_root_cert_expiry_timestamp 1.916309303e+09 +# HELP citadel_server_success_cert_issuance_count The number of certificates issuances that have succeeded. +# TYPE citadel_server_success_cert_issuance_count counter +citadel_server_success_cert_issuance_count 8 +# HELP endpoint_no_pod Endpoints without an associated pod. +# TYPE endpoint_no_pod gauge +endpoint_no_pod 0 +# HELP galley_validation_config_updates k8s webhook configuration updates +# TYPE galley_validation_config_updates counter +galley_validation_config_updates 2 +# HELP galley_validation_failed Resource validation failed +# TYPE galley_validation_failed counter +galley_validation_failed{group="networking.istio.io",reason="invalid_resource",resource="gateways",version="v1alpha3"} 1 +# HELP go_gc_duration_seconds A summary of the GC invocation durations. +# TYPE go_gc_duration_seconds summary +go_gc_duration_seconds{quantile="0"} 8.969e-06 +go_gc_duration_seconds{quantile="0.25"} 8.7539e-05 +go_gc_duration_seconds{quantile="0.5"} 0.000238037 +go_gc_duration_seconds{quantile="0.75"} 0.000783504 +go_gc_duration_seconds{quantile="1"} 0.005515511 +go_gc_duration_seconds_sum 0.013316174 +go_gc_duration_seconds_count 13 +# HELP go_goroutines Number of goroutines that currently exist. +# TYPE go_goroutines gauge +go_goroutines 345 +# HELP go_info Information about the Go environment. +# TYPE go_info gauge +go_info{version="go1.14.7"} 1 +# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. +# TYPE go_memstats_alloc_bytes gauge +go_memstats_alloc_bytes 3.1723136e+07 +# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed. +# TYPE go_memstats_alloc_bytes_total counter +go_memstats_alloc_bytes_total 1.106604e+08 +# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table. +# TYPE go_memstats_buck_hash_sys_bytes gauge +go_memstats_buck_hash_sys_bytes 1.496287e+06 +# HELP go_memstats_frees_total Total number of frees. +# TYPE go_memstats_frees_total counter +go_memstats_frees_total 982627 +# HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started. +# TYPE go_memstats_gc_cpu_fraction gauge +go_memstats_gc_cpu_fraction 6.904294960464036e-05 +# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata. +# TYPE go_memstats_gc_sys_bytes gauge +go_memstats_gc_sys_bytes 3.832072e+06 +# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use. +# TYPE go_memstats_heap_alloc_bytes gauge +go_memstats_heap_alloc_bytes 3.1723136e+07 +# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used. +# TYPE go_memstats_heap_idle_bytes gauge +go_memstats_heap_idle_bytes 2.1651456e+07 +# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use. +# TYPE go_memstats_heap_inuse_bytes gauge +go_memstats_heap_inuse_bytes 4.2508288e+07 +# HELP go_memstats_heap_objects Number of allocated objects. +# TYPE go_memstats_heap_objects gauge +go_memstats_heap_objects 157553 +# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS. +# TYPE go_memstats_heap_released_bytes gauge +go_memstats_heap_released_bytes 1.7825792e+07 +# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system. +# TYPE go_memstats_heap_sys_bytes gauge +go_memstats_heap_sys_bytes 6.4159744e+07 +# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection. +# TYPE go_memstats_last_gc_time_seconds gauge +go_memstats_last_gc_time_seconds 1.6019028053800597e+09 +# HELP go_memstats_lookups_total Total number of pointer lookups. +# TYPE go_memstats_lookups_total counter +go_memstats_lookups_total 0 +# HELP go_memstats_mallocs_total Total number of mallocs. +# TYPE go_memstats_mallocs_total counter +go_memstats_mallocs_total 1.14018e+06 +# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures. +# TYPE go_memstats_mcache_inuse_bytes gauge +go_memstats_mcache_inuse_bytes 6944 +# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system. +# TYPE go_memstats_mcache_sys_bytes gauge +go_memstats_mcache_sys_bytes 16384 +# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures. +# TYPE go_memstats_mspan_inuse_bytes gauge +go_memstats_mspan_inuse_bytes 485384 +# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system. +# TYPE go_memstats_mspan_sys_bytes gauge +go_memstats_mspan_sys_bytes 573440 +# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place. +# TYPE go_memstats_next_gc_bytes gauge +go_memstats_next_gc_bytes 5.3766592e+07 +# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations. +# TYPE go_memstats_other_sys_bytes gauge +go_memstats_other_sys_bytes 914201 +# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator. +# TYPE go_memstats_stack_inuse_bytes gauge +go_memstats_stack_inuse_bytes 2.94912e+06 +# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator. +# TYPE go_memstats_stack_sys_bytes gauge +go_memstats_stack_sys_bytes 2.94912e+06 +# HELP go_memstats_sys_bytes Number of bytes obtained from system. +# TYPE go_memstats_sys_bytes gauge +go_memstats_sys_bytes 7.3941248e+07 +# HELP go_threads Number of OS threads created. +# TYPE go_threads gauge +go_threads 14 +# HELP grpc_server_handled_total Total number of RPCs completed on the server, regardless of success or failure. +# TYPE grpc_server_handled_total counter +grpc_server_handled_total{grpc_code="Aborted",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="Aborted",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Aborted",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Aborted",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Aborted",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Aborted",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="AlreadyExists",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="AlreadyExists",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="AlreadyExists",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="AlreadyExists",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="AlreadyExists",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="AlreadyExists",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Canceled",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="Canceled",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Canceled",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Canceled",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Canceled",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Canceled",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DataLoss",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="DataLoss",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DataLoss",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DataLoss",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DataLoss",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DataLoss",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DeadlineExceeded",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="DeadlineExceeded",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DeadlineExceeded",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DeadlineExceeded",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DeadlineExceeded",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="DeadlineExceeded",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="FailedPrecondition",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="FailedPrecondition",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="FailedPrecondition",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="FailedPrecondition",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="FailedPrecondition",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="FailedPrecondition",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Internal",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="Internal",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Internal",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Internal",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Internal",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Internal",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="InvalidArgument",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="InvalidArgument",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="InvalidArgument",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="InvalidArgument",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="InvalidArgument",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="InvalidArgument",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="NotFound",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="NotFound",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="NotFound",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="NotFound",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="NotFound",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="NotFound",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OK",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 8 +grpc_server_handled_total{grpc_code="OK",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OK",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OK",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OK",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OK",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OutOfRange",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="OutOfRange",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OutOfRange",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OutOfRange",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OutOfRange",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="OutOfRange",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="PermissionDenied",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="PermissionDenied",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="PermissionDenied",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="PermissionDenied",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="PermissionDenied",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="PermissionDenied",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="ResourceExhausted",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="ResourceExhausted",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="ResourceExhausted",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="ResourceExhausted",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="ResourceExhausted",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="ResourceExhausted",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unauthenticated",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="Unauthenticated",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unauthenticated",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unauthenticated",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unauthenticated",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unauthenticated",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unavailable",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="Unavailable",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unavailable",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unavailable",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unavailable",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unavailable",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unimplemented",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="Unimplemented",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unimplemented",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unimplemented",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unimplemented",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unimplemented",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unknown",grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0 +grpc_server_handled_total{grpc_code="Unknown",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unknown",grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unknown",grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unknown",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handled_total{grpc_code="Unknown",grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +# HELP grpc_server_handling_seconds Histogram of response latency (seconds) of gRPC that had been application-level handled by the server. +# TYPE grpc_server_handling_seconds histogram +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="0.005"} 7 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="0.01"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="0.025"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="0.05"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="0.1"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="0.25"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="0.5"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="1"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="2.5"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="5"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="10"} 8 +grpc_server_handling_seconds_bucket{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary",le="+Inf"} 8 +grpc_server_handling_seconds_sum{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 0.031283576 +grpc_server_handling_seconds_count{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 8 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.005"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.01"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.025"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.05"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.25"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="2.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="10"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="+Inf"} 0 +grpc_server_handling_seconds_sum{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_count{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.005"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.01"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.025"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.05"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.25"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="2.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="10"} 0 +grpc_server_handling_seconds_bucket{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="+Inf"} 0 +grpc_server_handling_seconds_sum{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_count{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="0.005"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="0.01"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="0.025"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="0.05"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="0.1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="0.25"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="0.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="2.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="10"} 0 +grpc_server_handling_seconds_bucket{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream",le="+Inf"} 0 +grpc_server_handling_seconds_sum{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_count{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.005"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.01"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.025"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.05"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.25"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="2.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="10"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream",le="+Inf"} 0 +grpc_server_handling_seconds_sum{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_count{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.005"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.01"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.025"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.05"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.25"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="0.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="1"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="2.5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="5"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="10"} 0 +grpc_server_handling_seconds_bucket{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream",le="+Inf"} 0 +grpc_server_handling_seconds_sum{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_handling_seconds_count{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +# HELP grpc_server_msg_received_total Total number of RPC stream messages received on the server. +# TYPE grpc_server_msg_received_total counter +grpc_server_msg_received_total{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 8 +grpc_server_msg_received_total{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_msg_received_total{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_msg_received_total{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_msg_received_total{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_msg_received_total{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +# HELP grpc_server_msg_sent_total Total number of gRPC stream messages sent by the server. +# TYPE grpc_server_msg_sent_total counter +grpc_server_msg_sent_total{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 8 +grpc_server_msg_sent_total{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_msg_sent_total{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_msg_sent_total{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_msg_sent_total{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_msg_sent_total{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +# HELP grpc_server_started_total Total number of RPCs started on the server. +# TYPE grpc_server_started_total counter +grpc_server_started_total{grpc_method="CreateCertificate",grpc_service="istio.v1.auth.IstioCertificateService",grpc_type="unary"} 8 +grpc_server_started_total{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_started_total{grpc_method="DeltaAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_started_total{grpc_method="ServerReflectionInfo",grpc_service="grpc.reflection.v1alpha.ServerReflection",grpc_type="bidi_stream"} 0 +grpc_server_started_total{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v2.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +grpc_server_started_total{grpc_method="StreamAggregatedResources",grpc_service="envoy.service.discovery.v3.AggregatedDiscoveryService",grpc_type="bidi_stream"} 0 +# HELP istio_build Istio component build info +# TYPE istio_build gauge +istio_build{component="pilot",tag="1.7.1"} 1 +# HELP pilot_conflict_inbound_listener Number of conflicting inbound listeners. +# TYPE pilot_conflict_inbound_listener gauge +pilot_conflict_inbound_listener 0 +# HELP pilot_conflict_outbound_listener_http_over_current_tcp Number of conflicting wildcard http listeners with current wildcard tcp listener. +# TYPE pilot_conflict_outbound_listener_http_over_current_tcp gauge +pilot_conflict_outbound_listener_http_over_current_tcp 0 +# HELP pilot_conflict_outbound_listener_tcp_over_current_http Number of conflicting wildcard tcp listeners with current wildcard http listener. +# TYPE pilot_conflict_outbound_listener_tcp_over_current_http gauge +pilot_conflict_outbound_listener_tcp_over_current_http 0 +# HELP pilot_conflict_outbound_listener_tcp_over_current_tcp Number of conflicting tcp listeners with current tcp listener. +# TYPE pilot_conflict_outbound_listener_tcp_over_current_tcp gauge +pilot_conflict_outbound_listener_tcp_over_current_tcp 0 +# HELP pilot_destrule_subsets Duplicate subsets across destination rules for same host +# TYPE pilot_destrule_subsets gauge +pilot_destrule_subsets 0 +# HELP pilot_duplicate_envoy_clusters Duplicate envoy clusters caused by service entries with same hostname +# TYPE pilot_duplicate_envoy_clusters gauge +pilot_duplicate_envoy_clusters 0 +# HELP pilot_eds_no_instances Number of clusters without instances. +# TYPE pilot_eds_no_instances gauge +pilot_eds_no_instances 0 +# HELP pilot_endpoint_not_ready Endpoint found in unready state. +# TYPE pilot_endpoint_not_ready gauge +pilot_endpoint_not_ready 0 +# HELP pilot_inbound_updates Total number of updates received by pilot. +# TYPE pilot_inbound_updates counter +pilot_inbound_updates{type="config"} 90 +pilot_inbound_updates{type="eds"} 54 +pilot_inbound_updates{type="svc"} 22 +# HELP pilot_info Pilot version and build information. +# TYPE pilot_info gauge +pilot_info{version="1.7.1-4e26c697ce460dc8d3b25b25818fb0163ca16394-Clean"} 1 +# HELP pilot_k8s_cfg_events Events from k8s config. +# TYPE pilot_k8s_cfg_events counter +pilot_k8s_cfg_events{event="add",type="DestinationRule"} 4 +pilot_k8s_cfg_events{event="add",type="EnvoyFilter"} 8 +pilot_k8s_cfg_events{event="add",type="Gateway"} 1 +pilot_k8s_cfg_events{event="add",type="VirtualService"} 1 +# HELP pilot_k8s_reg_events Events from k8s registry. +# TYPE pilot_k8s_reg_events counter +pilot_k8s_reg_events{event="add",type="Endpoints"} 12 +pilot_k8s_reg_events{event="add",type="Nodes"} 1 +pilot_k8s_reg_events{event="add",type="Pods"} 22 +pilot_k8s_reg_events{event="add",type="Services"} 11 +pilot_k8s_reg_events{event="update",type="Endpoints"} 30 +pilot_k8s_reg_events{event="update",type="Nodes"} 1 +pilot_k8s_reg_events{event="update",type="Pods"} 61 +pilot_k8s_reg_events{event="updatesame",type="Endpoints"} 185 +# HELP pilot_no_ip Pods not found in the endpoint table, possibly invalid. +# TYPE pilot_no_ip gauge +pilot_no_ip 0 +# HELP pilot_proxy_convergence_time Delay in seconds between config change and a proxy receiving all required configuration. +# TYPE pilot_proxy_convergence_time histogram +pilot_proxy_convergence_time_bucket{le="0.1"} 1 +pilot_proxy_convergence_time_bucket{le="0.5"} 1 +pilot_proxy_convergence_time_bucket{le="1"} 1 +pilot_proxy_convergence_time_bucket{le="3"} 1 +pilot_proxy_convergence_time_bucket{le="5"} 1 +pilot_proxy_convergence_time_bucket{le="10"} 1 +pilot_proxy_convergence_time_bucket{le="20"} 1 +pilot_proxy_convergence_time_bucket{le="30"} 1 +pilot_proxy_convergence_time_bucket{le="+Inf"} 1 +pilot_proxy_convergence_time_sum 0.002034992 +pilot_proxy_convergence_time_count 1 +# HELP pilot_proxy_queue_time Time in seconds, a proxy is in the push queue before being dequeued. +# TYPE pilot_proxy_queue_time histogram +pilot_proxy_queue_time_bucket{le="0.1"} 41 +pilot_proxy_queue_time_bucket{le="1"} 41 +pilot_proxy_queue_time_bucket{le="3"} 41 +pilot_proxy_queue_time_bucket{le="5"} 41 +pilot_proxy_queue_time_bucket{le="10"} 41 +pilot_proxy_queue_time_bucket{le="20"} 41 +pilot_proxy_queue_time_bucket{le="30"} 41 +pilot_proxy_queue_time_bucket{le="+Inf"} 41 +pilot_proxy_queue_time_sum 0.002216352 +pilot_proxy_queue_time_count 41 +# HELP pilot_push_triggers Total number of times a push was triggered, labeled by reason for the push. +# TYPE pilot_push_triggers counter +pilot_push_triggers{type="endpoint"} 40 +pilot_push_triggers{type="proxy"} 1 +# HELP pilot_services Total services known to pilot. +# TYPE pilot_services gauge +pilot_services 11 +# HELP pilot_virt_services Total virtual services known to pilot. +# TYPE pilot_virt_services gauge +pilot_virt_services 1 +# HELP pilot_vservice_dup_domain Virtual services with dup domains. +# TYPE pilot_vservice_dup_domain gauge +pilot_vservice_dup_domain 0 +# HELP pilot_xds Number of endpoints connected to this pilot using XDS. +# TYPE pilot_xds gauge +pilot_xds{version="1.7.1"} 8 +# HELP pilot_xds_push_time Total time in seconds Pilot takes to push lds, rds, cds and eds. +# TYPE pilot_xds_push_time histogram +pilot_xds_push_time_bucket{type="cds",le="0.01"} 9 +pilot_xds_push_time_bucket{type="cds",le="0.1"} 9 +pilot_xds_push_time_bucket{type="cds",le="1"} 9 +pilot_xds_push_time_bucket{type="cds",le="3"} 9 +pilot_xds_push_time_bucket{type="cds",le="5"} 9 +pilot_xds_push_time_bucket{type="cds",le="10"} 9 +pilot_xds_push_time_bucket{type="cds",le="20"} 9 +pilot_xds_push_time_bucket{type="cds",le="30"} 9 +pilot_xds_push_time_bucket{type="cds",le="+Inf"} 9 +pilot_xds_push_time_sum{type="cds"} 0.009549363999999998 +pilot_xds_push_time_count{type="cds"} 9 +pilot_xds_push_time_bucket{type="eds",le="0.01"} 49 +pilot_xds_push_time_bucket{type="eds",le="0.1"} 49 +pilot_xds_push_time_bucket{type="eds",le="1"} 49 +pilot_xds_push_time_bucket{type="eds",le="3"} 49 +pilot_xds_push_time_bucket{type="eds",le="5"} 49 +pilot_xds_push_time_bucket{type="eds",le="10"} 49 +pilot_xds_push_time_bucket{type="eds",le="20"} 49 +pilot_xds_push_time_bucket{type="eds",le="30"} 49 +pilot_xds_push_time_bucket{type="eds",le="+Inf"} 49 +pilot_xds_push_time_sum{type="eds"} 0.008623654 +pilot_xds_push_time_count{type="eds"} 49 +pilot_xds_push_time_bucket{type="lds",le="0.01"} 9 +pilot_xds_push_time_bucket{type="lds",le="0.1"} 9 +pilot_xds_push_time_bucket{type="lds",le="1"} 9 +pilot_xds_push_time_bucket{type="lds",le="3"} 9 +pilot_xds_push_time_bucket{type="lds",le="5"} 9 +pilot_xds_push_time_bucket{type="lds",le="10"} 9 +pilot_xds_push_time_bucket{type="lds",le="20"} 9 +pilot_xds_push_time_bucket{type="lds",le="30"} 9 +pilot_xds_push_time_bucket{type="lds",le="+Inf"} 9 +pilot_xds_push_time_sum{type="lds"} 0.011886486000000002 +pilot_xds_push_time_count{type="lds"} 9 +pilot_xds_push_time_bucket{type="rds",le="0.01"} 9 +pilot_xds_push_time_bucket{type="rds",le="0.1"} 9 +pilot_xds_push_time_bucket{type="rds",le="1"} 9 +pilot_xds_push_time_bucket{type="rds",le="3"} 9 +pilot_xds_push_time_bucket{type="rds",le="5"} 9 +pilot_xds_push_time_bucket{type="rds",le="10"} 9 +pilot_xds_push_time_bucket{type="rds",le="20"} 9 +pilot_xds_push_time_bucket{type="rds",le="30"} 9 +pilot_xds_push_time_bucket{type="rds",le="+Inf"} 9 +pilot_xds_push_time_sum{type="rds"} 0.002646734 +pilot_xds_push_time_count{type="rds"} 9 +# HELP pilot_xds_pushes Pilot build and send errors for lds, rds, cds and eds. +# TYPE pilot_xds_pushes counter +pilot_xds_pushes{type="cds"} 9 +pilot_xds_pushes{type="eds"} 49 +pilot_xds_pushes{type="lds"} 9 +pilot_xds_pushes{type="rds"} 9 +# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds. +# TYPE process_cpu_seconds_total counter +process_cpu_seconds_total 2.35 +# HELP process_max_fds Maximum number of open file descriptors. +# TYPE process_max_fds gauge +process_max_fds 1.048576e+06 +# HELP process_open_fds Number of open file descriptors. +# TYPE process_open_fds gauge +process_open_fds 52 +# HELP process_resident_memory_bytes Resident memory size in bytes. +# TYPE process_resident_memory_bytes gauge +process_resident_memory_bytes 1.08478464e+08 +# HELP process_start_time_seconds Start time of the process since unix epoch in seconds. +# TYPE process_start_time_seconds gauge +process_start_time_seconds 1.60190238401e+09 +# HELP process_virtual_memory_bytes Virtual memory size in bytes. +# TYPE process_virtual_memory_bytes gauge +process_virtual_memory_bytes 8.08730624e+08 +# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes. +# TYPE process_virtual_memory_max_bytes gauge +process_virtual_memory_max_bytes -1 +# HELP statsd_metric_mapper_cache_gets_total The count of total metric cache gets. +# TYPE statsd_metric_mapper_cache_gets_total counter +statsd_metric_mapper_cache_gets_total 0 +# HELP statsd_metric_mapper_cache_hits_total The count of total metric cache hits. +# TYPE statsd_metric_mapper_cache_hits_total counter +statsd_metric_mapper_cache_hits_total 0 +# HELP statsd_metric_mapper_cache_length The count of unique metrics currently cached. +# TYPE statsd_metric_mapper_cache_length gauge +statsd_metric_mapper_cache_length 0 diff --git a/x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain-expected.json b/x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain-expected.json new file mode 100644 index 00000000000..2d96ee6b90e --- /dev/null +++ b/x-pack/metricbeat/module/istio/istiod/_meta/testdata/istiod.v1.7.1.plain-expected.json @@ -0,0 +1,843 @@ +[ + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Gateway" + }, + "pilot_k8s_cfg_events": { + "counter": 1, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Nodes" + }, + "pilot_k8s_reg_events": { + "counter": 1, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "update", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Nodes" + }, + "pilot_k8s_reg_events": { + "counter": 1, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "DestinationRule" + }, + "pilot_k8s_cfg_events": { + "counter": 4, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "proxy" + }, + "pilot_push_triggers": { + "counter": 1, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "lds" + }, + "pilot_xds_push_time": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.005, + 0.05500000000000001, + 0.55, + 2, + 4, + 7.5, + 15, + 25, + 40 + ] + } + }, + "pilot_xds_pushes": { + "counter": 9, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "svc" + }, + "pilot_inbound_updates": { + "counter": 22, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "eds" + }, + "pilot_inbound_updates": { + "counter": 54, + "rate": 0 + }, + "pilot_xds_push_time": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.005, + 0.05500000000000001, + 0.55, + 2, + 4, + 7.5, + 15, + 25, + 40 + ] + } + }, + "pilot_xds_pushes": { + "counter": 49, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "EnvoyFilter" + }, + "pilot_k8s_cfg_events": { + "counter": 8, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "endpoint" + }, + "pilot_push_triggers": { + "counter": 40, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "version": "1.7.1" + }, + "pilot_xds": { + "value": 8 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Services" + }, + "pilot_k8s_reg_events": { + "counter": 11, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "update", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Pods" + }, + "pilot_k8s_reg_events": { + "counter": 61, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "update", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Endpoints" + }, + "pilot_k8s_reg_events": { + "counter": 30, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "version": "1.7.1-4e26c697ce460dc8d3b25b25818fb0163ca16394-Clean" + }, + "pilot_info": { + "value": 1 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Endpoints" + }, + "pilot_k8s_reg_events": { + "counter": 12, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "VirtualService" + }, + "pilot_k8s_cfg_events": { + "counter": 1, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "cds" + }, + "pilot_xds_push_time": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.005, + 0.05500000000000001, + 0.55, + 2, + 4, + 7.5, + 15, + 25, + 40 + ] + } + }, + "pilot_xds_pushes": { + "counter": 9, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "add", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Pods" + }, + "pilot_k8s_reg_events": { + "counter": 22, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "event": "updatesame", + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "Endpoints" + }, + "pilot_k8s_reg_events": { + "counter": 185, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "config" + }, + "pilot_inbound_updates": { + "counter": 90, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "citadel_server_csr_count": { + "counter": 8, + "rate": 0 + }, + "citadel_server_root_cert_expiry_timestamp": { + "value": 1916309303 + }, + "citadel_server_success_cert_issuance_count": { + "counter": 8, + "rate": 0 + }, + "galley_validation_config_updates": { + "counter": 2, + "rate": 0 + }, + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio" + }, + "pilot_conflict_inbound_listener": { + "value": 0 + }, + "pilot_conflict_outbound_listener_http_over_current_tcp": { + "value": 0 + }, + "pilot_conflict_outbound_listener_tcp_over_current_http": { + "value": 0 + }, + "pilot_conflict_outbound_listener_tcp_over_current_tcp": { + "value": 0 + }, + "pilot_destrule_subsets": { + "value": 0 + }, + "pilot_duplicate_envoy_clusters": { + "value": 0 + }, + "pilot_eds_no_instances": { + "value": 0 + }, + "pilot_endpoint_not_ready": { + "value": 0 + }, + "pilot_no_ip": { + "value": 0 + }, + "pilot_proxy_convergence_time": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.05, + 0.30000000000000004, + 0.75, + 2, + 4, + 7.5, + 15, + 25, + 40 + ] + } + }, + "pilot_proxy_queue_time": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.05, + 0.55, + 2, + 4, + 7.5, + 15, + 25, + 40 + ] + } + }, + "pilot_services": { + "value": 11 + }, + "pilot_virt_services": { + "value": 1 + }, + "pilot_vservice_dup_domain": { + "value": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "labels": { + "instance": "127.0.0.1:51143", + "job": "istio", + "type": "rds" + }, + "pilot_xds_push_time": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.005, + 0.05500000000000001, + 0.55, + 2, + 4, + 7.5, + 15, + 25, + 40 + ] + } + }, + "pilot_xds_pushes": { + "counter": 9, + "rate": 0 + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.istiod", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "istiod", + "period": 10000 + }, + "prometheus": { + "galley_validation_failed": { + "counter": 1, + "rate": 0 + }, + "labels": { + "group": "networking.istio.io", + "instance": "127.0.0.1:51143", + "job": "istio", + "reason": "invalid_resource", + "resource": "gateways", + "version": "v1alpha3" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + } +] \ No newline at end of file diff --git a/x-pack/metricbeat/module/istio/istiod/istiod_test.go b/x-pack/metricbeat/module/istio/istiod/istiod_test.go new file mode 100644 index 00000000000..23ce86ca7f0 --- /dev/null +++ b/x-pack/metricbeat/module/istio/istiod/istiod_test.go @@ -0,0 +1,32 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +// +build !integration + +package istiod + +import ( + "os" + "testing" + + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/metricbeat/mb" + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + + // Register input module and metricset + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/prometheus" + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/prometheus/collector" +) + +func init() { + // To be moved to some kind of helper + os.Setenv("BEAT_STRICT_PERMS", "false") + mb.Registry.SetSecondarySource(mb.NewLightModulesSource("../../../module")) +} + +func TestEventMapping(t *testing.T) { + logp.TestingSetup() + + mbtest.TestDataFiles(t, "istio", "istiod") +} diff --git a/x-pack/metricbeat/module/istio/istiod/manifest.yml b/x-pack/metricbeat/module/istio/istiod/manifest.yml new file mode 100644 index 00000000000..0a8294d9192 --- /dev/null +++ b/x-pack/metricbeat/module/istio/istiod/manifest.yml @@ -0,0 +1,11 @@ +default: false +input: + module: prometheus + metricset: collector + defaults: + metrics_path: /metrics + metrics_filters: + include: ["citadel_*", "galley_*", "pilot_*"] + exclude: ["^up$"] + use_types: true + rate_counters: true diff --git a/x-pack/metricbeat/module/istio/module.yaml b/x-pack/metricbeat/module/istio/module.yaml deleted file mode 100644 index 8b137891791..00000000000 --- a/x-pack/metricbeat/module/istio/module.yaml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/x-pack/metricbeat/module/istio/module.yml b/x-pack/metricbeat/module/istio/module.yml new file mode 100644 index 00000000000..de29503fca5 --- /dev/null +++ b/x-pack/metricbeat/module/istio/module.yml @@ -0,0 +1,3 @@ +name: istio +metricsets: +- istiod diff --git a/x-pack/metricbeat/modules.d/istio.yml.disabled b/x-pack/metricbeat/modules.d/istio.yml.disabled index 1140d047a09..b65bcdef949 100644 --- a/x-pack/metricbeat/modules.d/istio.yml.disabled +++ b/x-pack/metricbeat/modules.d/istio.yml.disabled @@ -35,3 +35,10 @@ period: 10s # use istio-pilot.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ["localhost:15014"] + +# Istio istiod to monitor the Istio Daemon for versions after 1.5 of Istio. +- module: istio + metricsets: ['istiod'] + period: 10s + # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset + hosts: ['localhost:15014'] From a3fe79648592169bf81d482f5d3895a5045d140a Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Tue, 13 Oct 2020 13:08:46 +0200 Subject: [PATCH 124/156] Fix leaks with metadata processors (#16349) Add a closer interface for processors so their resources can be released when the processor is not needed anymore. Explicitly close publisher pipelines so their processors are closed. Add closers for add_docker_metadata, add_kubernetes_metadata and add_process_metadata. Script processor will fail if a processor that needs to be closed is used. --- CHANGELOG.next.asciidoc | 1 + libbeat/beat/pipeline.go | 1 + libbeat/cmd/instance/beat.go | 5 + libbeat/common/docker/watcher.go | 7 +- .../add_docker_metadata.go | 12 ++ .../add_docker_metadata_integration_test.go | 120 ++++++++++++++++++ .../add_docker_metadata_test.go | 1 + .../add_kubernetes_metadata/cache.go | 32 +++-- .../add_kubernetes_metadata/kubernetes.go | 10 ++ .../add_process_metadata.go | 46 +++++-- .../add_process_metadata_test.go | 2 +- libbeat/processors/processor.go | 30 +++++ .../javascript/module/processor/chain.go | 11 ++ .../module/processor/processor_test.go | 54 ++++++-- libbeat/publisher/pipeline/client.go | 10 ++ libbeat/publisher/processing/default.go | 12 +- libbeat/publisher/processing/default_test.go | 72 +++++++++++ libbeat/publisher/processing/processing.go | 2 + libbeat/publisher/processing/processors.go | 16 +++ libbeat/tests/docker/docker.go | 20 +++ 20 files changed, 426 insertions(+), 38 deletions(-) create mode 100644 libbeat/processors/add_docker_metadata/add_docker_metadata_integration_test.go diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 4ca46560ab5..576c0062310 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -180,6 +180,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Explicitly detect missing variables in autodiscover configuration, log them at the debug level. {issue}20568[20568] {pull}20898[20898] - Fix `libbeat.output.write.bytes` and `libbeat.output.read.bytes` metrics of the Elasticsearch output. {issue}20752[20752] {pull}21197[21197] - The `o365input` and `o365` module now recover from an authentication problem or other fatal errors, instead of terminating. {pull}21259[21258] +- Orderly close processors when processing pipelines are not needed anymore to release their resources. {pull}16349[16349] *Auditbeat* diff --git a/libbeat/beat/pipeline.go b/libbeat/beat/pipeline.go index 699c96d8b62..f13b3c39ff2 100644 --- a/libbeat/beat/pipeline.go +++ b/libbeat/beat/pipeline.go @@ -138,6 +138,7 @@ type ClientEventer interface { type ProcessorList interface { Processor + Close() error All() []Processor } diff --git a/libbeat/cmd/instance/beat.go b/libbeat/cmd/instance/beat.go index ca58b9b321f..714b266ea84 100644 --- a/libbeat/cmd/instance/beat.go +++ b/libbeat/cmd/instance/beat.go @@ -371,6 +371,11 @@ func (b *Beat) launch(settings Settings, bt beat.Creator) error { if err != nil { return err } + defer func() { + if err := b.processing.Close(); err != nil { + logp.Warn("Failed to close global processing: %v", err) + } + }() // Windows: Mark service as stopped. // After this is run, a Beat service is considered by the OS to be stopped diff --git a/libbeat/common/docker/watcher.go b/libbeat/common/docker/watcher.go index 0543d37e9c3..2421c232eee 100644 --- a/libbeat/common/docker/watcher.go +++ b/libbeat/common/docker/watcher.go @@ -138,6 +138,7 @@ func NewWatcher(log *logp.Logger, host string, tls *TLSConfig, storeShortID bool // Extra check to confirm that Docker is available _, err = client.Info(context.Background()) if err != nil { + client.Close() return nil, err } @@ -395,14 +396,12 @@ func (w *watcher) cleanupWorker() { log := w.log for { - // Wait a full period - time.Sleep(w.cleanupTimeout) - select { case <-w.ctx.Done(): w.stopped.Done() return - default: + // Wait a full period + case <-time.After(w.cleanupTimeout): // Check entries for timeout var toDelete []string timeout := time.Now().Add(-w.cleanupTimeout) diff --git a/libbeat/processors/add_docker_metadata/add_docker_metadata.go b/libbeat/processors/add_docker_metadata/add_docker_metadata.go index cf0fda79d8d..beaca3bb46b 100644 --- a/libbeat/processors/add_docker_metadata/add_docker_metadata.go +++ b/libbeat/processors/add_docker_metadata/add_docker_metadata.go @@ -209,6 +209,18 @@ func (d *addDockerMetadata) Run(event *beat.Event) (*beat.Event, error) { return event, nil } +func (d *addDockerMetadata) Close() error { + if d.cgroups != nil { + d.cgroups.StopJanitor() + } + d.watcher.Stop() + err := processors.Close(d.sourceProcessor) + if err != nil { + return errors.Wrap(err, "closing source processor of add_docker_metadata") + } + return nil +} + func (d *addDockerMetadata) String() string { return fmt.Sprintf("%v=[match_fields=[%v] match_pids=[%v]]", processorName, strings.Join(d.fields, ", "), strings.Join(d.pidFields, ", ")) diff --git a/libbeat/processors/add_docker_metadata/add_docker_metadata_integration_test.go b/libbeat/processors/add_docker_metadata/add_docker_metadata_integration_test.go new file mode 100644 index 00000000000..91d3315a401 --- /dev/null +++ b/libbeat/processors/add_docker_metadata/add_docker_metadata_integration_test.go @@ -0,0 +1,120 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// +build linux darwin windows +// +build integration + +package add_docker_metadata + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/docker" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/processors" + dockertest "github.com/elastic/beats/v7/libbeat/tests/docker" + "github.com/elastic/beats/v7/libbeat/tests/resources" +) + +func TestAddDockerMetadata(t *testing.T) { + goroutines := resources.NewGoroutinesChecker() + defer goroutines.Check(t) + + client, err := docker.NewClient(defaultConfig().Host, nil, nil) + require.NoError(t, err) + + // Docker clients can affect the goroutines checker because they keep + // idle keep-alive connections, so we explicitly close them. + // These idle connections in principle wouldn't represent leaks even if + // the client is not explicitly closed because they are eventually closed. + defer client.Close() + + // Start a container to have some data to enrich events + testClient, err := dockertest.NewClient() + require.NoError(t, err) + // Explicitly close client to don't affect goroutines checker + defer testClient.Close() + + image := "busybox" + cmd := []string{"sleep", "60"} + labels := map[string]string{"label": "foo"} + id, err := testClient.ContainerStart(image, cmd, labels) + require.NoError(t, err) + defer testClient.ContainerRemove(id) + + info, err := testClient.ContainerInspect(id) + require.NoError(t, err) + pid := info.State.Pid + + config, err := common.NewConfigFrom(map[string]interface{}{ + "match_fields": []string{"cid"}, + }) + watcherConstructor := newWatcherWith(client) + processor, err := buildDockerMetadataProcessor(logp.L(), config, watcherConstructor) + require.NoError(t, err) + + t.Run("match container by container id", func(t *testing.T) { + input := &beat.Event{Fields: common.MapStr{ + "cid": id, + }} + result, err := processor.Run(input) + require.NoError(t, err) + + resultLabels, _ := result.Fields.GetValue("container.labels") + expectedLabels := common.MapStr{"label": "foo"} + assert.Equal(t, expectedLabels, resultLabels) + assert.Equal(t, id, result.Fields["cid"]) + }) + + t.Run("match container by process id", func(t *testing.T) { + input := &beat.Event{Fields: common.MapStr{ + "cid": id, + "process.pid": pid, + }} + result, err := processor.Run(input) + require.NoError(t, err) + + resultLabels, _ := result.Fields.GetValue("container.labels") + expectedLabels := common.MapStr{"label": "foo"} + assert.Equal(t, expectedLabels, resultLabels) + assert.Equal(t, id, result.Fields["cid"]) + }) + + t.Run("don't enrich non existing container", func(t *testing.T) { + input := &beat.Event{Fields: common.MapStr{ + "cid": "notexists", + }} + result, err := processor.Run(input) + require.NoError(t, err) + assert.Equal(t, input.Fields, result.Fields) + }) + + err = processors.Close(processor) + require.NoError(t, err) +} + +func newWatcherWith(client docker.Client) docker.WatcherConstructor { + return func(log *logp.Logger, host string, tls *docker.TLSConfig, storeShortID bool) (docker.Watcher, error) { + return docker.NewWatcherWithClient(log, client, 60*time.Second, storeShortID) + } +} diff --git a/libbeat/processors/add_docker_metadata/add_docker_metadata_test.go b/libbeat/processors/add_docker_metadata/add_docker_metadata_test.go index 2d8a5a9e970..f246d597e13 100644 --- a/libbeat/processors/add_docker_metadata/add_docker_metadata_test.go +++ b/libbeat/processors/add_docker_metadata/add_docker_metadata_test.go @@ -16,6 +16,7 @@ // under the License. // +build linux darwin windows +// +build !integration package add_docker_metadata diff --git a/libbeat/processors/add_kubernetes_metadata/cache.go b/libbeat/processors/add_kubernetes_metadata/cache.go index da7492b43a9..5de52efdc1b 100644 --- a/libbeat/processors/add_kubernetes_metadata/cache.go +++ b/libbeat/processors/add_kubernetes_metadata/cache.go @@ -31,6 +31,7 @@ type cache struct { timeout time.Duration deleted map[string]time.Time // key -> when should this obj be deleted metadata map[string]common.MapStr + done chan struct{} } func newCache(cleanupTimeout time.Duration) *cache { @@ -38,6 +39,7 @@ func newCache(cleanupTimeout time.Duration) *cache { timeout: cleanupTimeout, deleted: make(map[string]time.Time), metadata: make(map[string]common.MapStr), + done: make(chan struct{}), } go c.cleanup() return c @@ -67,15 +69,29 @@ func (c *cache) set(key string, data common.MapStr) { } func (c *cache) cleanup() { - ticker := time.Tick(timeout) - for now := range ticker { - c.Lock() - for k, t := range c.deleted { - if now.After(t) { - delete(c.deleted, k) - delete(c.metadata, k) + if timeout <= 0 { + return + } + + ticker := time.NewTicker(timeout) + defer ticker.Stop() + for { + select { + case <-c.done: + return + case now := <-ticker.C: + c.Lock() + for k, t := range c.deleted { + if now.After(t) { + delete(c.deleted, k) + delete(c.metadata, k) + } } + c.Unlock() } - c.Unlock() } } + +func (c *cache) stop() { + close(c.done) +} diff --git a/libbeat/processors/add_kubernetes_metadata/kubernetes.go b/libbeat/processors/add_kubernetes_metadata/kubernetes.go index 2a5f4d2faed..535eb1187ea 100644 --- a/libbeat/processors/add_kubernetes_metadata/kubernetes.go +++ b/libbeat/processors/add_kubernetes_metadata/kubernetes.go @@ -242,6 +242,16 @@ func (k *kubernetesAnnotator) Run(event *beat.Event) (*beat.Event, error) { return event, nil } +func (k *kubernetesAnnotator) Close() error { + if k.watcher != nil { + k.watcher.Stop() + } + if k.cache != nil { + k.cache.stop() + } + return nil +} + func (k *kubernetesAnnotator) addPod(pod *kubernetes.Pod) { metadata := k.indexers.GetMetadata(pod) for _, m := range metadata { diff --git a/libbeat/processors/add_process_metadata/add_process_metadata.go b/libbeat/processors/add_process_metadata/add_process_metadata.go index c41ca9a73d6..01e2cf1e9fe 100644 --- a/libbeat/processors/add_process_metadata/add_process_metadata.go +++ b/libbeat/processors/add_process_metadata/add_process_metadata.go @@ -55,11 +55,12 @@ var ( ) type addProcessMetadata struct { - config config - provider processMetadataProvider - cidProvider cidProvider - log *logp.Logger - mappings common.MapStr + config config + provider processMetadataProvider + cgroupsCache *common.Cache + cidProvider cidProvider + log *logp.Logger + mappings common.MapStr } type processMetadata struct { @@ -81,16 +82,22 @@ type cidProvider interface { } func init() { - processors.RegisterPlugin(processorName, New) + processors.RegisterPlugin(processorName, NewWithCache) jsprocessor.RegisterPlugin("AddProcessMetadata", New) } // New constructs a new add_process_metadata processor. func New(cfg *common.Config) (processors.Processor, error) { - return newProcessMetadataProcessorWithProvider(cfg, &procCache) + return newProcessMetadataProcessorWithProvider(cfg, &procCache, false) } -func newProcessMetadataProcessorWithProvider(cfg *common.Config, provider processMetadataProvider) (proc processors.Processor, err error) { +// NewWithCache construct a new add_process_metadata processor with cache for container IDs. +// Resulting processor implements `Close()` to release the cache resources. +func NewWithCache(cfg *common.Config) (processors.Processor, error) { + return newProcessMetadataProcessorWithProvider(cfg, &procCache, true) +} + +func newProcessMetadataProcessorWithProvider(cfg *common.Config, provider processMetadataProvider, withCache bool) (proc processors.Processor, err error) { // Logging (each processor instance has a unique ID). var ( id = int(instanceID.Inc()) @@ -118,21 +125,25 @@ func newProcessMetadataProcessorWithProvider(cfg *common.Config, provider proces } // don't use cgroup.ProcessCgroupPaths to save it from doing the work when container id disabled if ok := containsValue(mappings, "container.id"); ok { - if config.CgroupCacheExpireTime != 0 { + if withCache && config.CgroupCacheExpireTime != 0 { p.log.Debug("Initializing cgroup cache") evictionListener := func(k common.Key, v common.Value) { p.log.Debugf("Evicted cached cgroups for PID=%v", k) } - cgroupsCache := common.NewCacheWithRemovalListener(config.CgroupCacheExpireTime, 100, evictionListener) - cgroupsCache.StartJanitor(config.CgroupCacheExpireTime) - p.cidProvider = newCidProvider(config.HostPath, config.CgroupPrefixes, config.CgroupRegex, processCgroupPaths, cgroupsCache) + p.cgroupsCache = common.NewCacheWithRemovalListener(config.CgroupCacheExpireTime, 100, evictionListener) + p.cgroupsCache.StartJanitor(config.CgroupCacheExpireTime) + p.cidProvider = newCidProvider(config.HostPath, config.CgroupPrefixes, config.CgroupRegex, processCgroupPaths, p.cgroupsCache) } else { p.cidProvider = newCidProvider(config.HostPath, config.CgroupPrefixes, config.CgroupRegex, processCgroupPaths, nil) } } + if withCache { + return &addProcessMetadataCloser{p}, nil + } + return &p, nil } @@ -253,6 +264,17 @@ func (p *addProcessMetadata) getContainerID(pid int) (string, error) { return cid, nil } +type addProcessMetadataCloser struct { + addProcessMetadata +} + +func (p *addProcessMetadataCloser) Close() error { + if p.addProcessMetadata.cgroupsCache != nil { + p.addProcessMetadata.cgroupsCache.StopJanitor() + } + return nil +} + // String returns the processor representation formatted as a string func (p *addProcessMetadata) String() string { return fmt.Sprintf("%v=[match_pids=%v, mappings=%v, ignore_missing=%v, overwrite_fields=%v, restricted_fields=%v, host_path=%v, cgroup_prefixes=%v]", diff --git a/libbeat/processors/add_process_metadata/add_process_metadata_test.go b/libbeat/processors/add_process_metadata/add_process_metadata_test.go index f9b4aaa681c..493034098cf 100644 --- a/libbeat/processors/add_process_metadata/add_process_metadata_test.go +++ b/libbeat/processors/add_process_metadata/add_process_metadata_test.go @@ -651,7 +651,7 @@ func TestAddProcessMetadata(t *testing.T) { t.Fatal(err) } - proc, err := newProcessMetadataProcessorWithProvider(config, testProcs) + proc, err := newProcessMetadataProcessorWithProvider(config, testProcs, true) if test.initErr == nil { if err != nil { t.Fatal(err) diff --git a/libbeat/processors/processor.go b/libbeat/processors/processor.go index c5002b7cebd..0e772a524da 100644 --- a/libbeat/processors/processor.go +++ b/libbeat/processors/processor.go @@ -20,6 +20,7 @@ package processors import ( "strings" + "github.com/joeshaw/multierror" "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/beat" @@ -35,11 +36,29 @@ type Processors struct { log *logp.Logger } +// Processor is the interface that all processors must implement type Processor interface { Run(event *beat.Event) (*beat.Event, error) String() string } +// Closer defines the interface for processors that should be closed after using +// them. +// Close() is not part of the Processor interface because implementing this method +// is also a way to indicate that the processor keeps some resource that needs to +// be released or orderly closed. +type Closer interface { + Close() error +} + +// Close closes a processor if it implements the Closer interface +func Close(p Processor) error { + if closer, ok := p.(Closer); ok { + return closer.Close() + } + return nil +} + // NewList creates a new empty processor list. // Additional processors can be added to the List field. func NewList(log *logp.Logger) *Processors { @@ -153,6 +172,17 @@ func (procs *Processors) All() []beat.Processor { return ret } +func (procs *Processors) Close() error { + var errs multierror.Errors + for _, p := range procs.List { + err := Close(p) + if err != nil { + errs = append(errs, err) + } + } + return errs.Err() +} + // Run executes the all processors serially and returns the event and possibly // an error. If the event has been dropped (canceled) by a processor in the // list then a nil event is returned. diff --git a/libbeat/processors/script/javascript/module/processor/chain.go b/libbeat/processors/script/javascript/module/processor/chain.go index e58aac29372..9ef3da7859e 100644 --- a/libbeat/processors/script/javascript/module/processor/chain.go +++ b/libbeat/processors/script/javascript/module/processor/chain.go @@ -151,6 +151,17 @@ func newNativeProcessor(constructor processors.Constructor, call gojaCall) (proc if err != nil { return nil, err } + + if closer, ok := p.(processors.Closer); ok { + closer.Close() + // Script processor doesn't support releasing resources of stateful processors, + // what can lead to leaks, so prevent use of these processors. They shouldn't + // be registered. If this error happens, a processor that needs to be closed is + // being registered, this should be avoided. + // See https://github.com/elastic/beats/pull/16349 + return nil, errors.Errorf("stateful processor cannot be used in script processor, this is probably a bug: %s", p) + } + return &nativeProcessor{p}, nil } diff --git a/libbeat/processors/script/javascript/module/processor/processor_test.go b/libbeat/processors/script/javascript/module/processor/processor_test.go index 6ea66f409ff..9e958ee7035 100644 --- a/libbeat/processors/script/javascript/module/processor/processor_test.go +++ b/libbeat/processors/script/javascript/module/processor/processor_test.go @@ -23,6 +23,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" @@ -35,6 +36,7 @@ import ( func init() { RegisterPlugin("Mock", newMock) + RegisterPlugin("MockWithCloser", newMockWithCloser) } func testEvent() *beat.Event { @@ -67,14 +69,10 @@ function process(evt) { logp.TestingSetup() p, err := javascript.NewFromConfig(javascript.Config{Source: script}, nil) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) evt, err := p.Run(testEvent()) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) checkEvent(t, evt, "added", "new_value") } @@ -107,14 +105,10 @@ function process(evt) { logp.TestingSetup() p, err := javascript.NewFromConfig(javascript.Config{Source: script}, nil) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) evt, err := p.Run(testEvent()) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) // checking if hello world is added to the event in different languages checkEvent(t, evt, "helló", "világ") @@ -123,6 +117,22 @@ function process(evt) { checkEvent(t, evt, "hallo", "Welt") } +func TestProcessorWithCloser(t *testing.T) { + const script = ` +var processor = require('processor'); + +var processorWithCloser = new processor.MockWithCloser().Build() + +function process(evt) { + processorWithCloser.Run(evt); +} +` + + logp.TestingSetup() + _, err := javascript.NewFromConfig(javascript.Config{Source: script}, nil) + require.Error(t, err, "processor that implements Closer() shouldn't be allowed") +} + func checkEvent(t *testing.T, evt *beat.Event, key, value string) { s, err := evt.GetValue(key) assert.NoError(t, err) @@ -162,3 +172,23 @@ func (m *mockProcessor) String() string { s, _ := json.Marshal(m.fields) return fmt.Sprintf("mock=%s", s) } + +type mockProcessorWithCloser struct{} + +func newMockWithCloser(c *common.Config) (processors.Processor, error) { + return &mockProcessorWithCloser{}, nil +} + +func (m *mockProcessorWithCloser) Run(event *beat.Event) (*beat.Event, error) { + // Nothing to do, we only want this struct to implement processors.Closer + return event, nil +} + +func (m *mockProcessorWithCloser) Close() error { + // Nothing to do, we only want this struct to implement processors.Closer + return nil +} + +func (m *mockProcessorWithCloser) String() string { + return "mockWithCloser" +} diff --git a/libbeat/publisher/pipeline/client.go b/libbeat/publisher/pipeline/client.go index 2ce792ed887..edb5a3f1eb3 100644 --- a/libbeat/publisher/pipeline/client.go +++ b/libbeat/publisher/pipeline/client.go @@ -24,6 +24,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common/atomic" "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/processors" "github.com/elastic/beats/v7/libbeat/publisher" "github.com/elastic/beats/v7/libbeat/publisher/queue" ) @@ -164,6 +165,15 @@ func (c *client) Close() error { log.Debug("client: unlink from queue") c.unlink() log.Debug("client: done unlink") + + if c.processors != nil { + log.Debug("client: closing processors") + err := processors.Close(c.processors) + if err != nil { + log.Errorf("client: error closing processors: %v", err) + } + log.Debug("client: done closing processors") + } }) return nil } diff --git a/libbeat/publisher/processing/default.go b/libbeat/publisher/processing/default.go index b2a65642e17..f9eab88fe48 100644 --- a/libbeat/publisher/processing/default.go +++ b/libbeat/publisher/processing/default.go @@ -338,7 +338,10 @@ func (b *builder) Create(cfg beat.ProcessingConfig, drop bool) (beat.Processor, } // setup 8: pipeline processors list - processors.add(b.processors) + if b.processors != nil { + // Add the global pipeline as a function processor, so clients cannot close it + processors.add(newProcessor(b.processors.title, b.processors.Run)) + } // setup 9: time series metadata if b.timeSeries { @@ -358,6 +361,13 @@ func (b *builder) Create(cfg beat.ProcessingConfig, drop bool) (beat.Processor, return processors, nil } +func (b *builder) Close() error { + if b.processors != nil { + return b.processors.Close() + } + return nil +} + func makeClientProcessors( log *logp.Logger, cfg beat.ProcessingConfig, diff --git a/libbeat/publisher/processing/default_test.go b/libbeat/publisher/processing/default_test.go index 56dfa75bdd2..637b38cf44d 100644 --- a/libbeat/publisher/processing/default_test.go +++ b/libbeat/publisher/processing/default_test.go @@ -29,6 +29,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/processors" "github.com/elastic/beats/v7/libbeat/processors/actions" "github.com/elastic/ecs/code/go/ecs" ) @@ -317,6 +318,9 @@ func TestNormalization(t *testing.T) { fields.DeepUpdate(test.mod) assert.Equal(t, test.want, actual.Fields) + + err = s.Close() + require.NoError(t, err) }) } } @@ -331,6 +335,9 @@ func TestAlwaysDrop(t *testing.T) { actual, err := prog.Run(&beat.Event{}) require.NoError(t, err) assert.Nil(t, actual) + + err = s.Close() + require.NoError(t, err) } func TestDynamicFields(t *testing.T) { @@ -351,6 +358,52 @@ func TestDynamicFields(t *testing.T) { actual, err = prog.Run(&beat.Event{Fields: common.MapStr{"hello": "world"}}) require.NoError(t, err) assert.Equal(t, common.MapStr{"hello": "world", "dyn": "field"}, actual.Fields) + + err = factory.Close() + require.NoError(t, err) +} + +func TestProcessingClose(t *testing.T) { + factory, err := MakeDefaultSupport(true)(beat.Info{}, logp.L(), common.NewConfig()) + require.NoError(t, err) + + // Inject a processor in the builder that we can check if has been closed. + factoryProcessor := &processorWithClose{} + b := factory.(*builder) + if b.processors == nil { + b.processors = newGroup("global", logp.L()) + } + b.processors.add(factoryProcessor) + + clientProcessor := &processorWithClose{} + g := newGroup("test", logp.L()) + g.add(clientProcessor) + + prog, err := factory.Create(beat.ProcessingConfig{ + Processor: g, + }, false) + require.NoError(t, err) + + // Check that both processors are called + assert.False(t, factoryProcessor.called) + assert.False(t, clientProcessor.called) + _, err = prog.Run(&beat.Event{Fields: common.MapStr{"hello": "world"}}) + require.NoError(t, err) + assert.True(t, factoryProcessor.called) + assert.True(t, clientProcessor.called) + + // Check that closing the client processing pipeline doesn't close the global pipeline + assert.False(t, factoryProcessor.closed) + assert.False(t, clientProcessor.closed) + err = processors.Close(prog) + require.NoError(t, err) + assert.False(t, factoryProcessor.closed) + assert.True(t, clientProcessor.closed) + + // Check that closing the factory closes the processor in the global pipeline + err = factory.Close() + require.NoError(t, err) + assert.True(t, factoryProcessor.closed) } func fromJSON(in string) common.MapStr { @@ -361,3 +414,22 @@ func fromJSON(in string) common.MapStr { } return tmp } + +type processorWithClose struct { + closed bool + called bool +} + +func (p *processorWithClose) Run(e *beat.Event) (*beat.Event, error) { + p.called = true + return e, nil +} + +func (p *processorWithClose) Close() error { + p.closed = true + return nil +} + +func (p *processorWithClose) String() string { + return "processorWithClose" +} diff --git a/libbeat/publisher/processing/processing.go b/libbeat/publisher/processing/processing.go index 4f615fb1422..88feb62c7b2 100644 --- a/libbeat/publisher/processing/processing.go +++ b/libbeat/publisher/processing/processing.go @@ -33,6 +33,8 @@ type SupportFactory func(info beat.Info, log *logp.Logger, cfg *common.Config) ( // will merge the global and local configurations into a common event // processor. // If `drop` is set, then the processor generated must always drop all events. +// A Supporter needs to be closed with `Close()` to release its global resources. type Supporter interface { Create(cfg beat.ProcessingConfig, drop bool) (beat.Processor, error) + Close() error } diff --git a/libbeat/publisher/processing/processors.go b/libbeat/publisher/processing/processors.go index e994eef48cc..3a400d36dad 100644 --- a/libbeat/publisher/processing/processors.go +++ b/libbeat/publisher/processing/processors.go @@ -22,6 +22,8 @@ import ( "strings" "sync" + "github.com/joeshaw/multierror" + "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/logp" @@ -77,6 +79,20 @@ func (p *group) add(processor processors.Processor) { } } +func (p *group) Close() error { + if p == nil { + return nil + } + var errs multierror.Errors + for _, processor := range p.list { + err := processors.Close(processor) + if err != nil { + errs = append(errs, err) + } + } + return errs.Err() +} + func (p *group) String() string { var s []string for _, p := range p.list { diff --git a/libbeat/tests/docker/docker.go b/libbeat/tests/docker/docker.go index b81ffa285ea..888347c5cc7 100644 --- a/libbeat/tests/docker/docker.go +++ b/libbeat/tests/docker/docker.go @@ -77,8 +77,28 @@ func (c Client) ContainerWait(ID string) error { return nil } +// ContainerInspect recovers information of the container +func (c Client) ContainerInspect(ID string) (types.ContainerJSON, error) { + ctx := context.Background() + return c.cli.ContainerInspect(ctx, ID) +} + // ContainerKill kills the given container func (c Client) ContainerKill(ID string) error { ctx := context.Background() return c.cli.ContainerKill(ctx, ID, "KILL") } + +// ContainerRemove kills and removed the given container +func (c Client) ContainerRemove(ID string) error { + ctx := context.Background() + return c.cli.ContainerRemove(ctx, ID, types.ContainerRemoveOptions{ + RemoveVolumes: true, + Force: true, + }) +} + +// Close closes the underlying client +func (c *Client) Close() error { + return c.cli.Close() +} From 500e8b5f81af3a9d0cd369182ac879360b39c64b Mon Sep 17 00:00:00 2001 From: Andrew Kroh Date: Tue, 13 Oct 2020 07:14:59 -0400 Subject: [PATCH 125/156] Remove dot from file.extension value in Auditbeat FIM (#21644) The ECS file.extension field should not include the dot. For example the value should be "png" and not ".png". Relates elastic/ecs#1016 --- CHANGELOG.next.asciidoc | 1 + auditbeat/module/file_integrity/event.go | 2 +- auditbeat/module/file_integrity/event_test.go | 11 +++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 576c0062310..660fa25a10d 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -32,6 +32,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Change event.kind=error to event.kind=event to comply with ECS. {issue}18870[18870] {pull}20685[20685] - Change network.direction values to ECS recommended values (inbound, outbound). {issue}12445[12445] {pull}20695[20695] - Docker container needs to be explicitly run as user root for auditing. {pull}21202[21202] +- File integrity dataset no longer includes the leading dot in `file.extension` values (e.g. it will report "png" instead of ".png") to comply with ECS. {pull}21644[21644] *Filebeat* diff --git a/auditbeat/module/file_integrity/event.go b/auditbeat/module/file_integrity/event.go index 41e4d5a3795..1ee28b7ce35 100644 --- a/auditbeat/module/file_integrity/event.go +++ b/auditbeat/module/file_integrity/event.go @@ -257,7 +257,7 @@ func buildMetricbeatEvent(e *Event, existedBefore bool) mb.Event { if e.Info.Type == FileType { if extension := filepath.Ext(e.Path); extension != "" { - file["extension"] = extension + file["extension"] = strings.TrimLeft(extension, ".") } if mimeType := getMimeType(e.Path); mimeType != "" { file["mime_type"] = mimeType diff --git a/auditbeat/module/file_integrity/event_test.go b/auditbeat/module/file_integrity/event_test.go index 79d1309903d..efaafd02041 100644 --- a/auditbeat/module/file_integrity/event_test.go +++ b/auditbeat/module/file_integrity/event_test.go @@ -28,6 +28,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/elastic/beats/v7/libbeat/common" ) @@ -295,7 +296,11 @@ func TestBuildEvent(t *testing.T) { assertHasKey(t, fields, "event.type") assertHasKey(t, fields, "file.path") - assertHasKey(t, fields, "file.extension") + if assertHasKey(t, fields, "file.extension") { + ext, err := fields.GetValue("file.extension") + require.NoError(t, err) + assert.Equal(t, ext, "txt") + } assertHasKey(t, fields, "file.target_path") assertHasKey(t, fields, "file.inode") assertHasKey(t, fields, "file.uid") @@ -427,10 +432,12 @@ func mustDecodeHex(v string) []byte { return data } -func assertHasKey(t testing.TB, m common.MapStr, key string) { +func assertHasKey(t testing.TB, m common.MapStr, key string) bool { t.Helper() found, err := m.HasKey(key) if err != nil || !found { t.Errorf("key %v not found: %v", key, err) + return false } + return true } From 09234d4e94d4813892160f7d313bc6dec66ca037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Tue, 13 Oct 2020 13:17:06 +0200 Subject: [PATCH 126/156] fix: update fleet test suite name (#21738) --- .ci/packaging.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/packaging.groovy b/.ci/packaging.groovy index c65fd7f8b56..9087cf48de4 100644 --- a/.ci/packaging.groovy +++ b/.ci/packaging.groovy @@ -230,11 +230,11 @@ def runE2ETestForPackages(){ catchError(buildResult: 'UNSTABLE', message: 'Unable to run e2e tests', stageResult: 'FAILURE') { if ("${env.BEATS_FOLDER}" == "filebeat" || "${env.BEATS_FOLDER}" == "x-pack/filebeat") { - suite = 'helm,ingest-manager' + suite = 'helm,fleet' } else if ("${env.BEATS_FOLDER}" == "metricbeat" || "${env.BEATS_FOLDER}" == "x-pack/metricbeat") { suite = '' } else if ("${env.BEATS_FOLDER}" == "x-pack/elastic-agent") { - suite = 'ingest-manager' + suite = 'fleet' } else { echo("Skipping E2E tests for ${env.BEATS_FOLDER}.") return From 1824e849978f248f4e2da75ae51732963379714a Mon Sep 17 00:00:00 2001 From: EamonnTP Date: Tue, 13 Oct 2020 13:49:48 +0100 Subject: [PATCH 127/156] Update obs app links (#21682) --- libbeat/docs/shared/obs-apps.asciidoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libbeat/docs/shared/obs-apps.asciidoc b/libbeat/docs/shared/obs-apps.asciidoc index 9b5f7354ea0..26698700c21 100644 --- a/libbeat/docs/shared/obs-apps.asciidoc +++ b/libbeat/docs/shared/obs-apps.asciidoc @@ -38,13 +38,13 @@ endif::[] |=== |Elastic apps | Use to -|{kibana-ref}/xpack-infra.html[{metrics-app}] +|{observability-guide}/analyze-metrics.html[{metrics-app}] |Explore metrics about systems and services across your ecosystem -|{kibana-ref}/xpack-logs.html[{logs-app}] +|{observability-guide}/monitor-logs.html[{logs-app}] |Tail related log data in real time -|{kibana-ref}/xpack-uptime.html[{uptime-app}] +|{observability-guide}/monitor-uptime.html[{uptime-app}] |Monitor availability issues across your apps and services |{kibana-ref}/xpack-apm.html[APM app] From 056f0e07b233d3a438b1d21b5182cb2ea49638d2 Mon Sep 17 00:00:00 2001 From: Mariana Dima Date: Tue, 13 Oct 2020 16:01:19 +0200 Subject: [PATCH 128/156] Fix for azure retrieve resource by ids (#21711) * mofidy doc * start work * work * changelog * fix test --- CHANGELOG.next.asciidoc | 1 + x-pack/metricbeat/module/azure/client.go | 6 ++--- x-pack/metricbeat/module/azure/client_test.go | 2 +- .../metricbeat/module/azure/mock_service.go | 4 +-- .../module/azure/monitor_service.go | 26 ++++++++++++++----- .../module/azure/service_interface.go | 2 +- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 660fa25a10d..41de16190a8 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -366,6 +366,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix remote_write flaky test. {pull}21173[21173] - Visualization title fixes in aws, azure and googlecloud compute dashboards. {pull}21098[21098] - Add a switch to the driver definition on SQL module to use pretty names {pull}17378[17378] +- Fix retrieving resources by ID for the azure module. {pull}21711[21711] {issue}21707[21707] - Use timestamp from CloudWatch API when creating events. {pull}21498[21498] *Packetbeat* diff --git a/x-pack/metricbeat/module/azure/client.go b/x-pack/metricbeat/module/azure/client.go index e488fab98b6..dd48f962b59 100644 --- a/x-pack/metricbeat/module/azure/client.go +++ b/x-pack/metricbeat/module/azure/client.go @@ -65,14 +65,14 @@ func (client *Client) InitResources(fn mapResourceMetrics) error { err = errors.Wrap(err, "failed to retrieve resources") return err } - if len(resourceList.Values()) == 0 { + if len(resourceList) == 0 { err = errors.Errorf("failed to retrieve resources: No resources returned using the configuration options resource ID %s, resource group %s, resource type %s, resource query %s", resource.Id, resource.Group, resource.Type, resource.Query) client.Log.Error(err) continue } //map resources to the client - for _, resource := range resourceList.Values() { + for _, resource := range resourceList { if !containsResource(*resource.ID, client.Resources) { client.Resources = append(client.Resources, Resource{ Id: *resource.ID, @@ -84,7 +84,7 @@ func (client *Client) InitResources(fn mapResourceMetrics) error { Subscription: client.Config.SubscriptionId}) } } - resourceMetrics, err := fn(client, resourceList.Values(), resource) + resourceMetrics, err := fn(client, resourceList, resource) if err != nil { return err } diff --git a/x-pack/metricbeat/module/azure/client_test.go b/x-pack/metricbeat/module/azure/client_test.go index 47b88f99cce..6b0df97a370 100644 --- a/x-pack/metricbeat/module/azure/client_test.go +++ b/x-pack/metricbeat/module/azure/client_test.go @@ -50,7 +50,7 @@ func TestInitResources(t *testing.T) { client := NewMockClient() client.Config = resourceQueryConfig m := &MockService{} - m.On("GetResourceDefinitions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(resources.ListResultPage{}, errors.New("invalid resource query")) + m.On("GetResourceDefinitions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]resources.GenericResource{}, errors.New("invalid resource query")) client.AzureMonitorService = m mr := MockReporterV2{} mr.On("Error", mock.Anything).Return(true) diff --git a/x-pack/metricbeat/module/azure/mock_service.go b/x-pack/metricbeat/module/azure/mock_service.go index f6f54c300e0..601f1de5b45 100644 --- a/x-pack/metricbeat/module/azure/mock_service.go +++ b/x-pack/metricbeat/module/azure/mock_service.go @@ -24,9 +24,9 @@ func (client *MockService) GetResourceDefinitionById(id string) (resources.Gener } // GetResourceDefinitions is a mock function for the azure service -func (client *MockService) GetResourceDefinitions(id []string, group []string, rType string, query string) (resources.ListResultPage, error) { +func (client *MockService) GetResourceDefinitions(id []string, group []string, rType string, query string) ([]resources.GenericResource, error) { args := client.Called(id, group, rType, query) - return args.Get(0).(resources.ListResultPage), args.Error(1) + return args.Get(0).([]resources.GenericResource), args.Error(1) } // GetMetricDefinitions is a mock function for the azure service diff --git a/x-pack/metricbeat/module/azure/monitor_service.go b/x-pack/metricbeat/module/azure/monitor_service.go index 053da3db05b..c3ed4e2fa43 100644 --- a/x-pack/metricbeat/module/azure/monitor_service.go +++ b/x-pack/metricbeat/module/azure/monitor_service.go @@ -55,16 +55,24 @@ func NewService(clientId string, clientSecret string, tenantId string, subscript } // GetResourceDefinitions will retrieve the azure resources based on the options entered -func (service MonitorService) GetResourceDefinitions(id []string, group []string, rType string, query string) (resources.ListResultPage, error) { +func (service MonitorService) GetResourceDefinitions(id []string, group []string, rType string, query string) ([]resources.GenericResource, error) { var resourceQuery string + var resourceList []resources.GenericResource if len(id) > 0 { - var filterList []string - // listing resourceID conditions does not seem to work with the API but querying by name or resource types will work + // listing multiple resourceId conditions does not seem to work with the API, extracting the name and resource type does not work as the position of the `resourceType` can move if a parent resource is involved, filtering by resource name and resource group (if extracted) is also not possible as + // different types of resources can contain the same name. for _, id := range id { - filterList = append(filterList, fmt.Sprintf("name eq '%s'", getResourceNameFromId(id))) + resource, err := service.resourceClient.List(service.context, fmt.Sprintf("resourceId eq '%s'", id), "", nil) + if err != nil { + return nil, err + } + if len(resource.Values()) > 0 { + resourceList = append(resourceList, resource.Values()...) + } } - resourceQuery = fmt.Sprintf("(%s) AND resourceType eq '%s'", strings.Join(filterList, " OR "), getResourceTypeFromId(id[0])) - } else if len(group) > 0 { + return resourceList, nil + } + if len(group) > 0 { var filterList []string for _, gr := range group { filterList = append(filterList, fmt.Sprintf("resourceGroup eq '%s'", gr)) @@ -76,7 +84,11 @@ func (service MonitorService) GetResourceDefinitions(id []string, group []string } else if query != "" { resourceQuery = query } - return service.resourceClient.List(service.context, resourceQuery, "", nil) + result, err := service.resourceClient.List(service.context, resourceQuery, "", nil) + if err == nil { + resourceList = result.Values() + } + return resourceList, err } // GetResourceDefinitionById will retrieve the azure resource based on the resource Id diff --git a/x-pack/metricbeat/module/azure/service_interface.go b/x-pack/metricbeat/module/azure/service_interface.go index e8985a7eedd..30430d03100 100644 --- a/x-pack/metricbeat/module/azure/service_interface.go +++ b/x-pack/metricbeat/module/azure/service_interface.go @@ -12,7 +12,7 @@ import ( // Service interface for the azure monitor service and mock for testing type Service interface { GetResourceDefinitionById(id string) (resources.GenericResource, error) - GetResourceDefinitions(id []string, group []string, rType string, query string) (resources.ListResultPage, error) + GetResourceDefinitions(id []string, group []string, rType string, query string) ([]resources.GenericResource, error) GetMetricDefinitions(resourceId string, namespace string) (insights.MetricDefinitionCollection, error) GetMetricNamespaces(resourceId string) (insights.MetricNamespaceCollection, error) GetMetricValues(resourceId string, namespace string, timegrain string, timespan string, metricNames []string, aggregations string, filter string) ([]insights.Metric, string, error) From 32d45264d27acb5c62a272431dff96c47d1dea83 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Tue, 13 Oct 2020 16:36:02 +0200 Subject: [PATCH 129/156] Skip flaky test with oauth2 config in httpjson input (#21749) --- x-pack/filebeat/input/httpjson/config_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/filebeat/input/httpjson/config_test.go b/x-pack/filebeat/input/httpjson/config_test.go index 85c7c64848d..1986ee7abe9 100644 --- a/x-pack/filebeat/input/httpjson/config_test.go +++ b/x-pack/filebeat/input/httpjson/config_test.go @@ -362,6 +362,7 @@ func TestConfigOauth2Validation(t *testing.T) { "url": "localhost", }, }, + /* Flaky test: https://github.com/elastic/beats/issues/21748 { name: "date_cursor.date_format will fail if invalid", expectedErr: "invalid configuration: date_format is not a valid date layout accessing 'date_cursor'", @@ -370,6 +371,7 @@ func TestConfigOauth2Validation(t *testing.T) { "url": "localhost", }, }, + */ { name: "date_cursor must work with a valid date_format", input: map[string]interface{}{ From f754515e287672405bb1f1b6613deb17471d1f70 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Tue, 13 Oct 2020 18:55:46 +0200 Subject: [PATCH 130/156] Remove kafka partition ISR from Metricbeat docs (#21709) Metricbeat doesn't collect this field directly, it collects for each replica if it is in sync or not. --- metricbeat/docs/fields.asciidoc | 10 ---------- metricbeat/module/kafka/fields.go | 2 +- metricbeat/module/kafka/partition/_meta/fields.yml | 4 ---- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 7f1d0f69ab9..a193d630564 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -24870,16 +24870,6 @@ type: long -- -*`kafka.partition.partition.isr`*:: -+ --- -List of isr ids. - - -type: keyword - --- - *`kafka.partition.partition.replica`*:: + -- diff --git a/metricbeat/module/kafka/fields.go b/metricbeat/module/kafka/fields.go index 72ee2cdc60c..96c306b5915 100644 --- a/metricbeat/module/kafka/fields.go +++ b/metricbeat/module/kafka/fields.go @@ -32,5 +32,5 @@ func init() { // AssetKafka returns asset data. // This is the base64 encoded gzipped contents of module/kafka. func AssetKafka() string { - return "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" + return "eJzUWk9v3LYSv/tTDHJyDlFO7x18eMBrUhRumiZIU6DoReCSo13WEqmQ1NqbT1+QlLT6S1Grddr45JU08/txhhwOZ/gKHvB0Bw8keyA3AIabHO/gxTv7+8UNAENNFS8Nl+IO/ncDAODeQSFZleMNgD5IZVIqRcb3d5CRXNunCnMkGu9gb9VmHHOm75z4KxCkwDOk/TOn0n6qZFXWTyZw+2q6qnZKPqBqH0/pm9Xp/35wGuCNFLoqUMFPVhTuRSZVQawAHMgRYYcoQCFhkClZwG0tdiCC5VzseyrNAYE2+hyVl0nng+FYuuPhrPe4GU8uBxDBIXWGxdnNJA5hTKHWk2APeHqUakgkDo+wIyrDNbIWYuQzI0tOE/v/yG9j6ADsZ6vH6ZzDQKWkSqhkY6SBRRdhnCqwqpIxWkmU4VY26flvLdLHRg1wFkRxo0snsML264H9LviXCoEzkJmbseUZXbgH3obLPPwa/DZ0gAjmfnnQ5CoBoZ67BRrFqfYL3Ie6+s3P7//oyLYBboeGRK7rYodEhFbUe/sBmAMxYA5cAx5RGODaohGDDIyMXqwNqMIvFWqT0AMRAvPkS4UVJpp/xRCTzwcE+03jiFoLOOm46DQkUCrJKopJRniOLC1RpRqpFMEYY3koYhwPLwi1nkavhhIVTGryxLJcEhNklqGhh8t50ZxbNzktraGstkrhFdj17bZESlTFDlXAXFewUTyHoGlWMylzTt1unORIGKoUc6T291DViJH/Hprvnes2wFeC5khEupZGLXcNOhq1tlS+SvmAWKJKGNdUCoHULNH4U8p3TgZoLu0uXSvbMFnHdPCp5Goxxpyp+O+fh4tN2aTIT/FsGolnoaNPgq7xkVtDtW+3ccnlPsnySh/SiSk3XjVyD+7rSyZoneChSbhIdieDugmtS7BcUFlwsQcr5aOsHbBTeDEJWZl1LGRl9vLaLBT+hdQgW0elkboalQK1JnvUKQ+mIz1n1DLb4K8zHS4AvYL7L0C9lrtXQm91bwRcA9WccNfl2u05eyLbbt99p/m2y3WiwmvBBS+qwq8oYuDxwOmhXzfQKJjup08ajAQyPuLETAw/DWvti2kcOaKyU+Kczjn5hh2DTCogoEukPOO0PpttyHepVGwLvVrDmeCZyyTXlQTXBq7mfNBYza0ze46VPSevXdzkKc1JsBDkJhd5cpOrnUpjmSWkNmFJqSwKPjo6zA5YZplGm7E4KTveNptZScEVCbfDv+vUGqPtHB9E24PgOaz5YOofuC8viKnDELq6qjmnqF+cbf5CkTQQbYbKPadSIbUR9A7+m/wnZL/ZIuI1a7GwXI+dswCE6rIQqs1GDBV6NdrmySz+dL0WFmq263gMMaYj4XRsj6gZD736Ngw0H6bnsKInXqdwHKTQliDjql6rOJxrvUuG8DEtnkIHpJ30dVzkwshOYXWHdluyCynMoOjnXbDG67TSRhbd+GgIMGIIaKO6i3USuRGb2PZWWiAne5cItKN/7XMWSnJa+YyPaBcpGM8yVCioDTTm0caafj26NiYRbGjg8GAmuxHxQxmvXbdFthxenxl2mxVh+7oCw4rgHuTzf635XiBr6hZ2ZtkZ5nLrOtOfW1MbAnBk7HvjSd2/hVtvOI3GWHqebcLZy+U4fJB6aK5LifRUzQIWaFPcdPvwuTCoBMkHO2EN0I1CofC3OhGZUrI+CQnEwEvm6ZHwnOxyrPXqptWx50cUnf7Wyjkq8BED0+PyROFXp7gJPMMG2ZBmx2w5ex5CH5ziZUIXbKsX+PO8l9qN5VukdqFtPoIwjJq9zdNZlr5v8Ayu/MU3JDiDW5/qj3LjUSPkGVh88pqnacy7TuiToOkSrZ2U+bgcFMnsXjBufa2BZ40BgGvgguYVQ9a0p7l4Zcm0zSK0+wvc3v/2KWokOl3w8LMMwrQNsmWKs+kLXMH/P7YZi08TXN3Lbs6xQSVw4SPIb9N51YyuhsxTG9x3gesdZ8a8Yg849SWKNZeOtp/u+XTxtOZyycWk7Zxmj77jpMj31FdWvT/WUlNV7/bdd1r1Jk02le4qe3JKXdEzeP52t3kMyYEUshIugfCyNhuVatisXaxtE0MPqeZfMSXHxfLoXG1bz52EooAL8rQE3NRlo4ED92qoVCzVKFhUu2G+Xm6xt9btU4VGnS4mYhRHVququx5bCbmI/C8i5PsGdRfnH3bW2mXS2GF8a2wN4IrlsQS4dNssyu9n4zYB/SqXynQphcbLGXj5DRS4TB8JX5xjLeT96w9gBcDwmfRkHmt1Y73fFfM9dlkZV5czHVYredQtlyirl+eNOKrp/XcAAAD//1uFyto=" } diff --git a/metricbeat/module/kafka/partition/_meta/fields.yml b/metricbeat/module/kafka/partition/_meta/fields.yml index 8f241278589..cf40ad266b9 100644 --- a/metricbeat/module/kafka/partition/_meta/fields.yml +++ b/metricbeat/module/kafka/partition/_meta/fields.yml @@ -33,10 +33,6 @@ type: long description: > Leader id (broker). - - name: isr - type: keyword - description: > - List of isr ids. - name: replica type: long description: > From 7addb4d45502d6f1bc0d5ea9823dc5a926cda9ea Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Tue, 13 Oct 2020 11:36:12 -0600 Subject: [PATCH 131/156] [Filebeat] Add check for context.DeadlineExceeded error (#21732) --- x-pack/filebeat/input/s3/collector.go | 34 ++++++++++++--------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/x-pack/filebeat/input/s3/collector.go b/x-pack/filebeat/input/s3/collector.go index bf294f94245..1b890513284 100644 --- a/x-pack/filebeat/input/s3/collector.go +++ b/x-pack/filebeat/input/s3/collector.go @@ -148,8 +148,7 @@ func (c *s3Collector) processMessage(svcS3 s3iface.ClientAPI, message sqs.Messag // read from s3 object and create event for each log line err = c.handleS3Objects(svcS3, s3Infos, errC) if err != nil { - err = fmt.Errorf("handleS3Objects failed: %w", err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("handleS3Objects failed: %w", err)) return err } c.logger.Debugf("handleS3Objects succeed") @@ -163,7 +162,12 @@ func (c *s3Collector) processorKeepAlive(svcSQS sqsiface.ClientAPI, message sqs. return nil case err := <-errC: if err != nil { - c.logger.Warn("Processing message failed, updating visibility timeout") + if err == context.DeadlineExceeded { + c.logger.Info("Context deadline exceeded, updating visibility timeout") + } else { + c.logger.Warnf("Processing message failed '%w', updating visibility timeout", err) + } + err := c.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) if err != nil { c.logger.Error(fmt.Errorf("SQS ChangeMessageVisibilityRequest failed: %w", err)) @@ -298,8 +302,7 @@ func (c *s3Collector) handleS3Objects(svc s3iface.ClientAPI, s3Infos []s3Info, e c.logger.Debugf("Processing file from s3 bucket \"%s\" with name \"%s\"", info.name, info.key) err := c.createEventsFromS3Info(svc, info, s3Ctx) if err != nil { - err = fmt.Errorf("createEventsFromS3Info failed processing file from s3 bucket \"%s\" with name \"%s\": %w", info.name, info.key, err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("createEventsFromS3Info failed processing file from s3 bucket \"%s\" with name \"%s\": %w", info.name, info.key, err)) s3Ctx.setError(err) } } @@ -326,8 +329,7 @@ func (c *s3Collector) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, // If the SDK can determine the request or retry delay was canceled // by a context the ErrCodeRequestCanceled error will be returned. if awsErr.Code() == awssdk.ErrCodeRequestCanceled { - err = fmt.Errorf("s3 GetObjectRequest canceled for '%s' from S3 bucket '%s': %w", info.key, info.name, err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("s3 GetObjectRequest canceled for '%s' from S3 bucket '%s': %w", info.key, info.name, err)) return err } @@ -345,16 +347,14 @@ func (c *s3Collector) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, isS3ObjGzipped, err := isStreamGzipped(reader) if err != nil { - err = fmt.Errorf("could not determine if S3 object is gzipped: %w", err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("could not determine if S3 object is gzipped: %w", err)) return err } if isS3ObjGzipped { gzipReader, err := gzip.NewReader(reader) if err != nil { - err = fmt.Errorf("gzip.NewReader failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("gzip.NewReader failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err)) return err } reader = bufio.NewReader(gzipReader) @@ -366,8 +366,7 @@ func (c *s3Collector) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, decoder := json.NewDecoder(reader) err := c.decodeJSON(decoder, objectHash, info, s3Ctx) if err != nil { - err = fmt.Errorf("decodeJSONWithKey failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("decodeJSONWithKey failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err)) return err } return nil @@ -383,14 +382,12 @@ func (c *s3Collector) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, event := createEvent(log, offset, info, objectHash, s3Ctx) err = c.forwardEvent(event) if err != nil { - err = fmt.Errorf("forwardEvent failed: %w", err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("forwardEvent failed: %w", err)) return err } return nil } else if err != nil { - err = fmt.Errorf("readStringAndTrimDelimiter failed: %w", err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("readStringAndTrimDelimiter failed: %w", err)) return err } @@ -403,8 +400,7 @@ func (c *s3Collector) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, event := createEvent(log, offset, info, objectHash, s3Ctx) err = c.forwardEvent(event) if err != nil { - err = fmt.Errorf("forwardEvent failed: %w", err) - c.logger.Error(err) + c.logger.Error(fmt.Errorf("forwardEvent failed: %w", err)) return err } } From b0fbfaed277c6c04c23a4be8d30c2a512d915084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Tue, 13 Oct 2020 20:44:32 +0200 Subject: [PATCH 132/156] Add missing configuration annotations (#21736) --- filebeat/input/filestream/config.go | 2 +- filebeat/input/filestream/fswatch.go | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/filebeat/input/filestream/config.go b/filebeat/input/filestream/config.go index c2b1e838ee5..5b582ccf6e8 100644 --- a/filebeat/input/filestream/config.go +++ b/filebeat/input/filestream/config.go @@ -34,7 +34,7 @@ type config struct { Paths []string `config:"paths"` Close closerConfig `config:"close"` - FileWatcher *common.ConfigNamespace `config:"file_watcher"` + FileWatcher *common.ConfigNamespace `config:"prospector"` FileIdentity *common.ConfigNamespace `config:"file_identity"` CleanInactive time.Duration `config:"clean_inactive" validate:"min=0"` CleanRemoved bool `config:"clean_removed"` diff --git a/filebeat/input/filestream/fswatch.go b/filebeat/input/filestream/fswatch.go index 1b80971d835..e988fb3cee9 100644 --- a/filebeat/input/filestream/fswatch.go +++ b/filebeat/input/filestream/fswatch.go @@ -57,9 +57,9 @@ type fileScanner struct { type fileWatcherConfig struct { // Interval is the time between two scans. - Interval time.Duration + Interval time.Duration `config:"check_interval"` // Scanner is the configuration of the scanner. - Scanner fileScannerConfig + Scanner fileScannerConfig `config:",inline"` } // fileWatcher gets the list of files from a FSWatcher and creates events by @@ -212,10 +212,9 @@ func (w *fileWatcher) Event() loginp.FSEvent { } type fileScannerConfig struct { - Paths []string - ExcludedFiles []match.Matcher - Symlinks bool - RecursiveGlob bool + ExcludedFiles []match.Matcher `config:"exclude_files"` + Symlinks bool `config:"symlinks"` + RecursiveGlob bool `config:"recursive_glob"` } func defaultFileScannerConfig() fileScannerConfig { From fff5f6a2241e4c9c9513c98c7e821f0a5007d362 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Tue, 13 Oct 2020 22:35:02 +0200 Subject: [PATCH 133/156] [Ingest Manager] Agent atomic installer (#21745) [Ingest Manager] Agent atomic installer (#21745) --- .../install/atomic/atomic_installer.go | 62 ++++++++++ .../install/atomic/atomic_installer_test.go | 115 ++++++++++++++++++ .../pkg/artifact/install/installer.go | 8 +- 3 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer.go create mode 100644 x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer_test.go diff --git a/x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer.go b/x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer.go new file mode 100644 index 00000000000..5e26436bfc4 --- /dev/null +++ b/x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package atomic + +import ( + "context" + "io/ioutil" + "os" + "path/filepath" +) + +type embeddedInstaller interface { + Install(ctx context.Context, programName, version, installDir string) error +} + +// Installer installs into temporary destination and moves to correct one after +// successful finish. +type Installer struct { + installer embeddedInstaller +} + +// NewInstaller creates a new AtomicInstaller +func NewInstaller(i embeddedInstaller) (*Installer, error) { + return &Installer{ + installer: i, + }, nil +} + +// Install performs installation of program in a specific version. +func (i *Installer) Install(ctx context.Context, programName, version, installDir string) error { + // tar installer uses Dir of installDir to determine location of unpack + tempDir, err := ioutil.TempDir(os.TempDir(), "elastic-agent-install") + if err != nil { + return err + } + tempInstallDir := filepath.Join(tempDir, filepath.Base(installDir)) + + // cleanup install directory before Install + if _, err := os.Stat(installDir); err == nil || os.IsExist(err) { + os.RemoveAll(installDir) + } + + if _, err := os.Stat(tempInstallDir); err == nil || os.IsExist(err) { + os.RemoveAll(tempInstallDir) + } + + if err := i.installer.Install(ctx, programName, version, tempInstallDir); err != nil { + // cleanup unfinished install + os.RemoveAll(tempInstallDir) + return err + } + + if err := os.Rename(tempInstallDir, installDir); err != nil { + os.RemoveAll(installDir) + os.RemoveAll(tempInstallDir) + return err + } + + return nil +} diff --git a/x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer_test.go b/x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer_test.go new file mode 100644 index 00000000000..d6266659b7d --- /dev/null +++ b/x-pack/elastic-agent/pkg/artifact/install/atomic/atomic_installer_test.go @@ -0,0 +1,115 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package atomic + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestOKInstall(t *testing.T) { + sig := make(chan int) + ti := &testInstaller{sig} + var wg sync.WaitGroup + i, err := NewInstaller(ti) + + assert.NoError(t, err) + + ctx := context.Background() + installDir := filepath.Join(os.TempDir(), "install_dir") + + wg.Add(1) + go func() { + err := i.Install(ctx, "a", "b", installDir) + assert.NoError(t, err) + wg.Done() + }() + + // signal to process next files + close(sig) + + wg.Wait() + + assert.DirExists(t, installDir) + files := getFiles() + + for name := range files { + path := filepath.Join(installDir, name) + assert.FileExists(t, path) + } + + os.RemoveAll(installDir) +} + +func TestContextCancelledInstall(t *testing.T) { + sig := make(chan int) + ti := &testInstaller{sig} + var wg sync.WaitGroup + i, err := NewInstaller(ti) + + assert.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + installDir := filepath.Join(os.TempDir(), "install_dir") + + wg.Add(1) + go func() { + err := i.Install(ctx, "a", "b", installDir) + assert.Error(t, err) + wg.Done() + }() + + // cancel before signaling + cancel() + close(sig) + + wg.Wait() + + assert.NoDirExists(t, installDir) +} + +type testInstaller struct { + signal chan int +} + +func (ti *testInstaller) Install(ctx context.Context, programName, version, installDir string) error { + files := getFiles() + if err := os.MkdirAll(installDir, 0777); err != nil { + return err + } + + for name, content := range files { + if err := ctx.Err(); err != nil { + return err + } + + filename := filepath.Join(installDir, name) + if err := ioutil.WriteFile(filename, content, 0666); err != nil { + return err + } + + // wait for all but last + <-ti.signal + } + + return nil +} + +func getFiles() map[string][]byte { + files := make(map[string][]byte) + fileCount := 3 + for i := 1; i <= fileCount; i++ { + files[fmt.Sprintf("file_%d", i)] = []byte(fmt.Sprintf("content of file %d", i)) + } + + return files +} diff --git a/x-pack/elastic-agent/pkg/artifact/install/installer.go b/x-pack/elastic-agent/pkg/artifact/install/installer.go index f04e7a4238e..c606ada5d65 100644 --- a/x-pack/elastic-agent/pkg/artifact/install/installer.go +++ b/x-pack/elastic-agent/pkg/artifact/install/installer.go @@ -12,6 +12,7 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact/install/dir" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact/install/atomic" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact/install/hooks" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact/install/tar" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact/install/zip" @@ -60,5 +61,10 @@ func NewInstaller(config *artifact.Config) (InstallerChecker, error) { return nil, err } - return hooks.NewInstallerChecker(installer, dir.NewChecker()) + atomicInstaller, err := atomic.NewInstaller(installer) + if err != nil { + return nil, err + } + + return hooks.NewInstallerChecker(atomicInstaller, dir.NewChecker()) } From a74c74f3e5fdee905c1521edb5ad2d64b2d3a672 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Wed, 14 Oct 2020 10:17:56 +0200 Subject: [PATCH 134/156] [Ingest Manager] Atomic installed forgotten changelog #21780 --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index eb98ef39ded..96f036dd15d 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -15,6 +15,7 @@ - Copy Action store on upgrade {pull}21298[21298] - Include inputs in action store actions {pull}21298[21298] - Fix issue where inputs without processors defined would panic {pull}21628[21628] +- Partial extracted beat result in failure to spawn beat {issue}21718[21718] ==== New features From e3cf9939f97d77f6efd848b1786cbf2e2a963f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Wed, 14 Oct 2020 11:23:48 +0200 Subject: [PATCH 135/156] chore: create CI artifacts for DEV usage (#21645) It will create the artifacts with some requirements related to integrity --- .ci/packaging.groovy | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.ci/packaging.groovy b/.ci/packaging.groovy index 9087cf48de4..37eeaa7d223 100644 --- a/.ci/packaging.groovy +++ b/.ci/packaging.groovy @@ -246,8 +246,12 @@ def runE2ETestForPackages(){ def release(){ withBeatsEnv(){ - dir("${env.BEATS_FOLDER}") { - sh(label: "Release ${env.BEATS_FOLDER} ${env.PLATFORMS}", script: 'mage package') + withEnv([ + "DEV=true" + ]) { + dir("${env.BEATS_FOLDER}") { + sh(label: "Release ${env.BEATS_FOLDER} ${env.PLATFORMS}", script: 'mage package') + } } publishPackages("${env.BEATS_FOLDER}") } From 303133990cbe6c001d3242445ab03a2d290c4883 Mon Sep 17 00:00:00 2001 From: Pavel Derendyaev Date: Wed, 14 Oct 2020 12:35:30 +0300 Subject: [PATCH 136/156] typofix for dns timeout configuration option (#21069) --- libbeat/processors/dns/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbeat/processors/dns/config.go b/libbeat/processors/dns/config.go index 8b0d6c9bd97..a2c2a98955e 100644 --- a/libbeat/processors/dns/config.go +++ b/libbeat/processors/dns/config.go @@ -31,7 +31,7 @@ import ( type Config struct { CacheConfig `config:",inline"` Nameservers []string `config:"nameservers"` // Required on Windows. /etc/resolv.conf is used if none are given. - Timeout time.Duration `conifg:"timeout"` // Per request timeout (with 2 nameservers the total timeout would be 2x). + Timeout time.Duration `config:"timeout"` // Per request timeout (with 2 nameservers the total timeout would be 2x). Type string `config:"type" validate:"required"` // Reverse is the only supported type currently. Action FieldAction `config:"action"` // Append or replace (defaults to append) when target exists. TagOnFailure []string `config:"tag_on_failure"` // Tags to append when a failure occurs. From 6c80fb3b37df033adcaffa190208e5c1d6e88d7d Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Wed, 14 Oct 2020 12:00:07 +0200 Subject: [PATCH 137/156] Increase recommended memory when deploying in Cloud foundry (#21755) --- deploy/cloudfoundry/filebeat/manifest.yml | 2 +- deploy/cloudfoundry/metricbeat/manifest.yml | 2 +- filebeat/docs/running-on-cloudfoundry.asciidoc | 2 +- metricbeat/docs/running-on-cloudfoundry.asciidoc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deploy/cloudfoundry/filebeat/manifest.yml b/deploy/cloudfoundry/filebeat/manifest.yml index 26ec5a0b958..5c424823cb3 100644 --- a/deploy/cloudfoundry/filebeat/manifest.yml +++ b/deploy/cloudfoundry/filebeat/manifest.yml @@ -1,6 +1,6 @@ applications: - name: filebeat - memory: 256M + memory: 512M instances: 1 buildpacks: - binary_buildpack diff --git a/deploy/cloudfoundry/metricbeat/manifest.yml b/deploy/cloudfoundry/metricbeat/manifest.yml index 40f0459b8da..1a2bb025683 100644 --- a/deploy/cloudfoundry/metricbeat/manifest.yml +++ b/deploy/cloudfoundry/metricbeat/manifest.yml @@ -1,6 +1,6 @@ applications: - name: metricbeat - memory: 256M + memory: 512M instances: 1 buildpacks: - binary_buildpack diff --git a/filebeat/docs/running-on-cloudfoundry.asciidoc b/filebeat/docs/running-on-cloudfoundry.asciidoc index ae9603dc012..c08efa30c5f 100644 --- a/filebeat/docs/running-on-cloudfoundry.asciidoc +++ b/filebeat/docs/running-on-cloudfoundry.asciidoc @@ -66,7 +66,7 @@ To check the status, run: $ cf apps name requested state instances memory disk urls -filebeat started 1/1 256M 1G +filebeat started 1/1 512M 1G ------------------------------------------------ Log events should start flowing to Elasticsearch. The events are annotated with diff --git a/metricbeat/docs/running-on-cloudfoundry.asciidoc b/metricbeat/docs/running-on-cloudfoundry.asciidoc index 2988e4d3a8b..5fdf20c9f72 100644 --- a/metricbeat/docs/running-on-cloudfoundry.asciidoc +++ b/metricbeat/docs/running-on-cloudfoundry.asciidoc @@ -66,7 +66,7 @@ To check the status, run: $ cf apps name requested state instances memory disk urls -metricbeat started 1/1 256M 1G +metricbeat started 1/1 512M 1G ------------------------------------------------ Metrics should start flowing to Elasticsearch. The events are annotated with From 1685f972d39607203a65eb9208941a3bc9d87a86 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Wed, 14 Oct 2020 11:03:28 +0100 Subject: [PATCH 138/156] [CI] Support skip-ci label (#21377) --- Jenkinsfile | 14 +++++++++----- Jenkinsfile.yml | 9 ++++----- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 17041987b27..30564270125 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -103,13 +103,17 @@ pipeline { script { def mapParallelTasks = [:] def content = readYaml(file: 'Jenkinsfile.yml') - content['projects'].each { projectName -> - generateStages(project: projectName, changeset: content['changeset']).each { k,v -> - mapParallelTasks["${k}"] = v + if (content?.disabled?.when?.labels && beatsWhen(project: 'top-level', content: content?.disabled?.when)) { + error 'Pull Request has been configured to be disabled when there is a skip-ci label match' + } else { + content['projects'].each { projectName -> + generateStages(project: projectName, changeset: content['changeset']).each { k,v -> + mapParallelTasks["${k}"] = v + } } + notifyBuildReason() + parallel(mapParallelTasks) } - notifyBuildReason() - parallel(mapParallelTasks) } } } diff --git a/Jenkinsfile.yml b/Jenkinsfile.yml index 2278ea93735..f7b21e1cbdf 100644 --- a/Jenkinsfile.yml +++ b/Jenkinsfile.yml @@ -40,10 +40,9 @@ changeset: - "^testing/.*" - "^x-pack/libbeat/.*" -## Proposal -## TBC: This will allow to configure what to do based on the PR configuration disabled: when: - labels: ## Skip the GitHub Pull Request builds if there is a GitHub label match - - "skip-ci" - draft: true ## Skip the GitHub Pull Request builds with Draft PRs. + labels: ## Skip the GitHub Pull Request builds if any of the given GitHub labels match with the assigned labels in the PR. + - skip-ci + ## TODO: This will allow to configure what to do based on the PR configuration + draft: true ## Skip the GitHub Pull Request builds with Draft PRs. \ No newline at end of file From 3e5a167809210e9999732d5e50c7e895e10fc389 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Wed, 14 Oct 2020 12:58:48 +0200 Subject: [PATCH 139/156] Make API address and Shard ID required in Cloud Foundry settings (#21759) Having an auto-generated Shard ID leads to duplicated data when trying to scale, increasing the problems of loaded systems. Forcing to set a shard ID makes the user more conscious of the implications of this setting. API address should be always set in a real deployment. --- CHANGELOG.next.asciidoc | 3 +++ deploy/cloudfoundry/filebeat/filebeat.yml | 2 +- deploy/cloudfoundry/metricbeat/metricbeat.yml | 3 ++- .../docs/running-on-cloudfoundry.asciidoc | 8 ------ metricbeat/docs/modules/cloudfoundry.asciidoc | 3 ++- .../docs/running-on-cloudfoundry.asciidoc | 8 ------ .../docs/inputs/input-cloudfoundry.asciidoc | 2 ++ x-pack/libbeat/common/cloudfoundry/config.go | 13 ++-------- .../common/cloudfoundry/config_test.go | 26 +++++++++++++++++-- .../common/cloudfoundry/test/config.go | 9 ++++++- .../add_cloudfoundry_metadata.go | 6 +++++ x-pack/metricbeat/metricbeat.reference.yml | 1 + .../cloudfoundry/_meta/config.reference.yml | 1 + .../module/cloudfoundry/_meta/config.yml | 1 + .../module/cloudfoundry/_meta/docs.asciidoc | 2 +- .../modules.d/cloudfoundry.yml.disabled | 1 + 16 files changed, 55 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 41de16190a8..8ff5fbee069 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -25,6 +25,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Allow embedding of CAs, Certificate of private keys for anything that support TLS in ouputs and inputs https://github.com/elastic/beats/pull/21179 - Update to Golang 1.12.1. {pull}11330[11330] - Disable Alibaba Cloud and Tencent Cloud metadata providers by default. {pull}13812[12812] +- API address is a required setting in `add_cloudfoundry_metadata`. {pull}21759[21759] *Auditbeat* @@ -78,6 +79,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Removed experimental modules `citrix`, `kaspersky`, `rapid7` and `tenable`. {pull}20706[20706] - Add support for GMT timezone offsets in `decode_cef`. {pull}20993[20993] - Fix parsing of Elasticsearch node name by `elasticsearch/slowlog` fileset. {pull}14547[14547] +- API address and shard ID are required settings in the Cloud Foundry input. {pull}21759[21759] *Heartbeat* @@ -95,6 +97,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix ECS compliance of user.id field in system/users metricset {pull}19019[19019] - Rename googlecloud stackdriver metricset to metrics. {pull}19718[19718] - Remove "invalid zero" metrics on Windows and Darwin, don't report linux-only memory and diskio metrics when running under agent. {pull}21457[21457] +- API address and shard ID are required settings in the Cloud Foundry module. {pull}21759[21759] *Packetbeat* diff --git a/deploy/cloudfoundry/filebeat/filebeat.yml b/deploy/cloudfoundry/filebeat/filebeat.yml index f4c4943d4bb..f3d58f079a1 100644 --- a/deploy/cloudfoundry/filebeat/filebeat.yml +++ b/deploy/cloudfoundry/filebeat/filebeat.yml @@ -11,7 +11,7 @@ filebeat.inputs: #doppler_address: ${DOPPLER_ADDRESS} #uaa_address: ${UAA_ADDRESS} #rlp_address: ${RLP_ADDRESS} - #shard_id: ${SHARD_ID} + shard_id: ${SHARD_ID} #version: v1 diff --git a/deploy/cloudfoundry/metricbeat/metricbeat.yml b/deploy/cloudfoundry/metricbeat/metricbeat.yml index c89c00ce983..12cfee75f00 100644 --- a/deploy/cloudfoundry/metricbeat/metricbeat.yml +++ b/deploy/cloudfoundry/metricbeat/metricbeat.yml @@ -11,7 +11,8 @@ metricbeat.modules: #doppler_address: ${DOPPLER_ADDRESS} #uaa_address: ${UAA_ADDRESS} #rlp_address: ${RLP_ADDRESS} - #shard_id: ${SHARD_ID} + shard_id: ${SHARD_ID} + #version: v1 #================================ Outputs ===================================== diff --git a/filebeat/docs/running-on-cloudfoundry.asciidoc b/filebeat/docs/running-on-cloudfoundry.asciidoc index c08efa30c5f..5aa3ef95837 100644 --- a/filebeat/docs/running-on-cloudfoundry.asciidoc +++ b/filebeat/docs/running-on-cloudfoundry.asciidoc @@ -71,11 +71,3 @@ filebeat started 1/1 512M 1G Log events should start flowing to Elasticsearch. The events are annotated with metadata added by the <> processor. - - -[WARNING] -======================================= -*Set shard_id to scale:* By default {beatname_uc} will generate a random `shard_id` when it starts. In the case that -{beatname_uc} needs to be scaled passed 1 instance, be sure to set a static `shard_id`. Not setting a static `shard_id` -will result in duplicate events being pushed to Elasticsearch. -======================================= diff --git a/metricbeat/docs/modules/cloudfoundry.asciidoc b/metricbeat/docs/modules/cloudfoundry.asciidoc index 4d153933c23..614c703d155 100644 --- a/metricbeat/docs/modules/cloudfoundry.asciidoc +++ b/metricbeat/docs/modules/cloudfoundry.asciidoc @@ -117,7 +117,7 @@ Client Secret to authenticate with Cloud Foundry. Default: "". === `shard_id` Shard ID for connection to the RLP Gateway. Use the same ID across multiple {beatname_lc} to shard the load of events -from the RLP Gateway. Default: "(generated UUID)". +from the RLP Gateway. [float] ==== `version` @@ -152,6 +152,7 @@ metricbeat.modules: rlp_address: '${CLOUDFOUNDRY_RLP_ADDRESS:""}' client_id: '${CLOUDFOUNDRY_CLIENT_ID:""}' client_secret: '${CLOUDFOUNDRY_CLIENT_SECRET:""}' + shard_id: metricbeat version: v1 ---- diff --git a/metricbeat/docs/running-on-cloudfoundry.asciidoc b/metricbeat/docs/running-on-cloudfoundry.asciidoc index 5fdf20c9f72..59802ba505d 100644 --- a/metricbeat/docs/running-on-cloudfoundry.asciidoc +++ b/metricbeat/docs/running-on-cloudfoundry.asciidoc @@ -71,11 +71,3 @@ metricbeat started 1/1 512M 1G Metrics should start flowing to Elasticsearch. The events are annotated with metadata added by the <> processor. - - -[WARNING] -======================================= -*Set shard_id to scale:* By default {beatname_uc} will generate a random `shard_id` when it starts. In the case that -{beatname_uc} needs to be scaled passed 1 instance, be sure to set a static `shard_id`. Not setting a static `shard_id` -will result in duplicate events being pushed to Elasticsearch. -======================================= diff --git a/x-pack/filebeat/docs/inputs/input-cloudfoundry.asciidoc b/x-pack/filebeat/docs/inputs/input-cloudfoundry.asciidoc index f8d5dd51015..551d0095b3a 100644 --- a/x-pack/filebeat/docs/inputs/input-cloudfoundry.asciidoc +++ b/x-pack/filebeat/docs/inputs/input-cloudfoundry.asciidoc @@ -23,6 +23,7 @@ Example configurations: api_address: https://api.dev.cfdev.sh client_id: uaa-filebeat client_secret: verysecret + shard_id: filebeat ssl: verification_mode: none ---- @@ -34,6 +35,7 @@ Example configurations: api_address: https://api.dev.cfdev.sh client_id: uaa-filebeat client_secret: verysecret + shard_id: filebeat ssl.certificate_authorities: ["/etc/pki/cf/ca.pem"] ssl.certificate: "/etc/pki/cf/cert.pem" ssl.key: "/etc/pki/cf/cert.key" diff --git a/x-pack/libbeat/common/cloudfoundry/config.go b/x-pack/libbeat/common/cloudfoundry/config.go index 0724bdc66e1..2f15d0c7cf9 100644 --- a/x-pack/libbeat/common/cloudfoundry/config.go +++ b/x-pack/libbeat/common/cloudfoundry/config.go @@ -10,8 +10,6 @@ import ( "strings" "time" - "github.com/gofrs/uuid" - "github.com/elastic/beats/v7/libbeat/common/transport/tlscommon" ) @@ -32,14 +30,14 @@ type Config struct { TLS *tlscommon.Config `config:"ssl"` // Override URLs returned from the CF client - APIAddress string `config:"api_address"` + APIAddress string `config:"api_address" validate:"required"` DopplerAddress string `config:"doppler_address"` UaaAddress string `config:"uaa_address"` RlpAddress string `config:"rlp_address"` // ShardID when retrieving events from loggregator, sharing this ID across // multiple filebeats will shard the load of receiving and sending events. - ShardID string `config:"shard_id"` + ShardID string `config:"shard_id" validate:"required"` // Maximum amount of time to cache application objects from CF client. CacheDuration time.Duration `config:"cache_duration"` @@ -50,13 +48,6 @@ type Config struct { // InitDefaults initialize the defaults for the configuration. func (c *Config) InitDefaults() { - // If not provided by the user; subscription ID should be a unique string to avoid clustering by default. - // Default to using a UUID4 string. - uuid, err := uuid.NewV4() - if err != nil { - panic(err) - } - c.ShardID = uuid.String() c.CacheDuration = 120 * time.Second c.CacheRetryDelay = 20 * time.Second c.Version = ConsumerVersionV1 diff --git a/x-pack/libbeat/common/cloudfoundry/config_test.go b/x-pack/libbeat/common/cloudfoundry/config_test.go index bce98a0b642..79ba7d47cc1 100644 --- a/x-pack/libbeat/common/cloudfoundry/config_test.go +++ b/x-pack/libbeat/common/cloudfoundry/config_test.go @@ -22,26 +22,48 @@ func TestValidation(t *testing.T) { var noId Config assert.Error(t, ucfg.MustNewFrom(common.MapStr{ + "api_address": "https://api.dev.cfdev.sh", "client_secret": "client_secret", + "shard_id": "beats-test-1", }).Unpack(&noId)) var noSecret Config assert.Error(t, ucfg.MustNewFrom(common.MapStr{ - "client_id": "client_id", + "api_address": "https://api.dev.cfdev.sh", + "client_id": "client_id", + "shard_id": "beats-test-1", }).Unpack(&noSecret)) + var noAPI Config + assert.Error(t, ucfg.MustNewFrom(common.MapStr{ + "client_id": "client_id", + "client_secret": "client_secret", + "shard_id": "beats-test-1", + }).Unpack(&noAPI)) + + var noShardID Config + assert.Error(t, ucfg.MustNewFrom(common.MapStr{ + "api_address": "https://api.dev.cfdev.sh", + "client_id": "client_id", + "client_secret": "client_secret", + }).Unpack(&noShardID)) + var valid Config assert.NoError(t, ucfg.MustNewFrom(common.MapStr{ + "api_address": "https://api.dev.cfdev.sh", "client_id": "client_id", "client_secret": "client_secret", + "shard_id": "beats-test-1", }).Unpack(&valid)) } func TestInitDefaults(t *testing.T) { var cfCfg Config assert.NoError(t, ucfg.MustNewFrom(common.MapStr{ + "api_address": "https://api.dev.cfdev.sh", "client_id": "client_id", "client_secret": "client_secret", + "shard_id": "beats-test-1", }).Unpack(&cfCfg)) - assert.Len(t, cfCfg.ShardID, 36) + assert.Equal(t, ConsumerVersionV1, cfCfg.Version) } diff --git a/x-pack/libbeat/common/cloudfoundry/test/config.go b/x-pack/libbeat/common/cloudfoundry/test/config.go index f7b9cd18ffb..45059fc559c 100644 --- a/x-pack/libbeat/common/cloudfoundry/test/config.go +++ b/x-pack/libbeat/common/cloudfoundry/test/config.go @@ -7,15 +7,23 @@ package test import ( "os" "testing" + + "github.com/gofrs/uuid" ) func GetConfigFromEnv(t *testing.T) map[string]interface{} { t.Helper() + shardID, err := uuid.NewV4() + if err != nil { + t.Fatalf("Unable to create a random shard ID: %v", err) + } + config := map[string]interface{}{ "api_address": lookupEnv(t, "CLOUDFOUNDRY_API_ADDRESS"), "client_id": lookupEnv(t, "CLOUDFOUNDRY_CLIENT_ID"), "client_secret": lookupEnv(t, "CLOUDFOUNDRY_CLIENT_SECRET"), + "shard_id": shardID.String(), "ssl.verification_mode": "none", } @@ -23,7 +31,6 @@ func GetConfigFromEnv(t *testing.T) map[string]interface{} { optionalConfig(config, "uaa_address", "CLOUDFOUNDRY_UAA_ADDRESS") optionalConfig(config, "rlp_address", "CLOUDFOUNDRY_RLP_ADDRESS") optionalConfig(config, "doppler_address", "CLOUDFOUNDRY_DOPPLER_ADDRESS") - optionalConfig(config, "shard_id", "CLOUDFOUNDRY_SHARD_ID") if t.Failed() { t.FailNow() diff --git a/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go b/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go index c178ea04325..a6b8bd16566 100644 --- a/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go +++ b/x-pack/libbeat/processors/add_cloudfoundry_metadata/add_cloudfoundry_metadata.go @@ -5,6 +5,7 @@ package add_cloudfoundry_metadata import ( + "github.com/gofrs/uuid" "github.com/pkg/errors" "github.com/elastic/beats/v7/libbeat/beat" @@ -32,6 +33,11 @@ const selector = "add_cloudfoundry_metadata" // New constructs a new add_cloudfoundry_metadata processor. func New(cfg *common.Config) (processors.Processor, error) { var config cloudfoundry.Config + + // ShardID is required in cloudfoundry config to consume from the firehose, + // but not for metadata requests, randomly generate one and use it. + config.ShardID = uuid.Must(uuid.NewV4()).String() + if err := cfg.Unpack(&config); err != nil { return nil, errors.Wrapf(err, "fail to unpack the %v configuration", processorName) } diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index b7b62643353..41552410a38 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -398,6 +398,7 @@ metricbeat.modules: rlp_address: '${CLOUDFOUNDRY_RLP_ADDRESS:""}' client_id: '${CLOUDFOUNDRY_CLIENT_ID:""}' client_secret: '${CLOUDFOUNDRY_CLIENT_SECRET:""}' + shard_id: metricbeat version: v1 #----------------------------- CockroachDB Module ----------------------------- diff --git a/x-pack/metricbeat/module/cloudfoundry/_meta/config.reference.yml b/x-pack/metricbeat/module/cloudfoundry/_meta/config.reference.yml index be15db23b65..6299cfc8116 100644 --- a/x-pack/metricbeat/module/cloudfoundry/_meta/config.reference.yml +++ b/x-pack/metricbeat/module/cloudfoundry/_meta/config.reference.yml @@ -10,4 +10,5 @@ rlp_address: '${CLOUDFOUNDRY_RLP_ADDRESS:""}' client_id: '${CLOUDFOUNDRY_CLIENT_ID:""}' client_secret: '${CLOUDFOUNDRY_CLIENT_SECRET:""}' + shard_id: metricbeat version: v1 diff --git a/x-pack/metricbeat/module/cloudfoundry/_meta/config.yml b/x-pack/metricbeat/module/cloudfoundry/_meta/config.yml index a2803b06d40..5ea86f3e8de 100644 --- a/x-pack/metricbeat/module/cloudfoundry/_meta/config.yml +++ b/x-pack/metricbeat/module/cloudfoundry/_meta/config.yml @@ -7,3 +7,4 @@ api_address: '${CLOUDFOUNDRY_API_ADDRESS:""}' client_id: '${CLOUDFOUNDRY_CLIENT_ID:""}' client_secret: '${CLOUDFOUNDRY_CLIENT_SECRET:""}' + shard_id: metricbeat diff --git a/x-pack/metricbeat/module/cloudfoundry/_meta/docs.asciidoc b/x-pack/metricbeat/module/cloudfoundry/_meta/docs.asciidoc index 4d908802358..752b2aaea0c 100644 --- a/x-pack/metricbeat/module/cloudfoundry/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/cloudfoundry/_meta/docs.asciidoc @@ -107,7 +107,7 @@ Client Secret to authenticate with Cloud Foundry. Default: "". === `shard_id` Shard ID for connection to the RLP Gateway. Use the same ID across multiple {beatname_lc} to shard the load of events -from the RLP Gateway. Default: "(generated UUID)". +from the RLP Gateway. [float] ==== `version` diff --git a/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled b/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled index ae540f20cfc..22a600e51d8 100644 --- a/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled +++ b/x-pack/metricbeat/modules.d/cloudfoundry.yml.disabled @@ -10,3 +10,4 @@ api_address: '${CLOUDFOUNDRY_API_ADDRESS:""}' client_id: '${CLOUDFOUNDRY_CLIENT_ID:""}' client_secret: '${CLOUDFOUNDRY_CLIENT_SECRET:""}' + shard_id: metricbeat From 85b95ee14300324f4950cdca13df1e04e84cc330 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Wed, 14 Oct 2020 13:15:39 +0200 Subject: [PATCH 140/156] Disable writes sync in persistent cache (#21754) With default configuration, every write is synced to disk. For the persistent cache, Beats not need to guarantee that everything is on disk, as the data can be recovered from the source endpoints, but the database was not being properly closed, so there could happen that most of the recent data was lost if the beat is stopped. Now, the processors can close their resources, so the database is properly closed in an normal shutdown, so we can go on without syncs on writes, what gives a much better performance. --- x-pack/libbeat/persistentcache/store.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/x-pack/libbeat/persistentcache/store.go b/x-pack/libbeat/persistentcache/store.go index 589fc724e01..e14b90fedda 100644 --- a/x-pack/libbeat/persistentcache/store.go +++ b/x-pack/libbeat/persistentcache/store.go @@ -36,10 +36,7 @@ func newStore(logger *logp.Logger, dir, name string) (*Store, error) { // Opinionated options for the use of badger as a store for metadata caches in Beats. options := badger.DefaultOptions(dbPath) options.Logger = badgerLogger{logger.Named("badger")} - // TODO: Disabling sync writes gives better performance, and data loss wouldn't - // be a problem for caches. But we are not properly closing processors yet, so let - // sync on writes by now. - // options.SyncWrites = false + options.SyncWrites = false db, err := badger.Open(options) if err != nil { From 355eef4f4bf1081568a0cd15bda16d17cd628fb2 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Wed, 14 Oct 2020 13:59:52 +0200 Subject: [PATCH 141/156] Use badger code from upstream repository (#21705) Issue in badger with 32-bits architectures has been solved in the release branch used by Beats. Update to the version with this fix and stop using the Elastic fork. --- NOTICE.txt | 6 +++--- go.mod | 3 +-- go.sum | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/NOTICE.txt b/NOTICE.txt index b62c4b5d202..349fe58b3d1 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -4473,12 +4473,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/elastic/badger/v2 -Version: v2.2007.2-beats +Dependency : github.com/dgraph-io/badger/v2 +Version: v2.2007.3-0.20201012072640-f5a7e0a1c83b Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/badger/v2@v2.2007.2-beats/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/dgraph-io/badger/v2@v2.2007.3-0.20201012072640-f5a7e0a1c83b/LICENSE: Apache License Version 2.0, January 2004 diff --git a/go.mod b/go.mod index 0f0bdb3a422..720690f1f2f 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 // indirect github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2 // indirect - github.com/dgraph-io/badger/v2 v2.2007.2 + github.com/dgraph-io/badger/v2 v2.2007.3-0.20201012072640-f5a7e0a1c83b github.com/dgrijalva/jwt-go v3.2.1-0.20190620180102-5e25c22bd5d6+incompatible // indirect github.com/digitalocean/go-libvirt v0.0.0-20180301200012-6075ea3c39a1 github.com/dlclark/regexp2 v1.1.7-0.20171009020623-7632a260cbaf // indirect @@ -191,7 +191,6 @@ replace ( github.com/Azure/go-autorest => github.com/Azure/go-autorest v12.2.0+incompatible github.com/Shopify/sarama => github.com/elastic/sarama v1.19.1-0.20200629123429-0e7b69039eec github.com/cucumber/godog => github.com/cucumber/godog v0.8.1 - github.com/dgraph-io/badger/v2 => github.com/elastic/badger/v2 v2.2007.2-beats github.com/docker/docker => github.com/docker/engine v0.0.0-20191113042239-ea84732a7725 github.com/docker/go-plugins-helpers => github.com/elastic/go-plugins-helpers v0.0.0-20200207104224-bdf17607b79f github.com/dop251/goja => github.com/andrewkroh/goja v0.0.0-20190128172624-dd2ac4456e20 diff --git a/go.sum b/go.sum index 6f737d7cee2..5c01c612fe3 100644 --- a/go.sum +++ b/go.sum @@ -201,6 +201,8 @@ github.com/denisenkom/go-mssqldb v0.0.0-20200206145737-bbfc9a55622e/go.mod h1:xb github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2 h1:6+hM8KeYKV0Z9EIINNqIEDyyIRAcNc2FW+/TUYNmWyw= github.com/devigned/tab v0.1.2-0.20190607222403-0c15cf42f9a2/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgraph-io/badger/v2 v2.2007.3-0.20201012072640-f5a7e0a1c83b h1:mUDs72Rlzv6A4YN8w3Ra3hU9x/plOQPcQjZYL/1f5SM= +github.com/dgraph-io/badger/v2 v2.2007.3-0.20201012072640-f5a7e0a1c83b/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -239,8 +241,6 @@ github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.1-0.20200121105743-0d940dd29fd2 h1:DW6WrARxK5J+o8uAKCiACi5wy9EK1UzrsCpGBPsKHAA= github.com/eclipse/paho.mqtt.golang v1.2.1-0.20200121105743-0d940dd29fd2/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/elastic/badger/v2 v2.2007.2-beats h1:/rV4bM6fdYvPQhFf2bHHivIb0H4nX8Or7nkWbQ/Q6Ko= -github.com/elastic/badger/v2 v2.2007.2-beats/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3 h1:lnDkqiRFKm0rxdljqrj3lotWinO9+jFmeDXIC4gvIQs= github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3/go.mod h1:aPqzac6AYkipvp4hufTyMj5PDIphF3+At8zr7r51xjY= github.com/elastic/ecs v1.6.0 h1:8NmgfnsjmKXh9hVsK3H2tZtfUptepNc3msJOAynhtmc= From 3f57f0ead23180dd721858bb40f2c63accb9007a Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Wed, 14 Oct 2020 14:52:02 +0100 Subject: [PATCH 142/156] disable TestReceiveEventsAndMetadata/TestSocketCleanup/TestReceiveNewEventsConcurrently in Windows (#21750) --- filebeat/Jenkinsfile.yml | 12 +++++++++++- filebeat/inputsource/unix/server_test.go | 12 ++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/filebeat/Jenkinsfile.yml b/filebeat/Jenkinsfile.yml index 6b5a23b7fb2..ffe2cec98b4 100644 --- a/filebeat/Jenkinsfile.yml +++ b/filebeat/Jenkinsfile.yml @@ -33,4 +33,14 @@ stages: mage: "mage build unitTest" platforms: ## override default labels in this specific stage. - "windows-2019" - #- "windows-2016" https://github.com/elastic/beats/issues/19641 + windows-2016: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2016" + when: ## Override the top-level when. + comments: + - "/test filebeat for windows-2016" + labels: + - "windows-2016" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/filebeat/inputsource/unix/server_test.go b/filebeat/inputsource/unix/server_test.go index a9043d14a8e..fc9545100d5 100644 --- a/filebeat/inputsource/unix/server_test.go +++ b/filebeat/inputsource/unix/server_test.go @@ -60,6 +60,10 @@ func TestErrorOnEmptyLineDelimiter(t *testing.T) { } func TestReceiveEventsAndMetadata(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("test is only supported on non-windows. See https://github.com/elastic/beats/issues/19641") + return + } expectedMessages := generateMessages(5, 100) largeMessages := generateMessages(10, 4096) extraLargeMessages := generateMessages(2, 65*1024) @@ -255,6 +259,10 @@ func TestSocketOwnershipAndMode(t *testing.T) { } func TestSocketCleanup(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("test is only supported on non-windows. See https://github.com/elastic/beats/issues/21757") + return + } path := filepath.Join(os.TempDir(), "test.sock") mockStaleSocket, err := net.Listen("unix", path) require.NoError(t, err) @@ -298,6 +306,10 @@ func TestSocketCleanupRefusal(t *testing.T) { } func TestReceiveNewEventsConcurrently(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("test is only supported on non-windows. See https://github.com/elastic/beats/issues/21757") + return + } workers := 4 eventsCount := 100 path := filepath.Join(os.TempDir(), "test.sock") From 4a9b08ae2c67dd9d9631f76e88cf55af54aa3587 Mon Sep 17 00:00:00 2001 From: Alex K <8418476+fearful-symmetry@users.noreply.github.com> Date: Wed, 14 Oct 2020 07:49:01 -0700 Subject: [PATCH 143/156] Fix non-windows fields on system/filesystem (#21758) * fix windows fields on system/filesystem * add changelog * fix tests --- CHANGELOG.next.asciidoc | 1 + metricbeat/module/system/filesystem/helper.go | 4 ++-- metricbeat/module/system/test_system.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 8ff5fbee069..0344f6a90d0 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -371,6 +371,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add a switch to the driver definition on SQL module to use pretty names {pull}17378[17378] - Fix retrieving resources by ID for the azure module. {pull}21711[21711] {issue}21707[21707] - Use timestamp from CloudWatch API when creating events. {pull}21498[21498] +- Report the correct windows events for system/filesystem {pull}21758[21758] *Packetbeat* diff --git a/metricbeat/module/system/filesystem/helper.go b/metricbeat/module/system/filesystem/helper.go index 4d53ddf2a79..9238df79f59 100644 --- a/metricbeat/module/system/filesystem/helper.go +++ b/metricbeat/module/system/filesystem/helper.go @@ -151,14 +151,14 @@ func GetFilesystemEvent(fsStat *FSStat) common.MapStr { "mount_point": fsStat.Mount, "total": fsStat.Total, "available": fsStat.Avail, - "files": fsStat.Files, + "free": fsStat.Free, "used": common.MapStr{ "pct": fsStat.UsedPercent, "bytes": fsStat.Used, }, } if runtime.GOOS != "windows" { - evt.Put("free", fsStat.Free) + evt.Put("files", fsStat.Files) evt.Put("free_files", fsStat.FreeFiles) } return evt diff --git a/metricbeat/module/system/test_system.py b/metricbeat/module/system/test_system.py index 0cfb820c18a..2e1b9e579d9 100644 --- a/metricbeat/module/system/test_system.py +++ b/metricbeat/module/system/test_system.py @@ -47,7 +47,7 @@ "free_files", "mount_point", "total", "used.bytes", "used.pct"] -SYSTEM_FILESYSTEM_FIELDS_WINDOWS = ["available", "device_name", "type", "files", +SYSTEM_FILESYSTEM_FIELDS_WINDOWS = ["available", "device_name", "type", "free", "mount_point", "total", "used.bytes", "used.pct"] From db3b99dd0eade882af21dd8090847bcb458cac3f Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Wed, 14 Oct 2020 16:08:40 +0100 Subject: [PATCH 144/156] [CI] Support Windows-2012 in pipeline 2.0 (#21338) --- Jenkinsfile | 3 ++- auditbeat/Jenkinsfile.yml | 11 +++++++++++ heartbeat/Jenkinsfile.yml | 12 ++++++++++++ metricbeat/Jenkinsfile.yml | 11 +++++++++++ packetbeat/Jenkinsfile.yml | 11 +++++++++++ winlogbeat/Jenkinsfile.yml | 11 +++++++++++ x-pack/auditbeat/Jenkinsfile.yml | 11 +++++++++++ x-pack/elastic-agent/Jenkinsfile.yml | 11 +++++++++++ x-pack/filebeat/Jenkinsfile.yml | 11 +++++++++++ x-pack/functionbeat/Jenkinsfile.yml | 11 +++++++++++ x-pack/metricbeat/Jenkinsfile.yml | 11 +++++++++++ x-pack/packetbeat/Jenkinsfile.yml | 11 +++++++++++ x-pack/winlogbeat/Jenkinsfile.yml | 11 +++++++++++ 13 files changed, 135 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 30564270125..8f05b4522cd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -234,9 +234,10 @@ def withBeatsEnv(Map args = [:], Closure body) { artifacts = '**/build/TEST*.out' } else { def chocoPath = 'C:\\ProgramData\\chocolatey\\bin' + def mingw64Path = 'C:\\tools\\mingw64\\bin' def chocoPython3Path = 'C:\\Python38;C:\\Python38\\Scripts' goRoot = "${env.USERPROFILE}\\.gvm\\versions\\go${GO_VERSION}.windows.amd64" - path = "${env.WORKSPACE}\\bin;${goRoot}\\bin;${chocoPath};${chocoPython3Path};${env.PATH}" + path = "${env.WORKSPACE}\\bin;${goRoot}\\bin;${chocoPath};${chocoPython3Path};${env.PATH};${mingw64Path}" magefile = "${env.WORKSPACE}\\.magefile" testResults = "**\\build\\TEST*.xml" artifacts = "**\\build\\TEST*.out" diff --git a/auditbeat/Jenkinsfile.yml b/auditbeat/Jenkinsfile.yml index 6f5374224d4..33d708e2635 100644 --- a/auditbeat/Jenkinsfile.yml +++ b/auditbeat/Jenkinsfile.yml @@ -45,3 +45,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test auditbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/heartbeat/Jenkinsfile.yml b/heartbeat/Jenkinsfile.yml index c465138791b..8d8b00a865d 100644 --- a/heartbeat/Jenkinsfile.yml +++ b/heartbeat/Jenkinsfile.yml @@ -43,3 +43,15 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test heartbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags + diff --git a/metricbeat/Jenkinsfile.yml b/metricbeat/Jenkinsfile.yml index 9860919d006..bdd45090837 100644 --- a/metricbeat/Jenkinsfile.yml +++ b/metricbeat/Jenkinsfile.yml @@ -51,3 +51,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test metricbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/packetbeat/Jenkinsfile.yml b/packetbeat/Jenkinsfile.yml index f755f322477..9fbe272b382 100644 --- a/packetbeat/Jenkinsfile.yml +++ b/packetbeat/Jenkinsfile.yml @@ -43,3 +43,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test packetbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/winlogbeat/Jenkinsfile.yml b/winlogbeat/Jenkinsfile.yml index 82ce7912d3b..94b36b0e647 100644 --- a/winlogbeat/Jenkinsfile.yml +++ b/winlogbeat/Jenkinsfile.yml @@ -30,3 +30,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test winlogbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/x-pack/auditbeat/Jenkinsfile.yml b/x-pack/auditbeat/Jenkinsfile.yml index 969aa0a8e08..5e0e2223dfa 100644 --- a/x-pack/auditbeat/Jenkinsfile.yml +++ b/x-pack/auditbeat/Jenkinsfile.yml @@ -44,3 +44,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test auditbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/x-pack/elastic-agent/Jenkinsfile.yml b/x-pack/elastic-agent/Jenkinsfile.yml index 04a6b227721..a36472d123b 100644 --- a/x-pack/elastic-agent/Jenkinsfile.yml +++ b/x-pack/elastic-agent/Jenkinsfile.yml @@ -43,3 +43,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test x-pack/elastic-agent for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/x-pack/filebeat/Jenkinsfile.yml b/x-pack/filebeat/Jenkinsfile.yml index b2db448f532..4b17c13b6ac 100644 --- a/x-pack/filebeat/Jenkinsfile.yml +++ b/x-pack/filebeat/Jenkinsfile.yml @@ -44,3 +44,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test x-pack/filebeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/x-pack/functionbeat/Jenkinsfile.yml b/x-pack/functionbeat/Jenkinsfile.yml index a8d42ce5fb9..29f2ecf8b5a 100644 --- a/x-pack/functionbeat/Jenkinsfile.yml +++ b/x-pack/functionbeat/Jenkinsfile.yml @@ -43,3 +43,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test x-pack/functionbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/x-pack/metricbeat/Jenkinsfile.yml b/x-pack/metricbeat/Jenkinsfile.yml index d02dc5e16aa..60a593c488d 100644 --- a/x-pack/metricbeat/Jenkinsfile.yml +++ b/x-pack/metricbeat/Jenkinsfile.yml @@ -46,3 +46,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test x-pack/metricbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/x-pack/packetbeat/Jenkinsfile.yml b/x-pack/packetbeat/Jenkinsfile.yml index fd30546f70a..e3fa9ad0324 100644 --- a/x-pack/packetbeat/Jenkinsfile.yml +++ b/x-pack/packetbeat/Jenkinsfile.yml @@ -29,3 +29,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test x-pack/winlogbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags diff --git a/x-pack/winlogbeat/Jenkinsfile.yml b/x-pack/winlogbeat/Jenkinsfile.yml index 788d4a35369..371f0aa6f48 100644 --- a/x-pack/winlogbeat/Jenkinsfile.yml +++ b/x-pack/winlogbeat/Jenkinsfile.yml @@ -29,3 +29,14 @@ stages: - "windows-2016" branches: true ## for all the branches tags: true ## for all the tags + windows-2012: + mage: "mage build unitTest" + platforms: ## override default labels in this specific stage. + - "windows-2012-r2" + when: ## Override the top-level when. + comments: + - "/test x-pack/winlogbeat for windows-2012" + labels: + - "windows-2012" + branches: true ## for all the branches + tags: true ## for all the tags From e38d417446bd595fb199a52dd81f1fad1134925d Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Wed, 14 Oct 2020 11:09:21 -0400 Subject: [PATCH 145/156] [Elastic Agent] Remove the service installer scripts from packaging (#21694) * Remove the service installer scripts from packaging. * Add changelog. --- dev-tools/packaging/packages.yml | 6 ------ .../install-service-elastic-agent.ps1.tmpl | 19 ------------------- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + 3 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 dev-tools/packaging/templates/windows/install-service-elastic-agent.ps1.tmpl diff --git a/dev-tools/packaging/packages.yml b/dev-tools/packaging/packages.yml index dbfbc9f4b7a..aedcd81eb7f 100644 --- a/dev-tools/packaging/packages.yml +++ b/dev-tools/packaging/packages.yml @@ -284,12 +284,6 @@ shared: <<: *common files: <<: *agent_binary_files - install-service-{{.BeatName}}.ps1: - template: '{{ elastic_beats_dir }}/dev-tools/packaging/templates/windows/install-service-elastic-agent.ps1.tmpl' - mode: 0755 - uninstall-service-{{.BeatName}}.ps1: - template: '{{ elastic_beats_dir }}/dev-tools/packaging/templates/windows/uninstall-service.ps1.tmpl' - mode: 0755 'data/{{.BeatName}}-{{ commit_short }}/downloads/filebeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip': source: '{{.AgentDropPath}}/filebeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip' mode: 0644 diff --git a/dev-tools/packaging/templates/windows/install-service-elastic-agent.ps1.tmpl b/dev-tools/packaging/templates/windows/install-service-elastic-agent.ps1.tmpl deleted file mode 100644 index fe037e3b425..00000000000 --- a/dev-tools/packaging/templates/windows/install-service-elastic-agent.ps1.tmpl +++ /dev/null @@ -1,19 +0,0 @@ -$ErrorActionPreference = "Stop" - -# Delete and stop the service if it already exists. -if (Get-Service {{.BeatName}} -ErrorAction SilentlyContinue) { - $service = Get-WmiObject -Class Win32_Service -Filter "name='{{.BeatName}}'" - $service.StopService() - Start-Sleep -s 1 - $service.delete() -} - -$workdir = Split-Path $MyInvocation.MyCommand.Path - -# Create the new service. -New-Service -name {{.BeatName}} ` - -displayName {{.BeatName | title}} ` - -binaryPathName "`"$workdir\{{.BeatName}}.exe`" --path.home `"$workdir`" --path.data `"$workdir\data`" run" - -# Start the new service. -Start-Service -name {{.BeatName}} diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 96f036dd15d..c2a723d552a 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -36,3 +36,4 @@ - Add `elastic.agent.id` and `elastic.agent.version` to published events from filebeat and metricbeat {pull}21543[21543] - Add `upgrade` subcommand to perform upgrade of installed Elastic Agent {pull}21425[21425] - Update `fleet.yml` and Kibana hosts when a policy change updates the Kibana hosts {pull}21599[21599] +- Removed `install-service.ps1` and `uninstall-service.ps1` from Windows .zip packaging {pull}21694[21694] From f28d14da067fc59d877e27e8afcc6d76dfdd5f0a Mon Sep 17 00:00:00 2001 From: Steffen Siering Date: Wed, 14 Oct 2020 17:37:59 +0200 Subject: [PATCH 146/156] Fix stress test package list (#21719) --- libbeat/scripts/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libbeat/scripts/Makefile b/libbeat/scripts/Makefile index b0c48d7c9fd..3bdf4774158 100755 --- a/libbeat/scripts/Makefile +++ b/libbeat/scripts/Makefile @@ -41,7 +41,7 @@ export PATH := ./bin:$(PATH) GOFILES = $(shell find . -type f -name '*.go' 2>/dev/null) GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "*/vendor/*" 2>/dev/null) GOFILES_ALL = $(GOFILES) $(shell find $(ES_BEATS) -type f -name '*.go' 2>/dev/null) -GOPACKAGES_STRESSTESTS=$(shell find . -name '*.go' 2>/dev/null | xargs awk 'FNR>1 {nextfile} /\+build.*stresstest/ {print FILENAME; nextfile}' | xargs dirname | uniq) +GOPACKAGES_STRESSTESTS=$(shell find . -name '*.go' 2>/dev/null | xargs grep -l '\+build.*stresstest' | xargs -n1 dirname | uniq) SHELL=bash ES_HOST?=elasticsearch ES_PORT?=9200 From de88c5515fa2d1ea2dd348bf3578a51154040128 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Wed, 14 Oct 2020 10:20:35 -0600 Subject: [PATCH 147/156] Change cloud.provider from googlecloud to gcp (#21775) --- CHANGELOG.next.asciidoc | 1 + .../googlecloud/metrics/_meta/data.json | 21 +++++++++++++------ .../timeseries_metadata_collector.go | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 0344f6a90d0..8da665c7d2b 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -97,6 +97,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix ECS compliance of user.id field in system/users metricset {pull}19019[19019] - Rename googlecloud stackdriver metricset to metrics. {pull}19718[19718] - Remove "invalid zero" metrics on Windows and Darwin, don't report linux-only memory and diskio metrics when running under agent. {pull}21457[21457] +- Change cloud.provider from googlecloud to gcp. {pull}21775[21775] - API address and shard ID are required settings in the Cloud Foundry module. {pull}21759[21759] *Packetbeat* diff --git a/x-pack/metricbeat/module/googlecloud/metrics/_meta/data.json b/x-pack/metricbeat/module/googlecloud/metrics/_meta/data.json index c14017dd7df..43fb0505dc3 100644 --- a/x-pack/metricbeat/module/googlecloud/metrics/_meta/data.json +++ b/x-pack/metricbeat/module/googlecloud/metrics/_meta/data.json @@ -2,15 +2,20 @@ "@timestamp": "2017-10-12T08:05:34.853Z", "cloud": { "account": { - "id": "elastic-apm" + "id": "elastic-observability", + "name": "elastic-observability" }, "instance": { - "id": "8867356942891823986", - "name": "apm-ui-dev" + "id": "2029454349697438698", + "name": "nchaulet-loadtest-elasticsearch" }, - "provider": "googlecloud" + "machine": { + "type": "n1-standard-8" + }, + "provider": "gcp" }, - "cloud.availability_zone": "europe-west4-a", + "cloud.availability_zone": "us-central1-a", + "cloud.region": "us-central1", "event": { "dataset": "googlecloud.metrics", "duration": 115000, @@ -21,11 +26,15 @@ "metrics": { "instance": { "uptime": { - "value": 60 + "value": 60.00000000093132 } } } }, + "host": { + "id": "2029454349697438698", + "name": "nchaulet-loadtest-elasticsearch" + }, "metricset": { "name": "metrics", "period": 10000 diff --git a/x-pack/metricbeat/module/googlecloud/timeseries_metadata_collector.go b/x-pack/metricbeat/module/googlecloud/timeseries_metadata_collector.go index d309d78714b..75441e53853 100644 --- a/x-pack/metricbeat/module/googlecloud/timeseries_metadata_collector.go +++ b/x-pack/metricbeat/module/googlecloud/timeseries_metadata_collector.go @@ -58,7 +58,7 @@ func (s *StackdriverTimeSeriesMetadataCollector) Metadata(ctx context.Context, i ECSCloudAccountID: accountID, ECSCloudAccountName: accountID, }, - ECSCloudProvider: "googlecloud", + ECSCloudProvider: "gcp", }, } From 116d7670b9bfe73477a5c0c8883ae7dabd31a1d2 Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Wed, 14 Oct 2020 13:03:44 -0400 Subject: [PATCH 148/156] [Elastic Agent] Update path from policy change for Kibana connection. (#21804) * Update path from policy change for kibana connection. * Add changelog. --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../pkg/agent/application/handler_action_policy_change.go | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index c2a723d552a..51081c2c7a7 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -36,4 +36,5 @@ - Add `elastic.agent.id` and `elastic.agent.version` to published events from filebeat and metricbeat {pull}21543[21543] - Add `upgrade` subcommand to perform upgrade of installed Elastic Agent {pull}21425[21425] - Update `fleet.yml` and Kibana hosts when a policy change updates the Kibana hosts {pull}21599[21599] +- Update `fleet.kibana.path` from a POLICY_CHANGE {pull}21804[21804] - Removed `install-service.ps1` and `uninstall-service.ps1` from Windows .zip packaging {pull}21694[21694] diff --git a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go index 8821700ee74..30a163a7b5e 100644 --- a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go +++ b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go @@ -73,14 +73,17 @@ func (h *handlerPolicyChange) handleKibanaHosts(c *config.Config) (err error) { // only set protocol/hosts as that is all Fleet currently sends prevProtocol := h.config.Fleet.Kibana.Protocol + prevPath := h.config.Fleet.Kibana.Path prevHosts := h.config.Fleet.Kibana.Hosts h.config.Fleet.Kibana.Protocol = cfg.Fleet.Kibana.Protocol + h.config.Fleet.Kibana.Path = cfg.Fleet.Kibana.Path h.config.Fleet.Kibana.Hosts = cfg.Fleet.Kibana.Hosts // rollback on failure defer func() { if err != nil { h.config.Fleet.Kibana.Protocol = prevProtocol + h.config.Fleet.Kibana.Path = prevPath h.config.Fleet.Kibana.Hosts = prevHosts } }() @@ -113,6 +116,9 @@ func kibanaEqual(k1 *kibana.Config, k2 *kibana.Config) bool { if k1.Protocol != k2.Protocol { return false } + if k1.Path != k2.Path { + return false + } sort.Strings(k1.Hosts) sort.Strings(k2.Hosts) From 34da9c906352d4d8717b42245b5a66cebe5aa693 Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Wed, 14 Oct 2020 13:45:16 -0400 Subject: [PATCH 149/156] [Elastic Agent] Don't perform install until after enroll (#21772) * Flip install and enroll. * Update order. * Always perform uninstall of service. * Fix issue with no enrolling. * Fix enrollment no. * Add changelog. --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + x-pack/elastic-agent/pkg/agent/cmd/enroll.go | 4 +- x-pack/elastic-agent/pkg/agent/cmd/install.go | 116 +++++++++++------- .../elastic-agent/pkg/agent/cmd/uninstall.go | 2 +- .../pkg/agent/install/uninstall.go | 10 +- 5 files changed, 74 insertions(+), 59 deletions(-) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 51081c2c7a7..4803b1ba4d2 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -36,5 +36,6 @@ - Add `elastic.agent.id` and `elastic.agent.version` to published events from filebeat and metricbeat {pull}21543[21543] - Add `upgrade` subcommand to perform upgrade of installed Elastic Agent {pull}21425[21425] - Update `fleet.yml` and Kibana hosts when a policy change updates the Kibana hosts {pull}21599[21599] +- Update `install` command to perform enroll before starting Elastic Agent {pull}21772[21772] - Update `fleet.kibana.path` from a POLICY_CHANGE {pull}21804[21804] - Removed `install-service.ps1` and `uninstall-service.ps1` from Windows .zip packaging {pull}21694[21694] diff --git a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go index a92766b9c07..2ae011db291 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go @@ -36,7 +36,7 @@ func newEnrollCommandWithArgs(flags *globalFlags, _ []string, streams *cli.IOStr Args: cobra.ExactArgs(2), Run: func(c *cobra.Command, args []string) { if err := enroll(streams, c, flags, args); err != nil { - fmt.Fprintf(streams.Err, "%v\n", err) + fmt.Fprintf(streams.Err, "Error: %v\n", err) os.Exit(1) } }, @@ -193,7 +193,7 @@ func enroll(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args // skip restarting noRestart, _ := cmd.Flags().GetBool("no-restart") - if noRestart { + if noRestart || fromInstall { return nil } diff --git a/x-pack/elastic-agent/pkg/agent/cmd/install.go b/x-pack/elastic-agent/pkg/agent/cmd/install.go index 177f79912c9..583bd2fc5b4 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/install.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/install.go @@ -9,6 +9,9 @@ import ( "os" "os/exec" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/paths" + "github.com/spf13/cobra" c "github.com/elastic/beats/v7/libbeat/common/cli" @@ -28,7 +31,7 @@ would like the Agent to operate. `, Run: func(c *cobra.Command, args []string) { if err := installCmd(streams, c, flags, args); err != nil { - fmt.Fprintf(streams.Err, "%v\n", err) + fmt.Fprintf(streams.Err, "Error: %v\n", err) os.Exit(1) } }, @@ -43,6 +46,7 @@ would like the Agent to operate. } func installCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args []string) error { + var err error if !install.HasRoot() { return fmt.Errorf("unable to perform install command, not executed with %s permissions", install.PermissionUser) } @@ -51,6 +55,16 @@ func installCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, return fmt.Errorf("already installed at: %s", install.InstallPath) } + // check the lock to ensure that elastic-agent is not already running in this directory + locker := application.NewAppLocker(paths.Data()) + if err := locker.TryLock(); err != nil { + if err == application.ErrAppAlreadyRunning { + return fmt.Errorf("cannot perform installation as Elastic Agent is already running from this directory") + } + return err + } + locker.Unlock() + warn.PrintNotGA(streams.Out) force, _ := cmd.Flags().GetBool("force") if status == install.Broken { @@ -58,7 +72,7 @@ func installCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, fmt.Fprintf(streams.Out, "Elastic Agent is installed but currently broken: %s\n", reason) confirm, err := c.Confirm(fmt.Sprintf("Continuing will re-install Elastic Agent over the current installation at %s. Do you want to continue?", install.InstallPath), true) if err != nil { - return fmt.Errorf("Error: problem reading prompt response") + return fmt.Errorf("problem reading prompt response") } if !confirm { return fmt.Errorf("installation was cancelled by the user") @@ -68,7 +82,7 @@ func installCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, if !force { confirm, err := c.Confirm(fmt.Sprintf("Elastic Agent will be installed at %s and will run as a service. Do you want to continue?", install.InstallPath), true) if err != nil { - return fmt.Errorf("Error: problem reading prompt response") + return fmt.Errorf("problem reading prompt response") } if !confirm { return fmt.Errorf("installation was cancelled by the user") @@ -76,17 +90,7 @@ func installCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, } } - err := install.Install() - if err != nil { - return fmt.Errorf("Error: %s", err) - } - err = install.StartService() - if err != nil { - fmt.Fprintf(streams.Out, "Installation of required system files was successful, but starting of the service failed.\n") - return err - } - fmt.Fprintf(streams.Out, "Installation was successful and Elastic Agent is running.\n") - + enroll := true askEnroll := true kibana, _ := cmd.Flags().GetString("kibana-url") token, _ := cmd.Flags().GetString("enrollment-token") @@ -102,53 +106,71 @@ func installCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, return fmt.Errorf("problem reading prompt response") } if !confirm { - // not enrolling, all done (standalone mode) - return nil + // not enrolling + enroll = false } } if !askEnroll && (kibana == "" || token == "") { // force was performed without required enrollment arguments, all done (standalone mode) - return nil + enroll = false } - if kibana == "" { - kibana, err = c.ReadInput("Kibana URL you want to enroll this Agent into:") - if err != nil { - return fmt.Errorf("problem reading prompt response") - } + if enroll { if kibana == "" { - fmt.Fprintf(streams.Out, "Enrollment cancelled because no URL was provided.\n") - return nil - } - } - if token == "" { - token, err = c.ReadInput("Fleet enrollment token:") - if err != nil { - return fmt.Errorf("problem reading prompt response") + kibana, err = c.ReadInput("Kibana URL you want to enroll this Agent into:") + if err != nil { + return fmt.Errorf("problem reading prompt response") + } + if kibana == "" { + fmt.Fprintf(streams.Out, "Enrollment cancelled because no URL was provided.\n") + return nil + } } if token == "" { - fmt.Fprintf(streams.Out, "Enrollment cancelled because no enrollment token was provided.\n") - return nil + token, err = c.ReadInput("Fleet enrollment token:") + if err != nil { + return fmt.Errorf("problem reading prompt response") + } + if token == "" { + fmt.Fprintf(streams.Out, "Enrollment cancelled because no enrollment token was provided.\n") + return nil + } } } - enrollArgs := []string{"enroll", kibana, token, "--from-install"} - enrollArgs = append(enrollArgs, buildEnrollmentFlags(cmd)...) - enrollCmd := exec.Command(install.ExecutablePath(), enrollArgs...) - enrollCmd.Stdin = os.Stdin - enrollCmd.Stdout = os.Stdout - enrollCmd.Stderr = os.Stderr - err = enrollCmd.Start() + err = install.Install() if err != nil { - return fmt.Errorf("failed to execute enroll command: %s", err) + return err } - err = enrollCmd.Wait() - if err == nil { - return nil + + if enroll { + enrollArgs := []string{"enroll", kibana, token, "--from-install"} + enrollArgs = append(enrollArgs, buildEnrollmentFlags(cmd)...) + enrollCmd := exec.Command(install.ExecutablePath(), enrollArgs...) + enrollCmd.Stdin = os.Stdin + enrollCmd.Stdout = os.Stdout + enrollCmd.Stderr = os.Stderr + err = enrollCmd.Start() + if err != nil { + install.Uninstall() + return fmt.Errorf("failed to execute enroll command: %s", err) + } + err = enrollCmd.Wait() + if err != nil { + install.Uninstall() + exitErr, ok := err.(*exec.ExitError) + if ok { + return fmt.Errorf("enroll command failed with exit code: %d", exitErr.ExitCode()) + } + return fmt.Errorf("enroll command failed for unknown reason: %s", err) + } } - exitErr, ok := err.(*exec.ExitError) - if ok { - return fmt.Errorf("enroll command failed with exit code: %d", exitErr.ExitCode()) + + err = install.StartService() + if err != nil { + fmt.Fprintf(streams.Out, "Installation of required system files was successful, but starting of the service failed.\n") + return err } - return fmt.Errorf("enroll command failed for unknown reason: %s", err) + fmt.Fprintf(streams.Out, "Installation was successful and Elastic Agent is running.\n") + return nil } diff --git a/x-pack/elastic-agent/pkg/agent/cmd/uninstall.go b/x-pack/elastic-agent/pkg/agent/cmd/uninstall.go index d215a15e337..ecb42d72b77 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/uninstall.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/uninstall.go @@ -28,7 +28,7 @@ Unless -f is used this command will ask confirmation before performing removal. `, Run: func(c *cobra.Command, args []string) { if err := uninstallCmd(streams, c, flags, args); err != nil { - fmt.Fprintf(streams.Err, "%v\n", err) + fmt.Fprintf(streams.Err, "Error: %v\n", err) os.Exit(1) } }, diff --git a/x-pack/elastic-agent/pkg/agent/install/uninstall.go b/x-pack/elastic-agent/pkg/agent/install/uninstall.go index 381427eb8c7..a83681cfb80 100644 --- a/x-pack/elastic-agent/pkg/agent/install/uninstall.go +++ b/x-pack/elastic-agent/pkg/agent/install/uninstall.go @@ -32,15 +32,7 @@ func Uninstall() error { } status = service.StatusStopped } - if status == service.StatusStopped { - err := svc.Uninstall() - if err != nil { - return errors.New( - err, - fmt.Sprintf("failed to uninstall service (%s)", ServiceName), - errors.M("service", ServiceName)) - } - } + _ = svc.Uninstall() // remove, if present on platform if ShellWrapperPath != "" { From 39b1db81034166991f28904278c8282a502d58e6 Mon Sep 17 00:00:00 2001 From: Andrew Cholakian Date: Wed, 14 Oct 2020 13:48:35 -0500 Subject: [PATCH 150/156] [Agent] Remove heartbeat from bundled beats in agent. (#21602) This keeps most of the changes in https://github.com/elastic/beats/pull/20488 but unbundles heartbeat since it's not ready for prime time yet. We may as well keep the work that has been done already IMHO. --- dev-tools/packaging/packages.yml | 41 -------------------- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 - x-pack/elastic-agent/magefile.go | 2 +- 3 files changed, 1 insertion(+), 43 deletions(-) diff --git a/dev-tools/packaging/packages.yml b/dev-tools/packaging/packages.yml index aedcd81eb7f..e1eff0fdfbb 100644 --- a/dev-tools/packaging/packages.yml +++ b/dev-tools/packaging/packages.yml @@ -74,16 +74,6 @@ shared: source: '{{.AgentDropPath}}/filebeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc' mode: 0644 skip_on_missing: true - /var/lib/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz: - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz' - mode: 0644 - /var/lib/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.sha512: - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.sha512' - mode: 0644 - /var/lib/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc: - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc' - mode: 0644 - skip_on_missing: true /var/lib/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz: source: '{{.AgentDropPath}}/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz' mode: 0644 @@ -165,17 +155,6 @@ shared: source: '{{.AgentDropPath}}/filebeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc' mode: 0644 skip_on_missing: true - /etc/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz: - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz' - mode: 0644 - /etc/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.sha512: - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.sha512' - mode: 0644 - skip_on_missing: true - /etc/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc: - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc' - mode: 0644 - skip_on_missing: true /etc/{{.BeatName}}/data/{{.BeatName}}-{{ commit_short }}/downloads/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz: source: '{{.AgentDropPath}}/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz' mode: 0644 @@ -246,16 +225,6 @@ shared: source: '{{.AgentDropPath}}/filebeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc' mode: 0644 skip_on_missing: true - 'data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz': - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz' - mode: 0644 - 'data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.sha512': - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.sha512' - mode: 0644 - 'data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc': - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz.asc' - mode: 0644 - skip_on_missing: true 'data/{{.BeatName}}-{{ commit_short }}/downloads/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz': source: '{{.AgentDropPath}}/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.tar.gz' mode: 0644 @@ -294,16 +263,6 @@ shared: source: '{{.AgentDropPath}}/filebeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip.asc' mode: 0644 skip_on_missing: true - 'data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip': - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip' - mode: 0644 - 'data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip.sha512': - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip.sha512' - mode: 0644 - 'data/{{.BeatName}}-{{ commit_short }}/downloads/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip.asc': - source: '{{.AgentDropPath}}/heartbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip.asc' - mode: 0644 - skip_on_missing: true 'data/{{.BeatName}}-{{ commit_short }}/downloads/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip': source: '{{.AgentDropPath}}/metricbeat-{{ beat_version }}{{if .Snapshot}}-SNAPSHOT{{end}}-{{.GOOS}}-{{.AgentArchName}}.zip' mode: 0644 diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 4803b1ba4d2..deae2522773 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -23,7 +23,6 @@ - Improved version CLI {pull}20359[20359] - Enroll CLI now restarts running daemon {pull}20359[20359] - Add restart CLI cmd {pull}20359[20359] -- Add new `synthetics/*` inputs to run Heartbeat {pull}20387[20387] - Users of the Docker image can now pass `FLEET_ENROLL_INSECURE=1` to include the `--insecure` flag with the `elastic-agent enroll` command {issue}20312[20312] {pull}20713[20713] - Add `docker` composable dynamic provider. {pull}20842[20842] - Add support for dynamic inputs with providers and `{{variable|"default"}}` substitution. {pull}20839[20839] diff --git a/x-pack/elastic-agent/magefile.go b/x-pack/elastic-agent/magefile.go index 4fa067f8f8b..a1aaba840fb 100644 --- a/x-pack/elastic-agent/magefile.go +++ b/x-pack/elastic-agent/magefile.go @@ -572,7 +572,7 @@ func packageAgent(requiredPackages []string, packagingFn func()) { defer os.RemoveAll(dropPath) defer os.Unsetenv(agentDropPath) - packedBeats := []string{"filebeat", "heartbeat", "metricbeat"} + packedBeats := []string{"filebeat", "metricbeat"} for _, b := range packedBeats { pwd, err := filepath.Abs(filepath.Join("..", b)) From 99b4172b3b6b506de32152412647b7ed3e38389f Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Wed, 14 Oct 2020 13:30:15 -0600 Subject: [PATCH 151/156] Move s3_daily_storage and s3_request metricsets to use cloudwatch input (#21703) --- CHANGELOG.next.asciidoc | 1 + .../modules/aws/s3_daily_storage.asciidoc | 1 + .../docs/modules/aws/s3_request.asciidoc | 1 + x-pack/metricbeat/include/list.go | 2 - x-pack/metricbeat/module/aws/module.yml | 2 + .../module/aws/mtest/integration.go | 1 + .../aws/s3_daily_storage/_meta/data.json | 27 +-- .../module/aws/s3_daily_storage/data.go | 21 -- .../module/aws/s3_daily_storage/manifest.yml | 22 ++ .../aws/s3_daily_storage/s3_daily_storage.go | 219 ----------------- .../s3_daily_storage_integration_test.go | 18 +- .../s3_daily_storage/s3_daily_storage_test.go | 21 ++ .../module/aws/s3_request/_meta/data.json | 58 ++--- .../metricbeat/module/aws/s3_request/data.go | 41 ---- .../module/aws/s3_request/manifest.yml | 64 +++++ .../module/aws/s3_request/s3_request.go | 221 ------------------ .../s3_request/s3_request_integration_test.go | 49 ++-- .../module/aws/s3_request/s3_request_test.go | 21 ++ 18 files changed, 209 insertions(+), 581 deletions(-) delete mode 100644 x-pack/metricbeat/module/aws/s3_daily_storage/data.go create mode 100644 x-pack/metricbeat/module/aws/s3_daily_storage/manifest.yml delete mode 100644 x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go create mode 100644 x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_test.go delete mode 100644 x-pack/metricbeat/module/aws/s3_request/data.go create mode 100644 x-pack/metricbeat/module/aws/s3_request/manifest.yml delete mode 100644 x-pack/metricbeat/module/aws/s3_request/s3_request.go create mode 100644 x-pack/metricbeat/module/aws/s3_request/s3_request_test.go diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 8da665c7d2b..28e66a63034 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -756,6 +756,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Move Prometheus query & remote_write to GA. {pull}21507[21507] - Expand unsupported option from namespace to metrics in the azure module. {pull}21486[21486] - Map cloud data filed `cloud.account.id` to azure subscription. {pull}21483[21483] {issue}21381[21381] +- Move s3_daily_storage and s3_request metricsets to use cloudwatch input. {pull}21703[21703] *Packetbeat* diff --git a/metricbeat/docs/modules/aws/s3_daily_storage.asciidoc b/metricbeat/docs/modules/aws/s3_daily_storage.asciidoc index 251fe923231..7fd8a635a3b 100644 --- a/metricbeat/docs/modules/aws/s3_daily_storage.asciidoc +++ b/metricbeat/docs/modules/aws/s3_daily_storage.asciidoc @@ -8,6 +8,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../../x-pack/metricbeat/module/aws/s3_daily_storage/_meta/docs.asciidoc[] +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. ==== Fields diff --git a/metricbeat/docs/modules/aws/s3_request.asciidoc b/metricbeat/docs/modules/aws/s3_request.asciidoc index 53bef698894..e8d26703b17 100644 --- a/metricbeat/docs/modules/aws/s3_request.asciidoc +++ b/metricbeat/docs/modules/aws/s3_request.asciidoc @@ -8,6 +8,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../../x-pack/metricbeat/module/aws/s3_request/_meta/docs.asciidoc[] +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. ==== Fields diff --git a/x-pack/metricbeat/include/list.go b/x-pack/metricbeat/include/list.go index 053385e2e79..e27c7f9a624 100644 --- a/x-pack/metricbeat/include/list.go +++ b/x-pack/metricbeat/include/list.go @@ -16,8 +16,6 @@ import ( _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/cloudwatch" _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/ec2" _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/rds" - _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/s3_daily_storage" - _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/s3_request" _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/sqs" _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure" _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/azure/app_insights" diff --git a/x-pack/metricbeat/module/aws/module.yml b/x-pack/metricbeat/module/aws/module.yml index 0be20d1d484..c6129426e8b 100644 --- a/x-pack/metricbeat/module/aws/module.yml +++ b/x-pack/metricbeat/module/aws/module.yml @@ -4,6 +4,8 @@ metricsets: - ebs - usage - sns + - s3_daily_storage + - s3_request - lambda - dynamodb - vpn diff --git a/x-pack/metricbeat/module/aws/mtest/integration.go b/x-pack/metricbeat/module/aws/mtest/integration.go index f99d34bb05f..fba6b9fe3b2 100644 --- a/x-pack/metricbeat/module/aws/mtest/integration.go +++ b/x-pack/metricbeat/module/aws/mtest/integration.go @@ -39,6 +39,7 @@ func GetConfigForTest(t *testing.T, metricSetName string, period string) map[str "access_key_id": accessKeyID, "secret_access_key": secretAccessKey, "default_region": defaultRegion, + "latency": "5m", // You can specify which region to run test on by using regions variable // "regions": []string{"us-east-1"}, } diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/_meta/data.json b/x-pack/metricbeat/module/aws/s3_daily_storage/_meta/data.json index 722318a2981..4285889e5d4 100644 --- a/x-pack/metricbeat/module/aws/s3_daily_storage/_meta/data.json +++ b/x-pack/metricbeat/module/aws/s3_daily_storage/_meta/data.json @@ -1,27 +1,28 @@ { "@timestamp": "2017-10-12T08:05:34.853Z", "aws": { - "s3": { - "bucket": { - "name": "test-s3-ks-2" - } + "cloudwatch": { + "namespace": "AWS/S3" + }, + "dimensions": { + "BucketName": "filebeat-aws-elb-test", + "StorageType": "AllStorageTypes" }, - "s3_daily_storage": { - "bucket": { - "size": { - "bytes": 207372 + "s3": { + "metrics": { + "NumberOfObjects": { + "avg": 57828 } - }, - "number_of_objects": 128 + } } }, "cloud": { "account": { - "id": "627959692251", - "name": "elastic-test" + "id": "428152502467", + "name": "elastic-beats" }, "provider": "aws", - "region": "ap-southeast-1" + "region": "eu-central-1" }, "event": { "dataset": "aws.s3_daily_storage", diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/data.go b/x-pack/metricbeat/module/aws/s3_daily_storage/data.go deleted file mode 100644 index 95b5b3cf53d..00000000000 --- a/x-pack/metricbeat/module/aws/s3_daily_storage/data.go +++ /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; -// you may not use this file except in compliance with the Elastic License. - -package s3_daily_storage - -import ( - s "github.com/elastic/beats/v7/libbeat/common/schema" - c "github.com/elastic/beats/v7/libbeat/common/schema/mapstrstr" -) - -var ( - schemaMetricSetFields = s.Schema{ - "bucket": s.Object{ - "size": s.Object{ - "bytes": c.Float("BucketSizeBytes"), - }, - }, - "number_of_objects": c.Float("NumberOfObjects"), - } -) diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/manifest.yml b/x-pack/metricbeat/module/aws/s3_daily_storage/manifest.yml new file mode 100644 index 00000000000..83ed42545c0 --- /dev/null +++ b/x-pack/metricbeat/module/aws/s3_daily_storage/manifest.yml @@ -0,0 +1,22 @@ +default: true +input: + module: aws + metricset: cloudwatch + defaults: + metrics: + - namespace: AWS/S3 + statistic: ["Average"] + name: + - BucketSizeBytes + - NumberOfObjects + +processors: + - rename: + ignore_missing: true + fields: + - from: "aws.s3.metrics.NumberOfObjects.avg" + to: "aws.s3_daily_storage.number_of_objects" + - from: "aws.s3.metrics.BucketSizeBytes.avg" + to: "aws.s3_daily_storage.bucket.size.bytes" + - from: "aws.dimensions.BucketName" + to: "aws.s3.bucket.name" diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go deleted file mode 100644 index d5efa36fb03..00000000000 --- a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage.go +++ /dev/null @@ -1,219 +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; -// you may not use this file except in compliance with the Elastic License. - -package s3_daily_storage - -import ( - "fmt" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go-v2/service/cloudwatch" - "github.com/pkg/errors" - - "github.com/elastic/beats/v7/metricbeat/mb" - awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" - "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws" -) - -var metricsetName = "s3_daily_storage" - -// init registers the MetricSet with the central registry as soon as the program -// starts. The New function will be called later to instantiate an instance of -// the MetricSet for each host defined in the module's configuration. After the -// MetricSet has been created then Fetch will begin to be called periodically. -func init() { - mb.Registry.MustAddMetricSet(aws.ModuleName, metricsetName, New) -} - -// MetricSet holds any configuration or state information. It must implement -// the mb.MetricSet interface. And this is best achieved by embedding -// mb.BaseMetricSet because it implements all of the required mb.MetricSet -// interface methods except for Fetch. -type MetricSet struct { - *aws.MetricSet -} - -// New creates a new instance of the MetricSet. New is responsible for unpacking -// any MetricSet specific configuration options if there are any. -func New(base mb.BaseMetricSet) (mb.MetricSet, error) { - moduleConfig := aws.Config{} - if err := base.Module().UnpackConfig(&moduleConfig); err != nil { - return nil, err - } - - metricSet, err := aws.NewMetricSet(base) - if err != nil { - return nil, errors.Wrap(err, "error creating aws metricset") - } - - // Check if period is set to be multiple of 86400s - remainder := int(metricSet.Period.Seconds()) % 86400 - if remainder != 0 { - err := errors.New("period needs to be set to 86400s (or a multiple of 86400s). " + - "To avoid data missing or extra costs, please make sure period is set correctly " + - "in config.yml") - base.Logger().Info(err) - } - - return &MetricSet{ - MetricSet: metricSet, - }, nil -} - -// Fetch methods implements the data gathering and data conversion to the right -// format. It publishes the event which is then forwarded to the output. In case -// of an error set the Error field of mb.Event or simply call report.Error(). -func (m *MetricSet) Fetch(report mb.ReporterV2) error { - namespace := "AWS/S3" - // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) - m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) - - // GetMetricData for AWS S3 from Cloudwatch - for _, regionName := range m.MetricSet.RegionsList { - awsConfig := m.MetricSet.AwsConfig.Copy() - awsConfig.Region = regionName - - svcCloudwatch := cloudwatch.New(awscommon.EnrichAWSConfigWithEndpoint( - m.Endpoint, "monitoring", regionName, awsConfig)) - - listMetricsOutputs, err := aws.GetListMetricsOutput(namespace, regionName, svcCloudwatch) - if err != nil { - err = errors.Wrap(err, "GetListMetricsOutput failed, skipping region "+regionName) - m.Logger().Error(err.Error()) - report.Error(err) - continue - } - - if listMetricsOutputs == nil || len(listMetricsOutputs) == 0 { - continue - } - - metricDataQueries := constructMetricQueries(listMetricsOutputs, m.Period) - // Use metricDataQueries to make GetMetricData API calls - metricDataOutputs, err := aws.GetMetricDataResults(metricDataQueries, svcCloudwatch, startTime, endTime) - if err != nil { - err = errors.Wrap(err, "GetMetricDataResults failed, skipping region "+regionName) - m.Logger().Error(err) - report.Error(err) - continue - } - - // Create Cloudwatch Events for s3_daily_storage - bucketNames := getBucketNames(listMetricsOutputs) - for _, bucketName := range bucketNames { - event, err := createCloudWatchEvents(metricDataOutputs, regionName, bucketName, m.AccountName, m.AccountID) - if err != nil { - err = errors.Wrap(err, "createCloudWatchEvents failed") - m.Logger().Error(err) - event.Error = err - report.Event(event) - continue - } - - if reported := report.Event(event); !reported { - m.Logger().Debug("Fetch interrupted, failed to emit event") - return nil - } - } - } - - return nil -} - -func getBucketNames(listMetricsOutputs []cloudwatch.Metric) (bucketNames []string) { - for _, output := range listMetricsOutputs { - for _, dim := range output.Dimensions { - if *dim.Name == "BucketName" { - if exists, _ := aws.StringInSlice(*dim.Value, bucketNames); exists { - continue - } - bucketNames = append(bucketNames, *dim.Value) - } - } - } - return -} - -func constructMetricQueries(listMetricsOutputs []cloudwatch.Metric, period time.Duration) []cloudwatch.MetricDataQuery { - var metricDataQueries []cloudwatch.MetricDataQuery - metricDataQueryEmpty := cloudwatch.MetricDataQuery{} - metricNames := []string{"NumberOfObjects", "BucketSizeBytes"} - for i, listMetric := range listMetricsOutputs { - if exists, _ := aws.StringInSlice(*listMetric.MetricName, metricNames); !exists { - continue - } - - metricDataQuery := createMetricDataQuery(listMetric, period, i) - if metricDataQuery == metricDataQueryEmpty { - continue - } - metricDataQueries = append(metricDataQueries, metricDataQuery) - } - return metricDataQueries -} - -func createMetricDataQuery(metric cloudwatch.Metric, period time.Duration, index int) (metricDataQuery cloudwatch.MetricDataQuery) { - statistic := "Average" - periodInSec := int64(period.Seconds()) - id := "s3d" + strconv.Itoa(index) - metricDims := metric.Dimensions - bucketName := "" - storageType := "" - for _, dim := range metricDims { - if *dim.Name == "BucketName" { - bucketName = *dim.Value - } else if *dim.Name == "StorageType" { - storageType = *dim.Value - } - } - metricName := *metric.MetricName - label := bucketName + " " + storageType + " " + metricName - - metricDataQuery = cloudwatch.MetricDataQuery{ - Id: &id, - MetricStat: &cloudwatch.MetricStat{ - Period: &periodInSec, - Stat: &statistic, - Metric: &metric, - }, - Label: &label, - } - return -} - -func createCloudWatchEvents(outputs []cloudwatch.MetricDataResult, regionName string, bucketName string, accountName string, accountID string) (event mb.Event, err error) { - // AWS s3_daily_storage metrics - mapOfMetricSetFieldResults := make(map[string]interface{}) - - // Find a timestamp for all metrics in output - timestamp := aws.FindTimestamp(outputs) - if !timestamp.IsZero() { - for _, output := range outputs { - if len(output.Values) == 0 { - continue - } - exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) - if exists { - labels := strings.Split(*output.Label, " ") - if labels[0] == bucketName && len(output.Values) > timestampIdx { - mapOfMetricSetFieldResults[labels[2]] = fmt.Sprint(output.Values[timestampIdx]) - } - } - } - } - - resultMetricSetFields, err := aws.EventMapping(mapOfMetricSetFieldResults, schemaMetricSetFields) - if err != nil { - err = errors.Wrap(err, "Error trying to apply schema schemaMetricSetFields in AWS s3_daily_storage metricbeat module.") - return - } - - event = aws.InitEvent(regionName, accountName, accountID, timestamp) - event.MetricSetFields = resultMetricSetFields - event.RootFields.Put("aws.s3.bucket.name", bucketName) - return -} diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_integration_test.go b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_integration_test.go index 592416a56a8..4042f332b8e 100644 --- a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_integration_test.go +++ b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_integration_test.go @@ -28,22 +28,18 @@ func TestFetch(t *testing.T) { assert.NotEmpty(t, events) for _, event := range events { - // RootField - mtest.CheckEventField("service.name", "string", event, t) mtest.CheckEventField("cloud.region", "string", event, t) - - // MetricSetField - mtest.CheckEventField("bucket.name", "string", event, t) - mtest.CheckEventField("bucket.size.bytes", "float", event, t) - mtest.CheckEventField("number_of_objects", "float", event, t) + mtest.CheckEventField("aws.dimensions.BucketName", "string", event, t) + mtest.CheckEventField("aws.dimensions.StorageType", "string", event, t) + mtest.CheckEventField("aws.s3.metrics.BucketSizeBytes.avg", "float", event, t) + mtest.CheckEventField("aws.s3.metrics.NumberOfObjects.avg", "float", event, t) + break } } func TestData(t *testing.T) { config := mtest.GetConfigForTest(t, "s3_daily_storage", "86400s") - metricSet := mbtest.NewReportingMetricSetV2Error(t, config) - if err := mbtest.WriteEventsReporterV2Error(metricSet, t, "/"); err != nil { - t.Fatal("write", err) - } + metricSet := mbtest.NewFetcher(t, config) + metricSet.WriteEvents(t, "/") } diff --git a/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_test.go b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_test.go new file mode 100644 index 00000000000..16008223a92 --- /dev/null +++ b/x-pack/metricbeat/module/aws/s3_daily_storage/s3_daily_storage_test.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package s3_daily_storage + +import ( + "os" + + "github.com/elastic/beats/v7/metricbeat/mb" + + // Register input module and metricset + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws" + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/cloudwatch" +) + +func init() { + // To be moved to some kind of helper + os.Setenv("BEAT_STRICT_PERMS", "false") + mb.Registry.SetSecondarySource(mb.NewLightModulesSource("../../../module")) +} diff --git a/x-pack/metricbeat/module/aws/s3_request/_meta/data.json b/x-pack/metricbeat/module/aws/s3_request/_meta/data.json index d8dfc488a83..8bdda96ef8d 100644 --- a/x-pack/metricbeat/module/aws/s3_request/_meta/data.json +++ b/x-pack/metricbeat/module/aws/s3_request/_meta/data.json @@ -1,40 +1,46 @@ { "@timestamp": "2017-10-12T08:05:34.853Z", "aws": { - "s3": { - "bucket": { - "name": "test-s3-ks-2" - } + "cloudwatch": { + "namespace": "AWS/S3" }, - "s3_request": { - "downloaded": { - "bytes": 534 - }, - "errors": { - "4xx": 0, - "5xx": 0 - }, - "latency": { - "first_byte.ms": 214, - "total_request.ms": 533 - }, - "requests": { - "list": 2, - "put": 10, - "total": 12 - }, - "uploaded": { - "bytes": 13572 + "dimensions": { + "BucketName": "test-ks-1", + "FilterId": "EntireBucket" + }, + "s3": { + "metrics": { + "4xxErrors": { + "avg": 0 + }, + "5xxErrors": { + "avg": 0 + }, + "AllRequests": { + "avg": 1 + }, + "BytesUploaded": { + "avg": 684 + }, + "FirstByteLatency": { + "avg": 21.791666666666668 + }, + "PutRequests": { + "avg": 1 + }, + "TotalRequestLatency": { + "avg": 35.916666666666664 + } } } }, "cloud": { "account": { - "id": "627959692251", - "name": "elastic-test" + "id": "428152502467", + "name": "elastic-beats" }, "provider": "aws", - "region": "ap-southeast-1" + "region": "us-east-1" }, "event": { "dataset": "aws.s3_request", diff --git a/x-pack/metricbeat/module/aws/s3_request/data.go b/x-pack/metricbeat/module/aws/s3_request/data.go deleted file mode 100644 index 5c4c2bfa1a4..00000000000 --- a/x-pack/metricbeat/module/aws/s3_request/data.go +++ /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; -// you may not use this file except in compliance with the Elastic License. - -package s3_request - -import ( - s "github.com/elastic/beats/v7/libbeat/common/schema" - c "github.com/elastic/beats/v7/libbeat/common/schema/mapstrstr" -) - -var ( - schemaMetricSetFields = s.Schema{ - "requests": s.Object{ - "total": c.Int("AllRequests"), - "get": c.Int("GetRequests"), - "put": c.Int("PutRequests"), - "delete": c.Int("DeleteRequests"), - "head": c.Int("HeadRequests"), - "post": c.Int("PostRequests"), - "select": c.Int("SelectRequests"), - "select_scanned.bytes": c.Float("SelectScannedBytes"), - "select_returned.bytes": c.Float("SelectReturnedBytes"), - "list": c.Int("ListRequests"), - }, - "downloaded": s.Object{ - "bytes": c.Float("BytesDownloaded"), - }, - "uploaded": s.Object{ - "bytes": c.Float("BytesUploaded"), - }, - "errors": s.Object{ - "4xx": c.Int("4xxErrors"), - "5xx": c.Int("5xxErrors"), - }, - "latency": s.Object{ - "first_byte.ms": c.Float("FirstByteLatency"), - "total_request.ms": c.Float("TotalRequestLatency"), - }, - } -) diff --git a/x-pack/metricbeat/module/aws/s3_request/manifest.yml b/x-pack/metricbeat/module/aws/s3_request/manifest.yml new file mode 100644 index 00000000000..6a401fed08f --- /dev/null +++ b/x-pack/metricbeat/module/aws/s3_request/manifest.yml @@ -0,0 +1,64 @@ +default: true +input: + module: aws + metricset: cloudwatch + defaults: + metrics: + - namespace: AWS/S3 + statistic: ["Average"] + name: + - AllRequests + - GetRequests + - PutRequests + - DeleteRequests + - HeadRequests + - PostRequests + - SelectRequests + - SelectScannedBytes + - SelectReturnedBytes + - ListRequests + - BytesDownloaded + - BytesUploaded + - 4xxErrors + - 5xxErrors + - FirstByteLatency + - TotalRequestLatency + +processors: + - rename: + ignore_missing: true + fields: + - from: "aws.s3.metrics.AllRequests.avg" + to: "aws.s3_request.requests.total" + - from: "aws.s3.metrics.GetRequests.avg" + to: "aws.s3_request.requests.get" + - from: "aws.s3.metrics.PutRequests.avg" + to: "aws.s3_request.requests.put" + - from: "aws.s3.metrics.DeleteRequests.avg" + to: "aws.s3_request.requests.delete" + - from: "aws.s3.metrics.HeadRequests.avg" + to: "aws.s3_request.requests.head" + - from: "aws.s3.metrics.PostRequests.avg" + to: "aws.s3_request.requests.post" + - from: "aws.s3.metrics.SelectRequests.avg" + to: "aws.s3_request.requests.select" + - from: "aws.s3.metrics.SelectScannedBytes.avg" + to: "aws.s3_request.requests.select_scanned.bytes" + - from: "aws.s3.metrics.SelectReturnedBytes.avg" + to: "aws.s3_request.requests.select_returned.bytes" + - from: "aws.s3.metrics.ListRequests.avg" + to: "aws.s3_request.requests.list" + - from: "aws.s3.metrics.BytesDownloaded.avg" + to: "aws.s3_request.downloaded.bytes" + - from: "aws.s3.metrics.BytesUploaded.avg" + to: "aws.s3_request.uploaded.bytes" + - from: "aws.s3.metrics.4xxErrors.avg" + to: "aws.s3_request.errors.4xx" + - from: "aws.s3.metrics.5xxErrors.avg" + to: "aws.s3_request.errors.5xx" + - from: "aws.s3.metrics.FirstByteLatency.avg" + to: "aws.s3_request.latency.first_byte.ms" + - from: "aws.s3.metrics.TotalRequestLatency.avg" + to: "aws.s3_request.latency.total_request.ms" + - from: "aws.dimensions.BucketName" + to: "aws.s3.bucket.name" diff --git a/x-pack/metricbeat/module/aws/s3_request/s3_request.go b/x-pack/metricbeat/module/aws/s3_request/s3_request.go deleted file mode 100644 index 00b82827bbf..00000000000 --- a/x-pack/metricbeat/module/aws/s3_request/s3_request.go +++ /dev/null @@ -1,221 +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; -// you may not use this file except in compliance with the Elastic License. - -package s3_request - -import ( - "fmt" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go-v2/service/cloudwatch" - "github.com/pkg/errors" - - "github.com/elastic/beats/v7/metricbeat/mb" - awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" - "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws" -) - -var metricsetName = "s3_request" - -// init registers the MetricSet with the central registry as soon as the program -// starts. The New function will be called later to instantiate an instance of -// the MetricSet for each host defined in the module's configuration. After the -// MetricSet has been created then Fetch will begin to be called periodically. -func init() { - mb.Registry.MustAddMetricSet(aws.ModuleName, metricsetName, New) -} - -// MetricSet holds any configuration or state information. It must implement -// the mb.MetricSet interface. And this is best achieved by embedding -// mb.BaseMetricSet because it implements all of the required mb.MetricSet -// interface methods except for Fetch. -type MetricSet struct { - *aws.MetricSet -} - -// New creates a new instance of the MetricSet. New is responsible for unpacking -// any MetricSet specific configuration options if there are any. -func New(base mb.BaseMetricSet) (mb.MetricSet, error) { - moduleConfig := aws.Config{} - if err := base.Module().UnpackConfig(&moduleConfig); err != nil { - return nil, err - } - - metricSet, err := aws.NewMetricSet(base) - if err != nil { - return nil, errors.Wrap(err, "error creating aws metricset") - } - - // Check if period is set to be multiple of 60s - remainder := int(metricSet.Period.Seconds()) % 60 - if remainder != 0 { - err := errors.New("period needs to be set to 60s (or a multiple of 60s). " + - "To avoid data missing or extra costs, please make sure period is set correctly " + - "in config.yml") - base.Logger().Info(err) - } - - return &MetricSet{ - MetricSet: metricSet, - }, nil -} - -// Fetch methods implements the data gathering and data conversion to the right -// format. It publishes the event which is then forwarded to the output. In case -// of an error set the Error field of mb.Event or simply call report.Error(). -func (m *MetricSet) Fetch(report mb.ReporterV2) error { - namespace := "AWS/S3" - // Get startTime and endTime - startTime, endTime := aws.GetStartTimeEndTime(m.Period, m.Latency) - m.Logger().Debugf("startTime = %s, endTime = %s", startTime, endTime) - - // GetMetricData for AWS S3 from Cloudwatch - for _, regionName := range m.MetricSet.RegionsList { - awsConfig := m.MetricSet.AwsConfig.Copy() - awsConfig.Region = regionName - - svcCloudwatch := cloudwatch.New(awscommon.EnrichAWSConfigWithEndpoint( - m.Endpoint, "monitoring", regionName, awsConfig)) - - listMetricsOutputs, err := aws.GetListMetricsOutput(namespace, regionName, svcCloudwatch) - if err != nil { - m.Logger().Error(err.Error()) - report.Error(err) - continue - } - - if listMetricsOutputs == nil || len(listMetricsOutputs) == 0 { - continue - } - - metricDataQueries := constructMetricQueries(listMetricsOutputs, m.Period) - // This happens when S3 cloudwatch request metrics are not enabled. - if len(metricDataQueries) == 0 { - continue - } - // Use metricDataQueries to make GetMetricData API calls - metricDataOutputs, err := aws.GetMetricDataResults(metricDataQueries, svcCloudwatch, startTime, endTime) - if err != nil { - err = errors.Wrap(err, "GetMetricDataResults failed, skipping region "+regionName) - m.Logger().Error(err.Error()) - report.Error(err) - continue - } - - // Create Cloudwatch Events for s3_request - bucketNames := getBucketNames(listMetricsOutputs) - for _, bucketName := range bucketNames { - event, err := createS3RequestEvents(metricDataOutputs, regionName, bucketName, m.AccountName, m.AccountID) - if err != nil { - m.Logger().Error(err.Error()) - event.Error = err - report.Event(event) - continue - } - - if reported := report.Event(event); !reported { - m.Logger().Debug("Fetch interrupted, failed to emit event") - return nil - } - } - } - - return nil -} - -func getBucketNames(listMetricsOutputs []cloudwatch.Metric) (bucketNames []string) { - for _, output := range listMetricsOutputs { - for _, dim := range output.Dimensions { - if *dim.Name == "BucketName" { - if exists, _ := aws.StringInSlice(*dim.Value, bucketNames); exists { - continue - } - bucketNames = append(bucketNames, *dim.Value) - } - } - } - return -} - -func createMetricDataQuery(metric cloudwatch.Metric, period time.Duration, index int) (metricDataQuery cloudwatch.MetricDataQuery) { - statistic := "Sum" - periodInSec := int64(period.Seconds()) - id := "s3r" + strconv.Itoa(index) - metricDims := metric.Dimensions - bucketName := "" - filterID := "" - for _, dim := range metricDims { - if *dim.Name == "BucketName" { - bucketName = *dim.Value - } else if *dim.Name == "FilterId" { - filterID = *dim.Value - } - } - metricName := *metric.MetricName - label := bucketName + " " + filterID + " " + metricName - metricDataQuery = cloudwatch.MetricDataQuery{ - Id: &id, - MetricStat: &cloudwatch.MetricStat{ - Period: &periodInSec, - Stat: &statistic, - Metric: &metric, - }, - Label: &label, - } - return -} - -func constructMetricQueries(listMetricsOutputs []cloudwatch.Metric, period time.Duration) []cloudwatch.MetricDataQuery { - var metricDataQueries []cloudwatch.MetricDataQuery - metricDataQueryEmpty := cloudwatch.MetricDataQuery{} - dailyMetricNames := []string{"NumberOfObjects", "BucketSizeBytes"} - for i, listMetric := range listMetricsOutputs { - if exists, _ := aws.StringInSlice(*listMetric.MetricName, dailyMetricNames); exists { - continue - } - - metricDataQuery := createMetricDataQuery(listMetric, period, i) - if metricDataQuery == metricDataQueryEmpty { - continue - } - metricDataQueries = append(metricDataQueries, metricDataQuery) - } - return metricDataQueries -} - -// CreateS3Events creates s3_request and s3_daily_storage events from Cloudwatch metric data. -func createS3RequestEvents(outputs []cloudwatch.MetricDataResult, regionName string, bucketName string, accountName string, accountID string) (event mb.Event, err error) { - // AWS s3_request metrics - mapOfMetricSetFieldResults := make(map[string]interface{}) - - // Find a timestamp for all metrics in output - timestamp := aws.FindTimestamp(outputs) - if !timestamp.IsZero() { - for _, output := range outputs { - if len(output.Values) == 0 { - continue - } - exists, timestampIdx := aws.CheckTimestampInArray(timestamp, output.Timestamps) - if exists { - labels := strings.Split(*output.Label, " ") - if labels[0] == bucketName && len(output.Values) > timestampIdx { - mapOfMetricSetFieldResults[labels[2]] = fmt.Sprint(output.Values[timestampIdx]) - } - } - } - } - - resultMetricSetFields, err := aws.EventMapping(mapOfMetricSetFieldResults, schemaMetricSetFields) - if err != nil { - err = errors.Wrap(err, "Error trying to apply schema schemaMetricSetFields in AWS s3_request metricbeat module.") - return - } - - event = aws.InitEvent(regionName, accountName, accountID, timestamp) - event.MetricSetFields = resultMetricSetFields - event.RootFields.Put("aws.s3.bucket.name", bucketName) - return -} diff --git a/x-pack/metricbeat/module/aws/s3_request/s3_request_integration_test.go b/x-pack/metricbeat/module/aws/s3_request/s3_request_integration_test.go index eeae8439f1f..8103acd13a4 100644 --- a/x-pack/metricbeat/module/aws/s3_request/s3_request_integration_test.go +++ b/x-pack/metricbeat/module/aws/s3_request/s3_request_integration_test.go @@ -17,7 +17,7 @@ import ( ) func TestFetch(t *testing.T) { - config := mtest.GetConfigForTest(t, "s3_request", "86400s") + config := mtest.GetConfigForTest(t, "s3_request", "60s") metricSet := mbtest.NewReportingMetricSetV2Error(t, config) events, errs := mbtest.ReportingFetchV2Error(metricSet) @@ -28,36 +28,31 @@ func TestFetch(t *testing.T) { assert.NotEmpty(t, events) for _, event := range events { - // RootField - mtest.CheckEventField("service.name", "string", event, t) mtest.CheckEventField("cloud.region", "string", event, t) - - // MetricSetField - mtest.CheckEventField("bucket.name", "string", event, t) - mtest.CheckEventField("requests.total", "int", event, t) - mtest.CheckEventField("requests.get", "int", event, t) - mtest.CheckEventField("requests.put", "int", event, t) - mtest.CheckEventField("requests.delete", "int", event, t) - mtest.CheckEventField("requests.head", "int", event, t) - mtest.CheckEventField("requests.post", "int", event, t) - mtest.CheckEventField("select.requests", "int", event, t) - mtest.CheckEventField("select_scanned.bytes", "float", event, t) - mtest.CheckEventField("select_returned.bytes", "float", event, t) - mtest.CheckEventField("requests.list", "int", event, t) - mtest.CheckEventField("downloaded.bytes", "float", event, t) - mtest.CheckEventField("uploaded.bytes", "float", event, t) - mtest.CheckEventField("errors.4xx", "int", event, t) - mtest.CheckEventField("errors.5xx", "int", event, t) - mtest.CheckEventField("latency.first_byte.ms", "float", event, t) - mtest.CheckEventField("latency.total_request.ms", "float", event, t) + mtest.CheckEventField("aws.dimensions.BucketName", "string", event, t) + mtest.CheckEventField("aws.dimensions.StorageType", "string", event, t) + mtest.CheckEventField("s3.metrics.AllRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.GetRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.PutRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.DeleteRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.HeadRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.PostRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.SelectRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.SelectScannedBytes.avg", "float", event, t) + mtest.CheckEventField("s3.metrics.SelectReturnedBytes.avg", "float", event, t) + mtest.CheckEventField("s3.metrics.ListRequests.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.BytesDownloaded.avg", "float", event, t) + mtest.CheckEventField("s3.metrics.BytesUploaded.avg", "float", event, t) + mtest.CheckEventField("s3.metrics.4xxErrors.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.5xxErrors.avg", "int", event, t) + mtest.CheckEventField("s3.metrics.FirstByteLatency.avg", "float", event, t) + mtest.CheckEventField("s3.metrics.TotalRequestLatency.avg", "float", event, t) } } func TestData(t *testing.T) { - config := mtest.GetConfigForTest(t, "s3_request", "86400s") + config := mtest.GetConfigForTest(t, "s3_request", "60s") - metricSet := mbtest.NewReportingMetricSetV2Error(t, config) - if err := mbtest.WriteEventsReporterV2Error(metricSet, t, "/"); err != nil { - t.Fatal("write", err) - } + metricSet := mbtest.NewFetcher(t, config) + metricSet.WriteEvents(t, "/") } diff --git a/x-pack/metricbeat/module/aws/s3_request/s3_request_test.go b/x-pack/metricbeat/module/aws/s3_request/s3_request_test.go new file mode 100644 index 00000000000..41098399024 --- /dev/null +++ b/x-pack/metricbeat/module/aws/s3_request/s3_request_test.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package s3_request + +import ( + "os" + + "github.com/elastic/beats/v7/metricbeat/mb" + + // Register input module and metricset + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws" + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/aws/cloudwatch" +) + +func init() { + // To be moved to some kind of helper + os.Setenv("BEAT_STRICT_PERMS", "false") + mb.Registry.SetSecondarySource(mb.NewLightModulesSource("../../../module")) +} From ace440f4736e6d969595ad1010b197d051e8fe77 Mon Sep 17 00:00:00 2001 From: DeDe Morton Date: Wed, 14 Oct 2020 16:33:58 -0700 Subject: [PATCH 152/156] Update endpoint-related terminology in Elastic Agent docs (#21458) --- x-pack/elastic-agent/docs/install-elastic-agent.asciidoc | 2 +- x-pack/elastic-agent/docs/tab-widgets/run.asciidoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/elastic-agent/docs/install-elastic-agent.asciidoc b/x-pack/elastic-agent/docs/install-elastic-agent.asciidoc index d8dfd49d5c4..69a04b01f9e 100644 --- a/x-pack/elastic-agent/docs/install-elastic-agent.asciidoc +++ b/x-pack/elastic-agent/docs/install-elastic-agent.asciidoc @@ -94,7 +94,7 @@ rm /Library/Launchdaemons/co.elastic.agent.plist . <>. + Unenrolling the agent should stop {agent} and any other programs started by -the agent, such as Elastic {endpoint-sec} and data shippers. +the agent, such as {elastic-sec} and data shippers. . If necessary, manually kill the `elastic-agent` process and any other processes started by the agent. diff --git a/x-pack/elastic-agent/docs/tab-widgets/run.asciidoc b/x-pack/elastic-agent/docs/tab-widgets/run.asciidoc index 569ea013236..727b2371cf4 100644 --- a/x-pack/elastic-agent/docs/tab-widgets/run.asciidoc +++ b/x-pack/elastic-agent/docs/tab-widgets/run.asciidoc @@ -92,7 +92,7 @@ cd 'C:\Program Files\Elastic-Agent' .\install-service-elastic-agent.ps1 <1> <2> ---- <1> You must run {agent} under the SYSTEM account if you plan -to use the {elastic-endpoint} integration. +to use the {elastic-endpoint-integration} integration. <2> If script execution is disabled on your system, set the execution policy for the current session to allow the script to run. For example: `PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-elastic-agent.ps1`. From 471df0bf0f0d241743953dc8efe1ea74ece04a09 Mon Sep 17 00:00:00 2001 From: Marc Guasch Date: Thu, 15 Oct 2020 09:53:23 +0200 Subject: [PATCH 153/156] [Filebeat][httpjson] Fix date_cursor validation (#21756) * Fix date_cursor validation * Only check for parse errors --- x-pack/filebeat/input/httpjson/config.go | 9 +++++++-- x-pack/filebeat/input/httpjson/config_test.go | 2 -- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/x-pack/filebeat/input/httpjson/config.go b/x-pack/filebeat/input/httpjson/config.go index ee1445b8a3d..6384811aaa4 100644 --- a/x-pack/filebeat/input/httpjson/config.go +++ b/x-pack/filebeat/input/httpjson/config.go @@ -125,10 +125,15 @@ func (dc *dateCursorConfig) Validate() error { if dc.DateFormat == "" { return nil } - now := time.Now().Format(dc.DateFormat) - if _, err := time.Parse(dc.DateFormat, now); err != nil { + + const knownTimestamp = 1602601228 // 2020-10-13T15:00:28+00:00 RFC3339 + knownDate := time.Unix(knownTimestamp, 0).UTC() + + dateStr := knownDate.Format(dc.DateFormat) + if _, err := time.Parse(dc.DateFormat, dateStr); err != nil { return errors.New("invalid configuration: date_format is not a valid date layout") } + return nil } diff --git a/x-pack/filebeat/input/httpjson/config_test.go b/x-pack/filebeat/input/httpjson/config_test.go index 1986ee7abe9..85c7c64848d 100644 --- a/x-pack/filebeat/input/httpjson/config_test.go +++ b/x-pack/filebeat/input/httpjson/config_test.go @@ -362,7 +362,6 @@ func TestConfigOauth2Validation(t *testing.T) { "url": "localhost", }, }, - /* Flaky test: https://github.com/elastic/beats/issues/21748 { name: "date_cursor.date_format will fail if invalid", expectedErr: "invalid configuration: date_format is not a valid date layout accessing 'date_cursor'", @@ -371,7 +370,6 @@ func TestConfigOauth2Validation(t *testing.T) { "url": "localhost", }, }, - */ { name: "date_cursor must work with a valid date_format", input: map[string]interface{}{ From fc10f069a30f5b54fd0b9aaaed6c56f93ee56e0e Mon Sep 17 00:00:00 2001 From: Chris Mark Date: Thu, 15 Oct 2020 10:54:12 +0300 Subject: [PATCH 154/156] Add proxy metricset (#21751) --- CHANGELOG.next.asciidoc | 1 + .../docs/images/metricbeat-istio-overview.png | Bin 187983 -> 198266 bytes .../docs/images/metricbeat-istio-traffic.png | Bin 0 -> 267742 bytes metricbeat/docs/modules/istio.asciidoc | 36 +- metricbeat/docs/modules/istio/istiod.asciidoc | 18 + metricbeat/docs/modules/istio/proxy.asciidoc | 18 + metricbeat/docs/modules_list.asciidoc | 4 +- x-pack/metricbeat/metricbeat.reference.yml | 7 + .../module/istio/_meta/config.reference.yml | 7 + .../metricbeat/module/istio/_meta/config.yml | 7 + .../module/istio/_meta/docs.asciidoc | 21 +- .../dashboard/Metricbeat-istio-overview.json | 3486 +++++++++-------- .../7/dashboard/Metricbeat-istio-traffic.json | 1274 ++++++ x-pack/metricbeat/module/istio/fields.go | 2 +- .../_meta/{docs.ascoodoc => docs.asciidoc} | 0 .../module/istio/istiod/_meta/fields.yml | 5 +- x-pack/metricbeat/module/istio/module.yml | 1 + .../module/istio/proxy/_meta/docs.asciidoc | 33 + .../module/istio/proxy/_meta/fields.yml | 4 + .../istio/proxy/_meta/testdata/config.yml | 5 + .../proxy/_meta/testdata/proxy.v1.7.1.plain | 1146 ++++++ .../testdata/proxy.v1.7.1.plain-expected.json | 1365 +++++++ .../module/istio/proxy/manifest.yml | 11 + .../module/istio/proxy/proxy_test.go | 32 + .../metricbeat/modules.d/istio.yml.disabled | 7 + 25 files changed, 5767 insertions(+), 1723 deletions(-) create mode 100644 metricbeat/docs/images/metricbeat-istio-traffic.png create mode 100644 metricbeat/docs/modules/istio/istiod.asciidoc create mode 100644 metricbeat/docs/modules/istio/proxy.asciidoc create mode 100644 x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-traffic.json rename x-pack/metricbeat/module/istio/istiod/_meta/{docs.ascoodoc => docs.asciidoc} (100%) create mode 100644 x-pack/metricbeat/module/istio/proxy/_meta/docs.asciidoc create mode 100644 x-pack/metricbeat/module/istio/proxy/_meta/fields.yml create mode 100644 x-pack/metricbeat/module/istio/proxy/_meta/testdata/config.yml create mode 100644 x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain create mode 100644 x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain-expected.json create mode 100644 x-pack/metricbeat/module/istio/proxy/manifest.yml create mode 100644 x-pack/metricbeat/module/istio/proxy/proxy_test.go diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 28e66a63034..37a3366318f 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -464,6 +464,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add istiod metricset. {pull}21519[21519] - Release `add_cloudfoundry_metadata` as GA. {pull}21525[21525] - Add support for OpenStack SSL metadata APIs in `add_cloud_metadata`. {pull}21590[21590] +- Add proxy metricset for istio module. {pull}21751[21751] *Auditbeat* diff --git a/metricbeat/docs/images/metricbeat-istio-overview.png b/metricbeat/docs/images/metricbeat-istio-overview.png index 139fe9260d49bd0d0034ad292987f67be37468ce..87151a70e73bf31750e55719311edee41c81afc0 100644 GIT binary patch literal 198266 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�$y|mL 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�)!0&tU;~T5q=NGJC@b*1d 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 diff --git a/metricbeat/docs/images/metricbeat-istio-traffic.png b/metricbeat/docs/images/metricbeat-istio-traffic.png new file mode 100644 index 0000000000000000000000000000000000000000..ff706b4c66bcd887759bb4e7d84c02e03b515136 GIT binary patch literal 267742 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%0AIu)EvjEUP?a@}8={C|cdilQk zEoW8hi=MOykI1!I|v#!UMrF^U#aF=!Uk(qs#;H&{&DQ=@^RSW-hBn6_# zlmQUFLcHVxw%@wF!h~g@LTg{Thop46XB1ggc)Kq+Iu7kqqOR%9j$L2$wV9-XVVP7y zWaC9J9K><$n{Y+SymxesPfgTxB62gPLe`8MbQkXlFU>O|UX?=5mm`3svJ8yz;XXI( zgl!dX^7{=B*WTpj;9Pvu&AJ*J+Y9EBRO$_GSk>Bm7{o#jbOmJ&sF3mX`cbgczYQHr zo<=Eh)I{4MXYvq!>}eXekRcDSrjy2!=@WTSv?o3VTWC1x2xz4@6Oyg%FoTw)CsZKO z>Q7enm@F^~?U(Wdv)a>n=<^TMD$RE}u~U?__R0c^0~%m$>WYef6lnKh#|`)rIZQj6 z7-iquP6))C6}pv{^Tl7|k)dAo*3p@LzYc!KTTz-a-Qg;pTzx;OVAGjp)Q&UOMOaV6 zL1Y%*%wWka$m-dQy~~dRP(@wcFr>wkIl$g@Ly=Pb1_(*Ky+3`y7fHFrad}#+4Eb%t z>t_H#0A936`Cy)O#Z~S0N;zSF)hI2aQB{Go)~Q40v06|hb-vw!)UxZGRpjFRl@d0; z6})T3?6D_k3`vAm=<%z}#zTdf?KdEh?}8|1|1D-PM$mySlTw3K{cT9?w}5Ag#6femuX8H-;mX#+M{a$O`zU z+{S>X!0QtGx6ZHck`yTcIIZ_qgQOYZU{&p#9ZsI)pG_+ZuYhIVpp)5D!OEfSFWx0=q5r=jH!iW%x%Kf|(3B-CwX2=YMti@7VW6 zE=idpqJLcGfBuU8>i%>DHot#NC;L}z|KEu#|6jMRLlI2=e%$hZ0K!FOfP(SH6f?zt z<81vdNRg8R*$hSrM8)`j_q>TfKgv+4p2Yv^Y;kemabN3K77zcm92_t*{FmtjHhs+Z zZLjlt_b_8dlopL%hkuA4Lyfp$f9xtG3V{}$&^DOBep2^`tm61z9UFkOBzvPTRMmRh zvc)}+n11abrgK1FmU#U23;l^r>q+hm+U_^yyucuanu7B3a_4HG#fa;C#^&kI7Pp(L z?yMv?8ih=$5CC^mVPR#(@bNR2Y55q9_3ymE&ylci_RJ$^d&C}^1cCZo8M$e5!eHhf zd_uu|L|)*M)&Q{9dpsym7NypAz1c zPiTcH$nYsi|gZ+u1XM zH?q?Fm->KTvp8W;VMzp?O&uMyqV-ZlX{6Es#IlQU|^ir_&)4)_e`}-`O>o<<}lQ;-=&lSa{#2S z2Q@#%MrbhSC;`Sk)FaUfi|^0XpALI%KRdP99L}&FQ&cwgo&(Z1D%k_Gsgk$%fXO|2 zwc5+rI0}`$!#A%IvbM2V1)g(4;w=?MKm-{b7NpEL4a?>3-2E=AbRNK*R{=06Z2s={ zTrEUZPL6cm4O(!E3wI9~qu{cL-p5(n%tiwQ#UiUp}zx;82qvrP(EZGCGNgi$7y{N&n?(P

F=kDt-jm4(EUc@xFY~8?V2t(d5R>w;~6@- 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 HuE+lYfNQ8X literal 0 HcmV?d00001 diff --git a/metricbeat/docs/modules/istio.asciidoc b/metricbeat/docs/modules/istio.asciidoc index bfda2a9588d..c80e2d84c09 100644 --- a/metricbeat/docs/modules/istio.asciidoc +++ b/metricbeat/docs/modules/istio.asciidoc @@ -11,9 +11,12 @@ beta[] This is the Istio module. This module is compatible with versions before `1.5` of Istio where microservices architecture is used. If using versions priot to `1.5` then `mesh`, `mixer`, `pilot`, `galley`, `citadel` metricsets should be used. -wehre the Istio module collects metrics from the +where the Istio module collects metrics from the Istio https://istio.io/v1.4/docs/tasks/observability/metrics/querying-metrics/#about-the-prometheus-add-on[prometheus exporters endpoints]. -For versions after `1.5`, `istiod` metricset can be used which collects metrics directly from Istio Daemon. + +For versions after `1.5`, `istiod` and `proxy` metricsets can be used. + +`istiod` collects metrics directly from Istio Daemon while `proxy` collects from each of the proxy sidecars. The default metricsets are `mesh`, `mixer`, `pilot`, `galley`, `citadel`. @@ -21,16 +24,24 @@ The default metricsets are `mesh`, `mixer`, `pilot`, `galley`, `citadel`. === Compatibility The Istio module is tested with Istio `1.4` for `mesh`, `mixer`, `pilot`, `galley`, `citadel`. -The Istio module is tested with Istio `1.7` for `istiod`. +The Istio module is tested with Istio `1.7` for `istiod` and `proxy`. [float] === Dashboard -The Istio module includes a predefined dashboard with overview information about Istio Daemon. -This dashboard is only compatible with versions of Istio after `1.5` which should be monitored with `istiod` metricset. +The Istio module includes predefined dashboards: + +1. overview information about Istio Daemon. + +2. Traffic information collected from istio-proxies. + +These dashboards are only compatible with versions of Istio after `1.5` which should be monitored with `istiod` +and `proxy` metricsets. image::./images/metricbeat-istio-overview.png[] +image::./images/metricbeat-istio-traffic.png[] + [float] === Example configuration @@ -82,6 +93,13 @@ metricbeat.modules: period: 10s # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ['localhost:15014'] + +# Istio proxy to monitor Envoy sidecars for versions after 1.5 of Istio. +- module: istio + metricsets: ['proxy'] + period: 10s + # it's recommended to deploy this metricset with autodiscovery, see metricset's docs for more info + hosts: ['localhost:15090'] ---- [float] @@ -93,19 +111,27 @@ The following metricsets are available: * <> +* <> + * <> * <> * <> +* <> + include::istio/citadel.asciidoc[] include::istio/galley.asciidoc[] +include::istio/istiod.asciidoc[] + include::istio/mesh.asciidoc[] include::istio/mixer.asciidoc[] include::istio/pilot.asciidoc[] +include::istio/proxy.asciidoc[] + diff --git a/metricbeat/docs/modules/istio/istiod.asciidoc b/metricbeat/docs/modules/istio/istiod.asciidoc new file mode 100644 index 00000000000..c13ab7e5244 --- /dev/null +++ b/metricbeat/docs/modules/istio/istiod.asciidoc @@ -0,0 +1,18 @@ +//// +This file is generated! See scripts/mage/docs_collector.go +//// + +[[metricbeat-metricset-istio-istiod]] +[role="xpack"] +=== Istio istiod metricset + +beta[] + +include::../../../../x-pack/metricbeat/module/istio/istiod/_meta/docs.asciidoc[] + + +==== Fields + +For a description of each field in the metricset, see the +<> section. + diff --git a/metricbeat/docs/modules/istio/proxy.asciidoc b/metricbeat/docs/modules/istio/proxy.asciidoc new file mode 100644 index 00000000000..71f5fd2b891 --- /dev/null +++ b/metricbeat/docs/modules/istio/proxy.asciidoc @@ -0,0 +1,18 @@ +//// +This file is generated! See scripts/mage/docs_collector.go +//// + +[[metricbeat-metricset-istio-proxy]] +[role="xpack"] +=== Istio proxy metricset + +beta[] + +include::../../../../x-pack/metricbeat/module/istio/proxy/_meta/docs.asciidoc[] + + +==== Fields + +For a description of each field in the metricset, see the +<> section. + diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index 1bc81071e76..530958eb8f3 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -133,11 +133,13 @@ This file is generated! See scripts/mage/docs_collector.go |<> beta[] |<> beta[] |<> beta[] |image:./images/icon-yes.png[Prebuilt dashboards are available] | -.5+| .5+| |<> beta[] +.7+| .7+| |<> beta[] |<> beta[] +|<> beta[] |<> beta[] |<> beta[] |<> beta[] +|<> beta[] |<> |image:./images/icon-no.png[No prebuilt dashboards] | .1+| .1+| |<> |<> |image:./images/icon-yes.png[Prebuilt dashboards are available] | diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index 41552410a38..ef7f167940e 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -701,6 +701,13 @@ metricbeat.modules: # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ['localhost:15014'] +# Istio proxy to monitor Envoy sidecars for versions after 1.5 of Istio. +- module: istio + metricsets: ['proxy'] + period: 10s + # it's recommended to deploy this metricset with autodiscovery, see metricset's docs for more info + hosts: ['localhost:15090'] + #------------------------------- Jolokia Module ------------------------------- - module: jolokia #metricsets: ["jmx"] diff --git a/x-pack/metricbeat/module/istio/_meta/config.reference.yml b/x-pack/metricbeat/module/istio/_meta/config.reference.yml index 146728fdfcd..7efe2adea30 100644 --- a/x-pack/metricbeat/module/istio/_meta/config.reference.yml +++ b/x-pack/metricbeat/module/istio/_meta/config.reference.yml @@ -39,3 +39,10 @@ period: 10s # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ['localhost:15014'] + +# Istio proxy to monitor Envoy sidecars for versions after 1.5 of Istio. +- module: istio + metricsets: ['proxy'] + period: 10s + # it's recommended to deploy this metricset with autodiscovery, see metricset's docs for more info + hosts: ['localhost:15090'] diff --git a/x-pack/metricbeat/module/istio/_meta/config.yml b/x-pack/metricbeat/module/istio/_meta/config.yml index 146728fdfcd..7efe2adea30 100644 --- a/x-pack/metricbeat/module/istio/_meta/config.yml +++ b/x-pack/metricbeat/module/istio/_meta/config.yml @@ -39,3 +39,10 @@ period: 10s # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ['localhost:15014'] + +# Istio proxy to monitor Envoy sidecars for versions after 1.5 of Istio. +- module: istio + metricsets: ['proxy'] + period: 10s + # it's recommended to deploy this metricset with autodiscovery, see metricset's docs for more info + hosts: ['localhost:15090'] diff --git a/x-pack/metricbeat/module/istio/_meta/docs.asciidoc b/x-pack/metricbeat/module/istio/_meta/docs.asciidoc index cfba8ec7ce8..f3b1825a9b1 100644 --- a/x-pack/metricbeat/module/istio/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/istio/_meta/docs.asciidoc @@ -1,9 +1,12 @@ This is the Istio module. This module is compatible with versions before `1.5` of Istio where microservices architecture is used. If using versions priot to `1.5` then `mesh`, `mixer`, `pilot`, `galley`, `citadel` metricsets should be used. -wehre the Istio module collects metrics from the +where the Istio module collects metrics from the Istio https://istio.io/v1.4/docs/tasks/observability/metrics/querying-metrics/#about-the-prometheus-add-on[prometheus exporters endpoints]. -For versions after `1.5`, `istiod` metricset can be used which collects metrics directly from Istio Daemon. + +For versions after `1.5`, `istiod` and `proxy` metricsets can be used. + +`istiod` collects metrics directly from Istio Daemon while `proxy` collects from each of the proxy sidecars. The default metricsets are `mesh`, `mixer`, `pilot`, `galley`, `citadel`. @@ -11,12 +14,20 @@ The default metricsets are `mesh`, `mixer`, `pilot`, `galley`, `citadel`. === Compatibility The Istio module is tested with Istio `1.4` for `mesh`, `mixer`, `pilot`, `galley`, `citadel`. -The Istio module is tested with Istio `1.7` for `istiod`. +The Istio module is tested with Istio `1.7` for `istiod` and `proxy`. [float] === Dashboard -The Istio module includes a predefined dashboard with overview information about Istio Daemon. -This dashboard is only compatible with versions of Istio after `1.5` which should be monitored with `istiod` metricset. +The Istio module includes predefined dashboards: + +1. overview information about Istio Daemon. + +2. Traffic information collected from istio-proxies. + +These dashboards are only compatible with versions of Istio after `1.5` which should be monitored with `istiod` +and `proxy` metricsets. image::./images/metricbeat-istio-overview.png[] + +image::./images/metricbeat-istio-traffic.png[] diff --git a/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json b/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json index 72b995c2382..ce73d05972b 100644 --- a/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json +++ b/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-overview.json @@ -1,1762 +1,1828 @@ { - "objects": [ - { - "attributes": { - "description": "Overview of the Istiod Service status", - "hits": 0, - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } - }, - "optionsJSON": { - "hidePanelTitles": false, - "useMargins": true - }, - "panelsJSON": [ - { - "embeddableConfig": { - "title": "Pilot Proxy Queue Time" - }, - "gridData": { - "h": 9, - "i": "cd1bbc4f-95de-4156-a3ef-c091cf6402c0", - "w": 12, - "x": 0, - "y": 0 - }, - "panelIndex": "cd1bbc4f-95de-4156-a3ef-c091cf6402c0", - "panelRefName": "panel_0", - "title": "Pilot Proxy Queue Time", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot xds Push Time" - }, - "gridData": { - "h": 9, - "i": "06af11e6-e026-48db-a06b-b34b402b535b", - "w": 12, - "x": 12, - "y": 0 - }, - "panelIndex": "06af11e6-e026-48db-a06b-b34b402b535b", - "panelRefName": "panel_1", - "title": "Pilot xds Push Time", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot xds Pushes" - }, - "gridData": { - "h": 9, - "i": "d9a49bf0-f88b-4d4f-a1e2-74fbd482f77c", - "w": 11, - "x": 24, - "y": 0 - }, - "panelIndex": "d9a49bf0-f88b-4d4f-a1e2-74fbd482f77c", - "panelRefName": "panel_2", - "title": "Pilot xds Pushes", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot Inbound Updates" - }, - "gridData": { - "h": 9, - "i": "a8e47ef0-03db-419f-890f-0880d674682c", - "w": 13, - "x": 35, - "y": 0 - }, - "panelIndex": "a8e47ef0-03db-419f-890f-0880d674682c", - "panelRefName": "panel_3", - "title": "Pilot Inbound Updates", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Citadel Cert Issuane" - }, - "gridData": { - "h": 9, - "i": "e708abfa-5a95-483c-9bb2-4470ee913f3c", - "w": 12, - "x": 0, - "y": 9 - }, - "panelIndex": "e708abfa-5a95-483c-9bb2-4470ee913f3c", - "panelRefName": "panel_4", - "title": "Citadel Cert Issuane", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Galley Validation Failed" - }, - "gridData": { - "h": 9, - "i": "724f0f9e-2186-4ddd-859c-edb2649b8c0f", - "w": 12, - "x": 12, - "y": 9 - }, - "panelIndex": "724f0f9e-2186-4ddd-859c-edb2649b8c0f", - "panelRefName": "panel_5", - "title": "Galley Validation Failed", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pods witout IP", - "vis": null - }, - "gridData": { - "h": 9, - "i": "32eaa989-a4f9-4d31-97cb-684f31488aa8", - "w": 8, - "x": 24, - "y": 9 - }, - "panelIndex": "32eaa989-a4f9-4d31-97cb-684f31488aa8", - "panelRefName": "panel_6", - "title": "Pods witout IP", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot Virtual Services", - "vis": null - }, - "gridData": { - "h": 9, - "i": "6a8463fe-b7cb-4cd8-bf01-f7ca6a185178", - "w": 8, - "x": 32, - "y": 9 - }, - "panelIndex": "6a8463fe-b7cb-4cd8-bf01-f7ca6a185178", - "panelRefName": "panel_7", - "title": "Pilot Virtual Services", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot Services", - "vis": null - }, - "gridData": { - "h": 9, - "i": "51ecc2f8-3c3f-4a80-b4b6-b52db10e68ad", - "w": 8, - "x": 40, - "y": 9 - }, - "panelIndex": "51ecc2f8-3c3f-4a80-b4b6-b52db10e68ad", - "panelRefName": "panel_8", - "title": "Pilot Services", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot Conflict Inbound Listener", - "vis": null - }, - "gridData": { - "h": 9, - "i": "0a63d980-8d93-4ce1-b5a1-ab77e589ceec", - "w": 9, - "x": 0, - "y": 18 - }, - "panelIndex": "0a63d980-8d93-4ce1-b5a1-ab77e589ceec", - "panelRefName": "panel_9", - "title": "Pilot Conflict Inbound Listener", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot eds instances", - "vis": null - }, - "gridData": { - "h": 9, - "i": "9fbfca4c-37b5-4a1a-924e-49fc9ef2294c", - "w": 10, - "x": 9, - "y": 18 - }, - "panelIndex": "9fbfca4c-37b5-4a1a-924e-49fc9ef2294c", - "panelRefName": "panel_10", - "title": "Pilot eds instances", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot xds endpoints" - }, - "gridData": { - "h": 9, - "i": "d6b2845f-9582-4863-853e-ab753f3d763e", - "w": 14, - "x": 19, - "y": 18 - }, - "panelIndex": "d6b2845f-9582-4863-853e-ab753f3d763e", - "panelRefName": "panel_11", - "title": "Pilot xds endpoints", - "version": "7.8.0" - }, - { - "embeddableConfig": { - "title": "Pilot xds expired" - }, - "gridData": { - "h": 9, - "i": "3d0dec37-26c3-490b-a45f-48b6d1baa160", - "w": 15, - "x": 33, - "y": 18 - }, - "panelIndex": "3d0dec37-26c3-490b-a45f-48b6d1baa160", - "panelRefName": "panel_12", - "title": "Pilot xds expired", - "version": "7.8.0" - } - ], - "timeRestore": false, - "title": "[Metricbeat Istio] Overview", - "version": 1 + "objects": [ + { + "attributes": { + "description": "Overview of the Istiod Service status", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "optionsJSON": { + "hidePanelTitles": false, + "useMargins": true + }, + "panelsJSON": [ + { + "embeddableConfig": { + "title": "" }, - "id": "d899d3f0-0883-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "dashboard": "7.3.0" + "gridData": { + "h": 3, + "i": "3ab7d813-a0b5-48b8-9c10-5ac962a4177c", + "w": 12, + "x": 0, + "y": 0 }, - "references": [ - { - "id": "dd1392f0-07d8-11eb-a3fd-1b45ec532bb3", - "name": "panel_0", - "type": "visualization" - }, - { - "id": "b5b3abb0-087c-11eb-a3fd-1b45ec532bb3", - "name": "panel_1", - "type": "visualization" - }, - { - "id": "f858c200-087e-11eb-a3fd-1b45ec532bb3", - "name": "panel_2", - "type": "visualization" - }, - { - "id": "aa997510-087d-11eb-a3fd-1b45ec532bb3", - "name": "panel_3", - "type": "visualization" - }, - { - "id": "506c8490-087f-11eb-a3fd-1b45ec532bb3", - "name": "panel_4", - "type": "visualization" - }, - { - "id": "98b01f00-087f-11eb-a3fd-1b45ec532bb3", - "name": "panel_5", - "type": "visualization" - }, - { - "id": "4275f710-0882-11eb-a3fd-1b45ec532bb3", - "name": "panel_6", - "type": "visualization" - }, - { - "id": "96bfe060-0882-11eb-a3fd-1b45ec532bb3", - "name": "panel_7", - "type": "visualization" - }, - { - "id": "6cfbe3f0-0882-11eb-a3fd-1b45ec532bb3", - "name": "panel_8", - "type": "visualization" - }, - { - "id": "d62a1e60-0881-11eb-a3fd-1b45ec532bb3", - "name": "panel_9", - "type": "visualization" - }, - { - "id": "12cdcce0-0882-11eb-a3fd-1b45ec532bb3", - "name": "panel_10", - "type": "visualization" - }, - { - "id": "e5f3e870-0882-11eb-a3fd-1b45ec532bb3", - "name": "panel_11", - "type": "visualization" - }, - { - "id": "0ed17c80-0883-11eb-a3fd-1b45ec532bb3", - "name": "panel_12", - "type": "visualization" - } - ], - "type": "dashboard", - "updated_at": "2020-10-07T10:23:52.518Z", - "version": "WzQ0OTIsMV0=" - }, - { - "attributes": { - "description": "Time in seconds, a proxy is in the push queue before being dequeued.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } - }, - "title": "Pilot Proxy Queue Time [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "formatter": "number", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "queue_time", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.pilot_proxy_queue_time.histogram.values", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "03ef6580-0887-11eb-876a-9d8e5e94d2f5", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "071fe4f0-0887-11eb-876a-9d8e5e94d2f5", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "0b7164c0-0887-11eb-876a-9d8e5e94d2f5", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "90" - }, - { - "id": "0f611580-0887-11eb-876a-9d8e5e94d2f5", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "136f98e0-0887-11eb-876a-9d8e5e94d2f5", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "percentile" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "everything", - "stacked": "none", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Pilot Proxy Queue Time [Metricbeat Istio]", - "type": "metrics" - } + "panelIndex": "3ab7d813-a0b5-48b8-9c10-5ac962a4177c", + "panelRefName": "panel_0", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds Push Time" }, - "id": "dd1392f0-07d8-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "gridData": { + "h": 9, + "i": "06af11e6-e026-48db-a06b-b34b402b535b", + "w": 12, + "x": 12, + "y": 0 }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T10:23:11.367Z", - "version": "WzQ0ODMsMV0=" - }, - { - "attributes": { - "description": "Total time in seconds Pilot takes to push lds, rds, cds and eds.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } - }, - "title": "Pilot xds Push Time [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "filter": { - "language": "kuery", - "query": "prometheus.labels.type: \"rds\" OR prometheus.labels.type: \"lds\" OR prometheus.labels.type: \"cds\" OR prometheus.labels.type: \"eds\"" - }, - "formatter": "s,s,", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "pilot_xds_push_time", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.pilot_xds_push_time.histogram.values", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "95c750d0-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "a3581040-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "percentile" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "prometheus.labels.type", - "terms_size": "20", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Pilot xds Push Time [Metricbeat Istio]", - "type": "metrics" - } + "panelIndex": "06af11e6-e026-48db-a06b-b34b402b535b", + "panelRefName": "panel_1", + "title": "Pilot xds Push Time", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds Pushes" }, - "id": "b5b3abb0-087c-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "gridData": { + "h": 9, + "i": "d9a49bf0-f88b-4d4f-a1e2-74fbd482f77c", + "w": 11, + "x": 24, + "y": 0 }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T10:23:48.176Z", - "version": "WzQ0ODgsMV0=" - }, - { - "attributes": { - "description": "Pilot build and send errors for lds, rds, cds and eds.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } - }, - "title": "Pilot xds Pushes [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "filter": { - "language": "kuery", - "query": "" - }, - "formatter": "number", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "pilot_xds_pushes", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.pilot_xds_pushes.counter", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "95c750d0-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "a3581040-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "max", - "unit": "" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "prometheus.labels.type", - "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "terms_size": "4", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Pilot xds Pushes [Metricbeat Istio]", - "type": "metrics" - } + "panelIndex": "d9a49bf0-f88b-4d4f-a1e2-74fbd482f77c", + "panelRefName": "panel_2", + "title": "Pilot xds Pushes", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot Inbound Updates" }, - "id": "f858c200-087e-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "gridData": { + "h": 9, + "i": "a8e47ef0-03db-419f-890f-0880d674682c", + "w": 13, + "x": 35, + "y": 0 }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T09:24:59.040Z", - "version": "WzQzOTAsMV0=" - }, - { - "attributes": { - "description": "Total number of updates received by pilot.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } - }, - "title": "Pilot Inbound Updates [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "filter": { - "language": "kuery", - "query": "" - }, - "formatter": "number", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "pilot_inbound_updates", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.pilot_inbound_updates.counter", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "95c750d0-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "a3581040-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "max", - "unit": "" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "prometheus.labels.type", - "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "terms_size": "10", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Pilot Inbound Updates [Metricbeat Istio]", - "type": "metrics" - } + "panelIndex": "a8e47ef0-03db-419f-890f-0880d674682c", + "panelRefName": "panel_3", + "title": "Pilot Inbound Updates", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot Conflict Inbound Listener", + "vis": null }, - "id": "aa997510-087d-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "gridData": { + "h": 6, + "i": "0a63d980-8d93-4ce1-b5a1-ab77e589ceec", + "w": 12, + "x": 0, + "y": 3 }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T09:21:43.250Z", - "version": "WzQzODcsMV0=" - }, - { - "attributes": { - "description": "The number of certificates issuances that have succeeded.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } - }, - "title": "Citadel Cert Issuance [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "filter": { - "language": "kuery", - "query": "" - }, - "formatter": "number", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "success_cert_issuance", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.citadel_server_success_cert_issuance_count.counter", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "95c750d0-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "a3581040-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "max", - "unit": "" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "everything", - "stacked": "none", - "terms_field": "prometheus.labels.type", - "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "terms_size": "4", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Citadel Cert Issuance [Metricbeat Istio]", - "type": "metrics" - } + "panelIndex": "0a63d980-8d93-4ce1-b5a1-ab77e589ceec", + "panelRefName": "panel_4", + "title": "Pilot Conflict Inbound Listener", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot Proxy Queue Time" }, - "id": "506c8490-087f-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "gridData": { + "h": 9, + "i": "cd1bbc4f-95de-4156-a3ef-c091cf6402c0", + "w": 12, + "x": 0, + "y": 9 }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T10:15:51.172Z", - "version": "WzQ0NzYsMV0=" - }, - { - "attributes": { - "description": "Resource validation failed.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } - }, - "title": "Galley Validation Failed [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "filter": { - "language": "kuery", - "query": "" - }, - "formatter": "number", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "galley_validation_failed", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.galley_validation_failed.counter", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "95c750d0-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "a3581040-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "max", - "unit": "" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "prometheus.labels.resource", - "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "terms_size": "10", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Galley Validation Failed [Metricbeat Istio]", - "type": "metrics" - } + "panelIndex": "cd1bbc4f-95de-4156-a3ef-c091cf6402c0", + "panelRefName": "panel_5", + "title": "Pilot Proxy Queue Time", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Galley Validation Failed" + }, + "gridData": { + "h": 9, + "i": "724f0f9e-2186-4ddd-859c-edb2649b8c0f", + "w": 12, + "x": 12, + "y": 9 + }, + "panelIndex": "724f0f9e-2186-4ddd-859c-edb2649b8c0f", + "panelRefName": "panel_6", + "title": "Galley Validation Failed", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pods witout IP", + "vis": null + }, + "gridData": { + "h": 9, + "i": "32eaa989-a4f9-4d31-97cb-684f31488aa8", + "w": 8, + "x": 24, + "y": 9 + }, + "panelIndex": "32eaa989-a4f9-4d31-97cb-684f31488aa8", + "panelRefName": "panel_7", + "title": "Pods witout IP", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot Virtual Services", + "vis": null + }, + "gridData": { + "h": 9, + "i": "6a8463fe-b7cb-4cd8-bf01-f7ca6a185178", + "w": 8, + "x": 32, + "y": 9 + }, + "panelIndex": "6a8463fe-b7cb-4cd8-bf01-f7ca6a185178", + "panelRefName": "panel_8", + "title": "Pilot Virtual Services", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot Services", + "vis": null }, - "id": "98b01f00-087f-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "gridData": { + "h": 9, + "i": "51ecc2f8-3c3f-4a80-b4b6-b52db10e68ad", + "w": 8, + "x": 40, + "y": 9 }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T09:30:05.212Z", - "version": "WzQzOTksMV0=" + "panelIndex": "51ecc2f8-3c3f-4a80-b4b6-b52db10e68ad", + "panelRefName": "panel_9", + "title": "Pilot Services", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot eds instances", + "vis": null + }, + "gridData": { + "h": 9, + "i": "9fbfca4c-37b5-4a1a-924e-49fc9ef2294c", + "w": 10, + "x": 0, + "y": 18 + }, + "panelIndex": "9fbfca4c-37b5-4a1a-924e-49fc9ef2294c", + "panelRefName": "panel_10", + "title": "Pilot eds instances", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Citadel Cert Issuane" + }, + "gridData": { + "h": 9, + "i": "e708abfa-5a95-483c-9bb2-4470ee913f3c", + "w": 12, + "x": 10, + "y": 18 + }, + "panelIndex": "e708abfa-5a95-483c-9bb2-4470ee913f3c", + "panelRefName": "panel_11", + "title": "Citadel Cert Issuane", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds endpoints" + }, + "gridData": { + "h": 9, + "i": "d6b2845f-9582-4863-853e-ab753f3d763e", + "w": 11, + "x": 22, + "y": 18 + }, + "panelIndex": "d6b2845f-9582-4863-853e-ab753f3d763e", + "panelRefName": "panel_12", + "title": "Pilot xds endpoints", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Pilot xds expired" + }, + "gridData": { + "h": 9, + "i": "3d0dec37-26c3-490b-a45f-48b6d1baa160", + "w": 15, + "x": 33, + "y": 18 + }, + "panelIndex": "3d0dec37-26c3-490b-a45f-48b6d1baa160", + "panelRefName": "panel_13", + "title": "Pilot xds expired", + "version": "7.9.0" + } + ], + "timeRestore": false, + "title": "[Metricbeat Istio] Overview", + "version": 1 + }, + "id": "d899d3f0-0883-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "dashboard": "7.3.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "19a8b9c0-0c7f-11eb-a3fd-1b45ec532bb3", + "name": "panel_0", + "type": "visualization" + }, + { + "id": "b5b3abb0-087c-11eb-a3fd-1b45ec532bb3", + "name": "panel_1", + "type": "visualization" + }, + { + "id": "f858c200-087e-11eb-a3fd-1b45ec532bb3", + "name": "panel_2", + "type": "visualization" + }, + { + "id": "aa997510-087d-11eb-a3fd-1b45ec532bb3", + "name": "panel_3", + "type": "visualization" + }, + { + "id": "d62a1e60-0881-11eb-a3fd-1b45ec532bb3", + "name": "panel_4", + "type": "visualization" + }, + { + "id": "dd1392f0-07d8-11eb-a3fd-1b45ec532bb3", + "name": "panel_5", + "type": "visualization" + }, + { + "id": "98b01f00-087f-11eb-a3fd-1b45ec532bb3", + "name": "panel_6", + "type": "visualization" + }, + { + "id": "4275f710-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_7", + "type": "visualization" + }, + { + "id": "96bfe060-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_8", + "type": "visualization" }, { - "attributes": { - "description": "Pods not found in the endpoint table, possibly invalid.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", - "query": { - "language": "kuery", - "query": "" - } - } + "id": "6cfbe3f0-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_9", + "type": "visualization" + }, + { + "id": "12cdcce0-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_10", + "type": "visualization" + }, + { + "id": "506c8490-087f-11eb-a3fd-1b45ec532bb3", + "name": "panel_11", + "type": "visualization" + }, + { + "id": "e5f3e870-0882-11eb-a3fd-1b45ec532bb3", + "name": "panel_12", + "type": "visualization" + }, + { + "id": "0ed17c80-0883-11eb-a3fd-1b45ec532bb3", + "name": "panel_13", + "type": "visualization" + } + ], + "type": "dashboard", + "updated_at": "2020-10-13T13:01:42.340Z", + "version": "WzI5OCwxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Dashboards Navigation Overview [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "fontSize": 12, + "markdown": "**Overview** | [Traffic](#/dashboard/3b88a120-0c7c-11eb-a3fd-1b45ec532bb3)\n", + "openLinksInNewTab": false + }, + "title": "Dashboards Navigation Overview [Metricbeat Istio]", + "type": "markdown" + } + }, + "id": "19a8b9c0-0c7f-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzQ2LDFd" + }, + { + "attributes": { + "description": "Total time in seconds Pilot takes to push lds, rds, cds and eds.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot xds Push Time [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "prometheus.labels.type: \"rds\" OR prometheus.labels.type: \"lds\" OR prometheus.labels.type: \"cds\" OR prometheus.labels.type: \"eds\"" }, - "title": "Pilot Pods without IP [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [ - { - "enabled": true, - "id": "1", - "params": { - "customLabel": "Pilot No IP pods", - "field": "prometheus.pilot_no_ip.value" - }, - "schema": "metric", - "type": "avg" - } + "formatter": "s,s,2", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds_push_time", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds_push_time.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } ], - "params": { - "addLegend": true, - "addTooltip": true, - "gauge": { - "alignment": "automatic", - "backStyle": "Full", - "colorSchema": "Green to Red", - "colorsRange": [ - { - "from": 0, - "to": 50 - }, - { - "from": 50, - "to": 75 - }, - { - "from": 75, - "to": 100 - } - ], - "extendRange": true, - "gaugeColorMode": "Labels", - "gaugeStyle": "Full", - "gaugeType": "Arc", - "invertColors": false, - "labels": { - "color": "black", - "show": true - }, - "orientation": "vertical", - "percentageMode": false, - "scale": { - "color": "rgba(105,112,125,0.2)", - "labels": false, - "show": true - }, - "style": { - "bgColor": true, - "bgFill": "rgba(105,112,125,0.2)", - "bgMask": false, - "bgWidth": 0.9, - "fontSize": 60, - "mask": false, - "maskBars": 50, - "subText": "", - "width": 0.9 - }, - "type": "meter" - }, - "isDisplayWarning": false, - "type": "gauge" - }, - "title": "Pilot Pods without IP [Metricbeat Istio]", - "type": "gauge" - } - }, - "id": "4275f710-0882-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" - }, - "references": [ - { - "id": "metricbeat-*", - "name": "kibanaSavedObjectMeta.searchSourceJSON.index", - "type": "index-pattern" - } + "type": "percentile" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_size": "20", + "type": "timeseries", + "value_template": "{{value}}" + } ], - "type": "visualization", - "updated_at": "2020-10-07T09:48:31.873Z", - "version": "WzQ0MjcsMV0=" + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Pilot xds Push Time [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "b5b3abb0-087c-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T13:01:21.843Z", + "version": "WzI2MCwxXQ==" + }, + { + "attributes": { + "description": "Pilot build and send errors for lds, rds, cds and eds.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} }, - { - "attributes": { - "description": "Total virtual services known to pilot.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", - "query": { - "language": "kuery", - "query": "" - } - } + "title": "Pilot xds Pushes [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" }, - "title": "Pilot Virtual Services [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [ - { - "enabled": true, - "id": "1", - "params": { - "customLabel": "Pilot Virtual Services", - "field": "prometheus.pilot_virt_services.value" - }, - "schema": "metric", - "type": "avg" - } + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds_pushes", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds_pushes.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } ], - "params": { - "addLegend": true, - "addTooltip": true, - "gauge": { - "alignment": "automatic", - "backStyle": "Full", - "colorSchema": "Green to Red", - "colorsRange": [ - { - "from": 0, - "to": 50 - }, - { - "from": 50, - "to": 75 - }, - { - "from": 75, - "to": 100 - } - ], - "extendRange": true, - "gaugeColorMode": "Labels", - "gaugeStyle": "Full", - "gaugeType": "Arc", - "invertColors": false, - "labels": { - "color": "black", - "show": true - }, - "orientation": "vertical", - "percentageMode": false, - "scale": { - "color": "rgba(105,112,125,0.2)", - "labels": false, - "show": true - }, - "style": { - "bgColor": true, - "bgFill": "rgba(105,112,125,0.2)", - "bgMask": false, - "bgWidth": 0.9, - "fontSize": 60, - "mask": false, - "maskBars": 50, - "subText": "", - "width": 0.9 - }, - "type": "meter" - }, - "isDisplayWarning": false, - "type": "gauge" - }, - "title": "Pilot Virtual Services [Metricbeat Istio]", - "type": "gauge" - } - }, - "id": "96bfe060-0882-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" - }, - "references": [ - { - "id": "metricbeat-*", - "name": "kibanaSavedObjectMeta.searchSourceJSON.index", - "type": "index-pattern" - } + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "4", + "type": "timeseries", + "value_template": "{{value}}" + } ], - "type": "visualization", - "updated_at": "2020-10-07T09:50:53.286Z", - "version": "WzQ0MzMsMV0=" + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot xds Pushes [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "f858c200-087e-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzQ4LDFd" + }, + { + "attributes": { + "description": "Total number of updates received by pilot.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} }, - { - "attributes": { - "description": "Total services known to pilot.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", - "query": { - "language": "kuery", - "query": "" - } - } + "title": "Pilot Inbound Updates [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" }, - "title": "Pilot Services [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [ - { - "enabled": true, - "id": "1", - "params": { - "customLabel": "Pilot Services", - "field": "prometheus.pilot_services.value" - }, - "schema": "metric", - "type": "avg" - } + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_inbound_updates", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_inbound_updates.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } ], - "params": { - "addLegend": true, - "addTooltip": true, - "gauge": { - "alignment": "automatic", - "backStyle": "Full", - "colorSchema": "Green to Red", - "colorsRange": [ - { - "from": 0, - "to": 50 - }, - { - "from": 50, - "to": 75 - }, - { - "from": 75, - "to": 100 - } - ], - "extendRange": true, - "gaugeColorMode": "Labels", - "gaugeStyle": "Full", - "gaugeType": "Arc", - "invertColors": false, - "labels": { - "color": "black", - "show": true - }, - "orientation": "vertical", - "percentageMode": false, - "scale": { - "color": "rgba(105,112,125,0.2)", - "labels": false, - "show": true - }, - "style": { - "bgColor": true, - "bgFill": "rgba(105,112,125,0.2)", - "bgMask": false, - "bgWidth": 0.9, - "fontSize": 60, - "mask": false, - "maskBars": 50, - "subText": "", - "width": 0.9 - }, - "type": "meter" - }, - "isDisplayWarning": false, - "type": "gauge" - }, - "title": "Pilot Services [Metricbeat Istio]", - "type": "gauge" - } - }, - "id": "6cfbe3f0-0882-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" - }, - "references": [ - { - "id": "metricbeat-*", - "name": "kibanaSavedObjectMeta.searchSourceJSON.index", - "type": "index-pattern" - } + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "10", + "type": "timeseries", + "value_template": "{{value}}" + } ], - "type": "visualization", - "updated_at": "2020-10-07T10:04:27.677Z", - "version": "WzQ0NTksMV0=" + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot Inbound Updates [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "aa997510-087d-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzQ5LDFd" + }, + { + "attributes": { + "description": "Number of conflicting inbound listeners.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } }, - { - "attributes": { - "description": "Number of conflicting inbound listeners.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", - "query": { - "language": "kuery", - "query": "" - } - } + "title": "Pilot Conflict Inbound Listener [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot conflict inbound listener", + "field": "prometheus.pilot_conflict_inbound_listener.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 }, - "title": "Pilot Conflict Inbound Listener [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [ - { - "enabled": true, - "id": "1", - "params": { - "customLabel": "Pilot conflict inbound listener", - "field": "prometheus.pilot_conflict_inbound_listener.value" - }, - "schema": "metric", - "type": "avg" - } - ], - "params": { - "addLegend": true, - "addTooltip": true, - "gauge": { - "alignment": "automatic", - "backStyle": "Full", - "colorSchema": "Green to Red", - "colorsRange": [ - { - "from": 0, - "to": 50 - }, - { - "from": 50, - "to": 75 - }, - { - "from": 75, - "to": 100 - } - ], - "extendRange": true, - "gaugeColorMode": "Labels", - "gaugeStyle": "Full", - "gaugeType": "Arc", - "invertColors": false, - "labels": { - "color": "black", - "show": true - }, - "orientation": "vertical", - "percentageMode": false, - "scale": { - "color": "rgba(105,112,125,0.2)", - "labels": false, - "show": true - }, - "style": { - "bgColor": true, - "bgFill": "rgba(105,112,125,0.2)", - "bgMask": false, - "bgWidth": 0.9, - "fontSize": 60, - "mask": false, - "maskBars": 50, - "subText": "", - "width": 0.9 - }, - "type": "meter" - }, - "isDisplayWarning": false, - "type": "gauge" - }, - "title": "Pilot Conflict Inbound Listener [Metricbeat Istio]", - "type": "gauge" + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" }, - "id": "d62a1e60-0881-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Conflict Inbound Listener [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "d62a1e60-0881-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzUwLDFd" + }, + { + "attributes": { + "description": "Time in seconds, a proxy is in the push queue before being dequeued.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Proxy Queue Time [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" }, - "references": [ - { - "id": "metricbeat-*", - "name": "kibanaSavedObjectMeta.searchSourceJSON.index", - "type": "index-pattern" - } + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "queue_time", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_proxy_queue_time.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "03ef6580-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "071fe4f0-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "0b7164c0-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "90" + }, + { + "id": "0f611580-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "136f98e0-0887-11eb-876a-9d8e5e94d2f5", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "type": "timeseries", + "value_template": "{{value}}" + } ], - "type": "visualization", - "updated_at": "2020-10-07T09:45:30.182Z", - "version": "WzQ0MjAsMV0=" + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Pilot Proxy Queue Time [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "dd1392f0-07d8-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:59:52.108Z", + "version": "WzI0NywxXQ==" + }, + { + "attributes": { + "description": "Resource validation failed.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} }, - { - "attributes": { - "description": "Number of clusters without instances.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", - "query": { - "language": "kuery", - "query": "" - } - } + "title": "Galley Validation Failed [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" }, - "title": "Pilot eds Instances [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [ - { - "enabled": true, - "id": "1", - "params": { - "customLabel": "Pilot eds instnaces", - "field": "prometheus.pilot_eds_no_instances.value" - }, - "schema": "metric", - "type": "avg" - } + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "galley_validation_failed", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.galley_validation_failed.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } ], - "params": { - "addLegend": true, - "addTooltip": true, - "gauge": { - "alignment": "automatic", - "backStyle": "Full", - "colorSchema": "Green to Red", - "colorsRange": [ - { - "from": 0, - "to": 50 - }, - { - "from": 50, - "to": 75 - }, - { - "from": 75, - "to": 100 - } - ], - "extendRange": true, - "gaugeColorMode": "Labels", - "gaugeStyle": "Full", - "gaugeType": "Arc", - "invertColors": false, - "labels": { - "color": "black", - "show": true - }, - "orientation": "vertical", - "percentageMode": false, - "scale": { - "color": "rgba(105,112,125,0.2)", - "labels": false, - "show": true - }, - "style": { - "bgColor": true, - "bgFill": "rgba(105,112,125,0.2)", - "bgMask": false, - "bgWidth": 0.9, - "fontSize": 60, - "mask": false, - "maskBars": 50, - "subText": "", - "width": 0.9 - }, - "type": "meter" - }, - "isDisplayWarning": false, - "type": "gauge" - }, - "title": "Pilot eds Instances [Metricbeat Istio]", - "type": "gauge" + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.resource", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "10", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Galley Validation Failed [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "98b01f00-087f-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzUyLDFd" + }, + { + "attributes": { + "description": "Pods not found in the endpoint table, possibly invalid.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Pods without IP [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot No IP pods", + "field": "prometheus.pilot_no_ip.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" }, - "id": "12cdcce0-0882-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" - }, - "references": [ + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Pods without IP [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "4275f710-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzUzLDFd" + }, + { + "attributes": { + "description": "Total virtual services known to pilot.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Virtual Services [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot Virtual Services", + "field": "prometheus.pilot_virt_services.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ { - "id": "metricbeat-*", - "name": "kibanaSavedObjectMeta.searchSourceJSON.index", - "type": "index-pattern" + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 + }, + { + "from": 75, + "to": 100 } - ], - "type": "visualization", - "updated_at": "2020-10-07T09:47:11.918Z", - "version": "WzQ0MjQsMV0=" - }, + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" + }, + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Virtual Services [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "96bfe060-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ { - "attributes": { - "description": "Number of endpoints connected to this pilot using XDS.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzU0LDFd" + }, + { + "attributes": { + "description": "Total services known to pilot.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot Services [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot Services", + "field": "prometheus.pilot_services.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 }, - "title": "Pilot XDS endpoints [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "formatter": "number", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "pilot_xds", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.pilot_xds.value", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "95c750d0-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "a3581040-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "avg" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "everything", - "stacked": "none", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Pilot XDS endpoints [Metricbeat Istio]", - "type": "metrics" + { + "from": 75, + "to": 100 } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" }, - "id": "e5f3e870-0882-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" - }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T09:53:38.583Z", - "version": "WzQ0NDEsMV0=" - }, + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot Services [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "6cfbe3f0-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ { - "attributes": { - "description": "Total number of XDS requests with an expired nonce.", - "kibanaSavedObjectMeta": { - "searchSourceJSON": { - "filter": [], - "query": { - "language": "kuery", - "query": "" - } - } + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzU1LDFd" + }, + { + "attributes": { + "description": "Number of clusters without instances.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Pilot eds Instances [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "Pilot eds instnaces", + "field": "prometheus.pilot_eds_no_instances.value" + }, + "schema": "metric", + "type": "avg" + } + ], + "params": { + "addLegend": true, + "addTooltip": true, + "gauge": { + "alignment": "automatic", + "backStyle": "Full", + "colorSchema": "Green to Red", + "colorsRange": [ + { + "from": 0, + "to": 50 + }, + { + "from": 50, + "to": 75 }, - "title": "Pilot XDS expired [Metricbeat Istio]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_min": 0, - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "filter": { - "language": "kuery", - "query": "" - }, - "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", - "index_pattern": "metricbeat-*", - "interval": "auto", - "isModelInvalid": false, - "series": [ - { - "axis_position": "right", - "chart_type": "line", - "color": "#6092C0", - "fill": 0, - "formatter": "number", - "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", - "label": "pilot_xds_expired_nonce", - "line_width": 2, - "metrics": [ - { - "field": "prometheus.pilot_xds_expired_nonce.counter", - "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", - "percentiles": [ - { - "id": "88c0d000-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "50" - }, - { - "id": "95c750d0-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "25" - }, - { - "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "75" - }, - { - "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "95" - }, - { - "id": "a3581040-07d8-11eb-86d1-6521145f6524", - "mode": "line", - "percentile": "", - "shade": 0.2, - "value": "99" - } - ], - "type": "avg" - } - ], - "point_size": 0, - "separate_axis": 0, - "split_mode": "everything", - "stacked": "none", - "type": "timeseries", - "value_template": "{{value}}" - } - ], - "show_grid": 1, - "show_legend": 1, - "time_field": "@timestamp", - "type": "timeseries" - }, - "title": "Pilot XDS expired [Metricbeat Istio]", - "type": "metrics" + { + "from": 75, + "to": 100 } + ], + "extendRange": true, + "gaugeColorMode": "Labels", + "gaugeStyle": "Full", + "gaugeType": "Arc", + "invertColors": false, + "labels": { + "color": "black", + "show": true + }, + "orientation": "vertical", + "percentageMode": false, + "scale": { + "color": "rgba(105,112,125,0.2)", + "labels": false, + "show": true + }, + "style": { + "bgColor": true, + "bgFill": "rgba(105,112,125,0.2)", + "bgMask": false, + "bgWidth": 0.9, + "fontSize": 60, + "mask": false, + "maskBars": 50, + "subText": "", + "width": 0.9 + }, + "type": "meter" }, - "id": "0ed17c80-0883-11eb-a3fd-1b45ec532bb3", - "migrationVersion": { - "visualization": "7.8.0" + "isDisplayWarning": false, + "type": "gauge" + }, + "title": "Pilot eds Instances [Metricbeat Istio]", + "type": "gauge" + } + }, + "id": "12cdcce0-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzU2LDFd" + }, + { + "attributes": { + "description": "The number of certificates issuances that have succeeded.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} + }, + "title": "Citadel Cert Issuance [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" }, - "references": [], - "type": "visualization", - "updated_at": "2020-10-07T09:54:14.728Z", - "version": "WzQ0NDMsMV0=" + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "filter": { + "language": "kuery", + "query": "" + }, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "success_cert_issuance", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.citadel_server_success_cert_issuance_count.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "max", + "unit": "" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "terms_field": "prometheus.labels.type", + "terms_order_by": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "terms_size": "4", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Citadel Cert Issuance [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "506c8490-087f-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzU3LDFd" + }, + { + "attributes": { + "description": "Number of endpoints connected to this pilot using XDS.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} + }, + "title": "Pilot XDS endpoints [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds.value", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "avg" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot XDS endpoints [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "e5f3e870-0882-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzU4LDFd" + }, + { + "attributes": { + "description": "Total number of XDS requests with an expired nonce.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} + }, + "title": "Pilot XDS expired [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "pilot_xds_expired_nonce", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.pilot_xds_expired_nonce.counter", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "avg" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "everything", + "stacked": "none", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Pilot XDS expired [Metricbeat Istio]", + "type": "metrics" } - ], - "version": "7.8.0" + }, + "id": "0ed17c80-0883-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.050Z", + "version": "WzU5LDFd" + } + ], + "version": "7.9.0" } diff --git a/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-traffic.json b/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-traffic.json new file mode 100644 index 00000000000..5998c84f3c3 --- /dev/null +++ b/x-pack/metricbeat/module/istio/_meta/kibana/7/dashboard/Metricbeat-istio-traffic.json @@ -0,0 +1,1274 @@ +{ + "objects": [ + { + "attributes": { + "description": "Istio traffic statistics based on metrics collected from istio proxies", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "optionsJSON": { + "hidePanelTitles": false, + "useMargins": true + }, + "panelsJSON": [ + { + "embeddableConfig": { + "title": "" + }, + "gridData": { + "h": 3, + "i": "fbc3815e-eb3a-46dd-b37a-a61b741b754e", + "w": 10, + "x": 0, + "y": 0 + }, + "panelIndex": "fbc3815e-eb3a-46dd-b37a-a61b741b754e", + "panelRefName": "panel_0", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Number of requests per source" + }, + "gridData": { + "h": 11, + "i": "1f88dc8b-1c21-40e0-8507-b468643d5507", + "w": 15, + "x": 10, + "y": 0 + }, + "panelIndex": "1f88dc8b-1c21-40e0-8507-b468643d5507", + "panelRefName": "panel_1", + "title": "Number of requests per source", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Number of requests per destination" + }, + "gridData": { + "h": 11, + "i": "7c7c491b-c55c-4892-a73e-3bfb5af9a610", + "w": 23, + "x": 25, + "y": 0 + }, + "panelIndex": "7c7c491b-c55c-4892-a73e-3bfb5af9a610", + "panelRefName": "panel_2", + "title": "Number of requests per destination", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Destination Apps" + }, + "gridData": { + "h": 8, + "i": "c87dc307-71f1-4642-8d2a-60066f5ab114", + "w": 10, + "x": 0, + "y": 3 + }, + "panelIndex": "c87dc307-71f1-4642-8d2a-60066f5ab114", + "panelRefName": "panel_3", + "title": "Destination Apps", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Duration of requests per destination" + }, + "gridData": { + "h": 10, + "i": "894e458b-c822-4df1-ae43-aa99d73bfedc", + "w": 12, + "x": 12, + "y": 11 + }, + "panelIndex": "894e458b-c822-4df1-ae43-aa99d73bfedc", + "panelRefName": "panel_4", + "title": "Duration of requests per destination", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Size of requests per source" + }, + "gridData": { + "h": 10, + "i": "28d6f60d-1b2c-4688-9cbc-5ebf3d587469", + "w": 12, + "x": 24, + "y": 11 + }, + "panelIndex": "28d6f60d-1b2c-4688-9cbc-5ebf3d587469", + "panelRefName": "panel_5", + "title": "Size of requests per source", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Size of requests per destination" + }, + "gridData": { + "h": 10, + "i": "1b1f0dcb-613d-4b71-a8a9-e30f79734ede", + "w": 12, + "x": 36, + "y": 11 + }, + "panelIndex": "1b1f0dcb-613d-4b71-a8a9-e30f79734ede", + "panelRefName": "panel_6", + "title": "Size of requests per destination", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Duration of requests per source" + }, + "gridData": { + "h": 10, + "i": "ae905bb4-456f-4122-8f5c-44a9ced608f1", + "w": 12, + "x": 0, + "y": 11 + }, + "panelIndex": "ae905bb4-456f-4122-8f5c-44a9ced608f1", + "panelRefName": "panel_7", + "title": "Duration of requests per source", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Size of response per source" + }, + "gridData": { + "h": 10, + "i": "3f4222fc-a243-4141-8787-1dd41d9f1661", + "w": 17, + "x": 12, + "y": 21 + }, + "panelIndex": "3f4222fc-a243-4141-8787-1dd41d9f1661", + "panelRefName": "panel_8", + "title": "Size of response per source", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Size of response per destination" + }, + "gridData": { + "h": 10, + "i": "4c498b69-296c-4e30-8a35-1510566ea5ef", + "w": 19, + "x": 29, + "y": 21 + }, + "panelIndex": "4c498b69-296c-4e30-8a35-1510566ea5ef", + "panelRefName": "panel_9", + "title": "Size of response per destination", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "hidePanelTitles": false, + "title": "Response Codes" + }, + "gridData": { + "h": 10, + "i": "2a128040-ef73-40a2-8b52-62c8180bcad7", + "w": 12, + "x": 0, + "y": 21 + }, + "panelIndex": "2a128040-ef73-40a2-8b52-62c8180bcad7", + "panelRefName": "panel_10", + "title": "Response Codes", + "version": "7.9.0" + } + ], + "timeRestore": false, + "title": "[Metricbeat Istio] Traffic", + "version": 1 + }, + "id": "3b88a120-0c7c-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "dashboard": "7.3.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "96c4a5c0-0c7c-11eb-a3fd-1b45ec532bb3", + "name": "panel_0", + "type": "visualization" + }, + { + "id": "e14e3560-0c78-11eb-a3fd-1b45ec532bb3", + "name": "panel_1", + "type": "visualization" + }, + { + "id": "c7468af0-0c78-11eb-a3fd-1b45ec532bb3", + "name": "panel_2", + "type": "visualization" + }, + { + "id": "1d076a90-0c7e-11eb-a3fd-1b45ec532bb3", + "name": "panel_3", + "type": "visualization" + }, + { + "id": "3ae9b3f0-0c7a-11eb-a3fd-1b45ec532bb3", + "name": "panel_4", + "type": "visualization" + }, + { + "id": "60dacbe0-0c79-11eb-a3fd-1b45ec532bb3", + "name": "panel_5", + "type": "visualization" + }, + { + "id": "78375380-0c79-11eb-a3fd-1b45ec532bb3", + "name": "panel_6", + "type": "visualization" + }, + { + "id": "5fd462f0-0c7a-11eb-a3fd-1b45ec532bb3", + "name": "panel_7", + "type": "visualization" + }, + { + "id": "b4235550-0c7a-11eb-a3fd-1b45ec532bb3", + "name": "panel_8", + "type": "visualization" + }, + { + "id": "8d818070-0c7a-11eb-a3fd-1b45ec532bb3", + "name": "panel_9", + "type": "visualization" + }, + { + "id": "09404610-0c7b-11eb-a3fd-1b45ec532bb3", + "name": "panel_10", + "type": "visualization" + } + ], + "type": "dashboard", + "updated_at": "2020-10-13T13:18:36.737Z", + "version": "WzUxNSwxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Dashboards Navigation Overview Traffic [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "fontSize": 12, + "markdown": "[Overview](#/dashboard/d899d3f0-0883-11eb-a3fd-1b45ec532bb3) | **Traffic**", + "openLinksInNewTab": false + }, + "title": "Dashboards Navigation Overview Traffic [Metricbeat Istio]", + "type": "markdown" + } + }, + "id": "96c4a5c0-0c7c-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.894Z", + "version": "WzYxLDFd" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} + }, + "title": "Number of requests per source [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Number of requests", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_requests_total.rate", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "max" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.source_app", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Number of requests per source [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "e14e3560-0c78-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.894Z", + "version": "WzYyLDFd" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} + }, + "title": "Number of requests per destination [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Number of requests", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_requests_total.rate", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "9f8e3700-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "max" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.destination_app", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Number of requests per destination [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "c7468af0-0c78-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.894Z", + "version": "WzYzLDFd" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.index", + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Destination Apps [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [ + { + "enabled": true, + "id": "1", + "params": { + "customLabel": "some" + }, + "schema": "metric", + "type": "count" + }, + { + "enabled": true, + "id": "2", + "params": { + "field": "prometheus.labels.destination_app", + "missingBucket": false, + "missingBucketLabel": "Missing", + "order": "desc", + "orderBy": "1", + "otherBucket": false, + "otherBucketLabel": "Other", + "size": 25 + }, + "schema": "segment", + "type": "terms" + } + ], + "params": { + "maxFontSize": 49, + "minFontSize": 13, + "orientation": "single", + "scale": "linear", + "showLabel": false + }, + "title": "Destination Apps [Metricbeat Istio]", + "type": "tagcloud" + } + }, + "id": "1d076a90-0c7e-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [ + { + "id": "metricbeat-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.894Z", + "version": "WzY0LDFd" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Duration of requests per destination [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "ms,s,2", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Duration of Requests", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_request_duration_milliseconds.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "257a4bc0-0c79-11eb-a187-45e4454f723b", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.destination_app", + "terms_size": "100", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Duration of requests per destination [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "3ae9b3f0-0c7a-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T13:04:46.542Z", + "version": "WzM0MiwxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Size of requests per source [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "bytes", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Size of Requests", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_request_bytes.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "257a4bc0-0c79-11eb-a187-45e4454f723b", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile", + "values": [ + "99" + ] + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.source_app", + "terms_size": "100", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Size of requests per source [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "60dacbe0-0c79-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T13:15:39.548Z", + "version": "WzQ4NywxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Size of requests per destination [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "bytes", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Size of Requests", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_request_bytes.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "257a4bc0-0c79-11eb-a187-45e4454f723b", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile", + "values": [ + "99" + ] + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.destination_app", + "terms_size": "100", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Size of requests per destination [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "78375380-0c79-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T13:15:47.103Z", + "version": "WzQ5MCwxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Duration of requests per source [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "ms,s,2", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Duration of Requests", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_request_duration_milliseconds.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "257a4bc0-0c79-11eb-a187-45e4454f723b", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.source_app", + "terms_size": "100", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Duration of requests per source [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "5fd462f0-0c7a-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T13:03:54.986Z", + "version": "WzMyNywxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Size of response per source [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "bytes", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Size of Responses", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_response_bytes.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "257a4bc0-0c79-11eb-a187-45e4454f723b", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile_rank", + "values": [ + "99" + ] + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.source_app", + "terms_size": "100", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Size of response per source [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "b4235550-0c7a-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T13:13:05.112Z", + "version": "WzQ0NSwxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } + }, + "title": "Size of response per destination [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "bytes", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Size of Responses", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_response_bytes.histogram", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "257a4bc0-0c79-11eb-a187-45e4454f723b", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "percentile", + "values": [ + "99" + ] + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.destination_app", + "terms_size": "100", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "tooltip_mode": "show_all", + "type": "timeseries" + }, + "title": "Size of response per destination [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "8d818070-0c7a-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T13:16:05.893Z", + "version": "WzQ5NywxXQ==" + }, + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": {} + }, + "title": "Response Codes [Metricbeat Istio]", + "uiStateJSON": {}, + "version": 1, + "visState": { + "aggs": [], + "params": { + "axis_formatter": "number", + "axis_min": 0, + "axis_position": "left", + "axis_scale": "normal", + "default_index_pattern": "metricbeat-*", + "default_timefield": "@timestamp", + "filter": { + "language": "kuery", + "query": "" + }, + "id": "7ccbe640-07d8-11eb-985d-2f490d4c2901", + "index_pattern": "metricbeat-*", + "interval": "auto", + "isModelInvalid": false, + "series": [ + { + "axis_position": "right", + "chart_type": "line", + "color": "#6092C0", + "fill": 0, + "formatter": "number", + "id": "7ccbe641-07d8-11eb-985d-2f490d4c2901", + "label": "Response Codes", + "line_width": 2, + "metrics": [ + { + "field": "prometheus.istio_response_bytes.histogram.values", + "id": "7ccbe642-07d8-11eb-985d-2f490d4c2901", + "percentiles": [ + { + "id": "88c0d000-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "25" + }, + { + "id": "95c750d0-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "50" + }, + { + "id": "9c5ec900-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "75" + }, + { + "id": "a3581040-07d8-11eb-86d1-6521145f6524", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "95" + }, + { + "id": "257a4bc0-0c79-11eb-a187-45e4454f723b", + "mode": "line", + "percentile": "", + "shade": 0.2, + "value": "99" + } + ], + "type": "count" + } + ], + "point_size": 0, + "separate_axis": 0, + "split_mode": "terms", + "stacked": "none", + "terms_field": "prometheus.labels.response_code", + "terms_size": "100", + "type": "timeseries", + "value_template": "{{value}}" + } + ], + "show_grid": 1, + "show_legend": 1, + "time_field": "@timestamp", + "type": "timeseries" + }, + "title": "Response Codes [Metricbeat Istio]", + "type": "metrics" + } + }, + "id": "09404610-0c7b-11eb-a3fd-1b45ec532bb3", + "migrationVersion": { + "visualization": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "visualization", + "updated_at": "2020-10-13T12:53:51.894Z", + "version": "WzcxLDFd" + } + ], + "version": "7.9.0" +} diff --git a/x-pack/metricbeat/module/istio/fields.go b/x-pack/metricbeat/module/istio/fields.go index ccd41e55fe8..49ad72ab697 100644 --- a/x-pack/metricbeat/module/istio/fields.go +++ b/x-pack/metricbeat/module/istio/fields.go @@ -19,5 +19,5 @@ func init() { // AssetIstio returns asset data. // This is the base64 encoded gzipped contents of module/istio. func AssetIstio() string { - return "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" + return "eJzUXE2T47bRvu+v6PLltd+a5V5Te0hVap2PrcSuza5TSeUiQ2BLhAUCNNCURv71KXyRFEVp9AFq1nPYnZFIPM8DNIBGd5NvYYP79yAsCf0GgARJfA/ffHR/f/MGoETLjWhIaPUe/vgGAMK18IMuW4lvAAxKZBbfwxKJvQFYCZSlfe8vfQuK1dg3735o3+B7WBvdNvGTCQz387O/62fgWhETyoIlRu4zboEqRrBDg2CQlbAyuoaPA5AhiSERLoiVKLvPp+icoeR+PkzQMSgZYQmkgSoMTOBDwAKLZis4DhoZd1n6GbMeMl+bhhc1UqXLg++Tgg3ud9qMvzujw/38VKFvGCYaPgA+1pALearlA2gHkhfX3Q565YfKoG2Qk9ieoDPJyyI3SAtnmEZLiWZht3zBOF9wg84QFhwNFVy3iiapS63W1/NWbb1E45i75sVKcEZoIWJC2aIzwKgAGPf44WuhVXFCitmiWRityZNe4HMjzH5hkWtV2kn2K6nZWNcF9FslnoFEjZZY3TyBUBBRnmBXoeomjCPjJcJOSAmeERbwbwSLBIKcSoVr5kdNKODM+vEUitAoJgGN0WZab2fNaIqKqVLi9HS6YYQ0MTkYo8+fPljgum4kutHRyttbgH4Cg2tmSonWumtty7n/1cCKCdkafJl9bdeFQY5iO6cEsGSQ1VCjtWyNbqkLkIeCLqNrMd98GFFdT3F1eLDcX8XTEjM0r1FEiFM9eJndCrUu3Kaj+L6obbFs+Qap+P9J3nr5C/Jxz4cPF/csSG7x1MoiRCLwbS2kFHFWf9eNi9+tK1bCElEBaxrpli6h1VuJW5QQJ+K1QzXVD7atLx26lTY1o/dQtsaTyaA/Cn4C29buj/C5QOuWqWHf3KQt935ymn5vsDWSEdweG2dHmkmJ+4c4VAEqkz/l/s3rVrgWB26Fbg1H/0foQxBDWSc52Ybl9rP+3i7RKHS+QocwJjrJZ4vGHk+MO9nERhOBibWpc9adb8UnpuadDPp2EwmhLDH1ktvnzyMFa6lCRXEFK2q0VaOlcLN8Fl9vy6QoA/a7Q+x3Q2zYKL1TbsLEacIIGDRaKHKLj/O7Lhf1WoLyiHHdUvyAtvqg1UqMueYX4fDe9Xj3kVdIO202bukv0ZJQvmdMKx8wGj32uzF2NlGotnq/EpLQPFTQEDebmDUj3LH9Q4UkzGwirCiRs8eORsLMJmIrDLVMRt/goVpG0PdJ8ivgvmBERixbwpopsUJL8ysKyO+OkbMICi7+A4wsykh4Wcgn9+Bh7DvALPQfs3lE6lfvFud9LtMqd3XRGM3RWm0K3KKihW2YKtLJ7dUOwImAO3js3NkWGa9AKK5rodbgqQKzUAlLem1YDYHmZefBi7U/9NB7iebuAJwuziw490n4Mk0XnIrPq7GKNbbStPANvpLN9ioCixSd2WIIz0S6WE4a7o1Kr7DQnBI6OwzX3Uj+925tUqzQf/f1rJduSJzoxDHnInle9+uslWO92RbI82Jns9xjPTeaqyVG6G1qMa+X5ZN+vV/VoAkf/evzP14gaBjhel9oteAVU+vp4Nzd9ESNNkS/I+D/WdDqg0eEitmwsnHnTk3naY8Iu7/M4tdWoOW4MG688uU1JsgziFg93SnQLvPo446LTbvERdzmQxZsQZqYnJXopo+IxjhtxF61Uu67fARTYTGeDo463zfMNJ843eC+aJuSUTYD/mvwnXsg2OGy0nozzP/CFOYURx+bKqRmuWxg8wfbE/Ktp9XhW4PfOaBLSeXtttO8xjgHp6Vht0znMC5NM6Rma7TVi43mSIw4oExpkaNI+JA74fMNef/G6BqpwtZOt56gf9HLSdSb4/wD4HHb3aKJv7Y5oys+3ZsaHeY1mYpj1Rj9vD/H5XW9tM+BRL/T3+iVTWh5mOf1OfV/uv1Wb2tCRE6PaoJnv1VNWuaYmRW/YbHcE76ipXwRv+Gl58Rj2vkOhif4jAHOcJlhbMdsDiFOEAtZ+d/f4B7zfsXRPSbztQxvow2hybfVfY4tgihRObcwHiQSUp/qDxYPHwmE9bV0pGGQ6AOxije5731NLYvFOMPNC5gqk9s8dQeXAhUN7zhReuibKHbabJyzWOSuyBB23COpQiOST8iwqwSvIJZzxlNYIHcx8exlG9PsD2o3RjLOkm2MUFw0J85V2Tg2iAY6rESUDFutBE9cBgbo6z79TYeVAO771uJ5Taxp5lUTO5g1DSyZDRV77g/JlihvGYUZCmqOWY8KbE7ymyQ6WA5eY2YOV6PzPXqS6GvMxNtofxVzckjo7ok5bGz22Tns9PNTdHJ4XlbwGrP1vCW9SDkGAYpK22lXJwvvIcn0uIFDTG6XWEp0Zzh36u3SGsn9uFjD/KvOlA6Heh3HRy84E6xfsJDU9Y3RpLmee72JKOf9zj99+thfKVbu960osXwCTRWanbDdnaCNc85UrNlMd02PUuf5c13mC9Ufq+yKpx3OkVR/R1iDhIXGoH8UQSu5dwvU33766VNKk0yr6OUWFnlrBO1jNcfMHk96eOhw0Q/Q5we0bqllckHShs0j+P9xu/AXsI3rrbpuVWrXa0N/oBgdI05sS6ShVaG4xIOM7krBfKHcv7HjEnvOlNIES2+hDRrpvmlaH0/tR6EL3orng0PajNFbh5QrfBsKYHlTpEFifDNPQi1NTgfQPxWUHuE4c3yKQX9WsobQFEKtdOGf2LIxHzAL3YAAqPwZHY1/YM64jSkmU92v0cAjNXDUDlMIlysKn83T9WECRDgfy3SseWuMW2Uim7NMU5HfrPw6kBsYxvq9B3RjVyl4O8lovX1i61EWvETOWotJwzBVaJBao7A89zBklJGyMl/ZLEy0rpiBnZL5zaYvJbjebkwrv7bOdpSu6OihgpoRr+bZYiKpUoSkTXjqn1lw+3jDjEW2lOd3GU90fmsIVa/XWwJh3TiX4CuzhkTrCovolMzf2Qnqlg5vlXXe2EpgWTDvYC/i4jkL4QARLXfFhOyf0+/2nSW6nm8V2zIhTxt0KWzjZhqaxcA5tosGzWLLjEDaz1g584N3UpNjNCTgXb5kL5GIB52WkfbMJL/gUtuZ6pK6Lu5fFxLQkuUHowAyTFlx2sQT55JhrVVO006We2gxW4QABUa3JFSwdAZrscXO7wNUW2G0qlGdCKok2vGVArZYtkI+oqejoac3T9zY2x1tP2aPWhN3lZDBTBzlTtdtEjojV7h7lIUr3Mn94KUgd/E22D5wchp8294+O+d9ojtOSJjaLfrKNr/6zUdiDJCAGyE1PSRY4ZEyBSuey7xJ+Q/+fTd65QwnLazP339JCek+pmZ9cPqTkzJtUo5Z09oq2/m4o+b4HLyf5AmYhR1K6f6P65Ffp707Ztw1/tfhjUfNOzmytE9g3D+8tD6khuWJ6GKS50uEX+dhAF8o5+DDMACxDVpnao7XtJanl2vRLpSb8WmUO3XEurRQl3ybmKw1/nfK4cnMvaDTApxl5i73/9gdyN1s8E8ncNlaQuOnmH8biyUvpID/otHDI7z1td6nIyVdr3OtCJ8pntcyUf9x7JB86/pPt2S/A6EECUb+nObGIBE4STO9BSsvxfGLjLp3bf3n+y+JtVBhezh9AJOCUyGFJVQ+TrrUrcrlXfSdmJBcn0UMSKCn8y0jcrolf2dRETWF3qIp4p5SEJ/ObOfivBOy5MyU4KB75rATVHUnhu4i4v01d4hzv+W356Esn/UaqfEbXzjVu6+/QKMNXT9GxEdD5NQ8ZoyG3X9qiA7G8X5xc9vfGUkvG1so+ONabV/HsXB7l0IsQy4q7mJx//qz2ur9YUzrdq/iUGhGl+IeBdf7E4cysjoT9wi5xJM4+7IPt0Gtj6J6F+1yx2/yOLOtbYWhIvdrRzyN+F6R6+goXYhcq8MnXYZQ+8pvoTHYiqoML3IgtpT4BI22VizlHoTy6acT61twxSaZ3fZYUZce+ss/v/9xGpROvTr2NsRgs6EG+vDBssNw58HUevFU/tLJ+X8BAAD//yTCrUI=" } diff --git a/x-pack/metricbeat/module/istio/istiod/_meta/docs.ascoodoc b/x-pack/metricbeat/module/istio/istiod/_meta/docs.asciidoc similarity index 100% rename from x-pack/metricbeat/module/istio/istiod/_meta/docs.ascoodoc rename to x-pack/metricbeat/module/istio/istiod/_meta/docs.asciidoc diff --git a/x-pack/metricbeat/module/istio/istiod/_meta/fields.yml b/x-pack/metricbeat/module/istio/istiod/_meta/fields.yml index 8033a27f5ac..dee384f91b1 100644 --- a/x-pack/metricbeat/module/istio/istiod/_meta/fields.yml +++ b/x-pack/metricbeat/module/istio/istiod/_meta/fields.yml @@ -1 +1,4 @@ -- release: beta +- name: istiod + type: group + release: beta + fields: diff --git a/x-pack/metricbeat/module/istio/module.yml b/x-pack/metricbeat/module/istio/module.yml index de29503fca5..027290884dd 100644 --- a/x-pack/metricbeat/module/istio/module.yml +++ b/x-pack/metricbeat/module/istio/module.yml @@ -1,3 +1,4 @@ name: istio metricsets: - istiod +- proxy diff --git a/x-pack/metricbeat/module/istio/proxy/_meta/docs.asciidoc b/x-pack/metricbeat/module/istio/proxy/_meta/docs.asciidoc new file mode 100644 index 00000000000..4f7aa03a9ef --- /dev/null +++ b/x-pack/metricbeat/module/istio/proxy/_meta/docs.asciidoc @@ -0,0 +1,33 @@ +This is the proxy metricset of the module istio. +This metricset collects metrics from the Envoy proxy's Prometheus exporter for Istio versions higher than 1.5 + +Tested with Istio 1.7 + +[float] +=== Deployment + +Istio-proxy is a sidecar container that is being injected into every Pod that is +being deployed on a Kubernetes cluster which's traffic is managed by Istio. +Because of this reason, in oder to collect metrics from this sidecars we need +to automatically identify these sidecar containers and start monitoring them +using their IP and the predifined port (15090). This can be achieved easily by +defining the proper autodiscover provider that will automatically identifies +all these sidecar containers and will start `proxy` metricset for each one of +them. Here is an example configuration that can be used for that purpose: + + +["source", "yaml"] +-------------------------------------------- +metricbeat.autodiscover: + providers: + - type: kubernetes + include_annotations: ["prometheus.io.scrape"] + templates: + - condition: + contains: + kubernetes.annotations.prometheus.io/path: "/stats/prometheus" + config: + - module: istio + metricsets: ["proxy"] + hosts: "${data.host}:15090" +-------------------------------------------- diff --git a/x-pack/metricbeat/module/istio/proxy/_meta/fields.yml b/x-pack/metricbeat/module/istio/proxy/_meta/fields.yml new file mode 100644 index 00000000000..1c1fa1b036d --- /dev/null +++ b/x-pack/metricbeat/module/istio/proxy/_meta/fields.yml @@ -0,0 +1,4 @@ +- name: proxy + type: group + release: beta + fields: diff --git a/x-pack/metricbeat/module/istio/proxy/_meta/testdata/config.yml b/x-pack/metricbeat/module/istio/proxy/_meta/testdata/config.yml new file mode 100644 index 00000000000..a22f2cf7133 --- /dev/null +++ b/x-pack/metricbeat/module/istio/proxy/_meta/testdata/config.yml @@ -0,0 +1,5 @@ +type: http +url: "/stats/prometheus" +suffix: plain +remove_fields_from_comparison: ["prometheus.labels.instance"] +omit_documented_fields_check: ["prometheus.labels.*"] diff --git a/x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain b/x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain new file mode 100644 index 00000000000..c5a3fb5335d --- /dev/null +++ b/x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain @@ -0,0 +1,1146 @@ +# TYPE istio_requests_total counter +istio_requests_total{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 6 +istio_requests_total{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 5 +istio_requests_total{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 2 +istio_requests_total{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1"} 6 +istio_requests_total{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1"} 3 +istio_requests_total{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2"} 2 +istio_requests_total{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3"} 1 + +# TYPE envoy_cluster_assignment_stale counter +envoy_cluster_assignment_stale{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_assignment_timeout_received counter +envoy_cluster_assignment_timeout_received{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_bind_errors counter +envoy_cluster_bind_errors{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_client_ssl_socket_factory_downstream_context_secrets_not_ready counter +envoy_cluster_client_ssl_socket_factory_downstream_context_secrets_not_ready{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_client_ssl_socket_factory_ssl_context_update_by_sds counter +envoy_cluster_client_ssl_socket_factory_ssl_context_update_by_sds{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_client_ssl_socket_factory_upstream_context_secrets_not_ready counter +envoy_cluster_client_ssl_socket_factory_upstream_context_secrets_not_ready{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_default_total_match_count counter +envoy_cluster_default_total_match_count{cluster_name="xds-grpc"} 473 + +# TYPE envoy_cluster_http2_dropped_headers_with_underscores counter +envoy_cluster_http2_dropped_headers_with_underscores{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_header_overflow counter +envoy_cluster_http2_header_overflow{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_headers_cb_no_stream counter +envoy_cluster_http2_headers_cb_no_stream{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_inbound_empty_frames_flood counter +envoy_cluster_http2_inbound_empty_frames_flood{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_inbound_priority_frames_flood counter +envoy_cluster_http2_inbound_priority_frames_flood{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_inbound_window_update_frames_flood counter +envoy_cluster_http2_inbound_window_update_frames_flood{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_outbound_control_flood counter +envoy_cluster_http2_outbound_control_flood{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_outbound_flood counter +envoy_cluster_http2_outbound_flood{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_requests_rejected_with_underscores_in_headers counter +envoy_cluster_http2_requests_rejected_with_underscores_in_headers{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_rx_messaging_error counter +envoy_cluster_http2_rx_messaging_error{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_rx_reset counter +envoy_cluster_http2_rx_reset{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_too_many_header_frames counter +envoy_cluster_http2_too_many_header_frames{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_trailers counter +envoy_cluster_http2_trailers{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_tx_flush_timeout counter +envoy_cluster_http2_tx_flush_timeout{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_tx_reset counter +envoy_cluster_http2_tx_reset{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_internal_upstream_rq counter +envoy_cluster_internal_upstream_rq{response_code_class="2xx",cluster_name="xds-grpc"} 8 +envoy_cluster_internal_upstream_rq{response_code_class="5xx",cluster_name="xds-grpc"} 4 + +# TYPE envoy_cluster_internal_upstream_rq_200 counter +envoy_cluster_internal_upstream_rq_200{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_internal_upstream_rq_503 counter +envoy_cluster_internal_upstream_rq_503{cluster_name="xds-grpc"} 4 + +# TYPE envoy_cluster_internal_upstream_rq_completed counter +envoy_cluster_internal_upstream_rq_completed{cluster_name="xds-grpc"} 12 + +# TYPE envoy_cluster_lb_healthy_panic counter +envoy_cluster_lb_healthy_panic{cluster_name="xds-grpc"} 4 + +# TYPE envoy_cluster_lb_local_cluster_not_ok counter +envoy_cluster_lb_local_cluster_not_ok{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_recalculate_zone_structures counter +envoy_cluster_lb_recalculate_zone_structures{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_subsets_created counter +envoy_cluster_lb_subsets_created{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_subsets_fallback counter +envoy_cluster_lb_subsets_fallback{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_subsets_fallback_panic counter +envoy_cluster_lb_subsets_fallback_panic{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_subsets_removed counter +envoy_cluster_lb_subsets_removed{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_subsets_selected counter +envoy_cluster_lb_subsets_selected{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_zone_cluster_too_small counter +envoy_cluster_lb_zone_cluster_too_small{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_zone_no_capacity_left counter +envoy_cluster_lb_zone_no_capacity_left{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_zone_number_differs counter +envoy_cluster_lb_zone_number_differs{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_zone_routing_all_directly counter +envoy_cluster_lb_zone_routing_all_directly{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_zone_routing_cross_zone counter +envoy_cluster_lb_zone_routing_cross_zone{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_lb_zone_routing_sampled counter +envoy_cluster_lb_zone_routing_sampled{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_membership_change counter +envoy_cluster_membership_change{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_original_dst_host_invalid counter +envoy_cluster_original_dst_host_invalid{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_retry_or_shadow_abandoned counter +envoy_cluster_retry_or_shadow_abandoned{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_ssl_ciphers_ECDHE_RSA_AES128_GCM_SHA256 counter +envoy_cluster_ssl_ciphers_ECDHE_RSA_AES128_GCM_SHA256{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_ssl_connection_error counter +envoy_cluster_ssl_connection_error{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_ssl_curves_X25519 counter +envoy_cluster_ssl_curves_X25519{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_ssl_fail_verify_cert_hash counter +envoy_cluster_ssl_fail_verify_cert_hash{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_ssl_fail_verify_error counter +envoy_cluster_ssl_fail_verify_error{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_ssl_fail_verify_no_cert counter +envoy_cluster_ssl_fail_verify_no_cert{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_ssl_fail_verify_san counter +envoy_cluster_ssl_fail_verify_san{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_ssl_handshake counter +envoy_cluster_ssl_handshake{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_ssl_no_certificate counter +envoy_cluster_ssl_no_certificate{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_ssl_session_reused counter +envoy_cluster_ssl_session_reused{cluster_name="xds-grpc"} 5 + +# TYPE envoy_cluster_ssl_sigalgs_rsa_pss_rsae_sha256 counter +envoy_cluster_ssl_sigalgs_rsa_pss_rsae_sha256{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_ssl_versions_TLSv1_2 counter +envoy_cluster_ssl_versions_TLSv1_2{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_update_attempt counter +envoy_cluster_update_attempt{cluster_name="xds-grpc"} 473 + +# TYPE envoy_cluster_update_empty counter +envoy_cluster_update_empty{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_update_failure counter +envoy_cluster_update_failure{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_update_no_rebuild counter +envoy_cluster_update_no_rebuild{cluster_name="xds-grpc"} 472 + +# TYPE envoy_cluster_update_success counter +envoy_cluster_update_success{cluster_name="xds-grpc"} 473 + +# TYPE envoy_cluster_upstream_cx_close_notify counter +envoy_cluster_upstream_cx_close_notify{cluster_name="xds-grpc"} 7 + +# TYPE envoy_cluster_upstream_cx_connect_attempts_exceeded counter +envoy_cluster_upstream_cx_connect_attempts_exceeded{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_connect_fail counter +envoy_cluster_upstream_cx_connect_fail{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_connect_timeout counter +envoy_cluster_upstream_cx_connect_timeout{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_destroy counter +envoy_cluster_upstream_cx_destroy{cluster_name="xds-grpc"} 7 + +# TYPE envoy_cluster_upstream_cx_destroy_local counter +envoy_cluster_upstream_cx_destroy_local{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_destroy_local_with_active_rq counter +envoy_cluster_upstream_cx_destroy_local_with_active_rq{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_destroy_remote counter +envoy_cluster_upstream_cx_destroy_remote{cluster_name="xds-grpc"} 7 + +# TYPE envoy_cluster_upstream_cx_destroy_remote_with_active_rq counter +envoy_cluster_upstream_cx_destroy_remote_with_active_rq{cluster_name="xds-grpc"} 7 + +# TYPE envoy_cluster_upstream_cx_destroy_with_active_rq counter +envoy_cluster_upstream_cx_destroy_with_active_rq{cluster_name="xds-grpc"} 7 + +# TYPE envoy_cluster_upstream_cx_http1_total counter +envoy_cluster_upstream_cx_http1_total{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_http2_total counter +envoy_cluster_upstream_cx_http2_total{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_upstream_cx_idle_timeout counter +envoy_cluster_upstream_cx_idle_timeout{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_max_requests counter +envoy_cluster_upstream_cx_max_requests{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_upstream_cx_none_healthy counter +envoy_cluster_upstream_cx_none_healthy{cluster_name="xds-grpc"} 4 + +# TYPE envoy_cluster_upstream_cx_overflow counter +envoy_cluster_upstream_cx_overflow{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_pool_overflow counter +envoy_cluster_upstream_cx_pool_overflow{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_protocol_error counter +envoy_cluster_upstream_cx_protocol_error{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_cx_rx_bytes_total counter +envoy_cluster_upstream_cx_rx_bytes_total{cluster_name="xds-grpc"} 1435518 + +# TYPE envoy_cluster_upstream_cx_total counter +envoy_cluster_upstream_cx_total{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_upstream_cx_tx_bytes_total counter +envoy_cluster_upstream_cx_tx_bytes_total{cluster_name="xds-grpc"} 1272824 + +# TYPE envoy_cluster_upstream_flow_control_backed_up_total counter +envoy_cluster_upstream_flow_control_backed_up_total{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_flow_control_drained_total counter +envoy_cluster_upstream_flow_control_drained_total{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_flow_control_paused_reading_total counter +envoy_cluster_upstream_flow_control_paused_reading_total{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_flow_control_resumed_reading_total counter +envoy_cluster_upstream_flow_control_resumed_reading_total{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_internal_redirect_failed_total counter +envoy_cluster_upstream_internal_redirect_failed_total{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_internal_redirect_succeeded_total counter +envoy_cluster_upstream_internal_redirect_succeeded_total{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq counter +envoy_cluster_upstream_rq{response_code_class="2xx",cluster_name="xds-grpc"} 8 +envoy_cluster_upstream_rq{response_code_class="5xx",cluster_name="xds-grpc"} 4 + +# TYPE envoy_cluster_upstream_rq_200 counter +envoy_cluster_upstream_rq_200{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_upstream_rq_503 counter +envoy_cluster_upstream_rq_503{cluster_name="xds-grpc"} 4 + +# TYPE envoy_cluster_upstream_rq_cancelled counter +envoy_cluster_upstream_rq_cancelled{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_completed counter +envoy_cluster_upstream_rq_completed{cluster_name="xds-grpc"} 12 + +# TYPE envoy_cluster_upstream_rq_maintenance_mode counter +envoy_cluster_upstream_rq_maintenance_mode{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_max_duration_reached counter +envoy_cluster_upstream_rq_max_duration_reached{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_pending_failure_eject counter +envoy_cluster_upstream_rq_pending_failure_eject{cluster_name="xds-grpc"} 7 + +# TYPE envoy_cluster_upstream_rq_pending_overflow counter +envoy_cluster_upstream_rq_pending_overflow{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_pending_total counter +envoy_cluster_upstream_rq_pending_total{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_upstream_rq_per_try_timeout counter +envoy_cluster_upstream_rq_per_try_timeout{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_retry counter +envoy_cluster_upstream_rq_retry{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_retry_limit_exceeded counter +envoy_cluster_upstream_rq_retry_limit_exceeded{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_retry_overflow counter +envoy_cluster_upstream_rq_retry_overflow{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_retry_success counter +envoy_cluster_upstream_rq_retry_success{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_rx_reset counter +envoy_cluster_upstream_rq_rx_reset{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_timeout counter +envoy_cluster_upstream_rq_timeout{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_total counter +envoy_cluster_upstream_rq_total{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_upstream_rq_tx_reset counter +envoy_cluster_upstream_rq_tx_reset{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_manager_cds_init_fetch_timeout counter +envoy_cluster_manager_cds_init_fetch_timeout{} 0 + +# TYPE envoy_cluster_manager_cds_update_attempt counter +envoy_cluster_manager_cds_update_attempt{} 23 + +# TYPE envoy_cluster_manager_cds_update_failure counter +envoy_cluster_manager_cds_update_failure{} 7 + +# TYPE envoy_cluster_manager_cds_update_rejected counter +envoy_cluster_manager_cds_update_rejected{} 0 + +# TYPE envoy_cluster_manager_cds_update_success counter +envoy_cluster_manager_cds_update_success{} 15 + +# TYPE envoy_cluster_manager_cluster_added counter +envoy_cluster_manager_cluster_added{} 38 + +# TYPE envoy_cluster_manager_cluster_modified counter +envoy_cluster_manager_cluster_modified{} 3 + +# TYPE envoy_cluster_manager_cluster_removed counter +envoy_cluster_manager_cluster_removed{} 0 + +# TYPE envoy_cluster_manager_cluster_updated counter +envoy_cluster_manager_cluster_updated{} 29 + +# TYPE envoy_cluster_manager_cluster_updated_via_merge counter +envoy_cluster_manager_cluster_updated_via_merge{} 0 + +# TYPE envoy_cluster_manager_update_merge_cancelled counter +envoy_cluster_manager_update_merge_cancelled{} 0 + +# TYPE envoy_cluster_manager_update_out_of_merge_window counter +envoy_cluster_manager_update_out_of_merge_window{} 0 + +# TYPE envoy_listener_manager_lds_init_fetch_timeout counter +envoy_listener_manager_lds_init_fetch_timeout{} 0 + +# TYPE envoy_listener_manager_lds_update_attempt counter +envoy_listener_manager_lds_update_attempt{} 23 + +# TYPE envoy_listener_manager_lds_update_failure counter +envoy_listener_manager_lds_update_failure{} 7 + +# TYPE envoy_listener_manager_lds_update_rejected counter +envoy_listener_manager_lds_update_rejected{} 0 + +# TYPE envoy_listener_manager_lds_update_success counter +envoy_listener_manager_lds_update_success{} 15 + +# TYPE envoy_listener_manager_listener_added counter +envoy_listener_manager_listener_added{} 20 + +# TYPE envoy_listener_manager_listener_create_failure counter +envoy_listener_manager_listener_create_failure{} 0 + +# TYPE envoy_listener_manager_listener_create_success counter +envoy_listener_manager_listener_create_success{} 150 + +# TYPE envoy_listener_manager_listener_in_place_updated counter +envoy_listener_manager_listener_in_place_updated{} 55 + +# TYPE envoy_listener_manager_listener_modified counter +envoy_listener_manager_listener_modified{} 55 + +# TYPE envoy_listener_manager_listener_removed counter +envoy_listener_manager_listener_removed{} 0 + +# TYPE envoy_listener_manager_listener_stopped counter +envoy_listener_manager_listener_stopped{} 0 + +# TYPE envoy_metric_cache_count counter +envoy_metric_cache_count{cache="hit",wasm_filter="stats_filter"} 0 +envoy_metric_cache_count{cache="miss",wasm_filter="stats_filter"} 16 + +# TYPE envoy_server_debug_assertion_failures counter +envoy_server_debug_assertion_failures{} 0 + +# TYPE envoy_server_dynamic_unknown_fields counter +envoy_server_dynamic_unknown_fields{} 0 + +# TYPE envoy_server_envoy_bug_failures counter +envoy_server_envoy_bug_failures{} 0 + +# TYPE envoy_server_main_thread_watchdog_mega_miss counter +envoy_server_main_thread_watchdog_mega_miss{} 5 + +# TYPE envoy_server_main_thread_watchdog_miss counter +envoy_server_main_thread_watchdog_miss{} 14 + +# TYPE envoy_server_static_unknown_fields counter +envoy_server_static_unknown_fields{} 0 + +# TYPE envoy_server_watchdog_mega_miss counter +envoy_server_watchdog_mega_miss{} 8 + +# TYPE envoy_server_watchdog_miss counter +envoy_server_watchdog_miss{} 45 + +# TYPE envoy_server_worker_0_watchdog_mega_miss counter +envoy_server_worker_0_watchdog_mega_miss{} 2 + +# TYPE envoy_server_worker_0_watchdog_miss counter +envoy_server_worker_0_watchdog_miss{} 21 + +# TYPE envoy_server_worker_1_watchdog_mega_miss counter +envoy_server_worker_1_watchdog_mega_miss{} 1 + +# TYPE envoy_server_worker_1_watchdog_miss counter +envoy_server_worker_1_watchdog_miss{} 10 + +# TYPE envoy_wasm_envoy_wasm_runtime_v8_created counter +envoy_wasm_envoy_wasm_runtime_v8_created{} 25 + +# TYPE envoy_wasm_vm_null_cloned counter +envoy_wasm_vm_null_cloned{} 0 + +# TYPE envoy_wasm_vm_null_created counter +envoy_wasm_vm_null_created{} 50 + +# TYPE istio_build gauge +istio_build{component="proxy",tag="1.7.1"} 1 + +# TYPE envoy_cluster_circuit_breakers_default_cx_open gauge +envoy_cluster_circuit_breakers_default_cx_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_default_cx_pool_open gauge +envoy_cluster_circuit_breakers_default_cx_pool_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_default_rq_open gauge +envoy_cluster_circuit_breakers_default_rq_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_default_rq_pending_open gauge +envoy_cluster_circuit_breakers_default_rq_pending_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_default_rq_retry_open gauge +envoy_cluster_circuit_breakers_default_rq_retry_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_high_cx_open gauge +envoy_cluster_circuit_breakers_high_cx_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_high_cx_pool_open gauge +envoy_cluster_circuit_breakers_high_cx_pool_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_high_rq_open gauge +envoy_cluster_circuit_breakers_high_rq_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_high_rq_pending_open gauge +envoy_cluster_circuit_breakers_high_rq_pending_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_circuit_breakers_high_rq_retry_open gauge +envoy_cluster_circuit_breakers_high_rq_retry_open{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_pending_send_bytes gauge +envoy_cluster_http2_pending_send_bytes{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_http2_streams_active gauge +envoy_cluster_http2_streams_active{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_lb_subsets_active gauge +envoy_cluster_lb_subsets_active{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_max_host_weight gauge +envoy_cluster_max_host_weight{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_membership_degraded gauge +envoy_cluster_membership_degraded{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_membership_excluded gauge +envoy_cluster_membership_excluded{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_membership_healthy gauge +envoy_cluster_membership_healthy{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_membership_total gauge +envoy_cluster_membership_total{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_upstream_cx_active gauge +envoy_cluster_upstream_cx_active{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_upstream_cx_rx_bytes_buffered gauge +envoy_cluster_upstream_cx_rx_bytes_buffered{cluster_name="xds-grpc"} 17 + +# TYPE envoy_cluster_upstream_cx_tx_bytes_buffered gauge +envoy_cluster_upstream_cx_tx_bytes_buffered{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_upstream_rq_active gauge +envoy_cluster_upstream_rq_active{cluster_name="xds-grpc"} 1 + +# TYPE envoy_cluster_upstream_rq_pending_active gauge +envoy_cluster_upstream_rq_pending_active{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_version gauge +envoy_cluster_version{cluster_name="xds-grpc"} 0 + +# TYPE envoy_cluster_manager_active_clusters gauge +envoy_cluster_manager_active_clusters{} 38 + +# TYPE envoy_cluster_manager_cds_update_time gauge +envoy_cluster_manager_cds_update_time{} 1602160603301 + +# TYPE envoy_cluster_manager_cds_version gauge +envoy_cluster_manager_cds_version{} 14451656482200925263 + +# TYPE envoy_cluster_manager_warming_clusters gauge +envoy_cluster_manager_warming_clusters{} 0 + +# TYPE envoy_listener_manager_lds_update_time gauge +envoy_listener_manager_lds_update_time{} 1602160603305 + +# TYPE envoy_listener_manager_lds_version gauge +envoy_listener_manager_lds_version{} 14451656482200925263 + +# TYPE envoy_listener_manager_total_filter_chains_draining gauge +envoy_listener_manager_total_filter_chains_draining{} 0 + +# TYPE envoy_listener_manager_total_listeners_active gauge +envoy_listener_manager_total_listeners_active{} 20 + +# TYPE envoy_listener_manager_total_listeners_draining gauge +envoy_listener_manager_total_listeners_draining{} 0 + +# TYPE envoy_listener_manager_total_listeners_warming gauge +envoy_listener_manager_total_listeners_warming{} 0 + +# TYPE envoy_listener_manager_workers_started gauge +envoy_listener_manager_workers_started{} 1 + +# TYPE envoy_server_concurrency gauge +envoy_server_concurrency{} 2 + +# TYPE envoy_server_days_until_first_cert_expiring gauge +envoy_server_days_until_first_cert_expiring{} 0 + +# TYPE envoy_server_hot_restart_epoch gauge +envoy_server_hot_restart_epoch{} 0 + +# TYPE envoy_server_hot_restart_generation gauge +envoy_server_hot_restart_generation{} 1 + +# TYPE envoy_server_live gauge +envoy_server_live{} 1 + +# TYPE envoy_server_memory_allocated gauge +envoy_server_memory_allocated{} 56508688 + +# TYPE envoy_server_memory_heap_size gauge +envoy_server_memory_heap_size{} 97271808 + +# TYPE envoy_server_memory_physical_size gauge +envoy_server_memory_physical_size{} 100016128 + +# TYPE envoy_server_parent_connections gauge +envoy_server_parent_connections{} 0 + +# TYPE envoy_server_state gauge +envoy_server_state{} 0 + +# TYPE envoy_server_stats_recent_lookups gauge +envoy_server_stats_recent_lookups{} 25928 + +# TYPE envoy_server_total_connections gauge +envoy_server_total_connections{} 0 + +# TYPE envoy_server_uptime gauge +envoy_server_uptime{} 19413 + +# TYPE envoy_server_version gauge +envoy_server_version{} 2499155 + +# TYPE envoy_wasm_envoy_wasm_runtime_v8_active gauge +envoy_wasm_envoy_wasm_runtime_v8_active{} 40 + +# TYPE envoy_wasm_vm_null_active gauge +envoy_wasm_vm_null_active{} 20 + +# TYPE istio_request_bytes histogram +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 6 +istio_request_bytes_sum{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 3690 +istio_request_bytes_count{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 6 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 0 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 0 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 0 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 0 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 0 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 4 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 5 +istio_request_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 5 +istio_request_bytes_sum{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 1235 +istio_request_bytes_count{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 5 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 0 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 2 +istio_request_bytes_sum{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 510 +istio_request_bytes_count{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="10"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="25"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="50"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="100"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="250"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="500"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1000"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="2500"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="5000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="10000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="30000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="60000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="300000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="600000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1800000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="3600000"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="+Inf"} 6 +istio_request_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1"} 7500 +istio_request_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1"} 6 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="10"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="25"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="50"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="100"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="250"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="500"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1000"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="2500"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="5000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="10000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="30000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="60000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="300000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="600000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1800000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="3600000"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="+Inf"} 3 +istio_request_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1"} 3750 +istio_request_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1"} 3 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="0.5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="10"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="25"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="50"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="100"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="250"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="500"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1000"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="2500"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="5000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="10000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="30000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="60000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="300000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="600000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1800000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="3600000"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="+Inf"} 2 +istio_request_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2"} 2500 +istio_request_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2"} 2 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="0.5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="5"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="10"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="25"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="50"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="100"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="250"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="500"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1000"} 0 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="2500"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="5000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="10000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="30000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="60000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="300000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="600000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1800000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="3600000"} 1 +istio_request_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="+Inf"} 1 +istio_request_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3"} 1250 +istio_request_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3"} 1 + +# TYPE istio_request_duration_milliseconds histogram +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 5 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 5 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 6 +istio_request_duration_milliseconds_sum{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 712.5 +istio_request_duration_milliseconds_count{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 6 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 5 +istio_request_duration_milliseconds_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 5 +istio_request_duration_milliseconds_sum{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 0 +istio_request_duration_milliseconds_count{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 5 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 2 +istio_request_duration_milliseconds_sum{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 17.5500000000000007105427357601 +istio_request_duration_milliseconds_count{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="5"} 5 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="10"} 5 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="25"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="50"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="100"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="250"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="500"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="2500"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="5000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="10000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="30000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="60000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="300000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="600000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1800000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="3600000"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="+Inf"} 6 +istio_request_duration_milliseconds_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1"} 31.75 +istio_request_duration_milliseconds_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1"} 6 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="0.5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="5"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="10"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="25"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="50"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="100"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="250"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="500"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="2500"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="5000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="10000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="30000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="60000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="300000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="600000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1800000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="3600000"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="+Inf"} 3 +istio_request_duration_milliseconds_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1"} 429.54999999999995452526491135359 +istio_request_duration_milliseconds_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1"} 3 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="0.5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="10"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="25"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="50"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="100"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="250"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="500"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="2500"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="5000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="10000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="30000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="60000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="300000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="600000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1800000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="3600000"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="+Inf"} 2 +istio_request_duration_milliseconds_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2"} 76 +istio_request_duration_milliseconds_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2"} 2 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="0.5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="5"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="10"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="25"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="50"} 0 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="100"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="250"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="500"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="2500"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="5000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="10000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="30000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="60000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="300000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="600000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1800000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="3600000"} 1 +istio_request_duration_milliseconds_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="+Inf"} 1 +istio_request_duration_milliseconds_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3"} 63.5 +istio_request_duration_milliseconds_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3"} 1 + +# TYPE istio_response_bytes histogram +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 6 +istio_response_bytes_sum{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 34500 +istio_response_bytes_count{response_code="200",reporter="destination",source_workload="istio-ingressgateway",source_workload_namespace="istio-system",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_app="istio-ingressgateway",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",destination_app="productpage",destination_version="v1",destination_service="productpage.default.svc.cluster.local",destination_service_name="productpage",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="mutual_tls",source_canonical_service="istio-ingressgateway",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 6 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 0 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 0 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 0 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 0 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 0 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 5 +istio_response_bytes_bucket{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 5 +istio_response_bytes_sum{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 1125.0000000000002273736754432321 +istio_response_bytes_count{response_code="503",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15000",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="UF",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 5 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="0.5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="25"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="50"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="100"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="250"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="500"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="2500"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="5000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="10000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="30000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="60000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="300000"} 0 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="600000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="1800000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="3600000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1",le="+Inf"} 2 +istio_response_bytes_sum{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 800000 +istio_response_bytes_count{response_code="200",reporter="destination",source_workload="unknown",source_workload_namespace="unknown",source_principal="unknown",source_app="unknown",source_version="unknown",destination_workload="productpage-v1",destination_workload_namespace="default",destination_principal="unknown",destination_app="productpage",destination_version="v1",destination_service="172.17.0.12:15090",destination_service_name="InboundPassthroughClusterIpv4",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="none",source_canonical_service="unknown",destination_canonical_service="productpage",source_canonical_revision="latest",destination_canonical_revision="v1"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="0.5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="10"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="25"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="50"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="100"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="250"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="500"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="2500"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="5000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="10000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="30000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="60000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="300000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="600000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="1800000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="3600000"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1",le="+Inf"} 6 +istio_response_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1"} 1830 +istio_response_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="details-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-details",destination_app="details",destination_version="v1",destination_service="details.default.svc.cluster.local",destination_service_name="details",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="details",source_canonical_revision="v1",destination_canonical_revision="v1"} 6 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="0.5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="10"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="25"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="50"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="100"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="250"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="500"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="2500"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="5000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="10000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="30000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="60000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="300000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="600000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="1800000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="3600000"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1",le="+Inf"} 3 +istio_response_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1"} 1405 +istio_response_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v1",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v1",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v1"} 3 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="0.5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="10"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="25"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="50"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="100"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="250"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="500"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="2500"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="5000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="10000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="30000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="60000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="300000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="600000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="1800000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="3600000"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2",le="+Inf"} 2 +istio_response_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2"} 1110 +istio_response_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v2",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v2",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v2"} 2 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="0.5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="5"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="10"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="25"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="50"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="100"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="250"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="500"} 0 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="2500"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="5000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="10000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="30000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="60000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="300000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="600000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="1800000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="3600000"} 1 +istio_response_bytes_bucket{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3",le="+Inf"} 1 +istio_response_bytes_sum{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3"} 545 +istio_response_bytes_count{response_code="200",reporter="source",source_workload="productpage-v1",source_workload_namespace="default",source_principal="spiffe://cluster.local/ns/default/sa/bookinfo-productpage",source_app="productpage",source_version="v1",destination_workload="reviews-v3",destination_workload_namespace="default",destination_principal="spiffe://cluster.local/ns/default/sa/bookinfo-reviews",destination_app="reviews",destination_version="v3",destination_service="reviews.default.svc.cluster.local",destination_service_name="reviews",destination_service_namespace="default",request_protocol="http",response_flags="-",grpc_response_status="",connection_security_policy="unknown",source_canonical_service="productpage",destination_canonical_service="reviews",source_canonical_revision="v1",destination_canonical_revision="v3"} 1 + +# TYPE envoy_cluster_upstream_cx_connect_ms histogram +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="0.5"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="1"} 0 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="5"} 6 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="10"} 7 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="25"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="50"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="100"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="250"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="500"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="1000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="2500"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="5000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="10000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="30000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="60000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="300000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="600000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="1800000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="3600000"} 8 +envoy_cluster_upstream_cx_connect_ms_bucket{cluster_name="xds-grpc",le="+Inf"} 8 +envoy_cluster_upstream_cx_connect_ms_sum{cluster_name="xds-grpc"} 30.8500000000000014210854715202 +envoy_cluster_upstream_cx_connect_ms_count{cluster_name="xds-grpc"} 8 + +# TYPE envoy_cluster_upstream_cx_length_ms histogram +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="0.5"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="1"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="5"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="10"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="25"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="50"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="100"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="250"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="500"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="1000"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="2500"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="5000"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="10000"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="30000"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="60000"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="300000"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="600000"} 0 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="1800000"} 4 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="3600000"} 7 +envoy_cluster_upstream_cx_length_ms_bucket{cluster_name="xds-grpc",le="+Inf"} 7 +envoy_cluster_upstream_cx_length_ms_sum{cluster_name="xds-grpc"} 12450000 +envoy_cluster_upstream_cx_length_ms_count{cluster_name="xds-grpc"} 7 + +# TYPE envoy_server_initialization_time_ms histogram +envoy_server_initialization_time_ms_bucket{le="0.5"} 0 +envoy_server_initialization_time_ms_bucket{le="1"} 0 +envoy_server_initialization_time_ms_bucket{le="5"} 0 +envoy_server_initialization_time_ms_bucket{le="10"} 0 +envoy_server_initialization_time_ms_bucket{le="25"} 0 +envoy_server_initialization_time_ms_bucket{le="50"} 0 +envoy_server_initialization_time_ms_bucket{le="100"} 0 +envoy_server_initialization_time_ms_bucket{le="250"} 0 +envoy_server_initialization_time_ms_bucket{le="500"} 0 +envoy_server_initialization_time_ms_bucket{le="1000"} 0 +envoy_server_initialization_time_ms_bucket{le="2500"} 0 +envoy_server_initialization_time_ms_bucket{le="5000"} 0 +envoy_server_initialization_time_ms_bucket{le="10000"} 1 +envoy_server_initialization_time_ms_bucket{le="30000"} 1 +envoy_server_initialization_time_ms_bucket{le="60000"} 1 +envoy_server_initialization_time_ms_bucket{le="300000"} 1 +envoy_server_initialization_time_ms_bucket{le="600000"} 1 +envoy_server_initialization_time_ms_bucket{le="1800000"} 1 +envoy_server_initialization_time_ms_bucket{le="3600000"} 1 +envoy_server_initialization_time_ms_bucket{le="+Inf"} 1 +envoy_server_initialization_time_ms_sum{} 6650 +envoy_server_initialization_time_ms_count{} 1 + diff --git a/x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain-expected.json b/x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain-expected.json new file mode 100644 index 00000000000..742e696fe76 --- /dev/null +++ b/x-pack/metricbeat/module/istio/proxy/_meta/testdata/proxy.v1.7.1.plain-expected.json @@ -0,0 +1,1365 @@ +[ + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_request_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_request_duration_milliseconds": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_requests_total": { + "counter": 5, + "rate": 0 + }, + "istio_response_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "labels": { + "connection_security_policy": "none", + "destination_app": "productpage", + "destination_canonical_revision": "v1", + "destination_canonical_service": "productpage", + "destination_principal": "unknown", + "destination_service": "172.17.0.12:15000", + "destination_service_name": "InboundPassthroughClusterIpv4", + "destination_service_namespace": "default", + "destination_version": "v1", + "destination_workload": "productpage-v1", + "destination_workload_namespace": "default", + "instance": "127.0.0.1:49701", + "job": "istio", + "reporter": "destination", + "request_protocol": "http", + "response_code": "503", + "response_flags": "UF", + "source_app": "unknown", + "source_canonical_revision": "latest", + "source_canonical_service": "unknown", + "source_principal": "unknown", + "source_version": "unknown", + "source_workload": "unknown", + "source_workload_namespace": "unknown" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_request_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_request_duration_milliseconds": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_requests_total": { + "counter": 2, + "rate": 0 + }, + "istio_response_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "labels": { + "connection_security_policy": "unknown", + "destination_app": "reviews", + "destination_canonical_revision": "v2", + "destination_canonical_service": "reviews", + "destination_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-reviews", + "destination_service": "reviews.default.svc.cluster.local", + "destination_service_name": "reviews", + "destination_service_namespace": "default", + "destination_version": "v2", + "destination_workload": "reviews-v2", + "destination_workload_namespace": "default", + "instance": "127.0.0.1:49701", + "job": "istio", + "reporter": "source", + "request_protocol": "http", + "response_code": "200", + "response_flags": "-", + "source_app": "productpage", + "source_canonical_revision": "v1", + "source_canonical_service": "productpage", + "source_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-productpage", + "source_version": "v1", + "source_workload": "productpage-v1", + "source_workload_namespace": "default" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_request_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_request_duration_milliseconds": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_requests_total": { + "counter": 6, + "rate": 0 + }, + "istio_response_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "labels": { + "connection_security_policy": "unknown", + "destination_app": "details", + "destination_canonical_revision": "v1", + "destination_canonical_service": "details", + "destination_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-details", + "destination_service": "details.default.svc.cluster.local", + "destination_service_name": "details", + "destination_service_namespace": "default", + "destination_version": "v1", + "destination_workload": "details-v1", + "destination_workload_namespace": "default", + "instance": "127.0.0.1:49701", + "job": "istio", + "reporter": "source", + "request_protocol": "http", + "response_code": "200", + "response_flags": "-", + "source_app": "productpage", + "source_canonical_revision": "v1", + "source_canonical_service": "productpage", + "source_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-productpage", + "source_version": "v1", + "source_workload": "productpage-v1", + "source_workload_namespace": "default" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_request_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_request_duration_milliseconds": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_requests_total": { + "counter": 2, + "rate": 0 + }, + "istio_response_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "labels": { + "connection_security_policy": "none", + "destination_app": "productpage", + "destination_canonical_revision": "v1", + "destination_canonical_service": "productpage", + "destination_principal": "unknown", + "destination_service": "172.17.0.12:15090", + "destination_service_name": "InboundPassthroughClusterIpv4", + "destination_service_namespace": "default", + "destination_version": "v1", + "destination_workload": "productpage-v1", + "destination_workload_namespace": "default", + "instance": "127.0.0.1:49701", + "job": "istio", + "reporter": "destination", + "request_protocol": "http", + "response_code": "200", + "response_flags": "-", + "source_app": "unknown", + "source_canonical_revision": "latest", + "source_canonical_service": "unknown", + "source_principal": "unknown", + "source_version": "unknown", + "source_workload": "unknown", + "source_workload_namespace": "unknown" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_request_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_request_duration_milliseconds": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_requests_total": { + "counter": 6, + "rate": 0 + }, + "istio_response_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "labels": { + "connection_security_policy": "mutual_tls", + "destination_app": "productpage", + "destination_canonical_revision": "v1", + "destination_canonical_service": "productpage", + "destination_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-productpage", + "destination_service": "productpage.default.svc.cluster.local", + "destination_service_name": "productpage", + "destination_service_namespace": "default", + "destination_version": "v1", + "destination_workload": "productpage-v1", + "destination_workload_namespace": "default", + "instance": "127.0.0.1:49701", + "job": "istio", + "reporter": "destination", + "request_protocol": "http", + "response_code": "200", + "response_flags": "-", + "source_app": "istio-ingressgateway", + "source_canonical_revision": "latest", + "source_canonical_service": "istio-ingressgateway", + "source_principal": "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account", + "source_version": "unknown", + "source_workload": "istio-ingressgateway", + "source_workload_namespace": "istio-system" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_build": { + "value": 1 + }, + "labels": { + "component": "proxy", + "instance": "127.0.0.1:49701", + "job": "istio", + "tag": "1.7.1" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_request_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_request_duration_milliseconds": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_requests_total": { + "counter": 1, + "rate": 0 + }, + "istio_response_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "labels": { + "connection_security_policy": "unknown", + "destination_app": "reviews", + "destination_canonical_revision": "v3", + "destination_canonical_service": "reviews", + "destination_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-reviews", + "destination_service": "reviews.default.svc.cluster.local", + "destination_service_name": "reviews", + "destination_service_namespace": "default", + "destination_version": "v3", + "destination_workload": "reviews-v3", + "destination_workload_namespace": "default", + "instance": "127.0.0.1:49701", + "job": "istio", + "reporter": "source", + "request_protocol": "http", + "response_code": "200", + "response_flags": "-", + "source_app": "productpage", + "source_canonical_revision": "v1", + "source_canonical_service": "productpage", + "source_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-productpage", + "source_version": "v1", + "source_workload": "productpage-v1", + "source_workload_namespace": "default" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + }, + { + "event": { + "dataset": "istio.proxy", + "duration": 115000, + "module": "istio" + }, + "metricset": { + "name": "proxy", + "period": 10000 + }, + "prometheus": { + "istio_request_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_request_duration_milliseconds": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "istio_requests_total": { + "counter": 3, + "rate": 0 + }, + "istio_response_bytes": { + "histogram": { + "counts": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 0.25, + 0.75, + 3, + 7.5, + 17.5, + 37.5, + 75, + 175, + 375, + 750, + 1750, + 3750, + 7500, + 20000, + 45000, + 180000, + 450000, + 1200000, + 2700000, + 5400000 + ] + } + }, + "labels": { + "connection_security_policy": "unknown", + "destination_app": "reviews", + "destination_canonical_revision": "v1", + "destination_canonical_service": "reviews", + "destination_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-reviews", + "destination_service": "reviews.default.svc.cluster.local", + "destination_service_name": "reviews", + "destination_service_namespace": "default", + "destination_version": "v1", + "destination_workload": "reviews-v1", + "destination_workload_namespace": "default", + "instance": "127.0.0.1:49701", + "job": "istio", + "reporter": "source", + "request_protocol": "http", + "response_code": "200", + "response_flags": "-", + "source_app": "productpage", + "source_canonical_revision": "v1", + "source_canonical_service": "productpage", + "source_principal": "spiffe://cluster.local/ns/default/sa/bookinfo-productpage", + "source_version": "v1", + "source_workload": "productpage-v1", + "source_workload_namespace": "default" + } + }, + "service": { + "address": "127.0.0.1:55555", + "type": "istio" + } + } +] \ No newline at end of file diff --git a/x-pack/metricbeat/module/istio/proxy/manifest.yml b/x-pack/metricbeat/module/istio/proxy/manifest.yml new file mode 100644 index 00000000000..856d6d5f38e --- /dev/null +++ b/x-pack/metricbeat/module/istio/proxy/manifest.yml @@ -0,0 +1,11 @@ +default: false +input: + module: prometheus + metricset: collector + defaults: + metrics_path: /stats/prometheus + metrics_filters: + include: ["istio_*"] + exclude: ["^up$"] + use_types: true + rate_counters: true diff --git a/x-pack/metricbeat/module/istio/proxy/proxy_test.go b/x-pack/metricbeat/module/istio/proxy/proxy_test.go new file mode 100644 index 00000000000..eec0bfec301 --- /dev/null +++ b/x-pack/metricbeat/module/istio/proxy/proxy_test.go @@ -0,0 +1,32 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +// +build !integration + +package proxy + +import ( + "os" + "testing" + + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/metricbeat/mb" + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + + // Register input module and metricset + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/prometheus" + _ "github.com/elastic/beats/v7/x-pack/metricbeat/module/prometheus/collector" +) + +func init() { + // To be moved to some kind of helper + os.Setenv("BEAT_STRICT_PERMS", "false") + mb.Registry.SetSecondarySource(mb.NewLightModulesSource("../../../module")) +} + +func TestEventMapping(t *testing.T) { + logp.TestingSetup() + + mbtest.TestDataFiles(t, "istio", "proxy") +} diff --git a/x-pack/metricbeat/modules.d/istio.yml.disabled b/x-pack/metricbeat/modules.d/istio.yml.disabled index b65bcdef949..119bc603d80 100644 --- a/x-pack/metricbeat/modules.d/istio.yml.disabled +++ b/x-pack/metricbeat/modules.d/istio.yml.disabled @@ -42,3 +42,10 @@ period: 10s # use istiod.istio-system:15014, when deploying Metricbeat in a kubernetes cluster as Pod or Daemonset hosts: ['localhost:15014'] + +# Istio proxy to monitor Envoy sidecars for versions after 1.5 of Istio. +- module: istio + metricsets: ['proxy'] + period: 10s + # it's recommended to deploy this metricset with autodiscovery, see metricset's docs for more info + hosts: ['localhost:15090'] From be5c2902cd5c492f98d299740de03cf9d19626b4 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 15 Oct 2020 09:06:27 +0100 Subject: [PATCH 155/156] [BUILD][CI] fetch dependencies with retry (#21614) --- Jenkinsfile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 8f05b4522cd..31d62c416ce 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -275,6 +275,13 @@ def withBeatsEnv(Map args = [:], Closure body) { fi''') } try { + // Add more stability when dependencies are not accessible temporarily + // See https://github.com/elastic/beats/issues/21609 + // retry/try/catch approach reports errors, let's avoid it to keep the + // notifications cleaner. + if (cmd(label: 'Download modules to local cache', script: 'go mod download', returnStatus: true) > 0) { + cmd(label: 'Download modules to local cache - retry', script: 'go mod download', returnStatus: true) + } body() } finally { if (archive) { From f8ff7cec3c28efb747738442fec0a47b2a968841 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 15 Oct 2020 10:28:43 +0100 Subject: [PATCH 156/156] [CI] Enable build stage for arm architecture (#21284) --- .ci/scripts/install-go.sh | 15 +++++++++++++-- Jenkinsfile | 23 +++++++++++++++++------ auditbeat/Jenkinsfile.yml | 15 ++++++++++++++- filebeat/Jenkinsfile.yml | 13 +++++++++++++ heartbeat/Jenkinsfile.yml | 13 +++++++++++++ journalbeat/Jenkinsfile.yml | 13 +++++++++++++ libbeat/Jenkinsfile.yml | 11 +++++++++++ packetbeat/Jenkinsfile.yml | 13 +++++++++++++ x-pack/auditbeat/Jenkinsfile.yml | 13 +++++++++++++ x-pack/elastic-agent/Jenkinsfile.yml | 13 +++++++++++++ x-pack/filebeat/Jenkinsfile.yml | 13 +++++++++++++ x-pack/functionbeat/Jenkinsfile.yml | 11 +++++++++++ x-pack/libbeat/Jenkinsfile.yml | 13 +++++++++++++ 13 files changed, 170 insertions(+), 9 deletions(-) diff --git a/.ci/scripts/install-go.sh b/.ci/scripts/install-go.sh index 49e12c7a18d..59f56445a80 100755 --- a/.ci/scripts/install-go.sh +++ b/.ci/scripts/install-go.sh @@ -5,7 +5,8 @@ MSG="environment variable missing" GO_VERSION=${GO_VERSION:?$MSG} PROPERTIES_FILE=${PROPERTIES_FILE:-"go_env.properties"} HOME=${HOME:?$MSG} -ARCH=$(uname -s| tr '[:upper:]' '[:lower:]') +OS=$(uname -s| tr '[:upper:]' '[:lower:]') +ARCH=$(uname -m| tr '[:upper:]' '[:lower:]') GVM_CMD="${HOME}/bin/gvm" if command -v go @@ -19,10 +20,20 @@ then fi fi +if [ "${ARCH}" == "aarch64" ] ; then + GVM_ARCH_SUFFIX=arm64 +elif [ "${ARCH}" == "x86_64" ] ; then + GVM_ARCH_SUFFIX=amd64 +elif [ "${ARCH}" == "i686" ] ; then + GVM_ARCH_SUFFIX=386 +else + GVM_ARCH_SUFFIX=arm +fi + echo "UNMET DEP: Installing Go" mkdir -p "${HOME}/bin" -curl -sSLo "${GVM_CMD}" "https://github.com/andrewkroh/gvm/releases/download/v0.2.2/gvm-${ARCH}-amd64" +curl -sSLo "${GVM_CMD}" "https://github.com/andrewkroh/gvm/releases/download/v0.2.2/gvm-${OS}-${GVM_ARCH_SUFFIX}" chmod +x "${GVM_CMD}" gvm ${GO_VERSION}|cut -d ' ' -f 2|tr -d '\"' > ${PROPERTIES_FILE} diff --git a/Jenkinsfile b/Jenkinsfile index 31d62c416ce..f3618d6615f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,7 +17,6 @@ pipeline { DOCKERELASTIC_SECRET = 'secret/observability-team/ci/docker-registry/prod' DOCKER_COMPOSE_VERSION = "1.21.0" DOCKER_REGISTRY = 'docker.elastic.co' - GOX_FLAGS = "-arch amd64" JOB_GCS_BUCKET = 'beats-ci-temp' JOB_GCS_CREDENTIALS = 'beats-ci-gcs-plugin' OSS_MODULE_PATTERN = '^[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' @@ -29,7 +28,7 @@ pipeline { XPACK_MODULE_PATTERN = '^x-pack\\/[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' } options { - timeout(time: 2, unit: 'HOURS') + timeout(time: 3, unit: 'HOURS') buildDiscarder(logRotator(numToKeepStr: '20', artifactNumToKeepStr: '20', daysToKeepStr: '30')) timestamps() ansiColor('xterm') @@ -46,6 +45,7 @@ pipeline { booleanParam(name: 'awsCloudTests', defaultValue: true, description: 'Run AWS cloud integration tests.') string(name: 'awsRegion', defaultValue: 'eu-central-1', description: 'Default AWS region to use for testing.') booleanParam(name: 'runAllStages', defaultValue: false, description: 'Allow to run all stages.') + booleanParam(name: 'armTest', defaultValue: false, description: 'Allow ARM stages.') booleanParam(name: 'macosTest', defaultValue: false, description: 'Allow macOS stages.') string(name: 'PYTEST_ADDOPTS', defaultValue: '', description: 'Additional options to pass to pytest. Use PYTEST_ADDOPTS="-k pattern" to only run tests matching the specified pattern. For retries you can use `--reruns 3 --reruns-delay 15`') } @@ -223,10 +223,17 @@ def withBeatsEnv(Map args = [:], Closure body) { def withModule = args.get('withModule', false) def directory = args.get('directory', '') - def goRoot, path, magefile, pythonEnv, testResults, artifacts + def goRoot, path, magefile, pythonEnv, testResults, artifacts, gox_flags if(isUnix()) { - goRoot = "${env.WORKSPACE}/.gvm/versions/go${GO_VERSION}.${nodeOS()}.amd64" + if (isArm() && is64arm()) { + // TODO: nodeOS() should support ARM + goRoot = "${env.WORKSPACE}/.gvm/versions/go${GO_VERSION}.linux.arm64" + gox_flags = '-arch arm' + } else { + goRoot = "${env.WORKSPACE}/.gvm/versions/go${GO_VERSION}.${nodeOS()}.amd64" + gox_flags = '-arch amd64' + } path = "${env.WORKSPACE}/bin:${goRoot}/bin:${env.PATH}" magefile = "${WORKSPACE}/.magefile" pythonEnv = "${WORKSPACE}/python-env" @@ -241,6 +248,7 @@ def withBeatsEnv(Map args = [:], Closure body) { magefile = "${env.WORKSPACE}\\.magefile" testResults = "**\\build\\TEST*.xml" artifacts = "**\\build\\TEST*.out" + gox_flags = '-arch amd64' } deleteDir() @@ -258,7 +266,8 @@ def withBeatsEnv(Map args = [:], Closure body) { "PYTHON_ENV=${pythonEnv}", "RACE_DETECTOR=true", "TEST_COVERAGE=true", - "TEST_TAGS=${env.TEST_TAGS},oracle" + "TEST_TAGS=${env.TEST_TAGS},oracle", + "GOX_FLAGS=${gox_flags}" ]) { if(isDockerInstalled()) { dockerLogin(secret: "${DOCKERELASTIC_SECRET}", registry: "${DOCKER_REGISTRY}") @@ -369,7 +378,9 @@ def archiveTestOutput(Map args = [:]) { def folder = cmd(label: 'Find system-tests', returnStdout: true, script: 'python .ci/scripts/search_system_tests.py').trim() log(level: 'INFO', text: "system-tests='${folder}'. If no empty then let's create a tarball") if (folder.trim()) { - def name = folder.replaceAll('/', '-').replaceAll('\\\\', '-').replaceAll('build', '').replaceAll('^-', '') + '-' + nodeOS() + // TODO: nodeOS() should support ARM + def os_suffix = isArm() ? 'linux' : nodeOS() + def name = folder.replaceAll('/', '-').replaceAll('\\\\', '-').replaceAll('build', '').replaceAll('^-', '') + '-' + os_suffix tar(file: "${name}.tgz", archive: true, dir: folder) } } diff --git a/auditbeat/Jenkinsfile.yml b/auditbeat/Jenkinsfile.yml index 33d708e2635..b3f20af2d37 100644 --- a/auditbeat/Jenkinsfile.yml +++ b/auditbeat/Jenkinsfile.yml @@ -13,9 +13,22 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test auditbeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage build test" - crosscompile: + crosscompile: make: "make -C auditbeat crosscompile" macos: mage: "mage build unitTest" diff --git a/filebeat/Jenkinsfile.yml b/filebeat/Jenkinsfile.yml index ffe2cec98b4..09dbe948c72 100644 --- a/filebeat/Jenkinsfile.yml +++ b/filebeat/Jenkinsfile.yml @@ -13,6 +13,19 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test filebeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage build test" withModule: true ## run the ITs only if the changeset affects a specific module. diff --git a/heartbeat/Jenkinsfile.yml b/heartbeat/Jenkinsfile.yml index 8d8b00a865d..1d41dbe581e 100644 --- a/heartbeat/Jenkinsfile.yml +++ b/heartbeat/Jenkinsfile.yml @@ -13,6 +13,19 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test heartbeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage build test" macos: diff --git a/journalbeat/Jenkinsfile.yml b/journalbeat/Jenkinsfile.yml index 12bb63f4cc6..5715712dd4a 100644 --- a/journalbeat/Jenkinsfile.yml +++ b/journalbeat/Jenkinsfile.yml @@ -13,5 +13,18 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test journalbeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags unitTest: mage: "mage build unitTest" diff --git a/libbeat/Jenkinsfile.yml b/libbeat/Jenkinsfile.yml index 64a43269b13..692400e7253 100644 --- a/libbeat/Jenkinsfile.yml +++ b/libbeat/Jenkinsfile.yml @@ -12,6 +12,17 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test libbeat for arm" + labels: + - "arm" + parameters: + - "armTest" build: mage: "mage build test" crosscompile: diff --git a/packetbeat/Jenkinsfile.yml b/packetbeat/Jenkinsfile.yml index 9fbe272b382..adf6471b82a 100644 --- a/packetbeat/Jenkinsfile.yml +++ b/packetbeat/Jenkinsfile.yml @@ -13,6 +13,19 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test packetbeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage build test" macos: diff --git a/x-pack/auditbeat/Jenkinsfile.yml b/x-pack/auditbeat/Jenkinsfile.yml index 5e0e2223dfa..1294c4681b4 100644 --- a/x-pack/auditbeat/Jenkinsfile.yml +++ b/x-pack/auditbeat/Jenkinsfile.yml @@ -13,6 +13,19 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test x-pack/auditbeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage update build test" withModule: true ## run the ITs only if the changeset affects a specific module. diff --git a/x-pack/elastic-agent/Jenkinsfile.yml b/x-pack/elastic-agent/Jenkinsfile.yml index a36472d123b..bf1bfed3ddd 100644 --- a/x-pack/elastic-agent/Jenkinsfile.yml +++ b/x-pack/elastic-agent/Jenkinsfile.yml @@ -13,6 +13,19 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test x-pack/elastic-agent for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage build test" macos: diff --git a/x-pack/filebeat/Jenkinsfile.yml b/x-pack/filebeat/Jenkinsfile.yml index 4b17c13b6ac..5bd2bcd40cf 100644 --- a/x-pack/filebeat/Jenkinsfile.yml +++ b/x-pack/filebeat/Jenkinsfile.yml @@ -13,6 +13,19 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test x-pack/filebeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage build test" withModule: true ## run the ITs only if the changeset affects a specific module. diff --git a/x-pack/functionbeat/Jenkinsfile.yml b/x-pack/functionbeat/Jenkinsfile.yml index 29f2ecf8b5a..ecb2bd14e0e 100644 --- a/x-pack/functionbeat/Jenkinsfile.yml +++ b/x-pack/functionbeat/Jenkinsfile.yml @@ -13,6 +13,17 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test x-pack/functionbeat for arm" + labels: + - "arm" + parameters: + - "armTest" build: mage: "mage build test && GO_VERSION=1.13.1 mage testGCPFunctions" macos: diff --git a/x-pack/libbeat/Jenkinsfile.yml b/x-pack/libbeat/Jenkinsfile.yml index 87019f071a0..ed22a8dfe70 100644 --- a/x-pack/libbeat/Jenkinsfile.yml +++ b/x-pack/libbeat/Jenkinsfile.yml @@ -13,5 +13,18 @@ when: tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: + arm: + mage: "mage build unitTest" + platforms: ## override default label in this specific stage. + - "arm" + when: ## Override the top-level when. + comments: + - "/test x-pack/libbeat for arm" + labels: + - "arm" + parameters: + - "armTest" + branches: true ## for all the branches + tags: true ## for all the tags build: mage: "mage build test"

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 diff --git a/x-pack/metricbeat/module/googlecloud/_meta/kibana/7/dashboard/Metricbeat-googlecloud-pubsub-overview.json b/x-pack/metricbeat/module/googlecloud/_meta/kibana/7/dashboard/Metricbeat-googlecloud-pubsub-overview.json index 52041a1c64c..6b937817527 100644 --- a/x-pack/metricbeat/module/googlecloud/_meta/kibana/7/dashboard/Metricbeat-googlecloud-pubsub-overview.json +++ b/x-pack/metricbeat/module/googlecloud/_meta/kibana/7/dashboard/Metricbeat-googlecloud-pubsub-overview.json @@ -2,7 +2,7 @@ "objects": [ { "attributes": { - "description": "Overview of Googlecloud Pubsub Metrics", + "description": "Overview of Googlecloud PubSub Metrics", "hits": 0, "kibanaSavedObjectMeta": { "searchSourceJSON": { @@ -23,212 +23,242 @@ "title": "Filters" }, "gridData": { - "h": 13, - "i": "575df0fe-b44d-471f-8386-c4bd118a3810", - "w": 10, + "h": 6, + "i": "3674673e-83e6-42df-8392-5284960a12ea", + "w": 48, "x": 0, "y": 0 }, - "panelIndex": "575df0fe-b44d-471f-8386-c4bd118a3810", + "panelIndex": "3674673e-83e6-42df-8392-5284960a12ea", "panelRefName": "panel_0", "title": "Filters", - "version": "7.6.1" + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Subscription Oldest Unacked Message" + "title": "Topic Send Request" }, "gridData": { "h": 13, - "i": "5c336037-7c71-4eab-b544-926aaff73736", - "w": 17, - "x": 11, - "y": 0 + "i": "c1d89f36-43ed-42e6-98a0-8820b28f7953", + "w": 16, + "x": 0, + "y": 6 }, - "panelIndex": "5c336037-7c71-4eab-b544-926aaff73736", + "panelIndex": "c1d89f36-43ed-42e6-98a0-8820b28f7953", "panelRefName": "panel_1", - "title": "Subscription Oldest Unacked Message", - "version": "7.6.1" + "title": "Topic Send Request", + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Subscription Undelivered Messages" + "title": "Topic Oldest Retained Acked Message Age" }, "gridData": { "h": 13, - "i": "389bc633-eeaf-4deb-815c-3a6b8e5d95ac", - "w": 19, - "x": 29, - "y": 0 + "i": "b26a6238-b982-4082-9e4e-3e3d9361a865", + "w": 16, + "x": 16, + "y": 6 }, - "panelIndex": "389bc633-eeaf-4deb-815c-3a6b8e5d95ac", + "panelIndex": "b26a6238-b982-4082-9e4e-3e3d9361a865", "panelRefName": "panel_2", - "title": "Subscription Undelivered Messages", - "version": "7.6.1" + "title": "Topic Oldest Retained Acked Message Age", + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Subscription Backlog Size" + "title": "Topic Oldest Unacked Message Age" }, "gridData": { - "h": 15, - "i": "2e8dc479-ba85-4424-87c4-40b93e801006", - "w": 24, - "x": 0, - "y": 13 + "h": 13, + "i": "c7bbeabc-b158-4bdd-9ba3-9d45264d250b", + "w": 16, + "x": 32, + "y": 6 }, - "panelIndex": "2e8dc479-ba85-4424-87c4-40b93e801006", + "panelIndex": "c7bbeabc-b158-4bdd-9ba3-9d45264d250b", "panelRefName": "panel_3", - "title": "Subscription Backlog Size", - "version": "7.6.1" + "title": "Topic Oldest Unacked Message Age", + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Subscription Pull Request Count" + "title": "Subsciption Oldest Unacked Message" }, "gridData": { - "h": 15, - "i": "aefce32f-71e4-4770-9a4b-bedb2c608abd", - "w": 24, - "x": 24, - "y": 13 + "h": 13, + "i": "b822a795-7086-4559-b7c0-176dfcc7380e", + "w": 16, + "x": 0, + "y": 19 }, - "panelIndex": "aefce32f-71e4-4770-9a4b-bedb2c608abd", + "panelIndex": "b822a795-7086-4559-b7c0-176dfcc7380e", "panelRefName": "panel_4", - "title": "Subscription Pull Request Count", - "version": "7.6.1" + "title": "Subsciption Oldest Unacked Message", + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Topic Message Size" + "title": "Subscription Number of Undelivered Messages" }, "gridData": { - "h": 15, - "i": "ca4cce89-0d1d-4d96-b35f-443a05d1b410", - "w": 24, - "x": 0, - "y": 28 + "h": 13, + "i": "9c99d7bb-88f0-415c-abc1-c12ec1295236", + "w": 16, + "x": 16, + "y": 19 }, - "panelIndex": "ca4cce89-0d1d-4d96-b35f-443a05d1b410", + "panelIndex": "9c99d7bb-88f0-415c-abc1-c12ec1295236", "panelRefName": "panel_5", - "title": "Topic Message Size", - "version": "7.6.1" + "title": "Subscription Number of Undelivered Messages", + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Subscription Undelivered Messages" + "title": "Snapshot Oldest Message" }, "gridData": { - "h": 15, - "i": "95c5c1f6-194c-4814-8281-02fecf7a81a5", - "w": 24, - "x": 24, - "y": 28 + "h": 13, + "i": "8cc0ccbd-5798-4d68-a519-07ef1d9693fd", + "w": 16, + "x": 32, + "y": 32 }, - "panelIndex": "95c5c1f6-194c-4814-8281-02fecf7a81a5", + "panelIndex": "8cc0ccbd-5798-4d68-a519-07ef1d9693fd", "panelRefName": "panel_6", - "title": "Subscription Undelivered Messages", - "version": "7.6.1" + "title": "Snapshot Oldest Message", + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Subscription Pull Message Operation Count" + "title": "Snapshot Number of Messages" }, "gridData": { - "h": 15, - "i": "ab2fad6a-f888-4b49-92c4-c220f3b8669c", - "w": 24, + "h": 13, + "i": "f9e45ec1-72e5-4f49-82cf-2132162d642c", + "w": 16, "x": 0, - "y": 43 + "y": 32 }, - "panelIndex": "ab2fad6a-f888-4b49-92c4-c220f3b8669c", + "panelIndex": "f9e45ec1-72e5-4f49-82cf-2132162d642c", "panelRefName": "panel_7", - "title": "Subscription Pull Message Operation Count", - "version": "7.6.1" + "title": "Snapshot Number of Messages", + "version": "7.9.0" }, { "embeddableConfig": { - "title": "Subscription Sent Message Count" + "title": "Snapshot Backlog Bytes" }, "gridData": { - "h": 15, - "i": "2121bde6-3a01-4339-8508-a20c107c62c9", - "w": 24, - "x": 24, - "y": 43 + "h": 13, + "i": "d8876e62-daf0-4654-8618-8746d5da43e0", + "w": 16, + "x": 16, + "y": 32 }, - "panelIndex": "2121bde6-3a01-4339-8508-a20c107c62c9", + "panelIndex": "d8876e62-daf0-4654-8618-8746d5da43e0", "panelRefName": "panel_8", - "title": "Subscription Sent Message Count", - "version": "7.6.1" + "title": "Snapshot Backlog Bytes", + "version": "7.9.0" + }, + { + "embeddableConfig": { + "title": "Subscription Backlog Bytes" + }, + "gridData": { + "h": 13, + "i": "6079e9ed-da9f-4457-bb3a-7ed20f98605e", + "w": 16, + "x": 32, + "y": 19 + }, + "panelIndex": "6079e9ed-da9f-4457-bb3a-7ed20f98605e", + "panelRefName": "panel_9", + "title": "Subscription Backlog Bytes", + "version": "7.9.0" } ], "timeRestore": false, - "title": "[Metricbeat Googlecloud] Pubsub Overview", + "title": "[Metricbeat Googlecloud] PubSub Overview", "version": 1 }, - "id": "ac97c2f0-6ac5-11ea-b657-e57ec854315f", + "id": "2b0fd7b0-feac-11ea-b032-d59f894a5072", "migrationVersion": { "dashboard": "7.3.0" }, + "namespaces": [ + "default" + ], "references": [ { - "id": "8897e920-6ac5-11ea-b657-e57ec854315f", + "id": "f6e33a00-feaf-11ea-b032-d59f894a5072", "name": "panel_0", "type": "visualization" }, { - "id": "1a83ede0-6ab5-11ea-b657-e57ec854315f", + "id": "bd399790-01a2-11eb-b032-d59f894a5072", "name": "panel_1", - "type": "visualization" + "type": "lens" }, { - "id": "fddf3a50-6ac8-11ea-b657-e57ec854315f", + "id": "25b76dc0-01a2-11eb-b032-d59f894a5072", "name": "panel_2", - "type": "visualization" + "type": "lens" }, { - "id": "5067cf60-6a2b-11ea-b657-e57ec854315f", + "id": "5f97d300-01a1-11eb-b032-d59f894a5072", "name": "panel_3", - "type": "visualization" + "type": "lens" }, { - "id": "8e4a1d50-6ab8-11ea-b657-e57ec854315f", + "id": "403d81e0-01a0-11eb-b032-d59f894a5072", "name": "panel_4", - "type": "visualization" + "type": "lens" }, { - "id": "0cb2b3f0-6abe-11ea-b657-e57ec854315f", + "id": "11d06fc0-01a0-11eb-b032-d59f894a5072", "name": "panel_5", - "type": "visualization" + "type": "lens" }, { - "id": "afe5e1b0-6ab3-11ea-b657-e57ec854315f", + "id": "f3e92c10-019d-11eb-b032-d59f894a5072", "name": "panel_6", - "type": "visualization" + "type": "lens" }, { - "id": "8355dab0-6ab8-11ea-b657-e57ec854315f", + "id": "6de1f430-019d-11eb-b032-d59f894a5072", "name": "panel_7", - "type": "visualization" + "type": "lens" }, { - "id": "97ee1230-6ab8-11ea-b657-e57ec854315f", + "id": "0776dbf0-019f-11eb-b032-d59f894a5072", "name": "panel_8", - "type": "visualization" + "type": "lens" + }, + { + "id": "79d80f10-01a0-11eb-b032-d59f894a5072", + "name": "panel_9", + "type": "lens" } ], "type": "dashboard", - "updated_at": "2020-03-20T16:52:13.023Z", - "version": "WzEwMDUsM10=" + "updated_at": "2020-09-28T16:57:22.839Z", + "version": "WzY5MDQsMV0=" }, { "attributes": { "description": "", "kibanaSavedObjectMeta": { - "searchSourceJSON": {} + "searchSourceJSON": { + "filter": [], + "query": { + "language": "kuery", + "query": "" + } + } }, - "title": "Pubsub Filters [Metricbeat Googlecloud]", + "title": "PubSub Filter [Metricbeat Googlecloud]", "uiStateJSON": {}, "version": 1, "visState": { @@ -237,7 +267,7 @@ "controls": [ { "fieldName": "googlecloud.labels.resource.subscription_id", - "id": "1584720667458", + "id": "1600984143264", "indexPatternRefName": "control_0_index_pattern", "label": "Subscription ID", "options": { @@ -252,7 +282,7 @@ }, { "fieldName": "googlecloud.labels.resource.topic_id", - "id": "1584720684072", + "id": "1600984164459", "indexPatternRefName": "control_1_index_pattern", "label": "Topic ID", "options": { @@ -264,20 +294,53 @@ }, "parent": "", "type": "list" + }, + { + "fieldName": "googlecloud.labels.resource.snapshot_id", + "id": "1601305675297", + "indexPatternRefName": "control_2_index_pattern", + "label": "Snapshot ID", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "", + "type": "list" + }, + { + "fieldName": "googlecloud.labels.metrics.region", + "id": "1601307561260", + "indexPatternRefName": "control_3_index_pattern", + "label": "Region", + "options": { + "dynamicOptions": true, + "multiselect": true, + "order": "desc", + "size": 5, + "type": "terms" + }, + "parent": "", + "type": "list" } ], - "pinFilters": true, - "updateFiltersOnChange": true, - "useTimeFilter": true + "pinFilters": false, + "updateFiltersOnChange": false, + "useTimeFilter": false }, - "title": "Pubsub Filters [Metricbeat Googlecloud]", + "title": "PubSub Filter [Metricbeat Googlecloud]", "type": "input_control_vis" } }, - "id": "8897e920-6ac5-11ea-b657-e57ec854315f", + "id": "f6e33a00-feaf-11ea-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "visualization": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [ { "id": "metricbeat-*", @@ -288,640 +351,1038 @@ "id": "metricbeat-*", "name": "control_1_index_pattern", "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_2_index_pattern", + "type": "index-pattern" + }, + { + "id": "metricbeat-*", + "name": "control_3_index_pattern", + "type": "index-pattern" } ], "type": "visualization", - "updated_at": "2020-03-20T16:34:17.599Z", - "version": "Wzk5MywzXQ==" + "updated_at": "2020-09-28T16:24:38.594Z", + "version": "WzYzNjcsMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Subscription Oldest Unacked Message [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "background_color_rules": [ - { - "id": "e0957450-6ab4-11ea-b946-0f4b813ed42e" - } - ], - "bar_color_rules": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"4f8dae5f-b49c-4a10-8f94-a29039f93919\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.resource.topic_id\\\",\\\"orderBy\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"f0d11f8d-e2f9-408a-9114-a0b9b18142d4\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"1m\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.topic.send_request_count.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-4f8dae5f-b49c-4a10-8f94-a29039f93919\\\":{\\\"label\\\":\\\"Top values of googlecloud.labels.resource.topic_id\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.resource.topic_id\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"id\\\":\\\"4f8dae5f-b49c-4a10-8f94-a29039f93919\\\"},\\\"col-2-f0d11f8d-e2f9-408a-9114-a0b9b18142d4\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"1m\\\"},\\\"id\\\":\\\"f0d11f8d-e2f9-408a-9114-a0b9b18142d4\\\"},\\\"col-3-27a71166-d245-471d-b550-ee0b1899ea88\\\":{\\\"label\\\":\\\"Topic Send Request Count\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"suggestedPriority\\\":0,\\\"sourceField\\\":\\\"googlecloud.pubsub.topic.send_request_count.value\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Topic Send Request Count\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"f0d11f8d-e2f9-408a-9114-a0b9b18142d4\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"4f8dae5f-b49c-4a10-8f94-a29039f93919\" seriesType=\"line\" accessors=\"27a71166-d245-471d-b550-ee0b1899ea88\" columnToLabel=\"{\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\":\\\"Topic Send Request Count\\\",\\\"4f8dae5f-b49c-4a10-8f94-a29039f93919\\\":\\\"Top values of googlecloud.labels.resource.topic_id\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "8a3465a0-6ac6-11ea-a262-61aa6533c46b" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "gauge_color_rules": [ - { - "id": "df2ac0c0-6ab4-11ea-b946-0f4b813ed42e" + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "4f8dae5f-b49c-4a10-8f94-a29039f93919", + "f0d11f8d-e2f9-408a-9114-a0b9b18142d4", + "27a71166-d245-471d-b550-ee0b1899ea88" + ], + "columns": { + "27a71166-d245-471d-b550-ee0b1899ea88": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Topic Send Request Count", + "operationType": "avg", + "scale": "ratio", + "sourceField": "googlecloud.pubsub.topic.send_request_count.value", + "suggestedPriority": 0 + }, + "4f8dae5f-b49c-4a10-8f94-a29039f93919": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.topic_id", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "27a71166-d245-471d-b550-ee0b1899ea88", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.topic_id" + }, + "f0d11f8d-e2f9-408a-9114-a0b9b18142d4": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "1m" + }, + "scale": "interval", + "sourceField": "@timestamp" + } + }, + "indexPatternId": "metricbeat-*" + } } - ], - "gauge_inner_width": 10, - "gauge_style": "half", - "gauge_width": 10, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "filter": { - "language": "kuery", - "query": "event.dataset: \"googlecloud.pubsub\" " - }, - "formatter": "number", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "Oldest Unacknowledged Message(s)", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.subscription.oldest_unacked_message_age.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "max" - } + "accessors": [ + "27a71166-d245-471d-b550-ee0b1899ea88" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "filter", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.subscription_id", - "terms_order_by": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "seriesType": "line", + "splitAccessor": "4f8dae5f-b49c-4a10-8f94-a29039f93919", + "xAccessor": "f0d11f8d-e2f9-408a-9114-a0b9b18142d4" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "metric" - }, - "title": "Pubsub Subscription Oldest Unacked Message [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Topic Send Request [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "1a83ede0-6ab5-11ea-b657-e57ec854315f", + "id": "bd399790-01a2-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-20T16:22:19.360Z", - "version": "Wzk4OCwzXQ==" + "type": "lens", + "updated_at": "2020-09-28T16:24:38.594Z", + "version": "WzYzNjgsMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Subscription Number of Undelivered Messages [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "background_color_rules": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"f0d11f8d-e2f9-408a-9114-a0b9b18142d4\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"1m\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"89c8d41d-6896-470d-8318-c0a691fa638e\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.metrics.region\\\",\\\"orderBy\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.topic.oldest_retained_acked_message_age_by_region.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-f0d11f8d-e2f9-408a-9114-a0b9b18142d4\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"1m\\\"},\\\"id\\\":\\\"f0d11f8d-e2f9-408a-9114-a0b9b18142d4\\\"},\\\"col-2-89c8d41d-6896-470d-8318-c0a691fa638e\\\":{\\\"label\\\":\\\"Top values of googlecloud.labels.metrics.region\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.metrics.region\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"id\\\":\\\"89c8d41d-6896-470d-8318-c0a691fa638e\\\"},\\\"col-3-27a71166-d245-471d-b550-ee0b1899ea88\\\":{\\\"label\\\":\\\"Topic Oldest Retained Acked Message Age By Region\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"suggestedPriority\\\":0,\\\"sourceField\\\":\\\"googlecloud.pubsub.topic.oldest_retained_acked_message_age_by_region.value\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Topic Oldest Retained Acked Message Age By Region\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"f0d11f8d-e2f9-408a-9114-a0b9b18142d4\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"89c8d41d-6896-470d-8318-c0a691fa638e\" seriesType=\"line\" accessors=\"27a71166-d245-471d-b550-ee0b1899ea88\" columnToLabel=\"{\\\"27a71166-d245-471d-b550-ee0b1899ea88\\\":\\\"Topic Oldest Retained Acked Message Age By Region\\\",\\\"89c8d41d-6896-470d-8318-c0a691fa638e\\\":\\\"Top values of googlecloud.labels.metrics.region\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "eed2b050-6ac8-11ea-a765-0512a055c04c" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "f0d11f8d-e2f9-408a-9114-a0b9b18142d4", + "89c8d41d-6896-470d-8318-c0a691fa638e", + "27a71166-d245-471d-b550-ee0b1899ea88" + ], + "columns": { + "27a71166-d245-471d-b550-ee0b1899ea88": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Topic Oldest Retained Acked Message Age By Region", + "operationType": "avg", + "scale": "ratio", + "sourceField": "googlecloud.pubsub.topic.oldest_retained_acked_message_age_by_region.value", + "suggestedPriority": 0 + }, + "89c8d41d-6896-470d-8318-c0a691fa638e": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.metrics.region", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "27a71166-d245-471d-b550-ee0b1899ea88", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.metrics.region" + }, + "f0d11f8d-e2f9-408a-9114-a0b9b18142d4": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "1m" + }, + "scale": "interval", + "sourceField": "@timestamp" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "formatter": "number", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "Number of Undelivered Messages", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.subscription.num_undelivered_messages.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "avg" - } + "accessors": [ + "27a71166-d245-471d-b550-ee0b1899ea88" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "everything", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.subscription_id", - "terms_order_by": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "seriesType": "line", + "splitAccessor": "89c8d41d-6896-470d-8318-c0a691fa638e", + "xAccessor": "f0d11f8d-e2f9-408a-9114-a0b9b18142d4" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "metric" - }, - "title": "Pubsub Subscription Number of Undelivered Messages [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Topic Oldest Retained Acked Message Age By Region [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "fddf3a50-6ac8-11ea-b657-e57ec854315f", + "id": "25b76dc0-01a2-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-20T16:36:54.809Z", - "version": "Wzk5NywzXQ==" + "type": "lens", + "updated_at": "2020-09-28T16:24:38.594Z", + "version": "WzYzNjksMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Subscription Backlog Size [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "background_color_rules": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"ed36f31e-ed2a-460a-a881-18e191f75d04\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.metrics.region\\\",\\\"orderBy\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"1m\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.topic.oldest_unacked_message_age_by_region.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-ed36f31e-ed2a-460a-a881-18e191f75d04\\\":{\\\"label\\\":\\\"Top values of googlecloud.labels.metrics.region\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.metrics.region\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"id\\\":\\\"ed36f31e-ed2a-460a-a881-18e191f75d04\\\"},\\\"col-2-6be62612-437b-448d-9631-c6cc0938225d\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"1m\\\"},\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\"},\\\"col-3-5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":{\\\"label\\\":\\\"Topic Oldest Unacked Message Age By Region\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"suggestedPriority\\\":0,\\\"sourceField\\\":\\\"googlecloud.pubsub.topic.oldest_unacked_message_age_by_region.value\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Topic Oldest Unacked Message Age By Region\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"6be62612-437b-448d-9631-c6cc0938225d\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"ed36f31e-ed2a-460a-a881-18e191f75d04\" seriesType=\"line\" accessors=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" columnToLabel=\"{\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":\\\"Topic Oldest Unacked Message Age By Region\\\",\\\"ed36f31e-ed2a-460a-a881-18e191f75d04\\\":\\\"Top values of googlecloud.labels.metrics.region\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "cb6bee00-6a1f-11ea-b594-a5f826db7e0b" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "bar_color_rules": [ + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "ed36f31e-ed2a-460a-a881-18e191f75d04", + "6be62612-437b-448d-9631-c6cc0938225d", + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "columns": { + "0888bf93-1ecf-467a-b0b5-9e0deee6545c": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.topic_id", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "5424865c-c988-4e26-b00b-b3cf90e1e4cf", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.topic_id" + }, + "5424865c-c988-4e26-b00b-b3cf90e1e4cf": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Topic Oldest Unacked Message Age By Region", + "operationType": "avg", + "scale": "ratio", + "sourceField": "googlecloud.pubsub.topic.oldest_unacked_message_age_by_region.value", + "suggestedPriority": 0 + }, + "6be62612-437b-448d-9631-c6cc0938225d": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "1m" + }, + "scale": "interval", + "sourceField": "@timestamp" + }, + "ed36f31e-ed2a-460a-a881-18e191f75d04": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.metrics.region", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "5424865c-c988-4e26-b00b-b3cf90e1e4cf", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.metrics.region" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "id": "cc54ee70-6a1f-11ea-b594-a5f826db7e0b" + "accessors": [ + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "position": "top", + "seriesType": "line", + "showGridlines": false, + "splitAccessor": "ed36f31e-ed2a-460a-a881-18e191f75d04", + "xAccessor": "6be62612-437b-448d-9631-c6cc0938225d" } ], - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "gauge_color_rules": [ + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Topic Oldest Unacked Message Age By Region [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" + }, + "id": "5f97d300-01a1-11eb-b032-d59f894a5072", + "migrationVersion": { + "lens": "7.8.0" + }, + "namespaces": [ + "default" + ], + "references": [], + "type": "lens", + "updated_at": "2020-09-28T16:24:38.594Z", + "version": "WzYzNzAsMV0=" + }, + { + "attributes": { + "description": "", + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"1m\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.resource.subscription_id\\\",\\\"orderBy\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.subscription.oldest_unacked_message_age.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-6be62612-437b-448d-9631-c6cc0938225d\\\":{\\\"dataType\\\":\\\"date\\\",\\\"isBucketed\\\":true,\\\"label\\\":\\\"@timestamp\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"params\\\":{\\\"interval\\\":\\\"1m\\\"},\\\"scale\\\":\\\"interval\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\"},\\\"col-2-2251f8b6-6091-4386-890b-4d0d33e79a96\\\":{\\\"dataType\\\":\\\"string\\\",\\\"isBucketed\\\":true,\\\"label\\\":\\\"Top values of googlecloud.labels.resource.subscription_id\\\",\\\"operationType\\\":\\\"terms\\\",\\\"params\\\":{\\\"orderBy\\\":{\\\"columnId\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"type\\\":\\\"column\\\"},\\\"orderDirection\\\":\\\"desc\\\",\\\"size\\\":3},\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.resource.subscription_id\\\",\\\"id\\\":\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\"},\\\"col-3-5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":{\\\"customLabel\\\":true,\\\"dataType\\\":\\\"number\\\",\\\"isBucketed\\\":false,\\\"label\\\":\\\"Subscription Oldest Unacked Message Age\\\",\\\"operationType\\\":\\\"avg\\\",\\\"scale\\\":\\\"ratio\\\",\\\"sourceField\\\":\\\"googlecloud.pubsub.subscription.oldest_unacked_message_age.value\\\",\\\"suggestedPriority\\\":0,\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Subscription Oldest Unacked Message Age\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"6be62612-437b-448d-9631-c6cc0938225d\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"2251f8b6-6091-4386-890b-4d0d33e79a96\" seriesType=\"line\" accessors=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" columnToLabel=\"{\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":\\\"Subscription Oldest Unacked Message Age\\\",\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\":\\\"Top values of googlecloud.labels.resource.subscription_id\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "cce19e10-6a1f-11ea-b594-a5f826db7e0b" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "gauge_inner_width": 10, - "gauge_style": "half", - "gauge_width": 10, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "6be62612-437b-448d-9631-c6cc0938225d", + "2251f8b6-6091-4386-890b-4d0d33e79a96", + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "columns": { + "2251f8b6-6091-4386-890b-4d0d33e79a96": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.subscription_id", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "5424865c-c988-4e26-b00b-b3cf90e1e4cf", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.subscription_id" + }, + "5424865c-c988-4e26-b00b-b3cf90e1e4cf": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Subscription Oldest Unacked Message Age", + "operationType": "avg", + "scale": "ratio", + "sourceField": "googlecloud.pubsub.subscription.oldest_unacked_message_age.value", + "suggestedPriority": 0 + }, + "6be62612-437b-448d-9631-c6cc0938225d": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "1m" + }, + "scale": "interval", + "sourceField": "@timestamp" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "filter": { - "language": "kuery", - "query": "" - }, - "formatter": "bytes", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.subscription.backlog_bytes.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "avg" - } + "accessors": [ + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.subscription_id", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "position": "top", + "seriesType": "line", + "showGridlines": false, + "splitAccessor": "2251f8b6-6091-4386-890b-4d0d33e79a96", + "xAccessor": "6be62612-437b-448d-9631-c6cc0938225d" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "timeseries" - }, - "title": "Pubsub Subscription Backlog Size [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Subscription Oldest Unacked Message [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "5067cf60-6a2b-11ea-b657-e57ec854315f", + "id": "403d81e0-01a0-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-19T21:48:05.334Z", - "version": "Wzk1NiwzXQ==" + "type": "lens", + "updated_at": "2020-09-28T16:53:54.651Z", + "version": "WzY4NDIsMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Subscription Pull Request Count [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "background_color_rules": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"1m\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.resource.subscription_id\\\",\\\"orderBy\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.subscription.num_undelivered_messages.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-6be62612-437b-448d-9631-c6cc0938225d\\\":{\\\"dataType\\\":\\\"date\\\",\\\"isBucketed\\\":true,\\\"label\\\":\\\"@timestamp\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"params\\\":{\\\"interval\\\":\\\"1m\\\"},\\\"scale\\\":\\\"interval\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\"},\\\"col-2-2251f8b6-6091-4386-890b-4d0d33e79a96\\\":{\\\"dataType\\\":\\\"string\\\",\\\"isBucketed\\\":true,\\\"label\\\":\\\"Top values of googlecloud.labels.resource.subscription_id\\\",\\\"operationType\\\":\\\"terms\\\",\\\"params\\\":{\\\"orderBy\\\":{\\\"columnId\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"type\\\":\\\"column\\\"},\\\"orderDirection\\\":\\\"desc\\\",\\\"size\\\":3},\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.resource.subscription_id\\\",\\\"id\\\":\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\"},\\\"col-3-5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":{\\\"customLabel\\\":true,\\\"dataType\\\":\\\"number\\\",\\\"isBucketed\\\":false,\\\"label\\\":\\\"Subscription Number of Undelivered Messages\\\",\\\"operationType\\\":\\\"avg\\\",\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"bytes\\\",\\\"params\\\":{\\\"decimals\\\":0}}},\\\"scale\\\":\\\"ratio\\\",\\\"sourceField\\\":\\\"googlecloud.pubsub.subscription.num_undelivered_messages.value\\\",\\\"suggestedPriority\\\":0,\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"}}\" | lens_format_column format=\"bytes\" columnId=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" decimals=0}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Subscription Number of Undelivered Messages\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"6be62612-437b-448d-9631-c6cc0938225d\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"2251f8b6-6091-4386-890b-4d0d33e79a96\" seriesType=\"line\" accessors=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" columnToLabel=\"{\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":\\\"Subscription Number of Undelivered Messages\\\",\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\":\\\"Top values of googlecloud.labels.resource.subscription_id\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "e0957450-6ab4-11ea-b946-0f4b813ed42e" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "gauge_color_rules": [ - { - "id": "df2ac0c0-6ab4-11ea-b946-0f4b813ed42e" + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "6be62612-437b-448d-9631-c6cc0938225d", + "2251f8b6-6091-4386-890b-4d0d33e79a96", + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "columns": { + "2251f8b6-6091-4386-890b-4d0d33e79a96": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.subscription_id", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "5424865c-c988-4e26-b00b-b3cf90e1e4cf", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.subscription_id" + }, + "5424865c-c988-4e26-b00b-b3cf90e1e4cf": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Subscription Number of Undelivered Messages", + "operationType": "avg", + "params": { + "format": { + "id": "bytes", + "params": { + "decimals": 0 + } + } + }, + "scale": "ratio", + "sourceField": "googlecloud.pubsub.subscription.num_undelivered_messages.value", + "suggestedPriority": 0 + }, + "6be62612-437b-448d-9631-c6cc0938225d": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "1m" + }, + "scale": "interval", + "sourceField": "@timestamp" + } + }, + "indexPatternId": "metricbeat-*" + } } - ], - "gauge_inner_width": 10, - "gauge_style": "half", - "gauge_width": 10, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "formatter": "number", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.subscription.pull_request_count.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "avg" - } + "accessors": [ + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.subscription_id", - "terms_order_by": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "position": "top", + "seriesType": "line", + "showGridlines": false, + "splitAccessor": "2251f8b6-6091-4386-890b-4d0d33e79a96", + "xAccessor": "6be62612-437b-448d-9631-c6cc0938225d" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "timeseries" - }, - "title": "Pubsub Subscription Pull Request Count [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Subscription Number of Undelivered Messages [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "8e4a1d50-6ab8-11ea-b657-e57ec854315f", + "id": "11d06fc0-01a0-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-20T16:10:38.696Z", - "version": "Wzk3OCwzXQ==" + "type": "lens", + "updated_at": "2020-09-28T16:55:54.581Z", + "version": "WzY4NzYsMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Topic Message Size [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "background_color_rules": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"921ee447-0c37-4e9d-9f42-a491f412baef\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.resource.snapshot_id\\\",\\\"orderBy\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.snapshot.oldest_message_age.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-6be62612-437b-448d-9631-c6cc0938225d\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\"},\\\"col-2-921ee447-0c37-4e9d-9f42-a491f412baef\\\":{\\\"label\\\":\\\"Top values of googlecloud.labels.resource.snapshot_id\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.resource.snapshot_id\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"id\\\":\\\"921ee447-0c37-4e9d-9f42-a491f412baef\\\"},\\\"col-3-5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":{\\\"label\\\":\\\"Snapshot Oldest Message\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"suggestedPriority\\\":0,\\\"sourceField\\\":\\\"googlecloud.pubsub.snapshot.oldest_message_age.value\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Snapshot Oldest Message\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"6be62612-437b-448d-9631-c6cc0938225d\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"921ee447-0c37-4e9d-9f42-a491f412baef\" seriesType=\"line\" accessors=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" columnToLabel=\"{\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":\\\"Snapshot Oldest Message\\\",\\\"921ee447-0c37-4e9d-9f42-a491f412baef\\\":\\\"Top values of googlecloud.labels.resource.snapshot_id\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "e0957450-6ab4-11ea-b946-0f4b813ed42e" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "gauge_color_rules": [ - { - "id": "df2ac0c0-6ab4-11ea-b946-0f4b813ed42e" + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "6be62612-437b-448d-9631-c6cc0938225d", + "921ee447-0c37-4e9d-9f42-a491f412baef", + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "columns": { + "5424865c-c988-4e26-b00b-b3cf90e1e4cf": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Snapshot Oldest Message", + "operationType": "avg", + "scale": "ratio", + "sourceField": "googlecloud.pubsub.snapshot.oldest_message_age.value", + "suggestedPriority": 0 + }, + "6be62612-437b-448d-9631-c6cc0938225d": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp" + }, + "921ee447-0c37-4e9d-9f42-a491f412baef": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.snapshot_id", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "5424865c-c988-4e26-b00b-b3cf90e1e4cf", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.snapshot_id" + } + }, + "indexPatternId": "metricbeat-*" + } } - ], - "gauge_inner_width": 10, - "gauge_style": "half", - "gauge_width": 10, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "formatter": "number", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.topic.message_sizes.bucket_options.Options.ExponentialBuckets.num_finite_buckets.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "avg" - } + "accessors": [ + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.topic_id", - "terms_order_by": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "position": "top", + "seriesType": "line", + "showGridlines": false, + "splitAccessor": "921ee447-0c37-4e9d-9f42-a491f412baef", + "xAccessor": "6be62612-437b-448d-9631-c6cc0938225d" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "timeseries" - }, - "title": "Pubsub Topic Message Size [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Snapshot Oldest Message [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "0cb2b3f0-6abe-11ea-b657-e57ec854315f", + "id": "f3e92c10-019d-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-20T16:53:34.774Z", - "version": "WzEwMDcsM10=" + "type": "lens", + "updated_at": "2020-09-28T16:24:38.594Z", + "version": "WzYzNzMsMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Subscription Undelivered Messages [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"ef2fc668-040b-4c82-9f65-5d3fb25c9536\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.resource.snapshot_id\\\",\\\"orderBy\\\":\\\"_key\\\",\\\"order\\\":\\\"asc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.snapshot.num_messages.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-6be62612-437b-448d-9631-c6cc0938225d\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\"},\\\"col-2-ef2fc668-040b-4c82-9f65-5d3fb25c9536\\\":{\\\"label\\\":\\\"Top values of googlecloud.labels.resource.snapshot_id\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.resource.snapshot_id\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"alphabetical\\\"},\\\"orderDirection\\\":\\\"asc\\\"},\\\"id\\\":\\\"ef2fc668-040b-4c82-9f65-5d3fb25c9536\\\"},\\\"col-3-5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":{\\\"label\\\":\\\"Snapshot Number of Messages\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"suggestedPriority\\\":0,\\\"sourceField\\\":\\\"googlecloud.pubsub.snapshot.num_messages.value\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"customLabel\\\":true,\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"}}\"}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Snapshot Number of Messages\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"6be62612-437b-448d-9631-c6cc0938225d\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"ef2fc668-040b-4c82-9f65-5d3fb25c9536\" seriesType=\"line\" accessors=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" columnToLabel=\"{\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":\\\"Snapshot Number of Messages\\\",\\\"ef2fc668-040b-4c82-9f65-5d3fb25c9536\\\":\\\"Top values of googlecloud.labels.resource.snapshot_id\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "formatter": "number", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.subscription.num_undelivered_messages.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "avg" - } + "id": "metricbeat-*", + "title": "metricbeat-*" + } + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "6be62612-437b-448d-9631-c6cc0938225d", + "ef2fc668-040b-4c82-9f65-5d3fb25c9536", + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "columns": { + "5424865c-c988-4e26-b00b-b3cf90e1e4cf": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Snapshot Number of Messages", + "operationType": "avg", + "scale": "ratio", + "sourceField": "googlecloud.pubsub.snapshot.num_messages.value", + "suggestedPriority": 0 + }, + "6be62612-437b-448d-9631-c6cc0938225d": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp" + }, + "ef2fc668-040b-4c82-9f65-5d3fb25c9536": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.snapshot_id", + "operationType": "terms", + "params": { + "orderBy": { + "type": "alphabetical" + }, + "orderDirection": "asc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.snapshot_id" + } + }, + "indexPatternId": "metricbeat-*" + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ + { + "accessors": [ + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.subscription_id", - "terms_order_by": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "position": "top", + "seriesType": "line", + "showGridlines": false, + "splitAccessor": "ef2fc668-040b-4c82-9f65-5d3fb25c9536", + "xAccessor": "6be62612-437b-448d-9631-c6cc0938225d" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "timeseries" - }, - "title": "Pubsub Subscription Undelivered Messages [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Snapshot Number of Messages [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "afe5e1b0-6ab3-11ea-b657-e57ec854315f", + "id": "6de1f430-019d-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-20T14:04:17.099Z", - "version": "Wzk1OCwzXQ==" + "type": "lens", + "updated_at": "2020-09-28T16:24:38.594Z", + "version": "WzYzNzQsMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Subscription Pull Message Operation Count [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "background_color_rules": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"auto\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"921ee447-0c37-4e9d-9f42-a491f412baef\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.resource.snapshot_id\\\",\\\"orderBy\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.snapshot.backlog_bytes.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-6be62612-437b-448d-9631-c6cc0938225d\\\":{\\\"label\\\":\\\"@timestamp\\\",\\\"dataType\\\":\\\"date\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"isBucketed\\\":true,\\\"scale\\\":\\\"interval\\\",\\\"params\\\":{\\\"interval\\\":\\\"auto\\\"},\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\"},\\\"col-2-921ee447-0c37-4e9d-9f42-a491f412baef\\\":{\\\"label\\\":\\\"Top values of googlecloud.labels.resource.snapshot_id\\\",\\\"dataType\\\":\\\"string\\\",\\\"operationType\\\":\\\"terms\\\",\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.resource.snapshot_id\\\",\\\"isBucketed\\\":true,\\\"params\\\":{\\\"size\\\":3,\\\"orderBy\\\":{\\\"type\\\":\\\"column\\\",\\\"columnId\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"},\\\"orderDirection\\\":\\\"desc\\\"},\\\"id\\\":\\\"921ee447-0c37-4e9d-9f42-a491f412baef\\\"},\\\"col-3-5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":{\\\"label\\\":\\\"Snapshot Backlog Bytes\\\",\\\"dataType\\\":\\\"number\\\",\\\"operationType\\\":\\\"avg\\\",\\\"suggestedPriority\\\":0,\\\"sourceField\\\":\\\"googlecloud.pubsub.snapshot.backlog_bytes.value\\\",\\\"isBucketed\\\":false,\\\"scale\\\":\\\"ratio\\\",\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"bytes\\\",\\\"params\\\":{\\\"decimals\\\":0}}},\\\"customLabel\\\":true,\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"}}\" | lens_format_column format=\"bytes\" columnId=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" decimals=0}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Snapshot Backlog Bytes\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"6be62612-437b-448d-9631-c6cc0938225d\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"921ee447-0c37-4e9d-9f42-a491f412baef\" seriesType=\"line\" accessors=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" columnToLabel=\"{\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":\\\"Snapshot Backlog Bytes\\\",\\\"921ee447-0c37-4e9d-9f42-a491f412baef\\\":\\\"Top values of googlecloud.labels.resource.snapshot_id\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "e0957450-6ab4-11ea-b946-0f4b813ed42e" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "gauge_color_rules": [ - { - "id": "df2ac0c0-6ab4-11ea-b946-0f4b813ed42e" + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "6be62612-437b-448d-9631-c6cc0938225d", + "921ee447-0c37-4e9d-9f42-a491f412baef", + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "columns": { + "5424865c-c988-4e26-b00b-b3cf90e1e4cf": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Snapshot Backlog Bytes", + "operationType": "avg", + "params": { + "format": { + "id": "bytes", + "params": { + "decimals": 0 + } + } + }, + "scale": "ratio", + "sourceField": "googlecloud.pubsub.snapshot.backlog_bytes.value", + "suggestedPriority": 0 + }, + "6be62612-437b-448d-9631-c6cc0938225d": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "@timestamp" + }, + "921ee447-0c37-4e9d-9f42-a491f412baef": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.snapshot_id", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "5424865c-c988-4e26-b00b-b3cf90e1e4cf", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.snapshot_id" + } + }, + "indexPatternId": "metricbeat-*" + } } - ], - "gauge_inner_width": 10, - "gauge_style": "half", - "gauge_width": 10, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "formatter": "number", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.subscription.pull_message_operation_count.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "max" - } + "accessors": [ + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.subscription_id", - "terms_order_by": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "position": "top", + "seriesType": "line", + "showGridlines": false, + "splitAccessor": "921ee447-0c37-4e9d-9f42-a491f412baef", + "xAccessor": "6be62612-437b-448d-9631-c6cc0938225d" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "timeseries" - }, - "title": "Pubsub Subscription Pull Message Operation Count [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Snapshot Backlog Bytes [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "8355dab0-6ab8-11ea-b657-e57ec854315f", + "id": "0776dbf0-019f-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-20T14:38:49.818Z", - "version": "Wzk2MSwzXQ==" + "type": "lens", + "updated_at": "2020-09-28T16:24:38.594Z", + "version": "WzYzNzUsMV0=" }, { "attributes": { "description": "", - "kibanaSavedObjectMeta": { - "searchSourceJSON": {} - }, - "title": "Pubsub Subscription Sent Message Count [Metricbeat Googlecloud]", - "uiStateJSON": {}, - "version": 1, - "visState": { - "aggs": [], - "params": { - "axis_formatter": "number", - "axis_position": "left", - "axis_scale": "normal", - "background_color_rules": [ + "expression": "kibana\n| kibana_context query=\"{\\\"query\\\":\\\"\\\",\\\"language\\\":\\\"kuery\\\"}\" filters=\"[]\"\n| lens_merge_tables layerIds=\"91e62734-6524-424c-b2b5-3974c835dd6c\" \n tables={esaggs index=\"metricbeat-*\" metricsAtAllLevels=true partialRows=true includeFormatHints=true timeFields=\"@timestamp\" aggConfigs=\"[{\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"date_histogram\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"@timestamp\\\",\\\"useNormalizedEsInterval\\\":true,\\\"interval\\\":\\\"1m\\\",\\\"drop_partials\\\":false,\\\"min_doc_count\\\":0,\\\"extended_bounds\\\":{}}},{\\\"id\\\":\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"terms\\\",\\\"schema\\\":\\\"segment\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.labels.resource.subscription_id\\\",\\\"orderBy\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"order\\\":\\\"desc\\\",\\\"size\\\":3,\\\"otherBucket\\\":false,\\\"otherBucketLabel\\\":\\\"Other\\\",\\\"missingBucket\\\":false,\\\"missingBucketLabel\\\":\\\"Missing\\\"}},{\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"enabled\\\":true,\\\"type\\\":\\\"avg\\\",\\\"schema\\\":\\\"metric\\\",\\\"params\\\":{\\\"field\\\":\\\"googlecloud.pubsub.subscription.backlog_bytes.value\\\",\\\"missing\\\":0}}]\" | lens_rename_columns idMap=\"{\\\"col-0-6be62612-437b-448d-9631-c6cc0938225d\\\":{\\\"dataType\\\":\\\"date\\\",\\\"isBucketed\\\":true,\\\"label\\\":\\\"@timestamp\\\",\\\"operationType\\\":\\\"date_histogram\\\",\\\"params\\\":{\\\"interval\\\":\\\"1m\\\"},\\\"scale\\\":\\\"interval\\\",\\\"sourceField\\\":\\\"@timestamp\\\",\\\"id\\\":\\\"6be62612-437b-448d-9631-c6cc0938225d\\\"},\\\"col-2-2251f8b6-6091-4386-890b-4d0d33e79a96\\\":{\\\"dataType\\\":\\\"string\\\",\\\"isBucketed\\\":true,\\\"label\\\":\\\"Top values of googlecloud.labels.resource.subscription_id\\\",\\\"operationType\\\":\\\"terms\\\",\\\"params\\\":{\\\"orderBy\\\":{\\\"columnId\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\",\\\"type\\\":\\\"column\\\"},\\\"orderDirection\\\":\\\"desc\\\",\\\"size\\\":3},\\\"scale\\\":\\\"ordinal\\\",\\\"sourceField\\\":\\\"googlecloud.labels.resource.subscription_id\\\",\\\"id\\\":\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\"},\\\"col-3-5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":{\\\"customLabel\\\":true,\\\"dataType\\\":\\\"number\\\",\\\"isBucketed\\\":false,\\\"label\\\":\\\"Subscription Backlog Bytes\\\",\\\"operationType\\\":\\\"avg\\\",\\\"params\\\":{\\\"format\\\":{\\\"id\\\":\\\"bytes\\\",\\\"params\\\":{\\\"decimals\\\":0}}},\\\"scale\\\":\\\"ratio\\\",\\\"sourceField\\\":\\\"googlecloud.pubsub.subscription.backlog_bytes.value\\\",\\\"suggestedPriority\\\":0,\\\"id\\\":\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\"}}\" | lens_format_column format=\"bytes\" columnId=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" decimals=0}\n| lens_xy_chart xTitle=\"@timestamp\" yTitle=\"Subscription Backlog Bytes\" legend={lens_xy_legendConfig isVisible=true position=\"right\"} fittingFunction=\"None\" \n layers={lens_xy_layer layerId=\"91e62734-6524-424c-b2b5-3974c835dd6c\" hide=false xAccessor=\"6be62612-437b-448d-9631-c6cc0938225d\" yScaleType=\"linear\" xScaleType=\"time\" isHistogram=true splitAccessor=\"2251f8b6-6091-4386-890b-4d0d33e79a96\" seriesType=\"line\" accessors=\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\" columnToLabel=\"{\\\"5424865c-c988-4e26-b00b-b3cf90e1e4cf\\\":\\\"Subscription Backlog Bytes\\\",\\\"2251f8b6-6091-4386-890b-4d0d33e79a96\\\":\\\"Top values of googlecloud.labels.resource.subscription_id\\\"}\"}", + "state": { + "datasourceMetaData": { + "filterableIndexPatterns": [ { - "id": "e0957450-6ab4-11ea-b946-0f4b813ed42e" + "id": "metricbeat-*", + "title": "metricbeat-*" } - ], - "default_index_pattern": "metricbeat-*", - "default_timefield": "@timestamp", - "drop_last_bucket": 0, - "gauge_color_rules": [ - { - "id": "df2ac0c0-6ab4-11ea-b946-0f4b813ed42e" + ] + }, + "datasourceStates": { + "indexpattern": { + "currentIndexPatternId": "metricbeat-*", + "layers": { + "91e62734-6524-424c-b2b5-3974c835dd6c": { + "columnOrder": [ + "6be62612-437b-448d-9631-c6cc0938225d", + "2251f8b6-6091-4386-890b-4d0d33e79a96", + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" + ], + "columns": { + "2251f8b6-6091-4386-890b-4d0d33e79a96": { + "dataType": "string", + "isBucketed": true, + "label": "Top values of googlecloud.labels.resource.subscription_id", + "operationType": "terms", + "params": { + "orderBy": { + "columnId": "5424865c-c988-4e26-b00b-b3cf90e1e4cf", + "type": "column" + }, + "orderDirection": "desc", + "size": 3 + }, + "scale": "ordinal", + "sourceField": "googlecloud.labels.resource.subscription_id" + }, + "5424865c-c988-4e26-b00b-b3cf90e1e4cf": { + "customLabel": true, + "dataType": "number", + "isBucketed": false, + "label": "Subscription Backlog Bytes", + "operationType": "avg", + "params": { + "format": { + "id": "bytes", + "params": { + "decimals": 0 + } + } + }, + "scale": "ratio", + "sourceField": "googlecloud.pubsub.subscription.backlog_bytes.value", + "suggestedPriority": 0 + }, + "6be62612-437b-448d-9631-c6cc0938225d": { + "dataType": "date", + "isBucketed": true, + "label": "@timestamp", + "operationType": "date_histogram", + "params": { + "interval": "1m" + }, + "scale": "interval", + "sourceField": "@timestamp" + } + }, + "indexPatternId": "metricbeat-*" + } } - ], - "gauge_inner_width": 10, - "gauge_style": "half", - "gauge_width": 10, - "id": "61ca57f0-469d-11e7-af02-69e470af7417", - "index_pattern": "metricbeat-*", - "interval": "5m", - "isModelInvalid": false, - "series": [ + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "fittingFunction": "None", + "layers": [ { - "axis_position": "right", - "chart_type": "line", - "color": "#68BC00", - "fill": "0", - "formatter": "number", - "id": "61ca57f1-469d-11e7-af02-69e470af7417", - "label": "", - "line_width": "2", - "metrics": [ - { - "field": "googlecloud.pubsub.subscription.sent_message_count.value", - "id": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "avg" - } + "accessors": [ + "5424865c-c988-4e26-b00b-b3cf90e1e4cf" ], - "point_size": "3", - "separate_axis": 0, - "split_mode": "terms", - "stacked": "none", - "terms_field": "googlecloud.labels.resource.subscription_id", - "terms_order_by": "61ca57f2-469d-11e7-af02-69e470af7417", - "type": "timeseries" + "layerId": "91e62734-6524-424c-b2b5-3974c835dd6c", + "position": "top", + "seriesType": "line", + "showGridlines": false, + "splitAccessor": "2251f8b6-6091-4386-890b-4d0d33e79a96", + "xAccessor": "6be62612-437b-448d-9631-c6cc0938225d" } ], - "show_grid": 1, - "show_legend": 1, - "time_field": "", - "type": "timeseries" - }, - "title": "Pubsub Subscription Sent Message Count [Metricbeat Googlecloud]", - "type": "metrics" - } + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "line" + } + }, + "title": "Subscription Backlog [Metricbeat Googlecloud]", + "visualizationType": "lnsXY" }, - "id": "97ee1230-6ab8-11ea-b657-e57ec854315f", + "id": "79d80f10-01a0-11eb-b032-d59f894a5072", "migrationVersion": { - "visualization": "7.4.2" + "lens": "7.8.0" }, + "namespaces": [ + "default" + ], "references": [], - "type": "visualization", - "updated_at": "2020-03-20T15:12:11.523Z", - "version": "Wzk2NCwzXQ==" + "type": "lens", + "updated_at": "2020-09-28T16:56:57.481Z", + "version": "WzY4OTYsMV0=" } ], - "version": "7.6.1" + "version": "7.9.0" } From 8eb3529199b62192359871fa72998d95ed4e08d3 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Tue, 29 Sep 2020 09:23:22 +0100 Subject: [PATCH 009/156] [CI] Archive build reasons (#21347) --- Jenkinsfile | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9121d0d48cf..27f97aa4b14 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -107,18 +107,11 @@ pipeline { mapParallelTasks["${k}"] = v } } + notifyBuildReason() parallel(mapParallelTasks) } } } - post { - always { - dir("${BASE_DIR}"){ - // Archive the markdown files that contain the build reasons - archiveArtifacts(allowEmptyArchive: false, artifacts: 'build-reasons/*.md') - } - } - } } } post { @@ -546,6 +539,17 @@ def isDockerInstalled(){ } } +/** +* Notify the build reason. +*/ +def notifyBuildReason() { + // Archive the build reason here, since the workspace can be deleted when running the parallel stages. + archiveArtifacts(allowEmptyArchive: true, artifacts: 'build-reasons/*.*') + if (isPR()) { + echo 'TODO: Add a comment with the build reason (this is required to be implemented in the shared library)' + } +} + /** * This class is the one used for running the parallel stages, therefore * its arguments are passed by the beatsStages step. From 452c6d2b9fe2a6831a337e309efa210bcdf91f36 Mon Sep 17 00:00:00 2001 From: Marc Guasch Date: Tue, 29 Sep 2020 10:42:48 +0200 Subject: [PATCH 010/156] [Filebeat] Fix checkpoint (#21344) * fix checkpoint @timestamp already exists * Fix checkpoint @timestamp already existing, test logs * testfile * Updated CHANGELOG * fix ASCIIDOC * remove timestamp renaming since it produced strange error messages about too much compiled scrips * reenable tiemestamp rename * move comment in asciidoc to bugfixes * move comment in asciidoc to bugfixes * fix asciidoc * fix asciidoc * fix tes log * remove empty lines * Fix pipeline and re generate test files * Reorder changelog entry Co-authored-by: bernhard.fluehmann --- CHANGELOG.next.asciidoc | 1 + .../checkpoint/firewall/ingest/pipeline.yml | 21 +- .../test/checkpoint.log-expected.json | 200 +++++++++--------- .../firewall/test/checkpoint_with_time.log | 1 + .../checkpoint_with_time.log-expected.json | 56 +++++ 5 files changed, 171 insertions(+), 108 deletions(-) create mode 100644 x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log create mode 100644 x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log-expected.json diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 13602e72d21..e94e6111d54 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -269,6 +269,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix an error updating file size being logged when EOF is reached. {pull}21048[21048] - Fix error when processing AWS Cloudtrail Digest logs. {pull}21086[21086] {issue}20943[20943] - Provide backwards compatibility for the `append` processor when Elasticsearch is less than 7.10.0. {pull}21159[21159] +- Fix checkpoint module when logs contain time field. {pull}20567[20567] *Heartbeat* diff --git a/x-pack/filebeat/module/checkpoint/firewall/ingest/pipeline.yml b/x-pack/filebeat/module/checkpoint/firewall/ingest/pipeline.yml index d21d421ce0f..d22d9a65eaf 100644 --- a/x-pack/filebeat/module/checkpoint/firewall/ingest/pipeline.yml +++ b/x-pack/filebeat/module/checkpoint/firewall/ingest/pipeline.yml @@ -40,10 +40,14 @@ processors: - message - host ignore_missing: true -- set: - field: '@timestamp' - value: '{{syslog5424_ts}}' - if: ctx.checkpoint?.time == null +- rename: + field: "@timestamp" + target_field: "event.created" + ignore_missing: true +- date: + field: "syslog5424_ts" + formats: ["ISO8601", "UNIX"] + if: "ctx.checkpoint?.time == null" - set: field: event.module value: checkpoint @@ -578,10 +582,10 @@ processors: field: checkpoint.industry_reference target_field: vulnerability.id ignore_missing: true -- rename: - field: checkpoint.time - target_field: '@timestamp' - ignore_missing: true +- date: + field: "checkpoint.time" + formats: ["ISO8601", "UNIX"] + if: "ctx.checkpoint?.time != null" - rename: field: checkpoint.message target_field: message @@ -795,6 +799,7 @@ processors: - checkpoint.xlatesrc - checkpoint.xlatedst - checkpoint.uid + - checkpoint.time - syslog5424_ts ignore_missing: true on_failure: diff --git a/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json index 72aede80ce5..fd07aa51eca 100644 --- a/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json +++ b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json @@ -1,6 +1,6 @@ [ { - "@timestamp": "2020-03-29T13:19:20Z", + "@timestamp": "2020-03-29T13:19:20.000Z", "checkpoint.sys_message": "The eth0 interface is not protected by the anti-spoofing feature. Your network may be at risk", "event.category": [ "network" @@ -27,7 +27,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:20Z", + "@timestamp": "2020-03-29T13:19:20.000Z", "checkpoint.sys_message": "The eth1 interface is not protected by the anti-spoofing feature. Your network may be at risk", "event.category": [ "network" @@ -54,7 +54,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:21Z", + "@timestamp": "2020-03-29T13:19:21.000Z", "checkpoint.sys_message": "installed Standard", "event.category": [ "network" @@ -81,7 +81,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -135,7 +135,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -202,7 +202,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -256,7 +256,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -320,7 +320,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -374,7 +374,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -438,7 +438,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -492,7 +492,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -556,7 +556,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -610,7 +610,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -674,7 +674,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -728,7 +728,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -792,7 +792,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -846,7 +846,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -910,7 +910,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -964,7 +964,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1028,7 +1028,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1082,7 +1082,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1146,7 +1146,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1200,7 +1200,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1264,7 +1264,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1318,7 +1318,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1382,7 +1382,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1436,7 +1436,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1500,7 +1500,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1554,7 +1554,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1618,7 +1618,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1672,7 +1672,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1736,7 +1736,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1790,7 +1790,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1854,7 +1854,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -1908,7 +1908,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -1972,7 +1972,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2026,7 +2026,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -2090,7 +2090,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2144,7 +2144,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:22Z", + "@timestamp": "2020-03-29T13:19:22.000Z", "checkpoint.additional_info": "Access Control Policy : Standard", "checkpoint.audit_status": "Success", "checkpoint.machine": "192.168.1.117", @@ -2192,7 +2192,7 @@ ] }, { - "@timestamp": "2020-03-29T13:19:23Z", + "@timestamp": "2020-03-29T13:19:23.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -2256,7 +2256,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:26Z", + "@timestamp": "2020-03-29T13:20:26.000Z", "checkpoint.blade_name": "Anti Bot & Anti Virus", "checkpoint.information": "policy installation for blade Anti Bot & Anti Virus completed successfully", "event.category": [ @@ -2283,7 +2283,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -2350,7 +2350,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2404,7 +2404,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2458,7 +2458,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2512,7 +2512,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -2576,7 +2576,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2630,7 +2630,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -2694,7 +2694,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2748,7 +2748,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -2812,7 +2812,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2866,7 +2866,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -2930,7 +2930,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -2984,7 +2984,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3048,7 +3048,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3102,7 +3102,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3166,7 +3166,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:28Z", + "@timestamp": "2020-03-29T13:20:28.000Z", "checkpoint.additional_info": "Threat Prevention Policy : Standard", "checkpoint.audit_status": "Success", "checkpoint.machine": "192.168.1.117", @@ -3214,7 +3214,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3268,7 +3268,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3332,7 +3332,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3386,7 +3386,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:29Z", + "@timestamp": "2020-03-29T13:20:29.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3450,7 +3450,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:30Z", + "@timestamp": "2020-03-29T13:20:30.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3504,7 +3504,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:30Z", + "@timestamp": "2020-03-29T13:20:30.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3568,7 +3568,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:30Z", + "@timestamp": "2020-03-29T13:20:30.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3622,7 +3622,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:30Z", + "@timestamp": "2020-03-29T13:20:30.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3686,7 +3686,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:30Z", + "@timestamp": "2020-03-29T13:20:30.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3740,7 +3740,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:30Z", + "@timestamp": "2020-03-29T13:20:30.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3804,7 +3804,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:31Z", + "@timestamp": "2020-03-29T13:20:31.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -3868,7 +3868,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:31Z", + "@timestamp": "2020-03-29T13:20:31.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3922,7 +3922,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:31Z", + "@timestamp": "2020-03-29T13:20:31.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -3976,7 +3976,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:31Z", + "@timestamp": "2020-03-29T13:20:31.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4040,7 +4040,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:31Z", + "@timestamp": "2020-03-29T13:20:31.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -4094,7 +4094,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:31Z", + "@timestamp": "2020-03-29T13:20:31.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4158,7 +4158,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:46Z", + "@timestamp": "2020-03-29T13:20:46.000Z", "checkpoint.sys_message": "The eth0 interface is not protected by the anti-spoofing feature. Your network may be at risk", "event.category": [ "network" @@ -4185,7 +4185,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:46Z", + "@timestamp": "2020-03-29T13:20:46.000Z", "checkpoint.sys_message": "The eth1 interface is not protected by the anti-spoofing feature. Your network may be at risk", "event.category": [ "network" @@ -4212,7 +4212,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:46Z", + "@timestamp": "2020-03-29T13:20:46.000Z", "checkpoint.sys_message": "installed Standard", "event.category": [ "network" @@ -4239,7 +4239,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4306,7 +4306,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -4360,7 +4360,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -4414,7 +4414,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4478,7 +4478,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -4532,7 +4532,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4596,7 +4596,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -4650,7 +4650,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4714,7 +4714,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -4768,7 +4768,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:47Z", + "@timestamp": "2020-03-29T13:20:47.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4832,7 +4832,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -4886,7 +4886,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -4950,7 +4950,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -5004,7 +5004,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -5068,7 +5068,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -5122,7 +5122,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -5186,7 +5186,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -5240,7 +5240,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -5304,7 +5304,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -5358,7 +5358,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -5422,7 +5422,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -5476,7 +5476,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:48Z", + "@timestamp": "2020-03-29T13:20:48.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", @@ -5540,7 +5540,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:49Z", + "@timestamp": "2020-03-29T13:20:49.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.parent_rule": "0", @@ -5594,7 +5594,7 @@ ] }, { - "@timestamp": "2020-03-29T13:20:49Z", + "@timestamp": "2020-03-29T13:20:49.000Z", "checkpoint.logid": "0", "checkpoint.match_id": "1", "checkpoint.nat_addtnl_rulenum": "0", diff --git a/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log new file mode 100644 index 00000000000..c2a7b014e15 --- /dev/null +++ b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log @@ -0,0 +1 @@ +<134>1 2020-03-30T07:20:35Z gw-da58d3 CheckPoint 7776 - [action:"Accept"; flags:"444676"; ifdir:"outbound"; ifname:"eth0"; logid:"0"; loguid:"{0x5e819dc3,0x0,0x353707c7,0xee78a1dc}"; origin:"192.168.1.100"; originsicname:"cn=cp_mgmt,o=gw-da58d3..tmn8s8"; sequencenum:"1"; time:"1594646954"; version:"5"; __policy_id_tag:"product=VPN-1 & FireWall-1[db_tag={880771B0-FD92-2C4F-82FC-B96FC3DE5A07};mgmt=gw-da58d3;date=1585502566;policy_name=Standard\]"; dst:"192.168.1.153"; inzone:"Local"; layer_name:"Network"; layer_uuid:"63b7fe60-76d2-4287-bca5-21af87337b0a"; match_id:"1"; parent_rule:"0"; rule_action:"Accept"; rule_uid:"1fde807b-6300-4b1a-914f-f1c1f3e2e7d2"; outzone:"External"; product:"VPN-1 & FireWall-1"; proto:"17"; s_port:"43103"; service:"514"; service_id:"syslog"; src:"192.168.1.100"] diff --git a/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log-expected.json b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log-expected.json new file mode 100644 index 00000000000..7df3da49b7b --- /dev/null +++ b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint_with_time.log-expected.json @@ -0,0 +1,56 @@ +[ + { + "@timestamp": "2020-07-13T13:29:14.000Z", + "checkpoint.logid": "0", + "checkpoint.match_id": "1", + "checkpoint.parent_rule": "0", + "checkpoint.rule_action": "Accept", + "client.ip": "192.168.1.100", + "client.port": 43103, + "destination.ip": "192.168.1.153", + "destination.port": 514, + "event.action": "Accept", + "event.category": [ + "network" + ], + "event.dataset": "checkpoint.firewall", + "event.id": "{0x5e819dc3,0x0,0x353707c7,0xee78a1dc}", + "event.kind": "event", + "event.module": "checkpoint", + "event.outcome": "success", + "event.sequence": 1, + "event.timezone": "-02:00", + "event.type": [ + "allowed", + "connection" + ], + "fileset.name": "firewall", + "input.type": "log", + "log.offset": 0, + "network.application": "syslog", + "network.direction": "outbound", + "network.iana_number": "17", + "network.name": "Network", + "observer.egress.interface.name": "eth0", + "observer.egress.zone": "External", + "observer.ingress.zone": "Local", + "observer.name": "192.168.1.100", + "observer.product": "VPN-1 & FireWall-1", + "observer.type": "firewall", + "observer.vendor": "Checkpoint", + "related.ip": [ + "192.168.1.100", + "192.168.1.153" + ], + "rule.uuid": "1fde807b-6300-4b1a-914f-f1c1f3e2e7d2", + "server.ip": "192.168.1.153", + "server.port": 514, + "service.type": "checkpoint", + "source.ip": "192.168.1.100", + "source.port": 43103, + "tags": [ + "checkpoint-firewall", + "forwarded" + ] + } +] \ No newline at end of file From 4d18e788be63ad9eb89410a987d03f841efefb90 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Tue, 29 Sep 2020 09:52:54 +0100 Subject: [PATCH 011/156] [CI] Fix runbld when workspace does not exist (#21350) --- Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 27f97aa4b14..119cea9b3ab 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -116,6 +116,8 @@ pipeline { } post { always { + deleteDir() + unstashV2(name: 'source', bucket: "${JOB_GCS_BUCKET}", credentialsId: "${JOB_GCS_CREDENTIALS}") runbld(stashedTestReports: stashedTestReports, project: env.REPO) } cleanup { From b65b12322b01c538c01a543cd98b8e7508c30a40 Mon Sep 17 00:00:00 2001 From: Chris Mark Date: Tue, 29 Sep 2020 12:19:43 +0300 Subject: [PATCH 012/156] Handle multiple upstreams in ingress-controller (#21215) --- CHANGELOG.next.asciidoc | 1 + filebeat/docs/fields.asciidoc | 64 +++- filebeat/module/nginx/fields.go | 2 +- .../nginx/ingress_controller/_meta/fields.yml | 43 ++- .../ingress_controller/ingest/pipeline.yml | 102 +++++- .../nginx/ingress_controller/test/test.log | 1 + .../test/test.log-expected.json | 346 ++++++++++++++++-- 7 files changed, 512 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index e94e6111d54..67d355a2733 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -268,6 +268,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Remove wrongly mapped `tls.client.server_name` from `fortinet/firewall` fileset. {pull}20983[20983] - Fix an error updating file size being logged when EOF is reached. {pull}21048[21048] - Fix error when processing AWS Cloudtrail Digest logs. {pull}21086[21086] {issue}20943[20943] +- Handle multiple upstreams in ingress-controller. {pull}21215[21215] - Provide backwards compatibility for the `append` processor when Elasticsearch is less than 7.10.0. {pull}21159[21159] - Fix checkpoint module when logs contain time field. {pull}20567[20567] diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index b4888ec8c5e..8a145ff8724 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -105135,6 +105135,46 @@ type: array -- +*`nginx.ingress_controller.upstream_address_list`*:: ++ +-- +An array of the upstream addresses. It is a list because it is common that several upstream servers were contacted during request processing. + + +type: keyword + +-- + +*`nginx.ingress_controller.upstream.response.length_list`*:: ++ +-- +An array of upstream response lengths. It is a list because it is common that several upstream servers were contacted during request processing. + + +type: keyword + +-- + +*`nginx.ingress_controller.upstream.response.time_list`*:: ++ +-- +An array of upstream response durations. It is a list because it is common that several upstream servers were contacted during request processing. + + +type: keyword + +-- + +*`nginx.ingress_controller.upstream.response.status_code_list`*:: ++ +-- +An array of upstream response status codes. It is a list because it is common that several upstream servers were contacted during request processing. + + +type: keyword + +-- + *`nginx.ingress_controller.http.request.length`*:: + -- @@ -105182,7 +105222,7 @@ type: keyword *`nginx.ingress_controller.upstream.response.length`*:: + -- -The length of the response obtained from the upstream server +The length of the response obtained from the upstream server. If several servers were contacted during request process, the summary of the multiple response lengths is stored. type: long @@ -105194,7 +105234,7 @@ format: bytes *`nginx.ingress_controller.upstream.response.time`*:: + -- -The time spent on receiving the response from the upstream server as seconds with millisecond resolution +The time spent on receiving the response from the upstream as seconds with millisecond resolution. If several servers were contacted during request process, the summary of the multiple response times is stored. type: double @@ -105206,40 +105246,40 @@ format: duration *`nginx.ingress_controller.upstream.response.status_code`*:: + -- -The status code of the response obtained from the upstream server +The status code of the response obtained from the upstream server. If several servers were contacted during request process, only the status code of the response from the last one is stored in this field. type: long -- -*`nginx.ingress_controller.http.request.id`*:: +*`nginx.ingress_controller.upstream.ip`*:: + -- -The randomly generated ID of the request +The IP address of the upstream server. If several servers were contacted during request process, only the last one is stored in this field. -type: keyword +type: ip -- -*`nginx.ingress_controller.upstream.ip`*:: +*`nginx.ingress_controller.upstream.port`*:: + -- -The IP address of the upstream server. If several servers were contacted during request processing, their addresses are separated by commas. +The port of the upstream server. If several servers were contacted during request process, only the last one is stored in this field. -type: ip +type: long -- -*`nginx.ingress_controller.upstream.port`*:: +*`nginx.ingress_controller.http.request.id`*:: + -- -The port of the upstream server. +The randomly generated ID of the request -type: long +type: keyword -- diff --git a/filebeat/module/nginx/fields.go b/filebeat/module/nginx/fields.go index 2f9e50ceb60..4e622f85db6 100644 --- a/filebeat/module/nginx/fields.go +++ b/filebeat/module/nginx/fields.go @@ -32,5 +32,5 @@ func init() { // AssetNginx returns asset data. // This is the base64 encoded gzipped contents of module/nginx. func AssetNginx() string { - return "eJzsWM9u48YPvucpiP1dfgUSPYAPBYotFsihRVH00Jt3rKFkIqOhSo6c+u2LkeQ/kUe25GS3PUinRDK/7+OQwxnyCV5wvwJfkv/7ASBQcLiCT7/G/z89AFjUXKgOxH4FPz4AAPzCtnEIBQvURpR8CWGL0JqA4xIKcqjZA4BuWcI6Z19QuYIgDT4AFITO6qqFegJvKjzRxyfsa1xBKdzU/ZuEhvh8aYGgEK7GBMTnnO+c0+Q5qh5fp4ivkMfnM/tgyGtP0a7ISUiHH/UcpaTknEsSrDjgmuq1Iw1vfnKQZ0TMfvDlisT4/OQ7K+CiZ4Dn38BYK6iKmsFzAFIwEElhg7lpFIHalzlXFXsIDORz11h8hA0qWdTW09wR+qFQOIN/fEPVxWqLxqIoOHpB+Prn0xeWVyMWbfzra3aB9jsaB8qN5K1wUhDUwII26vrafcmoPjNNru6G7X6t6EO22QfU9PI6MsMvtQnbFWxDqDNBrdkrZhErCVNRKaaLRJ/vl0IaRVnHP2dKiHZZwm4KZ4Vhy/Y+n/9qUEOWRJjkrri5jorLWKgkb4amUwij7PUORYn9PR6nTacwH/JjnbOdG923CabBhEZTONN0FCiC8p54j2BMoTflZVWYktzr1nBu6Mf32LiOYZWHkcp8DmlxR/kwGtddS7rX4aQ28jUvh2pGzGdqeacITpHMlMCaFY1zqYI4T8oYwnw975WSzt97tIwjzdoNJTIN0/3+jZCzD+TRh/eseH9sl8jZTbypC59z44Ps16Scqpx3SbuJOFWc47z92ftFXUGaKkawJPYfFL/rYJODR2H/UQl1BWrmCn1cKt0GHJN2kIQiLN+uYWnhZ/UrOXuPeWjdSt8tHftyXrfy+YgJZNEHKgjlxs3e4Q7n3jEdl1nKbsr9ph7xdpytFo7dYHZpOYUv3M0XtoLGZnexVqhqyrnX2LTVrdQmX8YWcR2PAmHn8Jvk+XPH0uf7iWvp1f8rvfr/DpnwdBYdrTGngvI+HqM937F1cejLsJ1akAqWyoQVpNr5G+H6Y4vQk0JHCv/vFp98efpCHh/7pXwE4+3xy4bt/ofb/gQamRVYbjZu+Ongj20kdU245RJVCOhMrWhByefYZk9BEvXGJYJXlOi2safZWyK5jp1YrUHQVKlbdefFC+5fWYYlasLSR8S4U6KCI811EcYFFG8C7XB8BPMhgs6Ypoo7dv/fNYH7xO1lHzQAb2INxbMgH3SCouwGg4FxX75r8m4RIl8sGT4AexDMkXaHGfXRuTGfwCgo5uytwiuFLVTkHHVvojW75kLVuOvjQ5x7b0fRwQ4VIuoHBe1NsRm5a9y9J8R4y5XbQ4kexQS08PzzSXhLen09R1rXi9cTxJxOuGHd6Ncng+cCFHco8SBrX/UFLx5IJo/ybSPn5b2/a5EvHyMiydkhagRBsTad35t9e0gbvVEHapb0jeK+hIlwY+5ev1gvI/NlZL6MzJeR+TIyX0bm1/UsI/NlZL6MzJeR+b88Mv8nAAD///5cnQ8=" + return "eJzsWcFu4zYQvecrBttLCyT6AB8KFFsskEOLouihNy8tjuTBUhx1SCX13xeUZFmRKFuSkzQLWKdEMue9eTNDDskH+IaHDdic7L93AJ68wQ18+j38/+kOQKNLhUpPbDfw8x0AwG+sK4OQsUCpxJHNwe8R6iFgOIeMDLrkDsDtWfw2ZZtRvgEvFd4BZIRGu01t6gGsKvAEHx5/KHEDuXBVtm8iHMLzpTYEmXAxRSA8fbw+pkpTdK57HQM+Ax6ez2y9IutaiFqRE5HGfuDTUYnR6VMSLNjjlsqtIedf/ORIT4mow+DLGYrh+cU2o4CzFgEe/wCltaBz6BJ49EAOFARQ2GGqKodA9cuUi4IteAayqak03sMOHWl0taepIbRDotAzf/8CqonVHpVGcWDoG8LXvx++sDwr0ajDX1+TkbU/URlwXElaEycHgs6zoA68vjZfEip7Q6Pq7lgftg6tT3YHjy4uryE1/FIqv9/A3vsyEXQlW4dJsBU1U1AuqolEm+9jIpVD2YY/F1II45LIuDmYBfo963U+/1Oh80nUwix3xSx1VEzCQjlZNRw6BzDQ3j6hOGK7xuP40DnIx/zYpqyXRvdlgjmvfOVidubxyFAE5Zp4T9iYA6/y8awwJ7m39cCloZ+usWkew1keJmbmvkmNT5QOo3Hetah7jZ1YIZ/zcshmYvhCLleS4BjIQgrskqwyJjYhLqMyZWE5n2upxPN3DZdpS4uqIUemYbqvL4SUrSeL1l+jeLts58jJRXtzhU+5sl4OW3IcmzlXUbtocS45w2n9s+tJnbE0l4xgTmxfKX7njc0OHvnDayXUGVMLFXq9VLpscIrakRKKsLzdhqU2v2i/krK1mPrarXhvadjmy3YrnzubQBqtp4xQLnT2Bp9waY9pOE9i4+b0N+WEt9NopXDYDSbjkXPw/Go8vxdUOlmFWqBzKl/axsZHXUptsnnYIm7DUiBsDL5Jnj82KG2+n7Bue/WPslf/4ZgJD73ouBJTyiht4xHv90vnBVWxbR2Yjso3PDyzDAtiQVyCmEe4haHZKw8On1CUOZlwKGHHOcJ8RsE6SVXqUYOuhGwO7fbsWOFk8+SsIKctpUGb+/0bCtN5dISEBvI70MZTge+qjK6a+fA70KZ3FPGuEjW4EHA/nEovTkqaLJ/b/2QshfIbiJ0eXtDrrz12DBtQ+LGZ6/vcDVm8b2fue1BWd192rA8/XfYnFEPUG83Vzgw/Hf05ZvRCl6hAQKNKhxoc2RTr+TUjCXyDRE2kQhtzOuqPrGWj/J08YF2VqkH6YHG4AFwoImU8ilWennD6xPdVCPWQ5pIbrAzvlMBt4ra0u2rnXWjZsBfkQQkn8Jh15d1W9bwqvh/xCOZdVRRKuhW9qIyn0uBo8QozTNPCLFlM3q1+9ggBLzRJ1gNbEEyRno63cp03Y1mVA4cpW+3gmfweCjKGmjdhGJsqgI57vNVhmCd78GaF6NMH5mt3okHa3hr0lhk7wh5Jx9YcGv3OMOqIGOVCLuBJRqCwQFK7Jbog6sRZ4ej1DAFPW4pR6/z6Zd2JdKX/JUu8y1mXRMHcx/f+RQswceCweqUSZTUX5gA5WhQV3Hr89ZS/Nej5M57b7e3t9vZ2e3u7vb3d3t5ub8/zud3e3m5vb7e3t9vb//n29r8AAAD//ydZrLw=" } diff --git a/filebeat/module/nginx/ingress_controller/_meta/fields.yml b/filebeat/module/nginx/ingress_controller/_meta/fields.yml index 2c467e3856a..30bc1f5ad9e 100644 --- a/filebeat/module/nginx/ingress_controller/_meta/fields.yml +++ b/filebeat/module/nginx/ingress_controller/_meta/fields.yml @@ -11,6 +11,26 @@ Real source IP is restored to `source.ip`. # ingress-controller specific fields + - name: upstream_address_list + type: keyword + description: > + An array of the upstream addresses. It is a list because it is common that several upstream servers + were contacted during request processing. + - name: upstream.response.length_list + type: keyword + description: > + An array of upstream response lengths. It is a list because it is common that several upstream servers + were contacted during request processing. + - name: upstream.response.time_list + type: keyword + description: > + An array of upstream response durations. It is a list because it is common that several upstream servers + were contacted during request processing. + - name: upstream.response.status_code_list + type: keyword + description: > + An array of upstream response status codes. It is a list because it is common that several upstream servers + were contacted during request processing. - name: http.request.length type: long format: bytes @@ -33,28 +53,33 @@ type: long format: bytes description: > - The length of the response obtained from the upstream server + The length of the response obtained from the upstream server. If several servers were contacted during request process, + the summary of the multiple response lengths is stored. - name: upstream.response.time type: double format: duration description: > - The time spent on receiving the response from the upstream server as seconds with millisecond resolution + The time spent on receiving the response from the upstream as seconds with millisecond resolution. + If several servers were contacted during request process, the summary of the multiple response times is stored. - name: upstream.response.status_code type: long description: > - The status code of the response obtained from the upstream server - - name: http.request.id - type: keyword - description: > - The randomly generated ID of the request + The status code of the response obtained from the upstream server. If several servers were contacted during + request process, only the status code of the response from the last one is stored in this field. - name: upstream.ip type: ip description: > - The IP address of the upstream server. If several servers were contacted during request processing, their addresses are separated by commas. + The IP address of the upstream server. If several servers were contacted during request process, + only the last one is stored in this field. - name: upstream.port type: long description: > - The port of the upstream server. + The port of the upstream server. If several servers were contacted during request process, + only the last one is stored in this field. + - name: http.request.id + type: keyword + description: > + The randomly generated ID of the request - name: body_sent.bytes type: alias diff --git a/filebeat/module/nginx/ingress_controller/ingest/pipeline.yml b/filebeat/module/nginx/ingress_controller/ingest/pipeline.yml index c9f4a5860c7..0eca28c6084 100644 --- a/filebeat/module/nginx/ingress_controller/ingest/pipeline.yml +++ b/filebeat/module/nginx/ingress_controller/ingest/pipeline.yml @@ -12,14 +12,17 @@ processors: %{NUMBER:http.response.status_code:long} %{NUMBER:http.response.body.bytes:long} "(-|%{DATA:http.request.referrer})" "(-|%{DATA:user_agent.original})" %{NUMBER:nginx.ingress_controller.http.request.length:long} %{NUMBER:nginx.ingress_controller.http.request.time:double} \[%{DATA:nginx.ingress_controller.upstream.name}\] - \[%{DATA:nginx.ingress_controller.upstream.alternative_name}\] (%{UPSTREAM_ADDRESS}|-) - (%{NUMBER:nginx.ingress_controller.upstream.response.length:long}|-) (%{NUMBER:nginx.ingress_controller.upstream.response.time:double}|-) - (%{NUMBER:nginx.ingress_controller.upstream.response.status_code:long}|-) %{GREEDYDATA:nginx.ingress_controller.http.request.id} + \[%{DATA:nginx.ingress_controller.upstream.alternative_name}\] (%{UPSTREAM_ADDRESS_LIST:nginx.ingress_controller.upstream_address_list}|-) + (%{UPSTREAM_RESPONSE_LENGTH_LIST:nginx.ingress_controller.upstream.response.length_list}|-) (%{UPSTREAM_RESPONSE_TIME_LIST:nginx.ingress_controller.upstream.response.time_list}|-) + (%{UPSTREAM_RESPONSE_STATUS_CODE_LIST:nginx.ingress_controller.upstream.response.status_code_list}|-) %{GREEDYDATA:nginx.ingress_controller.http.request.id} pattern_definitions: NGINX_HOST: (?:%{IP:destination.ip}|%{NGINX_NOTSEPARATOR:destination.domain})(:%{NUMBER:destination.port})? NGINX_NOTSEPARATOR: "[^\t ,:]+" NGINX_ADDRESS_LIST: (?:%{IP}|%{WORD})("?,?\s*(?:%{IP}|%{WORD}))* - UPSTREAM_ADDRESS: '%{IP:nginx.ingress_controller.upstream.ip}(:%{NUMBER:nginx.ingress_controller.upstream.port})?' + UPSTREAM_ADDRESS_LIST: (?:%{IP}(:%{NUMBER})?)("?,?\s*(?:%{IP}(:%{NUMBER})?))* + UPSTREAM_RESPONSE_LENGTH_LIST: (?:%{NUMBER})("?,?\s*(?:%{NUMBER}))* + UPSTREAM_RESPONSE_TIME_LIST: (?:%{NUMBER})("?,?\s*(?:%{NUMBER}))* + UPSTREAM_RESPONSE_STATUS_CODE_LIST: (?:%{NUMBER})("?,?\s*(?:%{NUMBER}))* ignore_missing: true - grok: field: nginx.ingress_controller.info @@ -33,6 +36,22 @@ processors: field: nginx.ingress_controller.remote_ip_list separator: '"?,?\s+' ignore_missing: true +- split: + field: nginx.ingress_controller.upstream_address_list + separator: '"?,?\s+' + ignore_missing: true +- split: + field: nginx.ingress_controller.upstream.response.length_list + separator: '"?,?\s+' + ignore_missing: true +- split: + field: nginx.ingress_controller.upstream.response.time_list + separator: '"?,?\s+' + ignore_missing: true +- split: + field: nginx.ingress_controller.upstream.response.status_code_list + separator: '"?,?\s+' + ignore_missing: true - split: field: nginx.ingress_controller.origin separator: '"?,?\s+' @@ -41,6 +60,81 @@ processors: field: source.address if: ctx.source?.address == null value: "" +- script: + if: ctx.nginx?.ingress_controller?.upstream?.response?.length_list != null && ctx.nginx.ingress_controller.upstream.response.length_list.length > 0 + lang: painless + source: >- + try { + if (ctx.nginx.ingress_controller.upstream.response.length_list.length == null) { + return; + } + int last_length = 0; + for (def item : ctx.nginx.ingress_controller.upstream.response.length_list) { + last_length = Integer.parseInt(item); + } + ctx.nginx.ingress_controller.upstream.response.length = last_length; + } + catch (Exception e) { + ctx.nginx.ingress_controller.upstream.response.length = null; + } +- script: + if: ctx.nginx?.ingress_controller?.upstream?.response?.time_list != null && ctx.nginx.ingress_controller.upstream.response.time_list.length > 0 + lang: painless + source: >- + try { + if (ctx.nginx.ingress_controller.upstream.response.time_list.length == null) { + return; + } + float res_time = 0; + for (def item : ctx.nginx.ingress_controller.upstream.response.time_list) { + res_time = res_time + Float.parseFloat(item); + } + ctx.nginx.ingress_controller.upstream.response.time = res_time; + } + catch (Exception e) { + ctx.nginx.ingress_controller.upstream.response.time = null; + } +- script: + if: ctx.nginx?.ingress_controller?.upstream?.response?.status_code_list != null && ctx.nginx.ingress_controller.upstream.response.status_code_list.length > 0 + lang: painless + source: >- + try { + if (ctx.nginx.ingress_controller.upstream.response.status_code_list.length == null) { + return; + } + int last_status_code; + for (def item : ctx.nginx.ingress_controller.upstream.response.status_code_list) { + last_status_code = Integer.parseInt(item); + } + ctx.nginx.ingress_controller.upstream.response.status_code = last_status_code; + } + catch (Exception e) { + ctx.nginx.ingress_controller.upstream.response.time = null; + } +- script: + if: ctx.nginx?.ingress_controller?.upstream_address_list != null && ctx.nginx.ingress_controller.upstream_address_list.length > 0 + lang: painless + source: >- + try { + if (ctx.nginx.ingress_controller.upstream_address_list.length == null) { + return; + } + def last_upstream = ""; + for (def item : ctx.nginx.ingress_controller.upstream_address_list) { + last_upstream = item; + } + StringTokenizer tok = new StringTokenizer(last_upstream, ":"); + if (tok.countTokens()>1) { + ctx.nginx.ingress_controller.upstream.ip = tok.nextToken(); + ctx.nginx.ingress_controller.upstream.port = Integer.parseInt(tok.nextToken()); + } else { + ctx.nginx.ingress_controller.upstream.ip = last_upstream; + } + } + catch (Exception e) { + ctx.nginx.ingress_controller.upstream.ip = null; + ctx.nginx.ingress_controller.upstream.port = null; + } - script: if: ctx.nginx?.ingress_controller?.remote_ip_list != null && ctx.nginx.ingress_controller.remote_ip_list.length > 0 lang: painless diff --git a/filebeat/module/nginx/ingress_controller/test/test.log b/filebeat/module/nginx/ingress_controller/test/test.log index 862c03a4af2..c8ba580f64d 100644 --- a/filebeat/module/nginx/ingress_controller/test/test.log +++ b/filebeat/module/nginx/ingress_controller/test/test.log @@ -20,3 +20,4 @@ 192.168.64.1 - - [07/Feb/2020:12:02:38 +0000] "GET /v2 HTTP/1.1" 200 61 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0" 343 0.000 [default-web2-8080] [] 172.17.0.6:8080 61 0.001 200 ba91c30454893c121879396b0a78be79 192.168.64.1 - - [07/Feb/2020:12:02:38 +0000] "GET /favicon.ico HTTP/1.1" 200 59 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0" 262 0.001 [default-web-8080] [] 172.17.0.5:8080 59 0.000 200 98c81aa2d50c67f6fb1fa16d5ce62f8f 192.168.64.1 - - [07/Feb/2020:12:02:42 +0000] "GET /v2/some HTTP/1.1" 200 61 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0" 348 0.001 [default-web2-8080] [] 172.17.0.6:8080 61 0.000 200 835136ae24486dbb4156dcbe21f5d402 +192.168.64.14 - - [07/Feb/2020:12:02:42 +0000] "GET /v2/some HTTP/1.1" 200 61 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0" 348 0.001 [default-web2-8080] [] 172.17.0.6:8080, 172.17.0.7:8080 61, 100 0.100, 0.004 200, 203 835136ae24486dbb4156dcbe21f5d402 diff --git a/filebeat/module/nginx/ingress_controller/test/test.log-expected.json b/filebeat/module/nginx/ingress_controller/test/test.log-expected.json index 4bf393a5906..e8b09bc1abd 100644 --- a/filebeat/module/nginx/ingress_controller/test/test.log-expected.json +++ b/filebeat/module/nginx/ingress_controller/test/test.log-expected.json @@ -28,10 +28,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -73,10 +85,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -118,10 +142,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.001, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.001" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -163,10 +199,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -280,10 +328,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -325,10 +385,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -374,10 +446,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -422,10 +506,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.6", "nginx.ingress_controller.upstream.name": "default-web2-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 61, + "nginx.ingress_controller.upstream.response.length_list": [ + "61" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.001, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.001" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.6:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -471,10 +567,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.002, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.002" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -519,10 +627,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.001, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.001" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -568,10 +688,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.001, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.001" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -616,10 +748,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.002, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.002" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -664,10 +808,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.001, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.001" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -713,10 +869,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.002, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.002" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -761,10 +929,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.6", "nginx.ingress_controller.upstream.name": "default-web2-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 61, + "nginx.ingress_controller.upstream.response.length_list": [ + "61" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.002, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.002" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.6:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -810,10 +990,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -858,10 +1050,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.001, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.001" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -903,10 +1107,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.6", "nginx.ingress_controller.upstream.name": "default-web2-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 61, + "nginx.ingress_controller.upstream.response.length_list": [ + "61" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.001, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.001" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.6:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -951,10 +1167,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.5", "nginx.ingress_controller.upstream.name": "default-web-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 59, + "nginx.ingress_controller.upstream.response.length_list": [ + "59" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.5:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -999,10 +1227,22 @@ "nginx.ingress_controller.upstream.alternative_name": "", "nginx.ingress_controller.upstream.ip": "172.17.0.6", "nginx.ingress_controller.upstream.name": "default-web2-8080", - "nginx.ingress_controller.upstream.port": "8080", + "nginx.ingress_controller.upstream.port": 8080, "nginx.ingress_controller.upstream.response.length": 61, + "nginx.ingress_controller.upstream.response.length_list": [ + "61" + ], "nginx.ingress_controller.upstream.response.status_code": 200, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200" + ], "nginx.ingress_controller.upstream.response.time": 0.0, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.000" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.6:8080" + ], "related.ip": [ "192.168.64.1" ], @@ -1017,5 +1257,69 @@ "user_agent.os.name": "Mac OS X", "user_agent.os.version": "10.14", "user_agent.version": "72.0." + }, + { + "@timestamp": "2020-02-07T12:02:42.000Z", + "event.category": [ + "web" + ], + "event.dataset": "nginx.ingress_controller", + "event.kind": "event", + "event.module": "nginx", + "event.outcome": "success", + "event.timezone": "-02:00", + "event.type": [ + "info" + ], + "fileset.name": "ingress_controller", + "http.request.method": "GET", + "http.response.body.bytes": 61, + "http.response.status_code": 200, + "http.version": "1.1", + "input.type": "log", + "log.offset": 5730, + "nginx.ingress_controller.http.request.id": "835136ae24486dbb4156dcbe21f5d402", + "nginx.ingress_controller.http.request.length": 348, + "nginx.ingress_controller.http.request.time": 0.001, + "nginx.ingress_controller.remote_ip_list": [ + "192.168.64.14" + ], + "nginx.ingress_controller.upstream.alternative_name": "", + "nginx.ingress_controller.upstream.ip": "172.17.0.7", + "nginx.ingress_controller.upstream.name": "default-web2-8080", + "nginx.ingress_controller.upstream.port": 8080, + "nginx.ingress_controller.upstream.response.length": 100, + "nginx.ingress_controller.upstream.response.length_list": [ + "61", + "100" + ], + "nginx.ingress_controller.upstream.response.status_code": 203, + "nginx.ingress_controller.upstream.response.status_code_list": [ + "200", + "203" + ], + "nginx.ingress_controller.upstream.response.time": 0.104, + "nginx.ingress_controller.upstream.response.time_list": [ + "0.100", + "0.004" + ], + "nginx.ingress_controller.upstream_address_list": [ + "172.17.0.6:8080", + "172.17.0.7:8080" + ], + "related.ip": [ + "192.168.64.14" + ], + "service.type": "nginx", + "source.address": "192.168.64.14", + "source.ip": "192.168.64.14", + "url.original": "/v2/some", + "user_agent.device.name": "Mac", + "user_agent.name": "Firefox", + "user_agent.original": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:72.0) Gecko/20100101 Firefox/72.0", + "user_agent.os.full": "Mac OS X 10.14", + "user_agent.os.name": "Mac OS X", + "user_agent.os.version": "10.14", + "user_agent.version": "72.0." } -] \ No newline at end of file +] From 27e8bd36a229fc4a71ee5ef6106912ba1a837b14 Mon Sep 17 00:00:00 2001 From: Adrian Serrano Date: Tue, 29 Sep 2020 11:26:32 +0200 Subject: [PATCH 013/156] Fix panic in cgroups monitoring (#21355) Gosigar's cgroups GetStatsForProcesses can return a nil Stats pointer and no error when the ["blkio", "cpu", "cpuacct", "memory"] subsystems are on the root cgroup. Related #21113 --- libbeat/cmd/instance/metrics.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libbeat/cmd/instance/metrics.go b/libbeat/cmd/instance/metrics.go index fa0d42bbeaf..24d3d12e3e1 100644 --- a/libbeat/cmd/instance/metrics.go +++ b/libbeat/cmd/instance/metrics.go @@ -285,6 +285,10 @@ func reportBeatCgroups(_ monitoring.Mode, V monitoring.Visitor) { logp.Err("error getting group status: %v", err) return } + // GetStatsForProcess returns a nil selfStats and no error when there's no stats + if selfStats == nil { + return + } if cpu := selfStats.CPU; cpu != nil { monitoring.ReportNamespace(V, "cpu", func() { From 8716d98860a03cc77456c7766b8a34f8e3482021 Mon Sep 17 00:00:00 2001 From: Adrian Serrano Date: Tue, 29 Sep 2020 11:29:28 +0200 Subject: [PATCH 014/156] o365input: Restart after fatal error (#21258) Update the o365input to restart the input after a fatal error is encountered, for example an authentication token refresh error or a parsing error. This enables the input to be more resilient against transient errors. Before this patch, the input would index an error document and terminate. Now it will index an error and restart after a fixed timeout of 5 minutes. --- CHANGELOG.next.asciidoc | 1 + x-pack/filebeat/input/o365audit/input.go | 44 +++++++++++++++++------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 67d355a2733..58ca2acb35c 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -175,6 +175,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - [Autodiscover] Handle input-not-finished errors in config reload. {pull}20915[20915] - Explicitly detect missing variables in autodiscover configuration, log them at the debug level. {issue}20568[20568] {pull}20898[20898] - Fix `libbeat.output.write.bytes` and `libbeat.output.read.bytes` metrics of the Elasticsearch output. {issue}20752[20752] {pull}21197[21197] +- The `o365input` and `o365` module now recover from an authentication problem or other fatal errors, instead of terminating. {pull}21259[21258] *Auditbeat* diff --git a/x-pack/filebeat/input/o365audit/input.go b/x-pack/filebeat/input/o365audit/input.go index ceff10751de..67013dc6a71 100644 --- a/x-pack/filebeat/input/o365audit/input.go +++ b/x-pack/filebeat/input/o365audit/input.go @@ -26,6 +26,9 @@ import ( const ( pluginName = "o365audit" fieldsPrefix = pluginName + + // How long to retry when a fatal error is encountered in the input. + failureRetryInterval = time.Minute * 5 ) type o365input struct { @@ -107,6 +110,34 @@ func (inp *o365input) Run( src cursor.Source, cursor cursor.Cursor, publisher cursor.Publisher, +) error { + for ctx.Cancelation.Err() == nil { + err := inp.runOnce(ctx, src, cursor, publisher) + if err == nil { + break + } + if ctx.Cancelation.Err() != err && err != context.Canceled { + msg := common.MapStr{} + msg.Put("error.message", err.Error()) + msg.Put("event.kind", "pipeline_error") + event := beat.Event{ + Timestamp: time.Now(), + Fields: msg, + } + publisher.Publish(event, nil) + ctx.Logger.Errorf("Input failed: %v", err) + ctx.Logger.Infof("Restarting in %v", failureRetryInterval) + time.Sleep(failureRetryInterval) + } + } + return nil +} + +func (inp *o365input) runOnce( + ctx v2.Context, + src cursor.Source, + cursor cursor.Cursor, + publisher cursor.Publisher, ) error { stream := src.(*stream) tenantID, contentType := stream.tenantID, stream.contentType @@ -156,18 +187,7 @@ func (inp *o365input) Run( } log.Infow("Start fetching events", "cursor", start) - err = poller.Run(action) - if err != nil && ctx.Cancelation.Err() != err && err != context.Canceled { - msg := common.MapStr{} - msg.Put("error.message", err.Error()) - msg.Put("event.kind", "pipeline_error") - event := beat.Event{ - Timestamp: time.Now(), - Fields: msg, - } - publisher.Publish(event, nil) - } - return err + return poller.Run(action) } func initCheckpoint(log *logp.Logger, c cursor.Cursor, maxRetention time.Duration) checkpoint { From 24e972f0da3e7434ebaaf35c24b2e552004da370 Mon Sep 17 00:00:00 2001 From: Adrian Serrano Date: Tue, 29 Sep 2020 11:30:45 +0200 Subject: [PATCH 015/156] Fixes for new 7.10 rsa2elk datasets (#21240) * Fix bad unicode character used in juniper/netscreen Some parsers from netwitness wrongly use ’ XML entity as a quote character. This entity translates to UNICODE codepoint U+0092 (PRIVATE USE 2), which is not printable and can cause problems. My understanding is that this is the result of either: - Device logs are encoded in the windows-1252 codepage, or - Log parsers originally written in windows-1252 codepage. In this codepage, \x92 represents a quotation mark similar to the ASCII \x27 single quotation mark ('). I believe someone misunderstood XML's &#xNNN entity as escaping a byte value, instead of a UNICODE codepoint. As it is unclear if the original logs contain this special quote, or it's the result of writting the parsers in a Windows editor, it's better to replace it's usage with empty captures that skip over this quote. * Update pipelines for new 7.10 rsa2elk datasets The original pipelines had been generated with some debugging comments in them, which made them much larger than necessary. --- .../barracuda/spamfirewall/config/pipeline.js | 159 +- .../module/cisco/meraki/config/pipeline.js | 204 +- .../citrix/netscaler/config/pipeline.js | 1140 +- .../cyberark/corepas/config/pipeline.js | 864 +- .../module/f5/bigipafm/config/pipeline.js | 3 +- .../fortinet/fortimail/config/pipeline.js | 630 +- .../fortinet/fortimanager/config/pipeline.js | 66 +- .../juniper/netscreen/config/pipeline.js | 13437 +++++++--------- .../emailsecurity/config/pipeline.js | 831 +- .../module/snort/log/config/pipeline.js | 852 +- .../module/sophos/utm/config/pipeline.js | 567 +- .../endpointprotection/config/pipeline.js | 3225 ++-- 12 files changed, 8297 insertions(+), 13681 deletions(-) diff --git a/x-pack/filebeat/module/barracuda/spamfirewall/config/pipeline.js b/x-pack/filebeat/module/barracuda/spamfirewall/config/pipeline.js index 37a1fa68d5e..3c8db034ee1 100644 --- a/x-pack/filebeat/module/barracuda/spamfirewall/config/pipeline.js +++ b/x-pack/filebeat/module/barracuda/spamfirewall/config/pipeline.js @@ -152,11 +152,9 @@ var map_getEventLegacyCategory = { "default": constant("1901000000"), }; -var dup1 = // "Pattern{Field(fld3,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(info,false)}" -match("MESSAGE#0:000001/1_0", "nwparser.p0", "%{fld3->} %{resultcode->} %{info}"); +var dup1 = match("MESSAGE#0:000001/1_0", "nwparser.p0", "%{fld3->} %{resultcode->} %{info}"); -var dup2 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#0:000001/1_1", "nwparser.p0", "info"); +var dup2 = match_copy("MESSAGE#0:000001/1_1", "nwparser.p0", "info"); var dup3 = setc("eventcategory","1207010201"); @@ -194,8 +192,7 @@ var dup13 = setc("eventcategory","1207010000"); var dup14 = setc("direction","outbound"); -var dup15 = // "Pattern{Constant('SZ:'), Field(fld9,true), Constant(' SUBJ:'), Field(subject,false)}" -match("MESSAGE#13:000003/1_0", "nwparser.p0", "SZ:%{fld9->} SUBJ:%{subject}"); +var dup15 = match("MESSAGE#13:000003/1_0", "nwparser.p0", "SZ:%{fld9->} SUBJ:%{subject}"); var dup16 = setc("eventcategory","1207040000"); @@ -259,8 +256,7 @@ var dup33 = linear_select([ dup2, ]); -var hdr1 = // "Pattern{Field(messageid,false), Constant('['), Field(hfld14,false), Constant(']: '), Field(p0,false)}" -match("HEADER#0:0001", "message", "%{messageid}[%{hfld14}]: %{p0}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "%{messageid}[%{hfld14}]: %{p0}", processor_chain([ setc("header_id","0001"), call({ dest: "nwparser.payload", @@ -275,8 +271,7 @@ match("HEADER#0:0001", "message", "%{messageid}[%{hfld14}]: %{p0}", processor_ch }), ])); -var hdr2 = // "Pattern{Field(hfld1,false), Constant('/'), Field(messageid,false), Constant('['), Field(hfld14,false), Constant(']: '), Field(p0,false)}" -match("HEADER#1:0002", "message", "%{hfld1}/%{messageid}[%{hfld14}]: %{p0}", processor_chain([ +var hdr2 = match("HEADER#1:0002", "message", "%{hfld1}/%{messageid}[%{hfld14}]: %{p0}", processor_chain([ setc("header_id","0002"), call({ dest: "nwparser.payload", @@ -293,8 +288,7 @@ match("HEADER#1:0002", "message", "%{hfld1}/%{messageid}[%{hfld14}]: %{p0}", pro }), ])); -var hdr3 = // "Pattern{Field(messageid,false), Constant(': '), Field(p0,false)}" -match("HEADER#2:0003", "message", "%{messageid}: %{p0}", processor_chain([ +var hdr3 = match("HEADER#2:0003", "message", "%{messageid}: %{p0}", processor_chain([ setc("header_id","0003"), call({ dest: "nwparser.payload", @@ -313,8 +307,7 @@ var select1 = linear_select([ hdr3, ]); -var part1 = // "Pattern{Constant('inbound/pass1['), Field(fld14,false), Constant(']: '), Field(username,false), Constant('['), Field(saddr,false), Constant('] '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' RECV '), Field(from,true), Constant(' '), Field(to,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#0:000001/0", "nwparser.payload", "inbound/pass1[%{fld14}]: %{username}[%{saddr}] %{id->} %{fld1->} %{fld2->} RECV %{from->} %{to->} %{p0}"); +var part1 = match("MESSAGE#0:000001/0", "nwparser.payload", "inbound/pass1[%{fld14}]: %{username}[%{saddr}] %{id->} %{fld1->} %{fld2->} RECV %{from->} %{to->} %{p0}"); var all1 = all_match({ processors: [ @@ -337,14 +330,11 @@ var all1 = all_match({ var msg1 = msg("000001", all1); -var part2 = // "Pattern{Constant('inbound/pass1: '), Field(web_domain,false), Constant('['), Field(saddr,false), Constant('] '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' SCAN '), Field(fld4,true), Constant(' '), Field(from,true), Constant(' '), Field(to,true), Constant(' '), Field(fld5,true), Constant(' '), Field(fld3,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1:inbound/pass1/0", "nwparser.payload", "inbound/pass1: %{web_domain}[%{saddr}] %{id->} %{fld1->} %{fld2->} SCAN %{fld4->} %{from->} %{to->} %{fld5->} %{fld3->} %{resultcode->} %{p0}"); +var part2 = match("MESSAGE#1:inbound/pass1/0", "nwparser.payload", "inbound/pass1: %{web_domain}[%{saddr}] %{id->} %{fld1->} %{fld2->} SCAN %{fld4->} %{from->} %{to->} %{fld5->} %{fld3->} %{resultcode->} %{p0}"); -var part3 = // "Pattern{Field(fld6,true), Constant(' SZ:'), Field(fld8,true), Constant(' SUBJ:'), Field(subject,false)}" -match("MESSAGE#1:inbound/pass1/1_0", "nwparser.p0", "%{fld6->} SZ:%{fld8->} SUBJ:%{subject}"); +var part3 = match("MESSAGE#1:inbound/pass1/1_0", "nwparser.p0", "%{fld6->} SZ:%{fld8->} SUBJ:%{subject}"); -var part4 = // "Pattern{Field(domain,true), Constant(' '), Field(info,false)}" -match("MESSAGE#1:inbound/pass1/1_1", "nwparser.p0", "%{domain->} %{info}"); +var part4 = match("MESSAGE#1:inbound/pass1/1_1", "nwparser.p0", "%{domain->} %{info}"); var select2 = linear_select([ part3, @@ -372,8 +362,7 @@ var all2 = all_match({ var msg2 = msg("inbound/pass1", all2); -var part5 = // "Pattern{Constant('inbound/pass1:'), Field(web_domain,false), Constant('['), Field(saddr,false), Constant('] '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' RECV '), Field(from,true), Constant(' '), Field(to,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#2:inbound/pass1:01/0", "nwparser.payload", "inbound/pass1:%{web_domain}[%{saddr}] %{id->} %{fld1->} %{fld2->} RECV %{from->} %{to->} %{p0}"); +var part5 = match("MESSAGE#2:inbound/pass1:01/0", "nwparser.payload", "inbound/pass1:%{web_domain}[%{saddr}] %{id->} %{fld1->} %{fld2->} RECV %{from->} %{to->} %{p0}"); var all3 = all_match({ processors: [ @@ -402,11 +391,9 @@ var select3 = linear_select([ msg3, ]); -var part6 = // "Pattern{Constant('outbound/smtp['), Field(fld14,false), Constant(']: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#3:000002/0", "nwparser.payload", "outbound/smtp[%{fld14}]: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{p0}"); +var part6 = match("MESSAGE#3:000002/0", "nwparser.payload", "outbound/smtp[%{fld14}]: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{p0}"); -var part7 = // "Pattern{Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(info,false)}" -match("MESSAGE#3:000002/1_0", "nwparser.p0", "%{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{info}"); +var part7 = match("MESSAGE#3:000002/1_0", "nwparser.p0", "%{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{info}"); var select4 = linear_select([ part7, @@ -430,37 +417,28 @@ var all4 = all_match({ var msg4 = msg("000002", all4); -var part8 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(fld5,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#4:outbound/smtp/0", "nwparser.payload", "outbound/smtp: %{saddr->} %{fld5->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{p0}"); +var part8 = match("MESSAGE#4:outbound/smtp/0", "nwparser.payload", "outbound/smtp: %{saddr->} %{fld5->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{p0}"); -var part9 = // "Pattern{Field(fld8,true), Constant(' <<'), Field(from,false), Constant('> '), Field(p0,false)}" -match("MESSAGE#4:outbound/smtp/1_0", "nwparser.p0", "%{fld8->} \u003c\u003c%{from}> %{p0}"); +var part9 = match("MESSAGE#4:outbound/smtp/1_0", "nwparser.p0", "%{fld8->} \u003c\u003c%{from}> %{p0}"); -var part10 = // "Pattern{Constant('<<'), Field(from,false), Constant('>'), Field(p0,false)}" -match("MESSAGE#4:outbound/smtp/1_1", "nwparser.p0", "\u003c\u003c%{from}>%{p0}"); +var part10 = match("MESSAGE#4:outbound/smtp/1_1", "nwparser.p0", "\u003c\u003c%{from}>%{p0}"); var select5 = linear_select([ part9, part10, ]); -var part11 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#4:outbound/smtp/2", "nwparser.p0", "%{} %{p0}"); +var part11 = match("MESSAGE#4:outbound/smtp/2", "nwparser.p0", "%{} %{p0}"); -var part12 = // "Pattern{Constant('[InternalId='), Field(id,false), Constant(', Hostname='), Field(hostname,false), Constant('] '), Field(event_description,true), Constant(' #to#'), Field(ddomain,false)}" -match("MESSAGE#4:outbound/smtp/3_0", "nwparser.p0", "[InternalId=%{id}, Hostname=%{hostname}] %{event_description->} #to#%{ddomain}"); +var part12 = match("MESSAGE#4:outbound/smtp/3_0", "nwparser.p0", "[InternalId=%{id}, Hostname=%{hostname}] %{event_description->} #to#%{ddomain}"); -var part13 = // "Pattern{Constant('[InternalId='), Field(id,false), Constant('] '), Field(event_description,true), Constant(' #to#'), Field(daddr,false)}" -match("MESSAGE#4:outbound/smtp/3_1", "nwparser.p0", "[InternalId=%{id}] %{event_description->} #to#%{daddr}"); +var part13 = match("MESSAGE#4:outbound/smtp/3_1", "nwparser.p0", "[InternalId=%{id}] %{event_description->} #to#%{daddr}"); -var part14 = // "Pattern{Constant('[InternalId='), Field(id,false), Constant(', Hostname='), Field(hostname,false), Constant('] '), Field(info,false)}" -match("MESSAGE#4:outbound/smtp/3_2", "nwparser.p0", "[InternalId=%{id}, Hostname=%{hostname}] %{info}"); +var part14 = match("MESSAGE#4:outbound/smtp/3_2", "nwparser.p0", "[InternalId=%{id}, Hostname=%{hostname}] %{info}"); -var part15 = // "Pattern{Field(event_description,true), Constant(' #to#'), Field(ddomain,false), Constant('['), Field(daddr,false), Constant(']:'), Field(dport,false)}" -match("MESSAGE#4:outbound/smtp/3_3", "nwparser.p0", "%{event_description->} #to#%{ddomain}[%{daddr}]:%{dport}"); +var part15 = match("MESSAGE#4:outbound/smtp/3_3", "nwparser.p0", "%{event_description->} #to#%{ddomain}[%{daddr}]:%{dport}"); -var part16 = // "Pattern{Field(event_description,true), Constant(' #to#'), Field(ddomain,false)}" -match("MESSAGE#4:outbound/smtp/3_4", "nwparser.p0", "%{event_description->} #to#%{ddomain}"); +var part16 = match("MESSAGE#4:outbound/smtp/3_4", "nwparser.p0", "%{event_description->} #to#%{ddomain}"); var select6 = linear_select([ part12, @@ -489,22 +467,18 @@ var all5 = all_match({ var msg5 = msg("outbound/smtp", all5); -var part17 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#5:000009/0", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{p0}"); +var part17 = match("MESSAGE#5:000009/0", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{p0}"); -var part18 = // "Pattern{Field(fld8,true), Constant(' ok'), Field(p0,false)}" -match("MESSAGE#5:000009/1_0", "nwparser.p0", "%{fld8->} ok%{p0}"); +var part18 = match("MESSAGE#5:000009/1_0", "nwparser.p0", "%{fld8->} ok%{p0}"); -var part19 = // "Pattern{Constant('ok'), Field(p0,false)}" -match("MESSAGE#5:000009/1_1", "nwparser.p0", "ok%{p0}"); +var part19 = match("MESSAGE#5:000009/1_1", "nwparser.p0", "ok%{p0}"); var select7 = linear_select([ part18, part19, ]); -var part20 = // "Pattern{Field(fld9,true), Constant(' Message '), Field(fld10,true), Constant(' accepted #to#'), Field(ddomain,false), Constant('['), Field(daddr,false), Constant(']:'), Field(dport,false)}" -match("MESSAGE#5:000009/2", "nwparser.p0", "%{fld9->} Message %{fld10->} accepted #to#%{ddomain}[%{daddr}]:%{dport}"); +var part20 = match("MESSAGE#5:000009/2", "nwparser.p0", "%{fld9->} Message %{fld10->} accepted #to#%{ddomain}[%{daddr}]:%{dport}"); var all6 = all_match({ processors: [ @@ -524,8 +498,7 @@ var all6 = all_match({ var msg6 = msg("000009", all6); -var part21 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(resultcode,true), Constant(' Message accepted for delivery #to#'), Field(ddomain,false), Constant('['), Field(daddr,false), Constant(']:'), Field(dport,false)}" -match("MESSAGE#6:outbound/smtp:01", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} Message accepted for delivery #to#%{ddomain}[%{daddr}]:%{dport}", processor_chain([ +var part21 = match("MESSAGE#6:outbound/smtp:01", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} Message accepted for delivery #to#%{ddomain}[%{daddr}]:%{dport}", processor_chain([ dup13, dup4, dup14, @@ -537,8 +510,7 @@ match("MESSAGE#6:outbound/smtp:01", "nwparser.payload", "outbound/smtp: %{saddr- var msg7 = msg("outbound/smtp:01", part21); -var part22 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' conversation with '), Field(fld5,false), Constant('['), Field(fld6,false), Constant('] timed out while sending '), Field(fld7,true), Constant(' #to#'), Field(ddomain,false), Constant('['), Field(daddr,false), Constant(']:'), Field(dport,false)}" -match("MESSAGE#7:outbound/smtp:02", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} conversation with %{fld5}[%{fld6}] timed out while sending %{fld7->} #to#%{ddomain}[%{daddr}]:%{dport}", processor_chain([ +var part22 = match("MESSAGE#7:outbound/smtp:02", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} conversation with %{fld5}[%{fld6}] timed out while sending %{fld7->} #to#%{ddomain}[%{daddr}]:%{dport}", processor_chain([ dup13, dup4, dup14, @@ -549,26 +521,19 @@ match("MESSAGE#7:outbound/smtp:02", "nwparser.payload", "outbound/smtp: %{saddr- var msg8 = msg("outbound/smtp:02", part22); -var part23 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(fld7,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#8:000010/0", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{fld7->} %{p0}"); +var part23 = match("MESSAGE#8:000010/0", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{fld7->} %{p0}"); -var part24 = // "Pattern{Constant('Ok '), Field(fld9,true), Constant(' '), Field(fld10,true), Constant(' - gsmtp #to#'), Field(p0,false)}" -match("MESSAGE#8:000010/1_0", "nwparser.p0", "Ok %{fld9->} %{fld10->} - gsmtp #to#%{p0}"); +var part24 = match("MESSAGE#8:000010/1_0", "nwparser.p0", "Ok %{fld9->} %{fld10->} - gsmtp #to#%{p0}"); -var part25 = // "Pattern{Constant('Ok: queued as '), Field(fld9,true), Constant(' #to#'), Field(p0,false)}" -match("MESSAGE#8:000010/1_1", "nwparser.p0", "Ok: queued as %{fld9->} #to#%{p0}"); +var part25 = match("MESSAGE#8:000010/1_1", "nwparser.p0", "Ok: queued as %{fld9->} #to#%{p0}"); -var part26 = // "Pattern{Constant('ok '), Field(fld9,true), Constant(' #to#'), Field(p0,false)}" -match("MESSAGE#8:000010/1_2", "nwparser.p0", "ok %{fld9->} #to#%{p0}"); +var part26 = match("MESSAGE#8:000010/1_2", "nwparser.p0", "ok %{fld9->} #to#%{p0}"); -var part27 = // "Pattern{Constant('Ok ('), Field(fld9,false), Constant(') #to#'), Field(p0,false)}" -match("MESSAGE#8:000010/1_3", "nwparser.p0", "Ok (%{fld9}) #to#%{p0}"); +var part27 = match("MESSAGE#8:000010/1_3", "nwparser.p0", "Ok (%{fld9}) #to#%{p0}"); -var part28 = // "Pattern{Constant('OK '), Field(fld9,true), Constant(' #to#'), Field(p0,false)}" -match("MESSAGE#8:000010/1_4", "nwparser.p0", "OK %{fld9->} #to#%{p0}"); +var part28 = match("MESSAGE#8:000010/1_4", "nwparser.p0", "OK %{fld9->} #to#%{p0}"); -var part29 = // "Pattern{Field(fld9,true), Constant(' #to#'), Field(p0,false)}" -match("MESSAGE#8:000010/1_5", "nwparser.p0", "%{fld9->} #to#%{p0}"); +var part29 = match("MESSAGE#8:000010/1_5", "nwparser.p0", "%{fld9->} #to#%{p0}"); var select8 = linear_select([ part24, @@ -579,8 +544,7 @@ var select8 = linear_select([ part29, ]); -var part30 = // "Pattern{Field(daddr,false)}" -match_copy("MESSAGE#8:000010/2", "nwparser.p0", "daddr"); +var part30 = match_copy("MESSAGE#8:000010/2", "nwparser.p0", "daddr"); var all7 = all_match({ processors: [ @@ -600,8 +564,7 @@ var all7 = all_match({ var msg9 = msg("000010", all7); -var part31 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' connect to '), Field(ddomain,false), Constant('['), Field(daddr,false), Constant(']: '), Field(event_description,false)}" -match("MESSAGE#9:000011", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} connect to %{ddomain}[%{daddr}]: %{event_description}", processor_chain([ +var part31 = match("MESSAGE#9:000011", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} connect to %{ddomain}[%{daddr}]: %{event_description}", processor_chain([ dup13, dup4, dup14, @@ -612,8 +575,7 @@ match("MESSAGE#9:000011", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} var msg10 = msg("000011", part31); -var part32 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(fld7,true), Constant(' ['), Field(ddomain,false), Constant(']: '), Field(event_description,false)}" -match("MESSAGE#10:000012", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{fld7->} [%{ddomain}]: %{event_description}", processor_chain([ +var part32 = match("MESSAGE#10:000012", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{fld7->} [%{ddomain}]: %{event_description}", processor_chain([ dup13, dup4, dup14, @@ -624,8 +586,7 @@ match("MESSAGE#10:000012", "nwparser.payload", "outbound/smtp: %{saddr->} %{id-> var msg11 = msg("000012", part32); -var part33 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(fld7,true), Constant(' <<'), Field(from,false), Constant('>: '), Field(event_description,false)}" -match("MESSAGE#11:000013", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{fld7->} \u003c\u003c%{from}>: %{event_description}", processor_chain([ +var part33 = match("MESSAGE#11:000013", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{fld7->} \u003c\u003c%{from}>: %{event_description}", processor_chain([ dup13, dup4, dup14, @@ -636,8 +597,7 @@ match("MESSAGE#11:000013", "nwparser.payload", "outbound/smtp: %{saddr->} %{id-> var msg12 = msg("000013", part33); -var part34 = // "Pattern{Constant('outbound/smtp: '), Field(saddr,true), Constant(' '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(fld8,true), Constant(' '), Field(event_description,false)}" -match("MESSAGE#12:000014", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{fld8->} %{event_description}", processor_chain([ +var part34 = match("MESSAGE#12:000014", "nwparser.payload", "outbound/smtp: %{saddr->} %{id->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{resultcode->} %{fld8->} %{event_description}", processor_chain([ dup13, dup4, dup14, @@ -661,8 +621,7 @@ var select9 = linear_select([ msg13, ]); -var part35 = // "Pattern{Constant('scan['), Field(fld14,false), Constant(']: '), Field(username,false), Constant('['), Field(saddr,false), Constant('] '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld8,true), Constant(' '), Field(from,true), Constant(' '), Field(to,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(fld7,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#13:000003/0", "nwparser.payload", "scan[%{fld14}]: %{username}[%{saddr}] %{id->} %{fld1->} %{fld2->} %{action->} %{fld8->} %{from->} %{to->} %{fld4->} %{fld3->} %{resultcode->} %{fld7->} %{p0}"); +var part35 = match("MESSAGE#13:000003/0", "nwparser.payload", "scan[%{fld14}]: %{username}[%{saddr}] %{id->} %{fld1->} %{fld2->} %{action->} %{fld8->} %{from->} %{to->} %{fld4->} %{fld3->} %{resultcode->} %{fld7->} %{p0}"); var all8 = all_match({ processors: [ @@ -683,8 +642,7 @@ var all8 = all_match({ var msg14 = msg("000003", all8); -var part36 = // "Pattern{Constant('scan: '), Field(web_domain,false), Constant('['), Field(saddr,false), Constant('] '), Field(id,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld8,true), Constant(' '), Field(from,true), Constant(' '), Field(to,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(fld7,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#14:scan/0", "nwparser.payload", "scan: %{web_domain}[%{saddr}] %{id->} %{fld1->} %{fld2->} %{action->} %{fld8->} %{from->} %{to->} %{fld4->} %{fld3->} %{resultcode->} %{fld7->} %{p0}"); +var part36 = match("MESSAGE#14:scan/0", "nwparser.payload", "scan: %{web_domain}[%{saddr}] %{id->} %{fld1->} %{fld2->} %{action->} %{fld8->} %{from->} %{to->} %{fld4->} %{fld3->} %{resultcode->} %{fld7->} %{p0}"); var all9 = all_match({ processors: [ @@ -710,16 +668,14 @@ var select10 = linear_select([ msg15, ]); -var part37 = // "Pattern{Constant('web: Ret Policy Summary (Del:'), Field(fld1,true), Constant(' Kept:'), Field(fld2,false), Constant(')')}" -match("MESSAGE#15:000004", "nwparser.payload", "web: Ret Policy Summary (Del:%{fld1->} Kept:%{fld2})", processor_chain([ +var part37 = match("MESSAGE#15:000004", "nwparser.payload", "web: Ret Policy Summary (Del:%{fld1->} Kept:%{fld2})", processor_chain([ dup17, dup4, ])); var msg16 = msg("000004", part37); -var part38 = // "Pattern{Constant('web: ['), Field(saddr,false), Constant('] FAILED_LOGIN ('), Field(username,false), Constant(')')}" -match("MESSAGE#16:000005", "nwparser.payload", "web: [%{saddr}] FAILED_LOGIN (%{username})", processor_chain([ +var part38 = match("MESSAGE#16:000005", "nwparser.payload", "web: [%{saddr}] FAILED_LOGIN (%{username})", processor_chain([ setc("eventcategory","1401030000"), dup18, dup19, @@ -731,16 +687,14 @@ match("MESSAGE#16:000005", "nwparser.payload", "web: [%{saddr}] FAILED_LOGIN (%{ var msg17 = msg("000005", part38); -var part39 = // "Pattern{Constant('web: Retention violating accounts: '), Field(fld1,true), Constant(' total')}" -match("MESSAGE#17:000006", "nwparser.payload", "web: Retention violating accounts: %{fld1->} total", processor_chain([ +var part39 = match("MESSAGE#17:000006", "nwparser.payload", "web: Retention violating accounts: %{fld1->} total", processor_chain([ setc("eventcategory","1605000000"), dup4, ])); var msg18 = msg("000006", part39); -var part40 = // "Pattern{Constant('web: ['), Field(saddr,false), Constant('] global CHANGE '), Field(category,true), Constant(' ('), Field(info,false), Constant(')')}" -match("MESSAGE#18:000007", "nwparser.payload", "web: [%{saddr}] global CHANGE %{category->} (%{info})", processor_chain([ +var part40 = match("MESSAGE#18:000007", "nwparser.payload", "web: [%{saddr}] global CHANGE %{category->} (%{info})", processor_chain([ dup17, dup4, setc("action","CHANGE"), @@ -748,8 +702,7 @@ match("MESSAGE#18:000007", "nwparser.payload", "web: [%{saddr}] global CHANGE %{ var msg19 = msg("000007", part40); -var part41 = // "Pattern{Constant('web: ['), Field(saddr,false), Constant('] LOGOUT ('), Field(username,false), Constant(')')}" -match("MESSAGE#19:000029", "nwparser.payload", "web: [%{saddr}] LOGOUT (%{username})", processor_chain([ +var part41 = match("MESSAGE#19:000029", "nwparser.payload", "web: [%{saddr}] LOGOUT (%{username})", processor_chain([ setc("eventcategory","1401070000"), dup18, setc("ec_activity","Logoff"), @@ -760,8 +713,7 @@ match("MESSAGE#19:000029", "nwparser.payload", "web: [%{saddr}] LOGOUT (%{userna var msg20 = msg("000029", part41); -var part42 = // "Pattern{Constant('web: ['), Field(saddr,false), Constant('] LOGIN ('), Field(username,false), Constant(')')}" -match("MESSAGE#20:000030", "nwparser.payload", "web: [%{saddr}] LOGIN (%{username})", processor_chain([ +var part42 = match("MESSAGE#20:000030", "nwparser.payload", "web: [%{saddr}] LOGIN (%{username})", processor_chain([ setc("eventcategory","1401060000"), dup18, dup19, @@ -781,8 +733,7 @@ var select11 = linear_select([ msg21, ]); -var part43 = // "Pattern{Constant('notify/smtp['), Field(fld14,false), Constant(']: '), Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(action,true), Constant(' '), Field(fld4,true), Constant(' '), Field(fld3,true), Constant(' '), Field(sessionid,true), Constant(' '), Field(bytes,true), Constant(' '), Field(version,true), Constant(' '), Field(from,true), Constant(' '), Field(info,false)}" -match("MESSAGE#21:000008", "nwparser.payload", "notify/smtp[%{fld14}]: %{saddr->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{bytes->} %{version->} %{from->} %{info}", processor_chain([ +var part43 = match("MESSAGE#21:000008", "nwparser.payload", "notify/smtp[%{fld14}]: %{saddr->} %{fld1->} %{fld2->} %{action->} %{fld4->} %{fld3->} %{sessionid->} %{bytes->} %{version->} %{from->} %{info}", processor_chain([ dup13, dup4, dup32, @@ -792,8 +743,7 @@ match("MESSAGE#21:000008", "nwparser.payload", "notify/smtp[%{fld14}]: %{saddr-> var msg22 = msg("000008", part43); -var part44 = // "Pattern{Constant('reports: REPORTS ('), Field(process,false), Constant(') queued as '), Field(fld1,false)}" -match("MESSAGE#22:reports", "nwparser.payload", "reports: REPORTS (%{process}) queued as %{fld1}", processor_chain([ +var part44 = match("MESSAGE#22:reports", "nwparser.payload", "reports: REPORTS (%{process}) queued as %{fld1}", processor_chain([ dup16, dup4, setc("event_description","report queued"), @@ -813,14 +763,11 @@ var chain1 = processor_chain([ }), ]); -var part45 = // "Pattern{Field(fld3,true), Constant(' '), Field(resultcode,true), Constant(' '), Field(info,false)}" -match("MESSAGE#0:000001/1_0", "nwparser.p0", "%{fld3->} %{resultcode->} %{info}"); +var part45 = match("MESSAGE#0:000001/1_0", "nwparser.p0", "%{fld3->} %{resultcode->} %{info}"); -var part46 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#0:000001/1_1", "nwparser.p0", "info"); +var part46 = match_copy("MESSAGE#0:000001/1_1", "nwparser.p0", "info"); -var part47 = // "Pattern{Constant('SZ:'), Field(fld9,true), Constant(' SUBJ:'), Field(subject,false)}" -match("MESSAGE#13:000003/1_0", "nwparser.p0", "SZ:%{fld9->} SUBJ:%{subject}"); +var part47 = match("MESSAGE#13:000003/1_0", "nwparser.p0", "SZ:%{fld9->} SUBJ:%{subject}"); var select12 = linear_select([ dup1, diff --git a/x-pack/filebeat/module/cisco/meraki/config/pipeline.js b/x-pack/filebeat/module/cisco/meraki/config/pipeline.js index 45a7b628d63..53a05ad2527 100644 --- a/x-pack/filebeat/module/cisco/meraki/config/pipeline.js +++ b/x-pack/filebeat/module/cisco/meraki/config/pipeline.js @@ -29,8 +29,7 @@ var map_actionType = { }, }; -var dup1 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hfld2,false), Constant('.'), Field(hfld3,true), Constant(' '), Field(p0,false)}" -match("HEADER#0:0003/0", "message", "%{hfld1->} %{hfld2}.%{hfld3->} %{p0}"); +var dup1 = match("HEADER#0:0003/0", "message", "%{hfld1->} %{hfld2}.%{hfld3->} %{p0}"); var dup2 = call({ dest: "nwparser.payload", @@ -52,8 +51,7 @@ var dup3 = call({ ], }); -var dup4 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#0:flows/2_1", "nwparser.p0", "p0"); +var dup4 = match_copy("MESSAGE#0:flows/2_1", "nwparser.p0", "p0"); var dup5 = setc("eventcategory","1605020000"); @@ -71,20 +69,15 @@ var dup9 = date_time({ ], }); -var dup10 = // "Pattern{}" -match_copy("MESSAGE#1:flows:01/1_2", "nwparser.p0", ""); +var dup10 = match_copy("MESSAGE#1:flows:01/1_2", "nwparser.p0", ""); -var dup11 = // "Pattern{Constant('dhost='), Field(dmacaddr,true), Constant(' direction='), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/1_0", "nwparser.p0", "dhost=%{dmacaddr->} direction=%{p0}"); +var dup11 = match("MESSAGE#10:ids-alerts:01/1_0", "nwparser.p0", "dhost=%{dmacaddr->} direction=%{p0}"); -var dup12 = // "Pattern{Constant('shost='), Field(smacaddr,true), Constant(' direction='), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/1_1", "nwparser.p0", "shost=%{smacaddr->} direction=%{p0}"); +var dup12 = match("MESSAGE#10:ids-alerts:01/1_1", "nwparser.p0", "shost=%{smacaddr->} direction=%{p0}"); -var dup13 = // "Pattern{Field(direction,true), Constant(' protocol='), Field(protocol,true), Constant(' src='), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/2", "nwparser.p0", "%{direction->} protocol=%{protocol->} src=%{p0}"); +var dup13 = match("MESSAGE#10:ids-alerts:01/2", "nwparser.p0", "%{direction->} protocol=%{protocol->} src=%{p0}"); -var dup14 = // "Pattern{Field(signame,false)}" -match_copy("MESSAGE#10:ids-alerts:01/4", "nwparser.p0", "signame"); +var dup14 = match_copy("MESSAGE#10:ids-alerts:01/4", "nwparser.p0", "signame"); var dup15 = setc("eventcategory","1607000000"); @@ -102,13 +95,11 @@ var dup18 = setc("event_type","security_event"); var dup19 = constant("Allow"); -var dup20 = // "Pattern{Field(hfld4,false), Constant('_appliance '), Field(p0,false)}" -match("HEADER#0:0003/1_0", "nwparser.p0", "%{hfld4}_appliance %{p0}", processor_chain([ +var dup20 = match("HEADER#0:0003/1_0", "nwparser.p0", "%{hfld4}_appliance %{p0}", processor_chain([ dup2, ])); -var dup21 = // "Pattern{Field(hfld4,true), Constant(' '), Field(p0,false)}" -match("HEADER#0:0003/1_1", "nwparser.p0", "%{hfld4->} %{p0}", processor_chain([ +var dup21 = match("HEADER#0:0003/1_1", "nwparser.p0", "%{hfld4->} %{p0}", processor_chain([ dup3, ])); @@ -122,8 +113,7 @@ var dup23 = linear_select([ dup21, ]); -var part1 = // "Pattern{Constant('urls '), Field(p0,false)}" -match("HEADER#0:0003/2", "nwparser.p0", "urls %{p0}"); +var part1 = match("HEADER#0:0003/2", "nwparser.p0", "urls %{p0}"); var all1 = all_match({ processors: [ @@ -137,19 +127,16 @@ var all1 = all_match({ ]), }); -var part2 = // "Pattern{Field(node,false), Constant('_appliance events '), Field(p0,false)}" -match("HEADER#1:0002/1_0", "nwparser.p0", "%{node}_appliance events %{p0}"); +var part2 = match("HEADER#1:0002/1_0", "nwparser.p0", "%{node}_appliance events %{p0}"); -var part3 = // "Pattern{Field(node,true), Constant(' events '), Field(p0,false)}" -match("HEADER#1:0002/1_1", "nwparser.p0", "%{node->} events %{p0}"); +var part3 = match("HEADER#1:0002/1_1", "nwparser.p0", "%{node->} events %{p0}"); var select1 = linear_select([ part2, part3, ]); -var part4 = // "Pattern{Field(payload,false)}" -match_copy("HEADER#1:0002/2", "nwparser.p0", "payload"); +var part4 = match_copy("HEADER#1:0002/2", "nwparser.p0", "payload"); var all2 = all_match({ processors: [ @@ -163,8 +150,7 @@ var all2 = all_match({ ]), }); -var part5 = // "Pattern{Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#2:0001/2", "nwparser.p0", "%{messageid->} %{p0}"); +var part5 = match("HEADER#2:0001/2", "nwparser.p0", "%{messageid->} %{p0}"); var all3 = all_match({ processors: [ @@ -177,19 +163,16 @@ var all3 = all_match({ ]), }); -var part6 = // "Pattern{Field(hfld4,false), Constant('_appliance '), Field(p0,false)}" -match("HEADER#3:0005/1_0", "nwparser.p0", "%{hfld4}_appliance %{p0}"); +var part6 = match("HEADER#3:0005/1_0", "nwparser.p0", "%{hfld4}_appliance %{p0}"); -var part7 = // "Pattern{Field(hfld4,true), Constant(' '), Field(p0,false)}" -match("HEADER#3:0005/1_1", "nwparser.p0", "%{hfld4->} %{p0}"); +var part7 = match("HEADER#3:0005/1_1", "nwparser.p0", "%{hfld4->} %{p0}"); var select2 = linear_select([ part6, part7, ]); -var part8 = // "Pattern{Field(,true), Constant(' '), Field(hfld5,true), Constant(' '), Field(hfld6,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#3:0005/2", "nwparser.p0", "%{} %{hfld5->} %{hfld6->} %{messageid->} %{p0}", processor_chain([ +var part8 = match("HEADER#3:0005/2", "nwparser.p0", "%{} %{hfld5->} %{hfld6->} %{messageid->} %{p0}", processor_chain([ call({ dest: "nwparser.payload", fn: STRCAT, @@ -214,8 +197,7 @@ var all4 = all_match({ ]), }); -var hdr1 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hfld2,false), Constant('.'), Field(hfld3,true), Constant(' '), Field(hfld4,false), Constant('_'), Field(space,true), Constant(' '), Field(messageid,true), Constant(' '), Field(payload,false)}" -match("HEADER#4:0004", "message", "%{hfld1->} %{hfld2}.%{hfld3->} %{hfld4}_%{space->} %{messageid->} %{payload}", processor_chain([ +var hdr1 = match("HEADER#4:0004", "message", "%{hfld1->} %{hfld2}.%{hfld3->} %{hfld4}_%{space->} %{messageid->} %{payload}", processor_chain([ setc("header_id","0004"), ])); @@ -227,36 +209,29 @@ var select3 = linear_select([ hdr1, ]); -var part9 = // "Pattern{Field(node,false), Constant('_appliance '), Field(p0,false)}" -match("MESSAGE#0:flows/0_0", "nwparser.payload", "%{node}_appliance %{p0}"); +var part9 = match("MESSAGE#0:flows/0_0", "nwparser.payload", "%{node}_appliance %{p0}"); -var part10 = // "Pattern{Field(node,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#0:flows/0_1", "nwparser.payload", "%{node->} %{p0}"); +var part10 = match("MESSAGE#0:flows/0_1", "nwparser.payload", "%{node->} %{p0}"); var select4 = linear_select([ part9, part10, ]); -var part11 = // "Pattern{Constant('flows src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#0:flows/1", "nwparser.p0", "flows src=%{saddr->} dst=%{daddr->} %{p0}"); +var part11 = match("MESSAGE#0:flows/1", "nwparser.p0", "flows src=%{saddr->} dst=%{daddr->} %{p0}"); -var part12 = // "Pattern{Constant('mac='), Field(dmacaddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#0:flows/2_0", "nwparser.p0", "mac=%{dmacaddr->} %{p0}"); +var part12 = match("MESSAGE#0:flows/2_0", "nwparser.p0", "mac=%{dmacaddr->} %{p0}"); var select5 = linear_select([ part12, dup4, ]); -var part13 = // "Pattern{Constant('protocol='), Field(protocol,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#0:flows/3", "nwparser.p0", "protocol=%{protocol->} %{p0}"); +var part13 = match("MESSAGE#0:flows/3", "nwparser.p0", "protocol=%{protocol->} %{p0}"); -var part14 = // "Pattern{Constant('sport='), Field(sport,true), Constant(' dport='), Field(dport,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#0:flows/4_0", "nwparser.p0", "sport=%{sport->} dport=%{dport->} %{p0}"); +var part14 = match("MESSAGE#0:flows/4_0", "nwparser.p0", "sport=%{sport->} dport=%{dport->} %{p0}"); -var part15 = // "Pattern{Constant('type='), Field(event_type,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#0:flows/4_1", "nwparser.p0", "type=%{event_type->} %{p0}"); +var part15 = match("MESSAGE#0:flows/4_1", "nwparser.p0", "type=%{event_type->} %{p0}"); var select6 = linear_select([ part14, @@ -264,8 +239,7 @@ var select6 = linear_select([ dup4, ]); -var part16 = // "Pattern{Constant('pattern: '), Field(fld21,true), Constant(' '), Field(info,false)}" -match("MESSAGE#0:flows/5", "nwparser.p0", "pattern: %{fld21->} %{info}"); +var part16 = match("MESSAGE#0:flows/5", "nwparser.p0", "pattern: %{fld21->} %{info}"); var all5 = all_match({ processors: [ @@ -292,14 +266,11 @@ var all5 = all_match({ var msg1 = msg("flows", all5); -var part17 = // "Pattern{Field(node,true), Constant(' flows '), Field(action,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' mac='), Field(smacaddr,true), Constant(' protocol='), Field(protocol,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1:flows:01/0", "nwparser.payload", "%{node->} flows %{action->} src=%{saddr->} dst=%{daddr->} mac=%{smacaddr->} protocol=%{protocol->} %{p0}"); +var part17 = match("MESSAGE#1:flows:01/0", "nwparser.payload", "%{node->} flows %{action->} src=%{saddr->} dst=%{daddr->} mac=%{smacaddr->} protocol=%{protocol->} %{p0}"); -var part18 = // "Pattern{Constant('sport='), Field(sport,true), Constant(' dport='), Field(dport,true), Constant(' ')}" -match("MESSAGE#1:flows:01/1_0", "nwparser.p0", "sport=%{sport->} dport=%{dport->} "); +var part18 = match("MESSAGE#1:flows:01/1_0", "nwparser.p0", "sport=%{sport->} dport=%{dport->} "); -var part19 = // "Pattern{Constant('type='), Field(event_type,true), Constant(' ')}" -match("MESSAGE#1:flows:01/1_1", "nwparser.p0", "type=%{event_type->} "); +var part19 = match("MESSAGE#1:flows:01/1_1", "nwparser.p0", "type=%{event_type->} "); var select7 = linear_select([ part18, @@ -323,8 +294,7 @@ var all6 = all_match({ var msg2 = msg("flows:01", all6); -var part20 = // "Pattern{Field(node,true), Constant(' flows '), Field(action,false)}" -match("MESSAGE#2:flows:02", "nwparser.payload", "%{node->} flows %{action}", processor_chain([ +var part20 = match("MESSAGE#2:flows:02", "nwparser.payload", "%{node->} flows %{action}", processor_chain([ dup5, dup6, dup7, @@ -340,14 +310,11 @@ var select8 = linear_select([ msg3, ]); -var part21 = // "Pattern{Field(node,false), Constant('_appliance urls src='), Field(p0,false)}" -match("MESSAGE#3:urls/0_0", "nwparser.payload", "%{node}_appliance urls src=%{p0}"); +var part21 = match("MESSAGE#3:urls/0_0", "nwparser.payload", "%{node}_appliance urls src=%{p0}"); -var part22 = // "Pattern{Field(node,true), Constant(' urls src='), Field(p0,false)}" -match("MESSAGE#3:urls/0_1", "nwparser.payload", "%{node->} urls src=%{p0}"); +var part22 = match("MESSAGE#3:urls/0_1", "nwparser.payload", "%{node->} urls src=%{p0}"); -var part23 = // "Pattern{Constant('src='), Field(p0,false)}" -match("MESSAGE#3:urls/0_2", "nwparser.payload", "src=%{p0}"); +var part23 = match("MESSAGE#3:urls/0_2", "nwparser.payload", "src=%{p0}"); var select9 = linear_select([ part21, @@ -355,17 +322,13 @@ var select9 = linear_select([ part23, ]); -var part24 = // "Pattern{Field(sport,false), Constant(':'), Field(saddr,true), Constant(' dst='), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' mac='), Field(macaddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#3:urls/1", "nwparser.p0", "%{sport}:%{saddr->} dst=%{daddr}:%{dport->} mac=%{macaddr->} %{p0}"); +var part24 = match("MESSAGE#3:urls/1", "nwparser.p0", "%{sport}:%{saddr->} dst=%{daddr}:%{dport->} mac=%{macaddr->} %{p0}"); -var part25 = // "Pattern{Constant('agent=''), Field(user_agent,false), Constant('' request: '), Field(p0,false)}" -match("MESSAGE#3:urls/2_0", "nwparser.p0", "agent='%{user_agent}' request: %{p0}"); +var part25 = match("MESSAGE#3:urls/2_0", "nwparser.p0", "agent='%{user_agent}' request: %{p0}"); -var part26 = // "Pattern{Constant('agent='), Field(user_agent,true), Constant(' request: '), Field(p0,false)}" -match("MESSAGE#3:urls/2_1", "nwparser.p0", "agent=%{user_agent->} request: %{p0}"); +var part26 = match("MESSAGE#3:urls/2_1", "nwparser.p0", "agent=%{user_agent->} request: %{p0}"); -var part27 = // "Pattern{Constant('request: '), Field(p0,false)}" -match("MESSAGE#3:urls/2_2", "nwparser.p0", "request: %{p0}"); +var part27 = match("MESSAGE#3:urls/2_2", "nwparser.p0", "request: %{p0}"); var select10 = linear_select([ part25, @@ -373,8 +336,7 @@ var select10 = linear_select([ part27, ]); -var part28 = // "Pattern{Field(,true), Constant(' '), Field(web_method,false), Constant(''), Field(url,false)}" -match("MESSAGE#3:urls/3", "nwparser.p0", "%{} %{web_method}%{url}"); +var part28 = match("MESSAGE#3:urls/3", "nwparser.p0", "%{} %{web_method}%{url}"); var all7 = all_match({ processors: [ @@ -394,22 +356,18 @@ var all7 = all_match({ var msg4 = msg("urls", all7); -var part29 = // "Pattern{Constant('dhcp lease of ip '), Field(saddr,true), Constant(' from server mac '), Field(smacaddr,true), Constant(' for client mac '), Field(p0,false)}" -match("MESSAGE#4:events/0", "nwparser.payload", "dhcp lease of ip %{saddr->} from server mac %{smacaddr->} for client mac %{p0}"); +var part29 = match("MESSAGE#4:events/0", "nwparser.payload", "dhcp lease of ip %{saddr->} from server mac %{smacaddr->} for client mac %{p0}"); -var part30 = // "Pattern{Field(dmacaddr,true), Constant(' with hostname '), Field(hostname,true), Constant(' from router '), Field(p0,false)}" -match("MESSAGE#4:events/1_0", "nwparser.p0", "%{dmacaddr->} with hostname %{hostname->} from router %{p0}"); +var part30 = match("MESSAGE#4:events/1_0", "nwparser.p0", "%{dmacaddr->} with hostname %{hostname->} from router %{p0}"); -var part31 = // "Pattern{Field(dmacaddr,true), Constant(' from router '), Field(p0,false)}" -match("MESSAGE#4:events/1_1", "nwparser.p0", "%{dmacaddr->} from router %{p0}"); +var part31 = match("MESSAGE#4:events/1_1", "nwparser.p0", "%{dmacaddr->} from router %{p0}"); var select11 = linear_select([ part30, part31, ]); -var part32 = // "Pattern{Field(hostip,true), Constant(' on subnet '), Field(mask,true), Constant(' with dns '), Field(dns_a_record,false)}" -match("MESSAGE#4:events/2", "nwparser.p0", "%{hostip->} on subnet %{mask->} with dns %{dns_a_record}"); +var part32 = match("MESSAGE#4:events/2", "nwparser.p0", "%{hostip->} on subnet %{mask->} with dns %{dns_a_record}"); var all8 = all_match({ processors: [ @@ -428,11 +386,9 @@ var all8 = all_match({ var msg5 = msg("events", all8); -var part33 = // "Pattern{Constant('content_filtering_block url=''), Field(url,false), Constant('' category0=''), Field(category,false), Constant('' server=''), Field(daddr,false), Constant(':'), Field(dport,false), Constant('''), Field(p0,false)}" -match("MESSAGE#5:events:02/0", "nwparser.payload", "content_filtering_block url='%{url}' category0='%{category}' server='%{daddr}:%{dport}'%{p0}"); +var part33 = match("MESSAGE#5:events:02/0", "nwparser.payload", "content_filtering_block url='%{url}' category0='%{category}' server='%{daddr}:%{dport}'%{p0}"); -var part34 = // "Pattern{Constant(' client_mac=''), Field(dmacaddr,false), Constant(''')}" -match("MESSAGE#5:events:02/1_0", "nwparser.p0", " client_mac='%{dmacaddr}'"); +var part34 = match("MESSAGE#5:events:02/1_0", "nwparser.p0", " client_mac='%{dmacaddr}'"); var select12 = linear_select([ part34, @@ -502,8 +458,7 @@ var part35 = tagval("MESSAGE#6:events:01", "nwparser.payload", tvm, { var msg7 = msg("events:01", part35); -var part36 = // "Pattern{Constant('IDS: '), Field(info,false)}" -match("MESSAGE#7:events:03", "nwparser.payload", "IDS: %{info}", processor_chain([ +var part36 = match("MESSAGE#7:events:03", "nwparser.payload", "IDS: %{info}", processor_chain([ dup5, dup6, setc("event_description","events IDS"), @@ -513,22 +468,18 @@ match("MESSAGE#7:events:03", "nwparser.payload", "IDS: %{info}", processor_chain var msg8 = msg("events:03", part36); -var part37 = // "Pattern{Constant('dhcp '), Field(p0,false)}" -match("MESSAGE#8:events:04/0", "nwparser.payload", "dhcp %{p0}"); +var part37 = match("MESSAGE#8:events:04/0", "nwparser.payload", "dhcp %{p0}"); -var part38 = // "Pattern{Constant('no offers'), Field(p0,false)}" -match("MESSAGE#8:events:04/1_0", "nwparser.p0", "no offers%{p0}"); +var part38 = match("MESSAGE#8:events:04/1_0", "nwparser.p0", "no offers%{p0}"); -var part39 = // "Pattern{Constant('release'), Field(p0,false)}" -match("MESSAGE#8:events:04/1_1", "nwparser.p0", "release%{p0}"); +var part39 = match("MESSAGE#8:events:04/1_1", "nwparser.p0", "release%{p0}"); var select13 = linear_select([ part38, part39, ]); -var part40 = // "Pattern{Field(,false), Constant('for mac '), Field(macaddr,false)}" -match("MESSAGE#8:events:04/2", "nwparser.p0", "%{}for mac %{macaddr}"); +var part40 = match("MESSAGE#8:events:04/2", "nwparser.p0", "%{}for mac %{macaddr}"); var all10 = all_match({ processors: [ @@ -547,8 +498,7 @@ var all10 = all_match({ var msg9 = msg("events:04", all10); -var part41 = // "Pattern{Constant('MAC '), Field(macaddr,true), Constant(' and MAC '), Field(macaddr,true), Constant(' both claim IP: '), Field(saddr,false)}" -match("MESSAGE#9:events:05", "nwparser.payload", "MAC %{macaddr->} and MAC %{macaddr->} both claim IP: %{saddr}", processor_chain([ +var part41 = match("MESSAGE#9:events:05", "nwparser.payload", "MAC %{macaddr->} and MAC %{macaddr->} both claim IP: %{saddr}", processor_chain([ dup5, dup6, setc("event_description"," events MAC"), @@ -567,14 +517,11 @@ var select14 = linear_select([ msg10, ]); -var part42 = // "Pattern{Field(node,true), Constant(' ids-alerts signature='), Field(fld1,true), Constant(' priority='), Field(fld2,true), Constant(' timestamp='), Field(fld3,false), Constant('.'), Field(fld4,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/0", "nwparser.payload", "%{node->} ids-alerts signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4->} %{p0}"); +var part42 = match("MESSAGE#10:ids-alerts:01/0", "nwparser.payload", "%{node->} ids-alerts signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4->} %{p0}"); -var part43 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' dst='), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' message: '), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/3_0", "nwparser.p0", "%{saddr}:%{sport->} dst=%{daddr}:%{dport->} message: %{p0}"); +var part43 = match("MESSAGE#10:ids-alerts:01/3_0", "nwparser.p0", "%{saddr}:%{sport->} dst=%{daddr}:%{dport->} message: %{p0}"); -var part44 = // "Pattern{Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' message: '), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/3_1", "nwparser.p0", "%{saddr->} dst=%{daddr->} message: %{p0}"); +var part44 = match("MESSAGE#10:ids-alerts:01/3_1", "nwparser.p0", "%{saddr->} dst=%{daddr->} message: %{p0}"); var select15 = linear_select([ part43, @@ -600,8 +547,7 @@ var all11 = all_match({ var msg11 = msg("ids-alerts:01", all11); -var part45 = // "Pattern{Field(node,true), Constant(' ids-alerts signature='), Field(fld1,true), Constant(' priority='), Field(fld2,true), Constant(' timestamp='), Field(fld3,false), Constant('.'), Field(fld4,false), Constant('direction='), Field(direction,true), Constant(' protocol='), Field(protocol,true), Constant(' src='), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#11:ids-alerts:03", "nwparser.payload", "%{node->} ids-alerts signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4}direction=%{direction->} protocol=%{protocol->} src=%{saddr}:%{sport}", processor_chain([ +var part45 = match("MESSAGE#11:ids-alerts:03", "nwparser.payload", "%{node->} ids-alerts signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4}direction=%{direction->} protocol=%{protocol->} src=%{saddr}:%{sport}", processor_chain([ dup15, dup6, dup16, @@ -611,8 +557,7 @@ match("MESSAGE#11:ids-alerts:03", "nwparser.payload", "%{node->} ids-alerts sign var msg12 = msg("ids-alerts:03", part45); -var part46 = // "Pattern{Field(node,true), Constant(' ids-alerts signature='), Field(fld1,true), Constant(' priority='), Field(fld2,true), Constant(' timestamp='), Field(fld3,false), Constant('.'), Field(fld4,false), Constant('protocol='), Field(protocol,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,false), Constant('message: '), Field(signame,false)}" -match("MESSAGE#12:ids-alerts:02", "nwparser.payload", "%{node->} ids-alerts signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4}protocol=%{protocol->} src=%{saddr->} dst=%{daddr}message: %{signame}", processor_chain([ +var part46 = match("MESSAGE#12:ids-alerts:02", "nwparser.payload", "%{node->} ids-alerts signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4}protocol=%{protocol->} src=%{saddr->} dst=%{daddr}message: %{signame}", processor_chain([ dup15, dup6, dup16, @@ -628,8 +573,7 @@ var select16 = linear_select([ msg13, ]); -var part47 = // "Pattern{Field(node,false), Constant('security_event '), Field(event_description,true), Constant(' url='), Field(url,true), Constant(' src='), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' dst='), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' mac='), Field(smacaddr,true), Constant(' name='), Field(fld10,true), Constant(' sha256='), Field(fld11,true), Constant(' disposition='), Field(disposition,true), Constant(' action='), Field(action,false)}" -match("MESSAGE#13:security_event", "nwparser.payload", "%{node}security_event %{event_description->} url=%{url->} src=%{saddr}:%{sport->} dst=%{daddr}:%{dport->} mac=%{smacaddr->} name=%{fld10->} sha256=%{fld11->} disposition=%{disposition->} action=%{action}", processor_chain([ +var part47 = match("MESSAGE#13:security_event", "nwparser.payload", "%{node}security_event %{event_description->} url=%{url->} src=%{saddr}:%{sport->} dst=%{daddr}:%{dport->} mac=%{smacaddr->} name=%{fld10->} sha256=%{fld11->} disposition=%{disposition->} action=%{action}", processor_chain([ dup5, dup6, dup18, @@ -639,14 +583,11 @@ match("MESSAGE#13:security_event", "nwparser.payload", "%{node}security_event %{ var msg14 = msg("security_event", part47); -var part48 = // "Pattern{Field(node,true), Constant(' security_event '), Field(event_description,true), Constant(' signature='), Field(fld1,true), Constant(' priority='), Field(fld2,true), Constant(' timestamp='), Field(fld3,false), Constant('.'), Field(fld4,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#14:security_event:01/0", "nwparser.payload", "%{node->} security_event %{event_description->} signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4->} %{p0}"); +var part48 = match("MESSAGE#14:security_event:01/0", "nwparser.payload", "%{node->} security_event %{event_description->} signature=%{fld1->} priority=%{fld2->} timestamp=%{fld3}.%{fld4->} %{p0}"); -var part49 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' dst='), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' message:'), Field(p0,false)}" -match("MESSAGE#14:security_event:01/3_0", "nwparser.p0", "%{saddr}:%{sport->} dst=%{daddr}:%{dport->} message:%{p0}"); +var part49 = match("MESSAGE#14:security_event:01/3_0", "nwparser.p0", "%{saddr}:%{sport->} dst=%{daddr}:%{dport->} message:%{p0}"); -var part50 = // "Pattern{Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' message:'), Field(p0,false)}" -match("MESSAGE#14:security_event:01/3_1", "nwparser.p0", "%{saddr->} dst=%{daddr->} message:%{p0}"); +var part50 = match("MESSAGE#14:security_event:01/3_1", "nwparser.p0", "%{saddr->} dst=%{daddr->} message:%{p0}"); var select17 = linear_select([ part49, @@ -688,34 +629,25 @@ var chain1 = processor_chain([ }), ]); -var hdr2 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hfld2,false), Constant('.'), Field(hfld3,true), Constant(' '), Field(p0,false)}" -match("HEADER#0:0003/0", "message", "%{hfld1->} %{hfld2}.%{hfld3->} %{p0}"); +var hdr2 = match("HEADER#0:0003/0", "message", "%{hfld1->} %{hfld2}.%{hfld3->} %{p0}"); -var part51 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#0:flows/2_1", "nwparser.p0", "p0"); +var part51 = match_copy("MESSAGE#0:flows/2_1", "nwparser.p0", "p0"); -var part52 = // "Pattern{}" -match_copy("MESSAGE#1:flows:01/1_2", "nwparser.p0", ""); +var part52 = match_copy("MESSAGE#1:flows:01/1_2", "nwparser.p0", ""); -var part53 = // "Pattern{Constant('dhost='), Field(dmacaddr,true), Constant(' direction='), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/1_0", "nwparser.p0", "dhost=%{dmacaddr->} direction=%{p0}"); +var part53 = match("MESSAGE#10:ids-alerts:01/1_0", "nwparser.p0", "dhost=%{dmacaddr->} direction=%{p0}"); -var part54 = // "Pattern{Constant('shost='), Field(smacaddr,true), Constant(' direction='), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/1_1", "nwparser.p0", "shost=%{smacaddr->} direction=%{p0}"); +var part54 = match("MESSAGE#10:ids-alerts:01/1_1", "nwparser.p0", "shost=%{smacaddr->} direction=%{p0}"); -var part55 = // "Pattern{Field(direction,true), Constant(' protocol='), Field(protocol,true), Constant(' src='), Field(p0,false)}" -match("MESSAGE#10:ids-alerts:01/2", "nwparser.p0", "%{direction->} protocol=%{protocol->} src=%{p0}"); +var part55 = match("MESSAGE#10:ids-alerts:01/2", "nwparser.p0", "%{direction->} protocol=%{protocol->} src=%{p0}"); -var part56 = // "Pattern{Field(signame,false)}" -match_copy("MESSAGE#10:ids-alerts:01/4", "nwparser.p0", "signame"); +var part56 = match_copy("MESSAGE#10:ids-alerts:01/4", "nwparser.p0", "signame"); -var part57 = // "Pattern{Field(hfld4,false), Constant('_appliance '), Field(p0,false)}" -match("HEADER#0:0003/1_0", "nwparser.p0", "%{hfld4}_appliance %{p0}", processor_chain([ +var part57 = match("HEADER#0:0003/1_0", "nwparser.p0", "%{hfld4}_appliance %{p0}", processor_chain([ dup2, ])); -var part58 = // "Pattern{Field(hfld4,true), Constant(' '), Field(p0,false)}" -match("HEADER#0:0003/1_1", "nwparser.p0", "%{hfld4->} %{p0}", processor_chain([ +var part58 = match("HEADER#0:0003/1_1", "nwparser.p0", "%{hfld4->} %{p0}", processor_chain([ dup3, ])); diff --git a/x-pack/filebeat/module/citrix/netscaler/config/pipeline.js b/x-pack/filebeat/module/citrix/netscaler/config/pipeline.js index 0da0631e21e..55f1931192c 100644 --- a/x-pack/filebeat/module/citrix/netscaler/config/pipeline.js +++ b/x-pack/filebeat/module/citrix/netscaler/config/pipeline.js @@ -77,14 +77,11 @@ var dup12 = setc("eventcategory","1201000000"); var dup13 = setc("event_description","AppFw Buffer Overflow violation in URL"); -var dup14 = // "Pattern{Field(saddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#6:APPFW_APPFW_COOKIE/0", "nwparser.payload", "%{saddr->} %{p0}"); +var dup14 = match("MESSAGE#6:APPFW_APPFW_COOKIE/0", "nwparser.payload", "%{saddr->} %{p0}"); -var dup15 = // "Pattern{Field(url,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#7:APPFW_APPFW_DENYURL/2", "nwparser.p0", "%{url->} \u003c\u003c%{disposition}>"); +var dup15 = match("MESSAGE#7:APPFW_APPFW_DENYURL/2", "nwparser.p0", "%{url->} \u003c\u003c%{disposition}>"); -var dup16 = // "Pattern{Field(url,true), Constant(' '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/2", "nwparser.p0", "%{url->} %{info->} \u003c\u003c%{disposition}>"); +var dup16 = match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/2", "nwparser.p0", "%{url->} %{info->} \u003c\u003c%{disposition}>"); var dup17 = setc("event_description","AppFw SQL Injection violation"); @@ -92,25 +89,19 @@ var dup18 = setc("event_description","AppFw Request error. Generated 400 Respons var dup19 = setc("severity","Warning"); -var dup20 = // "Pattern{Constant('"'), Field(p0,false)}" -match("MESSAGE#20:APPFW_Message/0", "nwparser.payload", "\"%{p0}"); +var dup20 = match("MESSAGE#20:APPFW_Message/0", "nwparser.payload", "\"%{p0}"); -var dup21 = // "Pattern{Constant('HASTATE '), Field(p0,false)}" -match("MESSAGE#23:DR_HA_Message/1_0", "nwparser.p0", "HASTATE %{p0}"); +var dup21 = match("MESSAGE#23:DR_HA_Message/1_0", "nwparser.p0", "HASTATE %{p0}"); -var dup22 = // "Pattern{Field(network_service,false), Constant(': '), Field(p0,false)}" -match("MESSAGE#23:DR_HA_Message/1_1", "nwparser.p0", "%{network_service}: %{p0}"); +var dup22 = match("MESSAGE#23:DR_HA_Message/1_1", "nwparser.p0", "%{network_service}: %{p0}"); -var dup23 = // "Pattern{Field(info,false), Constant('"')}" -match("MESSAGE#23:DR_HA_Message/2", "nwparser.p0", "%{info}\""); +var dup23 = match("MESSAGE#23:DR_HA_Message/2", "nwparser.p0", "%{info}\""); var dup24 = setc("event_description","Routing details"); -var dup25 = // "Pattern{Constant('for '), Field(dclass_counter1,false)}" -match("MESSAGE#24:EVENT_ALERTENDED/1_0", "nwparser.p0", "for %{dclass_counter1}"); +var dup25 = match("MESSAGE#24:EVENT_ALERTENDED/1_0", "nwparser.p0", "for %{dclass_counter1}"); -var dup26 = // "Pattern{Field(space,false)}" -match_copy("MESSAGE#24:EVENT_ALERTENDED/1_1", "nwparser.p0", "space"); +var dup26 = match_copy("MESSAGE#24:EVENT_ALERTENDED/1_1", "nwparser.p0", "space"); var dup27 = setc("ec_subject","Configuration"); @@ -120,14 +111,11 @@ var dup29 = setc("ec_theme","Configuration"); var dup30 = setc("ec_activity","Start"); -var dup31 = // "Pattern{Field(obj_type,true), Constant(' "'), Field(obj_name,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#28:EVENT_DEVICEDOWN/0", "nwparser.payload", "%{obj_type->} \"%{obj_name}\"%{p0}"); +var dup31 = match("MESSAGE#28:EVENT_DEVICEDOWN/0", "nwparser.payload", "%{obj_type->} \"%{obj_name}\"%{p0}"); -var dup32 = // "Pattern{Constant(' - State '), Field(event_state,false)}" -match("MESSAGE#28:EVENT_DEVICEDOWN/1_0", "nwparser.p0", " - State %{event_state}"); +var dup32 = match("MESSAGE#28:EVENT_DEVICEDOWN/1_0", "nwparser.p0", " - State %{event_state}"); -var dup33 = // "Pattern{}" -match_copy("MESSAGE#28:EVENT_DEVICEDOWN/1_1", "nwparser.p0", ""); +var dup33 = match_copy("MESSAGE#28:EVENT_DEVICEDOWN/1_1", "nwparser.p0", ""); var dup34 = setc("ec_subject","Service"); @@ -140,14 +128,11 @@ var dup35 = date_time({ ], }); -var dup36 = // "Pattern{Field(obj_type,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#31:EVENT_MONITORDOWN/0", "nwparser.payload", "%{obj_type->} %{p0}"); +var dup36 = match("MESSAGE#31:EVENT_MONITORDOWN/0", "nwparser.payload", "%{obj_type->} %{p0}"); -var dup37 = // "Pattern{Field(obj_name,true), Constant(' - State '), Field(event_state,false)}" -match("MESSAGE#31:EVENT_MONITORDOWN/1_0", "nwparser.p0", "%{obj_name->} - State %{event_state}"); +var dup37 = match("MESSAGE#31:EVENT_MONITORDOWN/1_0", "nwparser.p0", "%{obj_name->} - State %{event_state}"); -var dup38 = // "Pattern{Constant(''), Field(obj_name,false)}" -match("MESSAGE#31:EVENT_MONITORDOWN/1_2", "nwparser.p0", "%{obj_name}"); +var dup38 = match("MESSAGE#31:EVENT_MONITORDOWN/1_2", "nwparser.p0", "%{obj_name}"); var dup39 = setc("event_description","The monitor bound to the service is up"); @@ -155,11 +140,9 @@ var dup40 = setc("ec_subject","NetworkComm"); var dup41 = setc("severity","Debug"); -var dup42 = // "Pattern{Constant('" '), Field(p0,false)}" -match("MESSAGE#45:PITBOSS_Message1/0", "nwparser.payload", "\" %{p0}"); +var dup42 = match("MESSAGE#45:PITBOSS_Message1/0", "nwparser.payload", "\" %{p0}"); -var dup43 = // "Pattern{Constant(''), Field(info,false), Constant('"')}" -match("MESSAGE#45:PITBOSS_Message1/2", "nwparser.p0", "%{info}\""); +var dup43 = match("MESSAGE#45:PITBOSS_Message1/2", "nwparser.p0", "%{info}\""); var dup44 = date_time({ dest: "starttime", @@ -171,16 +154,13 @@ var dup44 = date_time({ var dup45 = setc("event_description","Process"); -var dup46 = // "Pattern{Constant('sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#54:SNMP_TRAP_SENT7/3_3", "nwparser.p0", "sysIpAddress = %{hostip})"); +var dup46 = match("MESSAGE#54:SNMP_TRAP_SENT7/3_3", "nwparser.p0", "sysIpAddress = %{hostip})"); var dup47 = setc("event_description","SNMP TRAP SENT"); -var dup48 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/0", "nwparser.payload", "%{} %{p0}"); +var dup48 = match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/0", "nwparser.payload", "%{} %{p0}"); -var dup49 = // "Pattern{Constant('ClientIP '), Field(p0,false)}" -match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/1_0", "nwparser.p0", "ClientIP %{p0}"); +var dup49 = match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/1_0", "nwparser.p0", "ClientIP %{p0}"); var dup50 = date_time({ dest: "event_time", @@ -193,23 +173,17 @@ var dup50 = date_time({ var dup51 = setc("ec_activity","Request"); -var dup52 = // "Pattern{Constant('" '), Field(fld10,true), Constant(' GMT" - End_time '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - End_time %{p0}"); +var dup52 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - End_time %{p0}"); -var dup53 = // "Pattern{Constant('" '), Field(fld10,false), Constant('" - End_time '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_1", "nwparser.p0", "\" %{fld10}\" - End_time %{p0}"); +var dup53 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_1", "nwparser.p0", "\" %{fld10}\" - End_time %{p0}"); -var dup54 = // "Pattern{Field(fld10,true), Constant(' - End_time '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_2", "nwparser.p0", "%{fld10->} - End_time %{p0}"); +var dup54 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_2", "nwparser.p0", "%{fld10->} - End_time %{p0}"); -var dup55 = // "Pattern{Constant('" '), Field(fld11,true), Constant(' GMT" - Duration '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_0", "nwparser.p0", "\" %{fld11->} GMT\" - Duration %{p0}"); +var dup55 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_0", "nwparser.p0", "\" %{fld11->} GMT\" - Duration %{p0}"); -var dup56 = // "Pattern{Constant('" '), Field(fld11,false), Constant('" - Duration '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_1", "nwparser.p0", "\" %{fld11}\" - Duration %{p0}"); +var dup56 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_1", "nwparser.p0", "\" %{fld11}\" - Duration %{p0}"); -var dup57 = // "Pattern{Field(fld11,true), Constant(' - Duration '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_2", "nwparser.p0", "%{fld11->} - Duration %{p0}"); +var dup57 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_2", "nwparser.p0", "%{fld11->} - Duration %{p0}"); var dup58 = setc("event_description","ICA connection related information for a connection belonging to a SSLVPN session"); @@ -233,61 +207,45 @@ var dup62 = date_time({ ], }); -var dup63 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - SessionId: '), Field(sessionid,false), Constant('- User '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/1_0", "nwparser.p0", "Context %{fld1->} - SessionId: %{sessionid}- User %{p0}"); +var dup63 = match("MESSAGE#94:SSLVPN_LOGIN/1_0", "nwparser.p0", "Context %{fld1->} - SessionId: %{sessionid}- User %{p0}"); -var dup64 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - User '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/1_1", "nwparser.p0", "Context %{fld1->} - User %{p0}"); +var dup64 = match("MESSAGE#94:SSLVPN_LOGIN/1_1", "nwparser.p0", "Context %{fld1->} - User %{p0}"); -var dup65 = // "Pattern{Constant('User '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/1_2", "nwparser.p0", "User %{p0}"); +var dup65 = match("MESSAGE#94:SSLVPN_LOGIN/1_2", "nwparser.p0", "User %{p0}"); -var dup66 = // "Pattern{Field(,true), Constant(' '), Field(username,false), Constant('- Client_ip '), Field(saddr,true), Constant(' - Nat_ip '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/2", "nwparser.p0", "%{} %{username}- Client_ip %{saddr->} - Nat_ip %{p0}"); +var dup66 = match("MESSAGE#94:SSLVPN_LOGIN/2", "nwparser.p0", "%{} %{username}- Client_ip %{saddr->} - Nat_ip %{p0}"); -var dup67 = // "Pattern{Constant('"'), Field(stransaddr,false), Constant('" - Vserver '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/3_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver %{p0}"); +var dup67 = match("MESSAGE#94:SSLVPN_LOGIN/3_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver %{p0}"); -var dup68 = // "Pattern{Field(stransaddr,true), Constant(' - Vserver '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/3_1", "nwparser.p0", "%{stransaddr->} - Vserver %{p0}"); +var dup68 = match("MESSAGE#94:SSLVPN_LOGIN/3_1", "nwparser.p0", "%{stransaddr->} - Vserver %{p0}"); var dup69 = setc("eventcategory","1401060000"); -var dup70 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Start_time '), Field(p0,false)}" -match("MESSAGE#95:SSLVPN_LOGOUT/4", "nwparser.p0", "%{daddr}:%{dport->} - Start_time %{p0}"); +var dup70 = match("MESSAGE#95:SSLVPN_LOGOUT/4", "nwparser.p0", "%{daddr}:%{dport->} - Start_time %{p0}"); var dup71 = setc("eventcategory","1401070000"); var dup72 = setc("ec_activity","Logoff"); -var dup73 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - SessionId: '), Field(sessionid,false), Constant('- User '), Field(username,true), Constant(' - Client_ip '), Field(hostip,true), Constant(' - Nat_ip '), Field(p0,false)}" -match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/0", "nwparser.payload", "Context %{fld1->} - SessionId: %{sessionid}- User %{username->} - Client_ip %{hostip->} - Nat_ip %{p0}"); +var dup73 = match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/0", "nwparser.payload", "Context %{fld1->} - SessionId: %{sessionid}- User %{username->} - Client_ip %{hostip->} - Nat_ip %{p0}"); -var dup74 = // "Pattern{Field(,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#100:SSLVPN_Message/0", "nwparser.payload", "%{}\"%{p0}"); +var dup74 = match("MESSAGE#100:SSLVPN_Message/0", "nwparser.payload", "%{}\"%{p0}"); -var dup75 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Vserver '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - NatIP '), Field(stransaddr,false), Constant(':'), Field(stransport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Delink Time '), Field(p0,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Vserver %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Delink Time %{p0}"); +var dup75 = match("MESSAGE#102:TCP_CONN_DELINK/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Vserver %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Delink Time %{p0}"); -var dup76 = // "Pattern{Field(fld11,true), Constant(' GMT - Total_bytes_send '), Field(p0,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/1_0", "nwparser.p0", "%{fld11->} GMT - Total_bytes_send %{p0}"); +var dup76 = match("MESSAGE#102:TCP_CONN_DELINK/1_0", "nwparser.p0", "%{fld11->} GMT - Total_bytes_send %{p0}"); -var dup77 = // "Pattern{Field(fld11,true), Constant(' - Total_bytes_send '), Field(p0,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/1_1", "nwparser.p0", "%{fld11->} - Total_bytes_send %{p0}"); +var dup77 = match("MESSAGE#102:TCP_CONN_DELINK/1_1", "nwparser.p0", "%{fld11->} - Total_bytes_send %{p0}"); -var dup78 = // "Pattern{Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/2", "nwparser.p0", "%{sbytes->} - Total_bytes_recv %{rbytes}"); +var dup78 = match("MESSAGE#102:TCP_CONN_DELINK/2", "nwparser.p0", "%{sbytes->} - Total_bytes_recv %{rbytes}"); var dup79 = setc("event_description","A Server side and a Client side TCP connection is delinked"); -var dup80 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Start Time '), Field(p0,false)}" -match("MESSAGE#103:TCP_CONN_TERMINATE/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{daddr}:%{dport->} - Start Time %{p0}"); +var dup80 = match("MESSAGE#103:TCP_CONN_TERMINATE/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{daddr}:%{dport->} - Start Time %{p0}"); -var dup81 = // "Pattern{Field(fld10,true), Constant(' GMT - End Time '), Field(p0,false)}" -match("MESSAGE#103:TCP_CONN_TERMINATE/1_0", "nwparser.p0", "%{fld10->} GMT - End Time %{p0}"); +var dup81 = match("MESSAGE#103:TCP_CONN_TERMINATE/1_0", "nwparser.p0", "%{fld10->} GMT - End Time %{p0}"); -var dup82 = // "Pattern{Field(fld10,true), Constant(' - End Time '), Field(p0,false)}" -match("MESSAGE#103:TCP_CONN_TERMINATE/1_1", "nwparser.p0", "%{fld10->} - End Time %{p0}"); +var dup82 = match("MESSAGE#103:TCP_CONN_TERMINATE/1_1", "nwparser.p0", "%{fld10->} - End Time %{p0}"); var dup83 = setc("event_description","TCP connection terminated"); @@ -317,27 +275,21 @@ var dup88 = setc("eventcategory","1401040000"); var dup89 = setc("event_description","CLI or GUI command executed in NetScaler"); -var dup90 = // "Pattern{Field(info,true), Constant(' "')}" -match("MESSAGE#113:CLUSTERD_Message:02/1_1", "nwparser.p0", "%{info->} \""); +var dup90 = match("MESSAGE#113:CLUSTERD_Message:02/1_1", "nwparser.p0", "%{info->} \""); var dup91 = setf("msg","$MSG"); var dup92 = setc("event_description","GUI command executed in NetScaler"); -var dup93 = // "Pattern{Constant('"'), Field(event_type,false), Constant(': '), Field(p0,false)}" -match("MESSAGE#158:AAA_Message/0", "nwparser.payload", "\"%{event_type}: %{p0}"); +var dup93 = match("MESSAGE#158:AAA_Message/0", "nwparser.payload", "\"%{event_type}: %{p0}"); -var dup94 = // "Pattern{Constant('Sessionid '), Field(sessionid,true), Constant(' - User '), Field(username,true), Constant(' - Client_ip '), Field(saddr,true), Constant(' - Nat_ip '), Field(p0,false)}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/0", "nwparser.payload", "Sessionid %{sessionid->} - User %{username->} - Client_ip %{saddr->} - Nat_ip %{p0}"); +var dup94 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/0", "nwparser.payload", "Sessionid %{sessionid->} - User %{username->} - Client_ip %{saddr->} - Nat_ip %{p0}"); -var dup95 = // "Pattern{Constant('"'), Field(stransaddr,false), Constant('" - Vserver_ip '), Field(p0,false)}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver_ip %{p0}"); +var dup95 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver_ip %{p0}"); -var dup96 = // "Pattern{Field(stransaddr,true), Constant(' - Vserver_ip '), Field(p0,false)}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_1", "nwparser.p0", "%{stransaddr->} - Vserver_ip %{p0}"); +var dup96 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_1", "nwparser.p0", "%{stransaddr->} - Vserver_ip %{p0}"); -var dup97 = // "Pattern{Field(daddr,true), Constant(' - Errmsg " '), Field(event_description,true), Constant(' "')}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/2", "nwparser.p0", "%{daddr->} - Errmsg \" %{event_description->} \""); +var dup97 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/2", "nwparser.p0", "%{daddr->} - Errmsg \" %{event_description->} \""); var dup98 = linear_select([ dup21, @@ -354,8 +306,7 @@ var dup100 = linear_select([ dup33, ]); -var dup101 = // "Pattern{Field(fld1,false), Constant(':UserLogin:'), Field(username,true), Constant(' - '), Field(event_description,true), Constant(' from client IP Address '), Field(saddr,false)}" -match("MESSAGE#84:SNMP_TRAP_SENT:05", "nwparser.payload", "%{fld1}:UserLogin:%{username->} - %{event_description->} from client IP Address %{saddr}", processor_chain([ +var dup101 = match("MESSAGE#84:SNMP_TRAP_SENT:05", "nwparser.payload", "%{fld1}:UserLogin:%{username->} - %{event_description->} from client IP Address %{saddr}", processor_chain([ dup5, dup4, ])); @@ -393,28 +344,24 @@ var dup107 = linear_select([ dup82, ]); -var dup108 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(action,false), Constant('" - Status "'), Field(disposition,false), Constant('"')}" -match("MESSAGE#109:UI_CMD_EXECUTED", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" - Status \"%{disposition}\"", processor_chain([ +var dup108 = match("MESSAGE#109:UI_CMD_EXECUTED", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" - Status \"%{disposition}\"", processor_chain([ dup88, dup89, dup3, dup4, ])); -var dup109 = // "Pattern{Field(product,false), Constant('|'), Field(version,false), Constant('|'), Field(rule,false), Constant('|'), Field(fld1,false), Constant('|'), Field(severity,false), Constant('|src='), Field(saddr,true), Constant(' spt='), Field(sport,true), Constant(' method='), Field(web_method,true), Constant(' request='), Field(url,true), Constant(' msg='), Field(info,true), Constant(' cn1='), Field(fld2,true), Constant(' cn2='), Field(fld3,true), Constant(' cs1='), Field(policyname,true), Constant(' cs2='), Field(fld5,true), Constant(' cs3='), Field(fld6,true), Constant(' cs4='), Field(severity,true), Constant(' cs5='), Field(fld8,true), Constant(' act='), Field(action,false)}" -match("MESSAGE#122:APPFW_COOKIE", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs3=%{fld6->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ +var dup109 = match("MESSAGE#122:APPFW_COOKIE", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs3=%{fld6->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ dup9, dup91, ])); -var dup110 = // "Pattern{Field(product,false), Constant('|'), Field(version,false), Constant('|'), Field(rule,false), Constant('|'), Field(fld1,false), Constant('|'), Field(severity,false), Constant('|src='), Field(saddr,true), Constant(' spt='), Field(sport,true), Constant(' method='), Field(web_method,true), Constant(' request='), Field(url,true), Constant(' msg='), Field(info,true), Constant(' cn1='), Field(fld2,true), Constant(' cn2='), Field(fld3,true), Constant(' cs1='), Field(policyname,true), Constant(' cs2='), Field(fld5,true), Constant(' cs4='), Field(severity,true), Constant(' cs5='), Field(fld8,true), Constant(' act='), Field(action,false)}" -match("MESSAGE#128:AF_400_RESP", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ +var dup110 = match("MESSAGE#128:AF_400_RESP", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ dup11, dup91, ])); -var dup111 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#165:AAATM_Message:06", "nwparser.payload", "info", processor_chain([ +var dup111 = match_copy("MESSAGE#165:AAATM_Message:06", "nwparser.payload", "info", processor_chain([ dup9, dup4, ])); @@ -450,34 +397,28 @@ var dup114 = all_match({ ]), }); -var hdr1 = // "Pattern{Field(hdatetime,true), Constant(' '), Field(hfld1,true), Constant(' : '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' '), Field(hfld2,false), Constant(':'), Field(payload,false)}" -match("HEADER#0:0001", "message", "%{hdatetime->} %{hfld1->} : %{msgIdPart1->} %{msgIdPart2->} %{hfld2}:%{payload}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "%{hdatetime->} %{hfld1->} : %{msgIdPart1->} %{msgIdPart2->} %{hfld2}:%{payload}", processor_chain([ setc("header_id","0001"), dup1, ])); -var hdr2 = // "Pattern{Field(hdatetime,true), Constant(' '), Field(hfld1,true), Constant(' : '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' :'), Field(payload,false)}" -match("HEADER#1:0005", "message", "%{hdatetime->} %{hfld1->} : %{msgIdPart1->} %{msgIdPart2->} :%{payload}", processor_chain([ +var hdr2 = match("HEADER#1:0005", "message", "%{hdatetime->} %{hfld1->} : %{msgIdPart1->} %{msgIdPart2->} :%{payload}", processor_chain([ setc("header_id","0005"), dup1, ])); -var hdr3 = // "Pattern{Field(hdatetime,true), Constant(' '), Field(hfld1,true), Constant(' : '), Field(hfld2,true), Constant(' '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#2:0002/0", "message", "%{hdatetime->} %{hfld1->} : %{hfld2->} %{msgIdPart1->} %{msgIdPart2->} %{p0}"); +var hdr3 = match("HEADER#2:0002/0", "message", "%{hdatetime->} %{hfld1->} : %{hfld2->} %{msgIdPart1->} %{msgIdPart2->} %{p0}"); -var part1 = // "Pattern{Field(hfld3,true), Constant(' '), Field(p0,false)}" -match("HEADER#2:0002/1_0", "nwparser.p0", "%{hfld3->} %{p0}"); +var part1 = match("HEADER#2:0002/1_0", "nwparser.p0", "%{hfld3->} %{p0}"); -var part2 = // "Pattern{Field(p0,false)}" -match_copy("HEADER#2:0002/1_1", "nwparser.p0", "p0"); +var part2 = match_copy("HEADER#2:0002/1_1", "nwparser.p0", "p0"); var select1 = linear_select([ part1, part2, ]); -var part3 = // "Pattern{Constant(':'), Field(payload,false)}" -match("HEADER#2:0002/2", "nwparser.p0", ":%{payload}"); +var part3 = match("HEADER#2:0002/2", "nwparser.p0", ":%{payload}"); var all1 = all_match({ processors: [ @@ -491,8 +432,7 @@ var all1 = all_match({ ]), }); -var hdr4 = // "Pattern{Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#3:0003", "message", "%{messageid->} %{p0}", processor_chain([ +var hdr4 = match("HEADER#3:0003", "message", "%{messageid->} %{p0}", processor_chain([ setc("header_id","0003"), call({ dest: "nwparser.payload", @@ -505,8 +445,7 @@ match("HEADER#3:0003", "message", "%{messageid->} %{p0}", processor_chain([ }), ])); -var hdr5 = // "Pattern{Constant('CEF:0|Citrix|'), Field(fld1,false), Constant('|'), Field(fld2,false), Constant('|'), Field(fld3,false), Constant('|'), Field(messageid,false), Constant('| '), Field(p0,false)}" -match("HEADER#4:0004", "message", "CEF:0|Citrix|%{fld1}|%{fld2}|%{fld3}|%{messageid}| %{p0}", processor_chain([ +var hdr5 = match("HEADER#4:0004", "message", "CEF:0|Citrix|%{fld1}|%{fld2}|%{fld3}|%{messageid}| %{p0}", processor_chain([ setc("header_id","0004"), call({ dest: "nwparser.payload", @@ -525,8 +464,7 @@ match("HEADER#4:0004", "message", "CEF:0|Citrix|%{fld1}|%{fld2}|%{fld3}|%{messag }), ])); -var hdr6 = // "Pattern{Constant('CEF:0|Citrix|'), Field(product,false), Constant('|'), Field(version,false), Constant('|'), Field(rule,false), Constant('|'), Field(hfld1,false), Constant('|'), Field(severity,false), Constant('| '), Field(payload,false)}" -match("HEADER#5:0006", "message", "CEF:0|Citrix|%{product}|%{version}|%{rule}|%{hfld1}|%{severity}| %{payload}", processor_chain([ +var hdr6 = match("HEADER#5:0006", "message", "CEF:0|Citrix|%{product}|%{version}|%{rule}|%{hfld1}|%{severity}| %{payload}", processor_chain([ setc("header_id","0006"), setc("messageid","CITRIX_TVM"), ])); @@ -540,11 +478,9 @@ var select2 = linear_select([ hdr6, ]); -var part4 = // "Pattern{Constant('Extracted_groups "'), Field(group,false), Constant('" ')}" -match("MESSAGE#0:AAA_EXTRACTED_GROUPS/0_0", "nwparser.payload", "Extracted_groups \"%{group}\" "); +var part4 = match("MESSAGE#0:AAA_EXTRACTED_GROUPS/0_0", "nwparser.payload", "Extracted_groups \"%{group}\" "); -var part5 = // "Pattern{Constant(' Extracted_groups "'), Field(group,false)}" -match("MESSAGE#0:AAA_EXTRACTED_GROUPS/0_1", "nwparser.payload", " Extracted_groups \"%{group}"); +var part5 = match("MESSAGE#0:AAA_EXTRACTED_GROUPS/0_1", "nwparser.payload", " Extracted_groups \"%{group}"); var select3 = linear_select([ part4, @@ -565,8 +501,7 @@ var all2 = all_match({ var msg1 = msg("AAA_EXTRACTED_GROUPS", all2); -var part6 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Client_ip '), Field(saddr,true), Constant(' - Failure_reason "'), Field(result,false), Constant('"')}" -match("MESSAGE#1:AAA_LOGIN_FAILED", "nwparser.payload", "User %{username->} - Client_ip %{saddr->} - Failure_reason \"%{result}\"", processor_chain([ +var part6 = match("MESSAGE#1:AAA_LOGIN_FAILED", "nwparser.payload", "User %{username->} - Client_ip %{saddr->} - Failure_reason \"%{result}\"", processor_chain([ dup5, setc("ec_subject","User"), dup6, @@ -579,8 +514,7 @@ match("MESSAGE#1:AAA_LOGIN_FAILED", "nwparser.payload", "User %{username->} - Cl var msg2 = msg("AAA_LOGIN_FAILED", part6); -var part7 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' --> Destination '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Protocol '), Field(protocol,true), Constant(' - TimeStamp '), Field(info,true), Constant(' - Hitcount '), Field(dclass_counter1,true), Constant(' - Hit Rule '), Field(rulename,true), Constant(' - Data '), Field(message_body,false)}" -match("MESSAGE#2:ACL_ACL_PKT_LOG", "nwparser.payload", "Source %{saddr}:%{sport->} --> Destination %{daddr}:%{dport->} - Protocol %{protocol->} - TimeStamp %{info->} - Hitcount %{dclass_counter1->} - Hit Rule %{rulename->} - Data %{message_body}", processor_chain([ +var part7 = match("MESSAGE#2:ACL_ACL_PKT_LOG", "nwparser.payload", "Source %{saddr}:%{sport->} --> Destination %{daddr}:%{dport->} - Protocol %{protocol->} - TimeStamp %{info->} - Hitcount %{dclass_counter1->} - Hit Rule %{rulename->} - Data %{message_body}", processor_chain([ dup9, setc("event_description","ACL_PKT_LOG"), dup10, @@ -589,8 +523,7 @@ match("MESSAGE#2:ACL_ACL_PKT_LOG", "nwparser.payload", "Source %{saddr}:%{sport- var msg3 = msg("ACL_ACL_PKT_LOG", part7); -var part8 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(info,false), Constant(': '), Field(url,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#3:APPFW_APPFW_BUFFEROVERFLOW_COOKIE", "nwparser.payload", "%{saddr->} %{fld2->} %{rule_group->} %{info}: %{url->} \u003c\u003c%{disposition}>", processor_chain([ +var part8 = match("MESSAGE#3:APPFW_APPFW_BUFFEROVERFLOW_COOKIE", "nwparser.payload", "%{saddr->} %{fld2->} %{rule_group->} %{info}: %{url->} \u003c\u003c%{disposition}>", processor_chain([ dup11, setc("event_description","AppFw Buffer Overflow violation in Cookie"), dup3, @@ -599,8 +532,7 @@ match("MESSAGE#3:APPFW_APPFW_BUFFEROVERFLOW_COOKIE", "nwparser.payload", "%{sadd var msg4 = msg("APPFW_APPFW_BUFFEROVERFLOW_COOKIE", part8); -var part9 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(info,false), Constant(': '), Field(url,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#4:APPFW_APPFW_BUFFEROVERFLOW_HDR", "nwparser.payload", "%{saddr->} %{fld2->} %{rule_group->} %{info}: %{url->} \u003c\u003c%{disposition}>", processor_chain([ +var part9 = match("MESSAGE#4:APPFW_APPFW_BUFFEROVERFLOW_HDR", "nwparser.payload", "%{saddr->} %{fld2->} %{rule_group->} %{info}: %{url->} \u003c\u003c%{disposition}>", processor_chain([ dup11, setc("event_description","AppFw Buffer Overflow violation in HTTP Headers"), dup3, @@ -609,8 +541,7 @@ match("MESSAGE#4:APPFW_APPFW_BUFFEROVERFLOW_HDR", "nwparser.payload", "%{saddr-> var msg5 = msg("APPFW_APPFW_BUFFEROVERFLOW_HDR", part9); -var part10 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(info,false), Constant(': '), Field(url,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#5:APPFW_APPFW_BUFFEROVERFLOW_URL", "nwparser.payload", "%{saddr->} %{fld2->} %{rule_group->} %{info}: %{url->} \u003c\u003c%{disposition}>", processor_chain([ +var part10 = match("MESSAGE#5:APPFW_APPFW_BUFFEROVERFLOW_URL", "nwparser.payload", "%{saddr->} %{fld2->} %{rule_group->} %{info}: %{url->} \u003c\u003c%{disposition}>", processor_chain([ dup12, dup13, dup3, @@ -619,8 +550,7 @@ match("MESSAGE#5:APPFW_APPFW_BUFFEROVERFLOW_URL", "nwparser.payload", "%{saddr-> var msg6 = msg("APPFW_APPFW_BUFFEROVERFLOW_URL", part10); -var part11 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld2,true), Constant(' '), Field(info,false), Constant(': '), Field(url,false)}" -match("MESSAGE#137:APPFW_APPFW_BUFFEROVERFLOW_URL:01", "nwparser.payload", "%{saddr->} %{fld2->} %{info}: %{url}", processor_chain([ +var part11 = match("MESSAGE#137:APPFW_APPFW_BUFFEROVERFLOW_URL:01", "nwparser.payload", "%{saddr->} %{fld2->} %{info}: %{url}", processor_chain([ dup12, dup13, dup3, @@ -634,14 +564,11 @@ var select4 = linear_select([ msg7, ]); -var part12 = // "Pattern{Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' '), Field(rule_group,true), Constant(' Cookie'), Field(p0,false)}" -match("MESSAGE#6:APPFW_APPFW_COOKIE/1_0", "nwparser.p0", "%{fld2->} %{fld3->} %{rule_group->} Cookie%{p0}"); +var part12 = match("MESSAGE#6:APPFW_APPFW_COOKIE/1_0", "nwparser.p0", "%{fld2->} %{fld3->} %{rule_group->} Cookie%{p0}"); -var part13 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Cookie'), Field(p0,false)}" -match("MESSAGE#6:APPFW_APPFW_COOKIE/1_1", "nwparser.p0", "%{fld2->} %{rule_group->} Cookie%{p0}"); +var part13 = match("MESSAGE#6:APPFW_APPFW_COOKIE/1_1", "nwparser.p0", "%{fld2->} %{rule_group->} Cookie%{p0}"); -var part14 = // "Pattern{Field(rule_group,true), Constant(' Cookie'), Field(p0,false)}" -match("MESSAGE#6:APPFW_APPFW_COOKIE/1_2", "nwparser.p0", "%{rule_group->} Cookie%{p0}"); +var part14 = match("MESSAGE#6:APPFW_APPFW_COOKIE/1_2", "nwparser.p0", "%{rule_group->} Cookie%{p0}"); var select5 = linear_select([ part12, @@ -649,8 +576,7 @@ var select5 = linear_select([ part14, ]); -var part15 = // "Pattern{Field(url,true), Constant(' validation failed for '), Field(fld3,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#6:APPFW_APPFW_COOKIE/2", "nwparser.p0", "%{url->} validation failed for %{fld3->} \u003c\u003c%{disposition}>"); +var part15 = match("MESSAGE#6:APPFW_APPFW_COOKIE/2", "nwparser.p0", "%{url->} validation failed for %{fld3->} \u003c\u003c%{disposition}>"); var all3 = all_match({ processors: [ @@ -668,11 +594,9 @@ var all3 = all_match({ var msg8 = msg("APPFW_APPFW_COOKIE", all3); -var part16 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Disallow Deny URL: '), Field(p0,false)}" -match("MESSAGE#7:APPFW_APPFW_DENYURL/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Disallow Deny URL: %{p0}"); +var part16 = match("MESSAGE#7:APPFW_APPFW_DENYURL/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Disallow Deny URL: %{p0}"); -var part17 = // "Pattern{Field(rule_group,true), Constant(' Disallow Deny URL: '), Field(p0,false)}" -match("MESSAGE#7:APPFW_APPFW_DENYURL/1_1", "nwparser.p0", "%{rule_group->} Disallow Deny URL: %{p0}"); +var part17 = match("MESSAGE#7:APPFW_APPFW_DENYURL/1_1", "nwparser.p0", "%{rule_group->} Disallow Deny URL: %{p0}"); var select6 = linear_select([ part16, @@ -697,14 +621,11 @@ var all4 = all_match({ var msg9 = msg("APPFW_APPFW_DENYURL", all4); -var part18 = // "Pattern{Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Field consistency'), Field(p0,false)}" -match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/1_0", "nwparser.p0", "%{fld1->} %{fld2->} %{rule_group->} Field consistency%{p0}"); +var part18 = match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/1_0", "nwparser.p0", "%{fld1->} %{fld2->} %{rule_group->} Field consistency%{p0}"); -var part19 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Field consistency'), Field(p0,false)}" -match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/1_1", "nwparser.p0", "%{fld2->} %{rule_group->} Field consistency%{p0}"); +var part19 = match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/1_1", "nwparser.p0", "%{fld2->} %{rule_group->} Field consistency%{p0}"); -var part20 = // "Pattern{Field(rule_group,true), Constant(' Field consistency'), Field(p0,false)}" -match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/1_2", "nwparser.p0", "%{rule_group->} Field consistency%{p0}"); +var part20 = match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/1_2", "nwparser.p0", "%{rule_group->} Field consistency%{p0}"); var select7 = linear_select([ part18, @@ -728,19 +649,16 @@ var all5 = all_match({ var msg10 = msg("APPFW_APPFW_FIELDCONSISTENCY", all5); -var part21 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Field'), Field(p0,false)}" -match("MESSAGE#9:APPFW_APPFW_FIELDFORMAT/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Field%{p0}"); +var part21 = match("MESSAGE#9:APPFW_APPFW_FIELDFORMAT/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Field%{p0}"); -var part22 = // "Pattern{Field(rule_group,true), Constant(' Field'), Field(p0,false)}" -match("MESSAGE#9:APPFW_APPFW_FIELDFORMAT/1_1", "nwparser.p0", "%{rule_group->} Field%{p0}"); +var part22 = match("MESSAGE#9:APPFW_APPFW_FIELDFORMAT/1_1", "nwparser.p0", "%{rule_group->} Field%{p0}"); var select8 = linear_select([ part21, part22, ]); -var part23 = // "Pattern{Field(url,true), Constant(' '), Field(info,true), Constant(' ="'), Field(fld4,false), Constant('" <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#9:APPFW_APPFW_FIELDFORMAT/2", "nwparser.p0", "%{url->} %{info->} =\"%{fld4}\" \u003c\u003c%{disposition}>"); +var part23 = match("MESSAGE#9:APPFW_APPFW_FIELDFORMAT/2", "nwparser.p0", "%{url->} %{info->} =\"%{fld4}\" \u003c\u003c%{disposition}>"); var all6 = all_match({ processors: [ @@ -758,11 +676,9 @@ var all6 = all_match({ var msg11 = msg("APPFW_APPFW_FIELDFORMAT", all6); -var part24 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' SQL'), Field(p0,false)}" -match("MESSAGE#10:APPFW_APPFW_SQL/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} SQL%{p0}"); +var part24 = match("MESSAGE#10:APPFW_APPFW_SQL/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} SQL%{p0}"); -var part25 = // "Pattern{Field(rule_group,true), Constant(' SQL'), Field(p0,false)}" -match("MESSAGE#10:APPFW_APPFW_SQL/1_1", "nwparser.p0", "%{rule_group->} SQL%{p0}"); +var part25 = match("MESSAGE#10:APPFW_APPFW_SQL/1_1", "nwparser.p0", "%{rule_group->} SQL%{p0}"); var select9 = linear_select([ part24, @@ -785,11 +701,9 @@ var all7 = all_match({ var msg12 = msg("APPFW_APPFW_SQL", all7); -var part26 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#11:APPFW_APPFW_SQL_1/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} %{p0}"); +var part26 = match("MESSAGE#11:APPFW_APPFW_SQL_1/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} %{p0}"); -var part27 = // "Pattern{Field(rule_group,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#11:APPFW_APPFW_SQL_1/1_1", "nwparser.p0", "%{rule_group->} %{p0}"); +var part27 = match("MESSAGE#11:APPFW_APPFW_SQL_1/1_1", "nwparser.p0", "%{rule_group->} %{p0}"); var select10 = linear_select([ part26, @@ -817,19 +731,16 @@ var select11 = linear_select([ msg13, ]); -var part28 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Maximum no. '), Field(p0,false)}" -match("MESSAGE#12:APPFW_APPFW_SAFECOMMERCE/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Maximum no. %{p0}"); +var part28 = match("MESSAGE#12:APPFW_APPFW_SAFECOMMERCE/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Maximum no. %{p0}"); -var part29 = // "Pattern{Field(rule_group,true), Constant(' Maximum no. '), Field(p0,false)}" -match("MESSAGE#12:APPFW_APPFW_SAFECOMMERCE/1_1", "nwparser.p0", "%{rule_group->} Maximum no. %{p0}"); +var part29 = match("MESSAGE#12:APPFW_APPFW_SAFECOMMERCE/1_1", "nwparser.p0", "%{rule_group->} Maximum no. %{p0}"); var select12 = linear_select([ part28, part29, ]); -var part30 = // "Pattern{Field(url,true), Constant(' of potential credit card numbers seen <<'), Field(info,false), Constant('>')}" -match("MESSAGE#12:APPFW_APPFW_SAFECOMMERCE/2", "nwparser.p0", "%{url->} of potential credit card numbers seen \u003c\u003c%{info}>"); +var part30 = match("MESSAGE#12:APPFW_APPFW_SAFECOMMERCE/2", "nwparser.p0", "%{url->} of potential credit card numbers seen \u003c\u003c%{info}>"); var all9 = all_match({ processors: [ @@ -847,19 +758,16 @@ var all9 = all_match({ var msg14 = msg("APPFW_APPFW_SAFECOMMERCE", all9); -var part31 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(url,true), Constant(' Transformed ('), Field(info,false), Constant(') Maximum no. '), Field(p0,false)}" -match("MESSAGE#13:APPFW_APPFW_SAFECOMMERCE_XFORM/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} %{url->} Transformed (%{info}) Maximum no. %{p0}"); +var part31 = match("MESSAGE#13:APPFW_APPFW_SAFECOMMERCE_XFORM/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} %{url->} Transformed (%{info}) Maximum no. %{p0}"); -var part32 = // "Pattern{Field(rule_group,true), Constant(' '), Field(url,true), Constant(' ('), Field(info,false), Constant(') '), Field(p0,false)}" -match("MESSAGE#13:APPFW_APPFW_SAFECOMMERCE_XFORM/1_1", "nwparser.p0", "%{rule_group->} %{url->} (%{info}) %{p0}"); +var part32 = match("MESSAGE#13:APPFW_APPFW_SAFECOMMERCE_XFORM/1_1", "nwparser.p0", "%{rule_group->} %{url->} (%{info}) %{p0}"); var select13 = linear_select([ part31, part32, ]); -var part33 = // "Pattern{Constant('potential credit card numbers seen in server response'), Field(,false)}" -match("MESSAGE#13:APPFW_APPFW_SAFECOMMERCE_XFORM/2", "nwparser.p0", "potential credit card numbers seen in server response%{}"); +var part33 = match("MESSAGE#13:APPFW_APPFW_SAFECOMMERCE_XFORM/2", "nwparser.p0", "potential credit card numbers seen in server response%{}"); var all10 = all_match({ processors: [ @@ -877,14 +785,11 @@ var all10 = all_match({ var msg15 = msg("APPFW_APPFW_SAFECOMMERCE_XFORM", all10); -var part34 = // "Pattern{Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' '), Field(rule_group,true), Constant(' Disallow Illegal URL: '), Field(p0,false)}" -match("MESSAGE#14:APPFW_APPFW_STARTURL/1_0", "nwparser.p0", "%{fld2->} %{fld3->} %{rule_group->} Disallow Illegal URL: %{p0}"); +var part34 = match("MESSAGE#14:APPFW_APPFW_STARTURL/1_0", "nwparser.p0", "%{fld2->} %{fld3->} %{rule_group->} Disallow Illegal URL: %{p0}"); -var part35 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Disallow Illegal URL: '), Field(p0,false)}" -match("MESSAGE#14:APPFW_APPFW_STARTURL/1_1", "nwparser.p0", "%{fld2->} %{rule_group->} Disallow Illegal URL: %{p0}"); +var part35 = match("MESSAGE#14:APPFW_APPFW_STARTURL/1_1", "nwparser.p0", "%{fld2->} %{rule_group->} Disallow Illegal URL: %{p0}"); -var part36 = // "Pattern{Field(rule_group,true), Constant(' Disallow Illegal URL: '), Field(p0,false)}" -match("MESSAGE#14:APPFW_APPFW_STARTURL/1_2", "nwparser.p0", "%{rule_group->} Disallow Illegal URL: %{p0}"); +var part36 = match("MESSAGE#14:APPFW_APPFW_STARTURL/1_2", "nwparser.p0", "%{rule_group->} Disallow Illegal URL: %{p0}"); var select14 = linear_select([ part34, @@ -908,19 +813,16 @@ var all11 = all_match({ var msg16 = msg("APPFW_APPFW_STARTURL", all11); -var part37 = // "Pattern{Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' Cross-site'), Field(p0,false)}" -match("MESSAGE#15:APPFW_APPFW_XSS/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Cross-site%{p0}"); +var part37 = match("MESSAGE#15:APPFW_APPFW_XSS/1_0", "nwparser.p0", "%{fld2->} %{rule_group->} Cross-site%{p0}"); -var part38 = // "Pattern{Field(rule_group,true), Constant(' Cross-site'), Field(p0,false)}" -match("MESSAGE#15:APPFW_APPFW_XSS/1_1", "nwparser.p0", "%{rule_group->} Cross-site%{p0}"); +var part38 = match("MESSAGE#15:APPFW_APPFW_XSS/1_1", "nwparser.p0", "%{rule_group->} Cross-site%{p0}"); var select15 = linear_select([ part37, part38, ]); -var part39 = // "Pattern{Field(url,true), Constant(' script '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#15:APPFW_APPFW_XSS/2", "nwparser.p0", "%{url->} script %{info->} \u003c\u003c%{disposition}>"); +var part39 = match("MESSAGE#15:APPFW_APPFW_XSS/2", "nwparser.p0", "%{url->} script %{info->} \u003c\u003c%{disposition}>"); var all12 = all_match({ processors: [ @@ -938,8 +840,7 @@ var all12 = all_match({ var msg17 = msg("APPFW_APPFW_XSS", all12); -var part40 = // "Pattern{Field(saddr,true), Constant(' "'), Field(info,false), Constant('"')}" -match("MESSAGE#16:APPFW_AF_400_RESP", "nwparser.payload", "%{saddr->} \"%{info}\"", processor_chain([ +var part40 = match("MESSAGE#16:APPFW_AF_400_RESP", "nwparser.payload", "%{saddr->} \"%{info}\"", processor_chain([ dup11, dup18, dup3, @@ -948,8 +849,7 @@ match("MESSAGE#16:APPFW_AF_400_RESP", "nwparser.payload", "%{saddr->} \"%{info}\ var msg18 = msg("APPFW_AF_400_RESP", part40); -var part41 = // "Pattern{Field(saddr,true), Constant(' '), Field(info,false)}" -match("MESSAGE#138:APPFW_AF_400_RESP:01", "nwparser.payload", "%{saddr->} %{info}", processor_chain([ +var part41 = match("MESSAGE#138:APPFW_AF_400_RESP:01", "nwparser.payload", "%{saddr->} %{info}", processor_chain([ dup11, dup18, dup3, @@ -963,8 +863,7 @@ var select16 = linear_select([ msg19, ]); -var part42 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld10,true), Constant(' Match found with Safe Object: '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#17:APPFW_APPFW_SAFEOBJECT", "nwparser.payload", "%{saddr->} %{fld10->} Match found with Safe Object: %{info->} \u003c\u003c%{disposition}>", processor_chain([ +var part42 = match("MESSAGE#17:APPFW_APPFW_SAFEOBJECT", "nwparser.payload", "%{saddr->} %{fld10->} Match found with Safe Object: %{info->} \u003c\u003c%{disposition}>", processor_chain([ dup11, setc("event_description","AppFw Safe Object"), dup3, @@ -973,8 +872,7 @@ match("MESSAGE#17:APPFW_APPFW_SAFEOBJECT", "nwparser.payload", "%{saddr->} %{fld var msg20 = msg("APPFW_APPFW_SAFEOBJECT", part42); -var part43 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld10,true), Constant(' CSRF Tag validation failed: <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#18:APPFW_APPFW_CSRF_TAG", "nwparser.payload", "%{saddr->} %{fld10->} CSRF Tag validation failed: \u003c\u003c%{disposition}>", processor_chain([ +var part43 = match("MESSAGE#18:APPFW_APPFW_CSRF_TAG", "nwparser.payload", "%{saddr->} %{fld10->} CSRF Tag validation failed: \u003c\u003c%{disposition}>", processor_chain([ dup11, setc("event_description","AppFw CSRF Tag Validation Failed"), dup3, @@ -983,8 +881,7 @@ match("MESSAGE#18:APPFW_APPFW_CSRF_TAG", "nwparser.payload", "%{saddr->} %{fld10 var msg21 = msg("APPFW_APPFW_CSRF_TAG", part43); -var part44 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' '), Field(url,false)}" -match("MESSAGE#135:APPFW_APPFW_CSRF_TAG:01", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{fld3->} %{url}", processor_chain([ +var part44 = match("MESSAGE#135:APPFW_APPFW_CSRF_TAG:01", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{fld3->} %{url}", processor_chain([ dup9, dup3, dup4, @@ -997,8 +894,7 @@ var select17 = linear_select([ msg22, ]); -var part45 = // "Pattern{Constant('Memory allocation request for '), Field(bytes,true), Constant(' bytes failed. Call stack PCs: '), Field(fld1,false)}" -match("MESSAGE#19:APPFW_AF_MEMORY_ERR", "nwparser.payload", "Memory allocation request for %{bytes->} bytes failed. Call stack PCs: %{fld1}", processor_chain([ +var part45 = match("MESSAGE#19:APPFW_AF_MEMORY_ERR", "nwparser.payload", "Memory allocation request for %{bytes->} bytes failed. Call stack PCs: %{fld1}", processor_chain([ dup11, setc("event_description","Memory allocation request for some bytes failed"), dup19, @@ -1007,19 +903,16 @@ match("MESSAGE#19:APPFW_AF_MEMORY_ERR", "nwparser.payload", "Memory allocation r var msg23 = msg("APPFW_AF_MEMORY_ERR", part45); -var part46 = // "Pattern{Constant('Invalid rule id '), Field(p0,false)}" -match("MESSAGE#20:APPFW_Message/1_0", "nwparser.p0", "Invalid rule id %{p0}"); +var part46 = match("MESSAGE#20:APPFW_Message/1_0", "nwparser.p0", "Invalid rule id %{p0}"); -var part47 = // "Pattern{Constant('Duplicate rule id '), Field(p0,false)}" -match("MESSAGE#20:APPFW_Message/1_1", "nwparser.p0", "Duplicate rule id %{p0}"); +var part47 = match("MESSAGE#20:APPFW_Message/1_1", "nwparser.p0", "Duplicate rule id %{p0}"); var select18 = linear_select([ part46, part47, ]); -var part48 = // "Pattern{Field(fld1,false), Constant('"')}" -match("MESSAGE#20:APPFW_Message/2", "nwparser.p0", "%{fld1}\""); +var part48 = match("MESSAGE#20:APPFW_Message/2", "nwparser.p0", "%{fld1}\""); var all13 = all_match({ processors: [ @@ -1037,8 +930,7 @@ var all13 = all_match({ var msg24 = msg("APPFW_Message", all13); -var part49 = // "Pattern{Constant('"Setting default custom settings for profile '), Field(fld1,true), Constant(' ('), Field(fld2,false), Constant(')"')}" -match("MESSAGE#21:APPFW_Message:01", "nwparser.payload", "\"Setting default custom settings for profile %{fld1->} (%{fld2})\"", processor_chain([ +var part49 = match("MESSAGE#21:APPFW_Message:01", "nwparser.payload", "\"Setting default custom settings for profile %{fld1->} (%{fld2})\"", processor_chain([ dup9, setc("event_description","Setting default custom settings for profile"), dup19, @@ -1047,8 +939,7 @@ match("MESSAGE#21:APPFW_Message:01", "nwparser.payload", "\"Setting default cust var msg25 = msg("APPFW_Message:01", part49); -var part50 = // "Pattern{Constant('"Setting same CustomSettings( ) to profile. '), Field(fld2,false), Constant('"')}" -match("MESSAGE#22:APPFW_Message:02", "nwparser.payload", "\"Setting same CustomSettings( ) to profile. %{fld2}\"", processor_chain([ +var part50 = match("MESSAGE#22:APPFW_Message:02", "nwparser.payload", "\"Setting same CustomSettings( ) to profile. %{fld2}\"", processor_chain([ dup9, setc("event_description","Setting same CustomSettings( ) to profile."), dup4, @@ -1064,8 +955,7 @@ var select19 = linear_select([ var msg27 = msg("DR_HA_Message", dup113); -var part51 = // "Pattern{Field(process,true), Constant(' ended '), Field(p0,false)}" -match("MESSAGE#24:EVENT_ALERTENDED/0", "nwparser.payload", "%{process->} ended %{p0}"); +var part51 = match("MESSAGE#24:EVENT_ALERTENDED/0", "nwparser.payload", "%{process->} ended %{p0}"); var all14 = all_match({ processors: [ @@ -1082,8 +972,7 @@ var all14 = all_match({ var msg28 = msg("EVENT_ALERTENDED", all14); -var part52 = // "Pattern{Field(process,true), Constant(' started '), Field(p0,false)}" -match("MESSAGE#25:EVENT_ALERTSTARTED/0", "nwparser.payload", "%{process->} started %{p0}"); +var part52 = match("MESSAGE#25:EVENT_ALERTSTARTED/0", "nwparser.payload", "%{process->} started %{p0}"); var all15 = all_match({ processors: [ @@ -1100,8 +989,7 @@ var all15 = all_match({ var msg29 = msg("EVENT_ALERTSTARTED", all15); -var part53 = // "Pattern{Constant('CONFIG '), Field(info,false)}" -match("MESSAGE#26:EVENT_CONFIGEND", "nwparser.payload", "CONFIG %{info}", processor_chain([ +var part53 = match("MESSAGE#26:EVENT_CONFIGEND", "nwparser.payload", "CONFIG %{info}", processor_chain([ dup2, dup27, dup28, @@ -1113,8 +1001,7 @@ match("MESSAGE#26:EVENT_CONFIGEND", "nwparser.payload", "CONFIG %{info}", proces var msg30 = msg("EVENT_CONFIGEND", part53); -var part54 = // "Pattern{Constant('CONFIG '), Field(info,false)}" -match("MESSAGE#27:EVENT_CONFIGSTART", "nwparser.payload", "CONFIG %{info}", processor_chain([ +var part54 = match("MESSAGE#27:EVENT_CONFIGSTART", "nwparser.payload", "CONFIG %{info}", processor_chain([ dup2, dup27, dup30, @@ -1143,8 +1030,7 @@ var all16 = all_match({ var msg32 = msg("EVENT_DEVICEDOWN", all16); -var part55 = // "Pattern{Field(obj_type,true), Constant(' "'), Field(obj_name,false), Constant('" - State '), Field(event_state,false)}" -match("MESSAGE#29:EVENT_DEVICEOFS", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - State %{event_state}", processor_chain([ +var part55 = match("MESSAGE#29:EVENT_DEVICEOFS", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - State %{event_state}", processor_chain([ dup11, dup34, dup28, @@ -1172,8 +1058,7 @@ var all17 = all_match({ var msg34 = msg("EVENT_DEVICEUP", all17); -var part56 = // "Pattern{Constant('"'), Field(obj_name,false), Constant('"')}" -match("MESSAGE#31:EVENT_MONITORDOWN/1_1", "nwparser.p0", "\"%{obj_name}\""); +var part56 = match("MESSAGE#31:EVENT_MONITORDOWN/1_1", "nwparser.p0", "\"%{obj_name}\""); var select20 = linear_select([ dup37, @@ -1216,8 +1101,7 @@ var all19 = all_match({ var msg36 = msg("EVENT_MONITORUP", all19); -var part57 = // "Pattern{Field(obj_type,true), Constant(' "'), Field(obj_name,false), Constant('" - State '), Field(event_state,false)}" -match("MESSAGE#33:EVENT_NICRESET", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - State %{event_state}", processor_chain([ +var part57 = match("MESSAGE#33:EVENT_NICRESET", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - State %{event_state}", processor_chain([ dup2, dup39, dup3, @@ -1226,8 +1110,7 @@ match("MESSAGE#33:EVENT_NICRESET", "nwparser.payload", "%{obj_type->} \"%{obj_na var msg37 = msg("EVENT_NICRESET", part57); -var part58 = // "Pattern{Field(obj_type,true), Constant(' '), Field(obj_name,true), Constant(' - State '), Field(event_state,false)}" -match("MESSAGE#34:EVENT_ROUTEDOWN", "nwparser.payload", "%{obj_type->} %{obj_name->} - State %{event_state}", processor_chain([ +var part58 = match("MESSAGE#34:EVENT_ROUTEDOWN", "nwparser.payload", "%{obj_type->} %{obj_name->} - State %{event_state}", processor_chain([ dup11, dup40, dup28, @@ -1238,8 +1121,7 @@ match("MESSAGE#34:EVENT_ROUTEDOWN", "nwparser.payload", "%{obj_type->} %{obj_nam var msg38 = msg("EVENT_ROUTEDOWN", part58); -var part59 = // "Pattern{Field(obj_type,true), Constant(' '), Field(obj_name,true), Constant(' - State '), Field(event_state,false)}" -match("MESSAGE#35:EVENT_ROUTEUP", "nwparser.payload", "%{obj_type->} %{obj_name->} - State %{event_state}", processor_chain([ +var part59 = match("MESSAGE#35:EVENT_ROUTEUP", "nwparser.payload", "%{obj_type->} %{obj_name->} - State %{event_state}", processor_chain([ dup2, dup40, dup30, @@ -1250,8 +1132,7 @@ match("MESSAGE#35:EVENT_ROUTEUP", "nwparser.payload", "%{obj_type->} %{obj_name- var msg39 = msg("EVENT_ROUTEUP", part59); -var part60 = // "Pattern{Constant('CPU_started '), Field(info,false)}" -match("MESSAGE#36:EVENT_STARTCPU", "nwparser.payload", "CPU_started %{info}", processor_chain([ +var part60 = match("MESSAGE#36:EVENT_STARTCPU", "nwparser.payload", "CPU_started %{info}", processor_chain([ dup2, setc("event_description","CPU Started"), dup3, @@ -1260,8 +1141,7 @@ match("MESSAGE#36:EVENT_STARTCPU", "nwparser.payload", "CPU_started %{info}", pr var msg40 = msg("EVENT_STARTCPU", part60); -var part61 = // "Pattern{Constant('SAVECONFIG '), Field(info,false)}" -match("MESSAGE#37:EVENT_STARTSAVECONFIG", "nwparser.payload", "SAVECONFIG %{info}", processor_chain([ +var part61 = match("MESSAGE#37:EVENT_STARTSAVECONFIG", "nwparser.payload", "SAVECONFIG %{info}", processor_chain([ dup2, setc("event_description","Save configuration started"), dup3, @@ -1270,8 +1150,7 @@ match("MESSAGE#37:EVENT_STARTSAVECONFIG", "nwparser.payload", "SAVECONFIG %{info var msg41 = msg("EVENT_STARTSAVECONFIG", part61); -var part62 = // "Pattern{Constant('System started - '), Field(info,false)}" -match("MESSAGE#38:EVENT_STARTSYS", "nwparser.payload", "System started - %{info}", processor_chain([ +var part62 = match("MESSAGE#38:EVENT_STARTSYS", "nwparser.payload", "System started - %{info}", processor_chain([ dup2, dup34, dup30, @@ -1282,8 +1161,7 @@ match("MESSAGE#38:EVENT_STARTSYS", "nwparser.payload", "System started - %{info} var msg42 = msg("EVENT_STARTSYS", part62); -var part63 = // "Pattern{Field(obj_type,true), Constant(' "'), Field(obj_name,false), Constant('" - State '), Field(event_state,false)}" -match("MESSAGE#39:EVENT_STATECHANGE", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - State %{event_state}", processor_chain([ +var part63 = match("MESSAGE#39:EVENT_STATECHANGE", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - State %{event_state}", processor_chain([ dup2, dup34, dup30, @@ -1294,8 +1172,7 @@ match("MESSAGE#39:EVENT_STATECHANGE", "nwparser.payload", "%{obj_type->} \"%{obj var msg43 = msg("EVENT_STATECHANGE", part63); -var part64 = // "Pattern{Field(obj_type,true), Constant(' ('), Field(obj_name,false), Constant(') - '), Field(event_state,true), Constant(' '), Field(info,false)}" -match("MESSAGE#40:EVENT_STATECHANGE_HEARTBEAT", "nwparser.payload", "%{obj_type->} (%{obj_name}) - %{event_state->} %{info}", processor_chain([ +var part64 = match("MESSAGE#40:EVENT_STATECHANGE_HEARTBEAT", "nwparser.payload", "%{obj_type->} (%{obj_name}) - %{event_state->} %{info}", processor_chain([ dup2, setc("event_description","Heartbeat State report"), dup3, @@ -1304,8 +1181,7 @@ match("MESSAGE#40:EVENT_STATECHANGE_HEARTBEAT", "nwparser.payload", "%{obj_type- var msg44 = msg("EVENT_STATECHANGE_HEARTBEAT", part64); -var part65 = // "Pattern{Field(obj_type,true), Constant(' "'), Field(obj_name,false), Constant('" - '), Field(event_state,true), Constant(' '), Field(info,false)}" -match("MESSAGE#41:EVENT_STATECHANGE:01", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - %{event_state->} %{info}", processor_chain([ +var part65 = match("MESSAGE#41:EVENT_STATECHANGE:01", "nwparser.payload", "%{obj_type->} \"%{obj_name}\" - %{event_state->} %{info}", processor_chain([ dup2, dup4, ])); @@ -1318,8 +1194,7 @@ var select22 = linear_select([ msg45, ]); -var part66 = // "Pattern{Constant('SAVECONFIG'), Field(info,false)}" -match("MESSAGE#42:EVENT_STOPSAVECONFIG", "nwparser.payload", "SAVECONFIG%{info}", processor_chain([ +var part66 = match("MESSAGE#42:EVENT_STOPSAVECONFIG", "nwparser.payload", "SAVECONFIG%{info}", processor_chain([ dup2, dup27, dup28, @@ -1330,8 +1205,7 @@ match("MESSAGE#42:EVENT_STOPSAVECONFIG", "nwparser.payload", "SAVECONFIG%{info}" var msg46 = msg("EVENT_STOPSAVECONFIG", part66); -var part67 = // "Pattern{Constant('System stopped - '), Field(info,false)}" -match("MESSAGE#43:EVENT_STOPSYS", "nwparser.payload", "System stopped - %{info}", processor_chain([ +var part67 = match("MESSAGE#43:EVENT_STOPSYS", "nwparser.payload", "System stopped - %{info}", processor_chain([ dup2, dup34, dup28, @@ -1342,8 +1216,7 @@ match("MESSAGE#43:EVENT_STOPSYS", "nwparser.payload", "System stopped - %{info}" var msg47 = msg("EVENT_STOPSYS", part67); -var part68 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#44:EVENT_UNKNOWN", "nwparser.payload", "info", processor_chain([ +var part68 = match_copy("MESSAGE#44:EVENT_UNKNOWN", "nwparser.payload", "info", processor_chain([ dup11, setc("event_description","Unknown Event"), dup3, @@ -1352,11 +1225,9 @@ match_copy("MESSAGE#44:EVENT_UNKNOWN", "nwparser.payload", "info", processor_cha var msg48 = msg("EVENT_UNKNOWN", part68); -var part69 = // "Pattern{Field(fld1,true), Constant(' '), Field(fld10,true), Constant(' Adding '), Field(p0,false)}" -match("MESSAGE#45:PITBOSS_Message1/1_0", "nwparser.p0", "%{fld1->} %{fld10->} Adding %{p0}"); +var part69 = match("MESSAGE#45:PITBOSS_Message1/1_0", "nwparser.p0", "%{fld1->} %{fld10->} Adding %{p0}"); -var part70 = // "Pattern{Constant('Adding '), Field(p0,false)}" -match("MESSAGE#45:PITBOSS_Message1/1_1", "nwparser.p0", "Adding %{p0}"); +var part70 = match("MESSAGE#45:PITBOSS_Message1/1_1", "nwparser.p0", "Adding %{p0}"); var select23 = linear_select([ part69, @@ -1379,11 +1250,9 @@ var all20 = all_match({ var msg49 = msg("PITBOSS_Message1", all20); -var part71 = // "Pattern{Field(fld1,true), Constant(' '), Field(fld10,true), Constant(' Deleting '), Field(p0,false)}" -match("MESSAGE#46:PITBOSS_Message2/1_0", "nwparser.p0", "%{fld1->} %{fld10->} Deleting %{p0}"); +var part71 = match("MESSAGE#46:PITBOSS_Message2/1_0", "nwparser.p0", "%{fld1->} %{fld10->} Deleting %{p0}"); -var part72 = // "Pattern{Constant('Deleting '), Field(p0,false)}" -match("MESSAGE#46:PITBOSS_Message2/1_1", "nwparser.p0", "Deleting %{p0}"); +var part72 = match("MESSAGE#46:PITBOSS_Message2/1_1", "nwparser.p0", "Deleting %{p0}"); var select24 = linear_select([ part71, @@ -1406,17 +1275,13 @@ var all21 = all_match({ var msg50 = msg("PITBOSS_Message2", all21); -var part73 = // "Pattern{Constant('"'), Field(fld1,true), Constant(' '), Field(fld10,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#47:PITBOSS_Message3/0", "nwparser.payload", "\"%{fld1->} %{fld10->} %{p0}"); +var part73 = match("MESSAGE#47:PITBOSS_Message3/0", "nwparser.payload", "\"%{fld1->} %{fld10->} %{p0}"); -var part74 = // "Pattern{Constant('Pitboss policy is'), Field(p0,false)}" -match("MESSAGE#47:PITBOSS_Message3/1_0", "nwparser.p0", "Pitboss policy is%{p0}"); +var part74 = match("MESSAGE#47:PITBOSS_Message3/1_0", "nwparser.p0", "Pitboss policy is%{p0}"); -var part75 = // "Pattern{Constant('PB_OP_CHANGE_POLICY new policy'), Field(p0,false)}" -match("MESSAGE#47:PITBOSS_Message3/1_1", "nwparser.p0", "PB_OP_CHANGE_POLICY new policy%{p0}"); +var part75 = match("MESSAGE#47:PITBOSS_Message3/1_1", "nwparser.p0", "PB_OP_CHANGE_POLICY new policy%{p0}"); -var part76 = // "Pattern{Constant('pb_op_longer_hb'), Field(p0,false)}" -match("MESSAGE#47:PITBOSS_Message3/1_2", "nwparser.p0", "pb_op_longer_hb%{p0}"); +var part76 = match("MESSAGE#47:PITBOSS_Message3/1_2", "nwparser.p0", "pb_op_longer_hb%{p0}"); var select25 = linear_select([ part74, @@ -1424,8 +1289,7 @@ var select25 = linear_select([ part76, ]); -var part77 = // "Pattern{Field(,true), Constant(' '), Field(info,false), Constant('"')}" -match("MESSAGE#47:PITBOSS_Message3/2", "nwparser.p0", "%{} %{info}\""); +var part77 = match("MESSAGE#47:PITBOSS_Message3/2", "nwparser.p0", "%{} %{info}\""); var all22 = all_match({ processors: [ @@ -1444,11 +1308,9 @@ var all22 = all_match({ var msg51 = msg("PITBOSS_Message3", all22); -var part78 = // "Pattern{Field(fld1,true), Constant(' '), Field(fld10,true), Constant(' process '), Field(p0,false)}" -match("MESSAGE#48:PITBOSS_Message4/1_0", "nwparser.p0", "%{fld1->} %{fld10->} process %{p0}"); +var part78 = match("MESSAGE#48:PITBOSS_Message4/1_0", "nwparser.p0", "%{fld1->} %{fld10->} process %{p0}"); -var part79 = // "Pattern{Constant('process '), Field(p0,false)}" -match("MESSAGE#48:PITBOSS_Message4/1_1", "nwparser.p0", "process %{p0}"); +var part79 = match("MESSAGE#48:PITBOSS_Message4/1_1", "nwparser.p0", "process %{p0}"); var select26 = linear_select([ part78, @@ -1472,11 +1334,9 @@ var all23 = all_match({ var msg52 = msg("PITBOSS_Message4", all23); -var part80 = // "Pattern{Field(fld1,true), Constant(' '), Field(fld10,true), Constant(' New '), Field(p0,false)}" -match("MESSAGE#49:PITBOSS_Message5/1_0", "nwparser.p0", "%{fld1->} %{fld10->} New %{p0}"); +var part80 = match("MESSAGE#49:PITBOSS_Message5/1_0", "nwparser.p0", "%{fld1->} %{fld10->} New %{p0}"); -var part81 = // "Pattern{Constant('New '), Field(p0,false)}" -match("MESSAGE#49:PITBOSS_Message5/1_1", "nwparser.p0", "New %{p0}"); +var part81 = match("MESSAGE#49:PITBOSS_Message5/1_1", "nwparser.p0", "New %{p0}"); var select27 = linear_select([ part80, @@ -1508,8 +1368,7 @@ var select28 = linear_select([ msg53, ]); -var part82 = // "Pattern{Constant('"IMI: '), Field(event_description,true), Constant(' : nodeID('), Field(fld1,false), Constant(') IP('), Field(saddr,false), Constant(') instance('), Field(fld2,false), Constant(') Configuration Coordinator('), Field(fld3,false), Constant(') Nodeset('), Field(fld4,false), Constant(')"')}" -match("MESSAGE#50:ROUTING_Message", "nwparser.payload", "\"IMI: %{event_description->} : nodeID(%{fld1}) IP(%{saddr}) instance(%{fld2}) Configuration Coordinator(%{fld3}) Nodeset(%{fld4})\"", processor_chain([ +var part82 = match("MESSAGE#50:ROUTING_Message", "nwparser.payload", "\"IMI: %{event_description->} : nodeID(%{fld1}) IP(%{saddr}) instance(%{fld2}) Configuration Coordinator(%{fld3}) Nodeset(%{fld4})\"", processor_chain([ dup9, dup4, ])); @@ -1518,8 +1377,7 @@ var msg54 = msg("ROUTING_Message", part82); var msg55 = msg("ROUTING_Message:01", dup113); -var part83 = // "Pattern{Constant('"'), Field(fld1,true), Constant(' started"')}" -match("MESSAGE#52:ROUTING_Message:02", "nwparser.payload", "\"%{fld1->} started\"", processor_chain([ +var part83 = match("MESSAGE#52:ROUTING_Message:02", "nwparser.payload", "\"%{fld1->} started\"", processor_chain([ dup9, dup4, ])); @@ -1532,8 +1390,7 @@ var select29 = linear_select([ msg56, ]); -var part84 = // "Pattern{Field(obj_type,true), Constant(' Command "'), Field(action,false), Constant('" '), Field(info,false)}" -match("MESSAGE#53:ROUTING_ZEBOS_CMD_EXECUTED", "nwparser.payload", "%{obj_type->} Command \"%{action}\" %{info}", processor_chain([ +var part84 = match("MESSAGE#53:ROUTING_ZEBOS_CMD_EXECUTED", "nwparser.payload", "%{obj_type->} Command \"%{action}\" %{info}", processor_chain([ dup2, setc("event_description","User has executed a command in ZebOS(vtysh)"), dup3, @@ -1542,31 +1399,24 @@ match("MESSAGE#53:ROUTING_ZEBOS_CMD_EXECUTED", "nwparser.payload", "%{obj_type-> var msg57 = msg("ROUTING_ZEBOS_CMD_EXECUTED", part84); -var part85 = // "Pattern{Field(obj_type,true), Constant(' ( '), Field(space,false), Constant('entityName = "'), Field(p0,false)}" -match("MESSAGE#54:SNMP_TRAP_SENT7/0", "nwparser.payload", "%{obj_type->} ( %{space}entityName = \"%{p0}"); +var part85 = match("MESSAGE#54:SNMP_TRAP_SENT7/0", "nwparser.payload", "%{obj_type->} ( %{space}entityName = \"%{p0}"); -var part86 = // "Pattern{Field(obj_name,false), Constant('('), Field(info,false), Constant('...",'), Field(p0,false)}" -match("MESSAGE#54:SNMP_TRAP_SENT7/1_0", "nwparser.p0", "%{obj_name}(%{info}...\",%{p0}"); +var part86 = match("MESSAGE#54:SNMP_TRAP_SENT7/1_0", "nwparser.p0", "%{obj_name}(%{info}...\",%{p0}"); -var part87 = // "Pattern{Field(obj_name,false), Constant('...",'), Field(p0,false)}" -match("MESSAGE#54:SNMP_TRAP_SENT7/1_1", "nwparser.p0", "%{obj_name}...\",%{p0}"); +var part87 = match("MESSAGE#54:SNMP_TRAP_SENT7/1_1", "nwparser.p0", "%{obj_name}...\",%{p0}"); var select30 = linear_select([ part86, part87, ]); -var part88 = // "Pattern{Field(,false), Constant('alarmEntityCurState = '), Field(event_state,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#54:SNMP_TRAP_SENT7/2", "nwparser.p0", "%{}alarmEntityCurState = %{event_state}, %{p0}"); +var part88 = match("MESSAGE#54:SNMP_TRAP_SENT7/2", "nwparser.p0", "%{}alarmEntityCurState = %{event_state}, %{p0}"); -var part89 = // "Pattern{Constant('svcServiceFullName.'), Field(fld2,true), Constant(' = "'), Field(service,false), Constant('", nsPartitionName = '), Field(fld4,false), Constant(')')}" -match("MESSAGE#54:SNMP_TRAP_SENT7/3_0", "nwparser.p0", "svcServiceFullName.%{fld2->} = \"%{service}\", nsPartitionName = %{fld4})"); +var part89 = match("MESSAGE#54:SNMP_TRAP_SENT7/3_0", "nwparser.p0", "svcServiceFullName.%{fld2->} = \"%{service}\", nsPartitionName = %{fld4})"); -var part90 = // "Pattern{Constant('vsvrFullName.'), Field(fld3,true), Constant(' = "'), Field(obj_server,false), Constant('", nsPartitionName = '), Field(fld4,false), Constant(')')}" -match("MESSAGE#54:SNMP_TRAP_SENT7/3_1", "nwparser.p0", "vsvrFullName.%{fld3->} = \"%{obj_server}\", nsPartitionName = %{fld4})"); +var part90 = match("MESSAGE#54:SNMP_TRAP_SENT7/3_1", "nwparser.p0", "vsvrFullName.%{fld3->} = \"%{obj_server}\", nsPartitionName = %{fld4})"); -var part91 = // "Pattern{Constant('svcGrpMemberFullName.'), Field(fld6,true), Constant(' = "'), Field(fld7,false), Constant('", nsPartitionName = '), Field(fld4,false), Constant(')')}" -match("MESSAGE#54:SNMP_TRAP_SENT7/3_2", "nwparser.p0", "svcGrpMemberFullName.%{fld6->} = \"%{fld7}\", nsPartitionName = %{fld4})"); +var part91 = match("MESSAGE#54:SNMP_TRAP_SENT7/3_2", "nwparser.p0", "svcGrpMemberFullName.%{fld6->} = \"%{fld7}\", nsPartitionName = %{fld4})"); var select31 = linear_select([ part89, @@ -1592,8 +1442,7 @@ var all25 = all_match({ var msg58 = msg("SNMP_TRAP_SENT7", all25); -var part92 = // "Pattern{Field(obj_type,true), Constant(' ( entityName = "'), Field(obj_name,false), Constant('...", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#55:SNMP_TRAP_SENT8", "nwparser.payload", "%{obj_type->} ( entityName = \"%{obj_name}...\", sysIpAddress = %{hostip})", processor_chain([ +var part92 = match("MESSAGE#55:SNMP_TRAP_SENT8", "nwparser.payload", "%{obj_type->} ( entityName = \"%{obj_name}...\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup4, @@ -1601,8 +1450,7 @@ match("MESSAGE#55:SNMP_TRAP_SENT8", "nwparser.payload", "%{obj_type->} ( entityN var msg59 = msg("SNMP_TRAP_SENT8", part92); -var part93 = // "Pattern{Field(obj_type,true), Constant(' ( haNicsMonitorFailed = '), Field(obj_name,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#56:SNMP_TRAP_SENT9", "nwparser.payload", "%{obj_type->} ( haNicsMonitorFailed = %{obj_name}, sysIpAddress = %{hostip})", processor_chain([ +var part93 = match("MESSAGE#56:SNMP_TRAP_SENT9", "nwparser.payload", "%{obj_type->} ( haNicsMonitorFailed = %{obj_name}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup4, @@ -1610,8 +1458,7 @@ match("MESSAGE#56:SNMP_TRAP_SENT9", "nwparser.payload", "%{obj_type->} ( haNicsM var msg60 = msg("SNMP_TRAP_SENT9", part93); -var part94 = // "Pattern{Field(obj_type,true), Constant(' ( '), Field(space,false), Constant('haPeerSystemState = "'), Field(event_state,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#57:SNMP_TRAP_SENT10", "nwparser.payload", "%{obj_type->} ( %{space}haPeerSystemState = \"%{event_state}\", sysIpAddress = %{hostip})", processor_chain([ +var part94 = match("MESSAGE#57:SNMP_TRAP_SENT10", "nwparser.payload", "%{obj_type->} ( %{space}haPeerSystemState = \"%{event_state}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1620,8 +1467,7 @@ match("MESSAGE#57:SNMP_TRAP_SENT10", "nwparser.payload", "%{obj_type->} ( %{spac var msg61 = msg("SNMP_TRAP_SENT10", part94); -var part95 = // "Pattern{Field(obj_type,true), Constant(' ( sysHealthDiskName = "'), Field(obj_name,false), Constant('", sysHealthDiskPerusage = '), Field(fld2,false), Constant(', alarmHighThreshold = '), Field(dclass_counter2,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#58:SNMP_TRAP_SENT11", "nwparser.payload", "%{obj_type->} ( sysHealthDiskName = \"%{obj_name}\", sysHealthDiskPerusage = %{fld2}, alarmHighThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ +var part95 = match("MESSAGE#58:SNMP_TRAP_SENT11", "nwparser.payload", "%{obj_type->} ( sysHealthDiskName = \"%{obj_name}\", sysHealthDiskPerusage = %{fld2}, alarmHighThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1630,8 +1476,7 @@ match("MESSAGE#58:SNMP_TRAP_SENT11", "nwparser.payload", "%{obj_type->} ( sysHea var msg62 = msg("SNMP_TRAP_SENT11", part95); -var part96 = // "Pattern{Field(obj_type,true), Constant(' ( vsvrName = "'), Field(dclass_counter1_string,false), Constant('", vsvrRequestRate = "'), Field(dclass_counter1,false), Constant('", alarmHighThreshold = '), Field(dclass_counter2,false), Constant(', vsvrFullName = "'), Field(fld1,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#59:SNMP_TRAP_SENT12", "nwparser.payload", "%{obj_type->} ( vsvrName = \"%{dclass_counter1_string}\", vsvrRequestRate = \"%{dclass_counter1}\", alarmHighThreshold = %{dclass_counter2}, vsvrFullName = \"%{fld1}\", sysIpAddress = %{hostip})", processor_chain([ +var part96 = match("MESSAGE#59:SNMP_TRAP_SENT12", "nwparser.payload", "%{obj_type->} ( vsvrName = \"%{dclass_counter1_string}\", vsvrRequestRate = \"%{dclass_counter1}\", alarmHighThreshold = %{dclass_counter2}, vsvrFullName = \"%{fld1}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1640,8 +1485,7 @@ match("MESSAGE#59:SNMP_TRAP_SENT12", "nwparser.payload", "%{obj_type->} ( vsvrNa var msg63 = msg("SNMP_TRAP_SENT12", part96); -var part97 = // "Pattern{Field(obj_type,true), Constant(' ( monServiceName = "'), Field(fld1,false), Constant('", monitorName = "'), Field(dclass_counter1_string,false), Constant('", responseTimeoutThreshold = '), Field(dclass_counter1,false), Constant(', alarmMonrespto = '), Field(dclass_counter2,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#60:SNMP_TRAP_SENT13", "nwparser.payload", "%{obj_type->} ( monServiceName = \"%{fld1}\", monitorName = \"%{dclass_counter1_string}\", responseTimeoutThreshold = %{dclass_counter1}, alarmMonrespto = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ +var part97 = match("MESSAGE#60:SNMP_TRAP_SENT13", "nwparser.payload", "%{obj_type->} ( monServiceName = \"%{fld1}\", monitorName = \"%{dclass_counter1_string}\", responseTimeoutThreshold = %{dclass_counter1}, alarmMonrespto = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1650,8 +1494,7 @@ match("MESSAGE#60:SNMP_TRAP_SENT13", "nwparser.payload", "%{obj_type->} ( monSer var msg64 = msg("SNMP_TRAP_SENT13", part97); -var part98 = // "Pattern{Field(obj_type,true), Constant(' ( sysHealthCounterName = "'), Field(dclass_counter1_string,false), Constant('", sysHealthCounterValue = '), Field(dclass_counter1,false), Constant(', alarmNormalThreshold = '), Field(dclass_counter2,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#61:SNMP_TRAP_SENT14", "nwparser.payload", "%{obj_type->} ( sysHealthCounterName = \"%{dclass_counter1_string}\", sysHealthCounterValue = %{dclass_counter1}, alarmNormalThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ +var part98 = match("MESSAGE#61:SNMP_TRAP_SENT14", "nwparser.payload", "%{obj_type->} ( sysHealthCounterName = \"%{dclass_counter1_string}\", sysHealthCounterValue = %{dclass_counter1}, alarmNormalThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1660,8 +1503,7 @@ match("MESSAGE#61:SNMP_TRAP_SENT14", "nwparser.payload", "%{obj_type->} ( sysHea var msg65 = msg("SNMP_TRAP_SENT14", part98); -var part99 = // "Pattern{Field(obj_type,true), Constant(' ( sysHealthCounterName = "'), Field(dclass_counter1_string,false), Constant('", sysHealthCounterValue = '), Field(dclass_counter1,false), Constant(', alarmLowThreshold = '), Field(dclass_counter2,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#62:SNMP_TRAP_SENT15", "nwparser.payload", "%{obj_type->} ( sysHealthCounterName = \"%{dclass_counter1_string}\", sysHealthCounterValue = %{dclass_counter1}, alarmLowThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ +var part99 = match("MESSAGE#62:SNMP_TRAP_SENT15", "nwparser.payload", "%{obj_type->} ( sysHealthCounterName = \"%{dclass_counter1_string}\", sysHealthCounterValue = %{dclass_counter1}, alarmLowThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1670,8 +1512,7 @@ match("MESSAGE#62:SNMP_TRAP_SENT15", "nwparser.payload", "%{obj_type->} ( sysHea var msg66 = msg("SNMP_TRAP_SENT15", part99); -var part100 = // "Pattern{Field(obj_type,true), Constant(' ( sysHealthCounterName = "'), Field(dclass_counter1_string,false), Constant('", sysHealthCounterValue = '), Field(dclass_counter1,false), Constant(', alarmHighThreshold = '), Field(dclass_counter2,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#63:SNMP_TRAP_SENT16", "nwparser.payload", "%{obj_type->} ( sysHealthCounterName = \"%{dclass_counter1_string}\", sysHealthCounterValue = %{dclass_counter1}, alarmHighThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ +var part100 = match("MESSAGE#63:SNMP_TRAP_SENT16", "nwparser.payload", "%{obj_type->} ( sysHealthCounterName = \"%{dclass_counter1_string}\", sysHealthCounterValue = %{dclass_counter1}, alarmHighThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1680,8 +1521,7 @@ match("MESSAGE#63:SNMP_TRAP_SENT16", "nwparser.payload", "%{obj_type->} ( sysHea var msg67 = msg("SNMP_TRAP_SENT16", part100); -var part101 = // "Pattern{Field(obj_type,true), Constant(' ( alarmRateLmtThresholdExceeded = "'), Field(obj_name,false), Constant(': "'), Field(info,false), Constant('...", ipAddressGathered = "'), Field(fld1,false), Constant('", stringComputed = "'), Field(fld2,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#64:SNMP_TRAP_SENT17", "nwparser.payload", "%{obj_type->} ( alarmRateLmtThresholdExceeded = \"%{obj_name}: \"%{info}...\", ipAddressGathered = \"%{fld1}\", stringComputed = \"%{fld2}\", sysIpAddress = %{hostip})", processor_chain([ +var part101 = match("MESSAGE#64:SNMP_TRAP_SENT17", "nwparser.payload", "%{obj_type->} ( alarmRateLmtThresholdExceeded = \"%{obj_name}: \"%{info}...\", ipAddressGathered = \"%{fld1}\", stringComputed = \"%{fld2}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1690,22 +1530,18 @@ match("MESSAGE#64:SNMP_TRAP_SENT17", "nwparser.payload", "%{obj_type->} ( alarmR var msg68 = msg("SNMP_TRAP_SENT17", part101); -var part102 = // "Pattern{Field(obj_type,true), Constant(' ( entityName = "'), Field(obj_name,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#65:SNMP_TRAP_SENT/0", "nwparser.payload", "%{obj_type->} ( entityName = \"%{obj_name->} (%{p0}"); +var part102 = match("MESSAGE#65:SNMP_TRAP_SENT/0", "nwparser.payload", "%{obj_type->} ( entityName = \"%{obj_name->} (%{p0}"); -var part103 = // "Pattern{Field(info,false), Constant('..." '), Field(p0,false)}" -match("MESSAGE#65:SNMP_TRAP_SENT/1_0", "nwparser.p0", "%{info}...\" %{p0}"); +var part103 = match("MESSAGE#65:SNMP_TRAP_SENT/1_0", "nwparser.p0", "%{info}...\" %{p0}"); -var part104 = // "Pattern{Field(info,false), Constant('" '), Field(p0,false)}" -match("MESSAGE#65:SNMP_TRAP_SENT/1_1", "nwparser.p0", "%{info}\" %{p0}"); +var part104 = match("MESSAGE#65:SNMP_TRAP_SENT/1_1", "nwparser.p0", "%{info}\" %{p0}"); var select32 = linear_select([ part103, part104, ]); -var part105 = // "Pattern{Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#65:SNMP_TRAP_SENT/2", "nwparser.p0", ", sysIpAddress = %{hostip})"); +var part105 = match("MESSAGE#65:SNMP_TRAP_SENT/2", "nwparser.p0", ", sysIpAddress = %{hostip})"); var all26 = all_match({ processors: [ @@ -1723,8 +1559,7 @@ var all26 = all_match({ var msg69 = msg("SNMP_TRAP_SENT", all26); -var part106 = // "Pattern{Field(obj_type,true), Constant(' ( appfwLogMsg = '), Field(obj_name,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#66:SNMP_TRAP_SENT6", "nwparser.payload", "%{obj_type->} ( appfwLogMsg = %{obj_name}, sysIpAddress = %{hostip})", processor_chain([ +var part106 = match("MESSAGE#66:SNMP_TRAP_SENT6", "nwparser.payload", "%{obj_type->} ( appfwLogMsg = %{obj_name}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1733,37 +1568,28 @@ match("MESSAGE#66:SNMP_TRAP_SENT6", "nwparser.payload", "%{obj_type->} ( appfwLo var msg70 = msg("SNMP_TRAP_SENT6", part106); -var part107 = // "Pattern{Field(obj_type,true), Constant(' ( '), Field(space,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#67:SNMP_TRAP_SENT5/0", "nwparser.payload", "%{obj_type->} ( %{space->} %{p0}"); +var part107 = match("MESSAGE#67:SNMP_TRAP_SENT5/0", "nwparser.payload", "%{obj_type->} ( %{space->} %{p0}"); -var part108 = // "Pattern{Constant('partition id = '), Field(fld12,false), Constant(', nsUserName = "'), Field(p0,false)}" -match("MESSAGE#67:SNMP_TRAP_SENT5/1_0", "nwparser.p0", "partition id = %{fld12}, nsUserName = \"%{p0}"); +var part108 = match("MESSAGE#67:SNMP_TRAP_SENT5/1_0", "nwparser.p0", "partition id = %{fld12}, nsUserName = \"%{p0}"); -var part109 = // "Pattern{Constant('nsUserName = "'), Field(p0,false)}" -match("MESSAGE#67:SNMP_TRAP_SENT5/1_1", "nwparser.p0", "nsUserName = \"%{p0}"); +var part109 = match("MESSAGE#67:SNMP_TRAP_SENT5/1_1", "nwparser.p0", "nsUserName = \"%{p0}"); var select33 = linear_select([ part108, part109, ]); -var part110 = // "Pattern{Constant('",'), Field(username,true), Constant(' configurationCmd = "'), Field(action,false), Constant('", authorizationStatus = '), Field(event_state,false), Constant(', commandExecutionStatus = '), Field(disposition,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#67:SNMP_TRAP_SENT5/2", "nwparser.p0", "\",%{username->} configurationCmd = \"%{action}\", authorizationStatus = %{event_state}, commandExecutionStatus = %{disposition}, %{p0}"); +var part110 = match("MESSAGE#67:SNMP_TRAP_SENT5/2", "nwparser.p0", "\",%{username->} configurationCmd = \"%{action}\", authorizationStatus = %{event_state}, commandExecutionStatus = %{disposition}, %{p0}"); -var part111 = // "Pattern{Constant('commandFailureReason = "'), Field(result,false), Constant('", nsClientIPAddr = '), Field(saddr,false), Constant(', sysIpAddress ='), Field(hostip,false), Constant(')')}" -match("MESSAGE#67:SNMP_TRAP_SENT5/3_0", "nwparser.p0", "commandFailureReason = \"%{result}\", nsClientIPAddr = %{saddr}, sysIpAddress =%{hostip})"); +var part111 = match("MESSAGE#67:SNMP_TRAP_SENT5/3_0", "nwparser.p0", "commandFailureReason = \"%{result}\", nsClientIPAddr = %{saddr}, sysIpAddress =%{hostip})"); -var part112 = // "Pattern{Constant('commandFailureReason = "'), Field(result,false), Constant('", nsClientIPAddr = '), Field(saddr,false), Constant(', nsPartitionName = '), Field(fld1,false), Constant(')')}" -match("MESSAGE#67:SNMP_TRAP_SENT5/3_1", "nwparser.p0", "commandFailureReason = \"%{result}\", nsClientIPAddr = %{saddr}, nsPartitionName = %{fld1})"); +var part112 = match("MESSAGE#67:SNMP_TRAP_SENT5/3_1", "nwparser.p0", "commandFailureReason = \"%{result}\", nsClientIPAddr = %{saddr}, nsPartitionName = %{fld1})"); -var part113 = // "Pattern{Constant('nsClientIPAddr = '), Field(saddr,false), Constant(', nsPartitionName = '), Field(fld1,false), Constant(')')}" -match("MESSAGE#67:SNMP_TRAP_SENT5/3_2", "nwparser.p0", "nsClientIPAddr = %{saddr}, nsPartitionName = %{fld1})"); +var part113 = match("MESSAGE#67:SNMP_TRAP_SENT5/3_2", "nwparser.p0", "nsClientIPAddr = %{saddr}, nsPartitionName = %{fld1})"); -var part114 = // "Pattern{Constant('nsClientIPAddr = '), Field(saddr,false), Constant(', sysIpAddress ='), Field(hostip,true), Constant(' )')}" -match("MESSAGE#67:SNMP_TRAP_SENT5/3_3", "nwparser.p0", "nsClientIPAddr = %{saddr}, sysIpAddress =%{hostip->} )"); +var part114 = match("MESSAGE#67:SNMP_TRAP_SENT5/3_3", "nwparser.p0", "nsClientIPAddr = %{saddr}, sysIpAddress =%{hostip->} )"); -var part115 = // "Pattern{Constant('sysIpAddress ='), Field(hostip,false), Constant(')')}" -match("MESSAGE#67:SNMP_TRAP_SENT5/3_4", "nwparser.p0", "sysIpAddress =%{hostip})"); +var part115 = match("MESSAGE#67:SNMP_TRAP_SENT5/3_4", "nwparser.p0", "sysIpAddress =%{hostip})"); var select34 = linear_select([ part111, @@ -1790,8 +1616,7 @@ var all27 = all_match({ var msg71 = msg("SNMP_TRAP_SENT5", all27); -var part116 = // "Pattern{Field(obj_type,true), Constant(' ( nsUserName = "'), Field(username,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#68:SNMP_TRAP_SENT1", "nwparser.payload", "%{obj_type->} ( nsUserName = \"%{username}\", sysIpAddress = %{hostip})", processor_chain([ +var part116 = match("MESSAGE#68:SNMP_TRAP_SENT1", "nwparser.payload", "%{obj_type->} ( nsUserName = \"%{username}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, setf("obj_name","username"), @@ -1801,8 +1626,7 @@ match("MESSAGE#68:SNMP_TRAP_SENT1", "nwparser.payload", "%{obj_type->} ( nsUserN var msg72 = msg("SNMP_TRAP_SENT1", part116); -var part117 = // "Pattern{Field(obj_type,true), Constant(' ( nsCPUusage = '), Field(dclass_counter1,false), Constant(', alarm '), Field(trigger_val,true), Constant(' = '), Field(dclass_counter2,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#69:SNMP_TRAP_SENT2", "nwparser.payload", "%{obj_type->} ( nsCPUusage = %{dclass_counter1}, alarm %{trigger_val->} = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ +var part117 = match("MESSAGE#69:SNMP_TRAP_SENT2", "nwparser.payload", "%{obj_type->} ( nsCPUusage = %{dclass_counter1}, alarm %{trigger_val->} = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1811,8 +1635,7 @@ match("MESSAGE#69:SNMP_TRAP_SENT2", "nwparser.payload", "%{obj_type->} ( nsCPUus var msg73 = msg("SNMP_TRAP_SENT2", part117); -var part118 = // "Pattern{Field(obj_type,true), Constant(' ( sysHealthDiskName = "'), Field(filename,false), Constant('", sysHealthDiskPerusage = '), Field(dclass_counter1,false), Constant(', alarmNormalThreshold = '), Field(dclass_counter2,false), Constant(', sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#70:SNMP_TRAP_SENT3", "nwparser.payload", "%{obj_type->} ( sysHealthDiskName = \"%{filename}\", sysHealthDiskPerusage = %{dclass_counter1}, alarmNormalThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ +var part118 = match("MESSAGE#70:SNMP_TRAP_SENT3", "nwparser.payload", "%{obj_type->} ( sysHealthDiskName = \"%{filename}\", sysHealthDiskPerusage = %{dclass_counter1}, alarmNormalThreshold = %{dclass_counter2}, sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1821,8 +1644,7 @@ match("MESSAGE#70:SNMP_TRAP_SENT3", "nwparser.payload", "%{obj_type->} ( sysHeal var msg74 = msg("SNMP_TRAP_SENT3", part118); -var part119 = // "Pattern{Field(obj_type,true), Constant(' ( sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#71:SNMP_TRAP_SENT4", "nwparser.payload", "%{obj_type->} ( sysIpAddress = %{hostip})", processor_chain([ +var part119 = match("MESSAGE#71:SNMP_TRAP_SENT4", "nwparser.payload", "%{obj_type->} ( sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1831,8 +1653,7 @@ match("MESSAGE#71:SNMP_TRAP_SENT4", "nwparser.payload", "%{obj_type->} ( sysIpAd var msg75 = msg("SNMP_TRAP_SENT4", part119); -var part120 = // "Pattern{Field(obj_type,true), Constant(' (entityName = "'), Field(obj_name,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#72:SNMP_TRAP_SENT18", "nwparser.payload", "%{obj_type->} (entityName = \"%{obj_name}\", sysIpAddress = %{hostip})", processor_chain([ +var part120 = match("MESSAGE#72:SNMP_TRAP_SENT18", "nwparser.payload", "%{obj_type->} (entityName = \"%{obj_name}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup4, @@ -1840,8 +1661,7 @@ match("MESSAGE#72:SNMP_TRAP_SENT18", "nwparser.payload", "%{obj_type->} (entityN var msg76 = msg("SNMP_TRAP_SENT18", part120); -var part121 = // "Pattern{Field(obj_type,true), Constant(' ( '), Field(space,true), Constant(' nsUserName = "'), Field(username,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#73:SNMP_TRAP_SENT19", "nwparser.payload", "%{obj_type->} ( %{space->} nsUserName = \"%{username}\", sysIpAddress = %{hostip})", processor_chain([ +var part121 = match("MESSAGE#73:SNMP_TRAP_SENT19", "nwparser.payload", "%{obj_type->} ( %{space->} nsUserName = \"%{username}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -1850,28 +1670,22 @@ match("MESSAGE#73:SNMP_TRAP_SENT19", "nwparser.payload", "%{obj_type->} ( %{spac var msg77 = msg("SNMP_TRAP_SENT19", part121); -var part122 = // "Pattern{Field(obj_type,true), Constant(' (partition id = '), Field(fld12,false), Constant(', entityName = "'), Field(p0,false)}" -match("MESSAGE#74:SNMP_TRAP_SENT21/0", "nwparser.payload", "%{obj_type->} (partition id = %{fld12}, entityName = \"%{p0}"); +var part122 = match("MESSAGE#74:SNMP_TRAP_SENT21/0", "nwparser.payload", "%{obj_type->} (partition id = %{fld12}, entityName = \"%{p0}"); -var part123 = // "Pattern{Field(obj_name,false), Constant('('), Field(fld4,false), Constant('...", '), Field(p0,false)}" -match("MESSAGE#74:SNMP_TRAP_SENT21/1_0", "nwparser.p0", "%{obj_name}(%{fld4}...\", %{p0}"); +var part123 = match("MESSAGE#74:SNMP_TRAP_SENT21/1_0", "nwparser.p0", "%{obj_name}(%{fld4}...\", %{p0}"); -var part124 = // "Pattern{Field(obj_name,false), Constant('...", '), Field(p0,false)}" -match("MESSAGE#74:SNMP_TRAP_SENT21/1_1", "nwparser.p0", "%{obj_name}...\", %{p0}"); +var part124 = match("MESSAGE#74:SNMP_TRAP_SENT21/1_1", "nwparser.p0", "%{obj_name}...\", %{p0}"); var select35 = linear_select([ part123, part124, ]); -var part125 = // "Pattern{Constant('svcGrpMemberFullName.'), Field(fld2,true), Constant(' = "'), Field(fld3,false), Constant('", sysIpAddress = '), Field(hostip,true), Constant(' )')}" -match("MESSAGE#74:SNMP_TRAP_SENT21/2_0", "nwparser.p0", "svcGrpMemberFullName.%{fld2->} = \"%{fld3}\", sysIpAddress = %{hostip->} )"); +var part125 = match("MESSAGE#74:SNMP_TRAP_SENT21/2_0", "nwparser.p0", "svcGrpMemberFullName.%{fld2->} = \"%{fld3}\", sysIpAddress = %{hostip->} )"); -var part126 = // "Pattern{Constant('vsvrFullName.'), Field(fld2,true), Constant(' = "'), Field(fld3,false), Constant('", sysIpAddress = '), Field(hostip,true), Constant(' )')}" -match("MESSAGE#74:SNMP_TRAP_SENT21/2_1", "nwparser.p0", "vsvrFullName.%{fld2->} = \"%{fld3}\", sysIpAddress = %{hostip->} )"); +var part126 = match("MESSAGE#74:SNMP_TRAP_SENT21/2_1", "nwparser.p0", "vsvrFullName.%{fld2->} = \"%{fld3}\", sysIpAddress = %{hostip->} )"); -var part127 = // "Pattern{Constant('sysIpAddress = '), Field(hostip,true), Constant(' )')}" -match("MESSAGE#74:SNMP_TRAP_SENT21/2_2", "nwparser.p0", "sysIpAddress = %{hostip->} )"); +var part127 = match("MESSAGE#74:SNMP_TRAP_SENT21/2_2", "nwparser.p0", "sysIpAddress = %{hostip->} )"); var select36 = linear_select([ part125, @@ -1895,31 +1709,24 @@ var all28 = all_match({ var msg78 = msg("SNMP_TRAP_SENT21", all28); -var part128 = // "Pattern{Field(obj_type,true), Constant(' (entityName = "'), Field(p0,false)}" -match("MESSAGE#75:SNMP_TRAP_SENT22/0", "nwparser.payload", "%{obj_type->} (entityName = \"%{p0}"); +var part128 = match("MESSAGE#75:SNMP_TRAP_SENT22/0", "nwparser.payload", "%{obj_type->} (entityName = \"%{p0}"); -var part129 = // "Pattern{Field(obj_name,false), Constant('..." '), Field(p0,false)}" -match("MESSAGE#75:SNMP_TRAP_SENT22/1_0", "nwparser.p0", "%{obj_name}...\" %{p0}"); +var part129 = match("MESSAGE#75:SNMP_TRAP_SENT22/1_0", "nwparser.p0", "%{obj_name}...\" %{p0}"); -var part130 = // "Pattern{Field(obj_name,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#75:SNMP_TRAP_SENT22/1_1", "nwparser.p0", "%{obj_name}\"%{p0}"); +var part130 = match("MESSAGE#75:SNMP_TRAP_SENT22/1_1", "nwparser.p0", "%{obj_name}\"%{p0}"); var select37 = linear_select([ part129, part130, ]); -var part131 = // "Pattern{Constant(', '), Field(p0,false)}" -match("MESSAGE#75:SNMP_TRAP_SENT22/2", "nwparser.p0", ", %{p0}"); +var part131 = match("MESSAGE#75:SNMP_TRAP_SENT22/2", "nwparser.p0", ", %{p0}"); -var part132 = // "Pattern{Constant('svcGrpMemberFullName.'), Field(p0,false)}" -match("MESSAGE#75:SNMP_TRAP_SENT22/3_0", "nwparser.p0", "svcGrpMemberFullName.%{p0}"); +var part132 = match("MESSAGE#75:SNMP_TRAP_SENT22/3_0", "nwparser.p0", "svcGrpMemberFullName.%{p0}"); -var part133 = // "Pattern{Constant('vsvrFullName.'), Field(p0,false)}" -match("MESSAGE#75:SNMP_TRAP_SENT22/3_1", "nwparser.p0", "vsvrFullName.%{p0}"); +var part133 = match("MESSAGE#75:SNMP_TRAP_SENT22/3_1", "nwparser.p0", "vsvrFullName.%{p0}"); -var part134 = // "Pattern{Constant('svcServiceFullName.'), Field(p0,false)}" -match("MESSAGE#75:SNMP_TRAP_SENT22/3_2", "nwparser.p0", "svcServiceFullName.%{p0}"); +var part134 = match("MESSAGE#75:SNMP_TRAP_SENT22/3_2", "nwparser.p0", "svcServiceFullName.%{p0}"); var select38 = linear_select([ part132, @@ -1927,8 +1734,7 @@ var select38 = linear_select([ part134, ]); -var part135 = // "Pattern{Field(fld2,true), Constant(' = "'), Field(fld3,false), Constant('", nsPartitionName = '), Field(fld1,false), Constant(')')}" -match("MESSAGE#75:SNMP_TRAP_SENT22/4", "nwparser.p0", "%{fld2->} = \"%{fld3}\", nsPartitionName = %{fld1})"); +var part135 = match("MESSAGE#75:SNMP_TRAP_SENT22/4", "nwparser.p0", "%{fld2->} = \"%{fld3}\", nsPartitionName = %{fld1})"); var all29 = all_match({ processors: [ @@ -1948,8 +1754,7 @@ var all29 = all_match({ var msg79 = msg("SNMP_TRAP_SENT22", all29); -var part136 = // "Pattern{Field(obj_type,true), Constant(' (platformRateLimitPacketDropCount = '), Field(dclass_counter1,false), Constant(', platformLicensedThroughput = '), Field(fld2,false), Constant(', nsPartitionName = '), Field(fld3,false), Constant(')')}" -match("MESSAGE#76:SNMP_TRAP_SENT23", "nwparser.payload", "%{obj_type->} (platformRateLimitPacketDropCount = %{dclass_counter1}, platformLicensedThroughput = %{fld2}, nsPartitionName = %{fld3})", processor_chain([ +var part136 = match("MESSAGE#76:SNMP_TRAP_SENT23", "nwparser.payload", "%{obj_type->} (platformRateLimitPacketDropCount = %{dclass_counter1}, platformLicensedThroughput = %{fld2}, nsPartitionName = %{fld3})", processor_chain([ dup9, dup47, dup10, @@ -1958,8 +1763,7 @@ match("MESSAGE#76:SNMP_TRAP_SENT23", "nwparser.payload", "%{obj_type->} (platfor var msg80 = msg("SNMP_TRAP_SENT23", part136); -var part137 = // "Pattern{Field(obj_type,true), Constant(' (vsvrName.'), Field(fld2,true), Constant(' = "'), Field(fld3,false), Constant('", vsvrCurSoValue = '), Field(fld4,false), Constant(', vsvrSoMethod = "'), Field(fld5,false), Constant('", vsvrSoThresh = "'), Field(info,false), Constant('", vsvrFullName.'), Field(fld6,true), Constant(' = "'), Field(fld7,false), Constant('", nsPartitionName = '), Field(fld8,false), Constant(')')}" -match("MESSAGE#77:SNMP_TRAP_SENT24", "nwparser.payload", "%{obj_type->} (vsvrName.%{fld2->} = \"%{fld3}\", vsvrCurSoValue = %{fld4}, vsvrSoMethod = \"%{fld5}\", vsvrSoThresh = \"%{info}\", vsvrFullName.%{fld6->} = \"%{fld7}\", nsPartitionName = %{fld8})", processor_chain([ +var part137 = match("MESSAGE#77:SNMP_TRAP_SENT24", "nwparser.payload", "%{obj_type->} (vsvrName.%{fld2->} = \"%{fld3}\", vsvrCurSoValue = %{fld4}, vsvrSoMethod = \"%{fld5}\", vsvrSoThresh = \"%{info}\", vsvrFullName.%{fld6->} = \"%{fld7}\", nsPartitionName = %{fld8})", processor_chain([ dup9, dup47, dup10, @@ -1968,25 +1772,20 @@ match("MESSAGE#77:SNMP_TRAP_SENT24", "nwparser.payload", "%{obj_type->} (vsvrNam var msg81 = msg("SNMP_TRAP_SENT24", part137); -var part138 = // "Pattern{Field(obj_type,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#78:SNMP_TRAP_SENT25/0", "nwparser.payload", "%{obj_type->} (%{p0}"); +var part138 = match("MESSAGE#78:SNMP_TRAP_SENT25/0", "nwparser.payload", "%{obj_type->} (%{p0}"); -var part139 = // "Pattern{Constant('partition id = '), Field(fld12,false), Constant(', sslCertKeyName.'), Field(p0,false)}" -match("MESSAGE#78:SNMP_TRAP_SENT25/1_0", "nwparser.p0", "partition id = %{fld12}, sslCertKeyName.%{p0}"); +var part139 = match("MESSAGE#78:SNMP_TRAP_SENT25/1_0", "nwparser.p0", "partition id = %{fld12}, sslCertKeyName.%{p0}"); -var part140 = // "Pattern{Constant(' sslCertKeyName.'), Field(p0,false)}" -match("MESSAGE#78:SNMP_TRAP_SENT25/1_1", "nwparser.p0", " sslCertKeyName.%{p0}"); +var part140 = match("MESSAGE#78:SNMP_TRAP_SENT25/1_1", "nwparser.p0", " sslCertKeyName.%{p0}"); var select39 = linear_select([ part139, part140, ]); -var part141 = // "Pattern{Constant('",'), Field(fld2,true), Constant(' = "'), Field(fld1,true), Constant(' sslDaysToExpire.'), Field(fld3,true), Constant(' = '), Field(dclass_counter1,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#78:SNMP_TRAP_SENT25/2", "nwparser.p0", "\",%{fld2->} = \"%{fld1->} sslDaysToExpire.%{fld3->} = %{dclass_counter1}, %{p0}"); +var part141 = match("MESSAGE#78:SNMP_TRAP_SENT25/2", "nwparser.p0", "\",%{fld2->} = \"%{fld1->} sslDaysToExpire.%{fld3->} = %{dclass_counter1}, %{p0}"); -var part142 = // "Pattern{Constant('nsPartitionName = '), Field(fld4,false), Constant(')')}" -match("MESSAGE#78:SNMP_TRAP_SENT25/3_0", "nwparser.p0", "nsPartitionName = %{fld4})"); +var part142 = match("MESSAGE#78:SNMP_TRAP_SENT25/3_0", "nwparser.p0", "nsPartitionName = %{fld4})"); var select40 = linear_select([ part142, @@ -2010,8 +1809,7 @@ var all30 = all_match({ var msg82 = msg("SNMP_TRAP_SENT25", all30); -var part143 = // "Pattern{Field(obj_type,true), Constant(' (nsUserName = "'), Field(username,false), Constant('", nsPartitionName = '), Field(fld1,false), Constant(')')}" -match("MESSAGE#79:SNMP_TRAP_SENT26", "nwparser.payload", "%{obj_type->} (nsUserName = \"%{username}\", nsPartitionName = %{fld1})", processor_chain([ +var part143 = match("MESSAGE#79:SNMP_TRAP_SENT26", "nwparser.payload", "%{obj_type->} (nsUserName = \"%{username}\", nsPartitionName = %{fld1})", processor_chain([ dup9, dup47, dup4, @@ -2019,8 +1817,7 @@ match("MESSAGE#79:SNMP_TRAP_SENT26", "nwparser.payload", "%{obj_type->} (nsUserN var msg83 = msg("SNMP_TRAP_SENT26", part143); -var part144 = // "Pattern{Field(info,true), Constant(' (sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#80:SNMP_TRAP_SENT20", "nwparser.payload", "%{info->} (sysIpAddress = %{hostip})", processor_chain([ +var part144 = match("MESSAGE#80:SNMP_TRAP_SENT20", "nwparser.payload", "%{info->} (sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -2029,8 +1826,7 @@ match("MESSAGE#80:SNMP_TRAP_SENT20", "nwparser.payload", "%{info->} (sysIpAddres var msg84 = msg("SNMP_TRAP_SENT20", part144); -var part145 = // "Pattern{Field(obj_type,false), Constant('(lldpRemLocalPortNum.'), Field(fld1,false), Constant('= "'), Field(fld5,false), Constant('", lldpRemChassisId.'), Field(fld2,false), Constant('= "'), Field(dmacaddr,false), Constant('", lldpRemPortId.'), Field(fld3,false), Constant('= "'), Field(dinterface,false), Constant('", sysIpAddress ='), Field(hostip,false), Constant(')')}" -match("MESSAGE#81:SNMP_TRAP_SENT28", "nwparser.payload", "%{obj_type}(lldpRemLocalPortNum.%{fld1}= \"%{fld5}\", lldpRemChassisId.%{fld2}= \"%{dmacaddr}\", lldpRemPortId.%{fld3}= \"%{dinterface}\", sysIpAddress =%{hostip})", processor_chain([ +var part145 = match("MESSAGE#81:SNMP_TRAP_SENT28", "nwparser.payload", "%{obj_type}(lldpRemLocalPortNum.%{fld1}= \"%{fld5}\", lldpRemChassisId.%{fld2}= \"%{dmacaddr}\", lldpRemPortId.%{fld3}= \"%{dinterface}\", sysIpAddress =%{hostip})", processor_chain([ dup9, dup47, dup10, @@ -2039,8 +1835,7 @@ match("MESSAGE#81:SNMP_TRAP_SENT28", "nwparser.payload", "%{obj_type}(lldpRemLoc var msg85 = msg("SNMP_TRAP_SENT28", part145); -var part146 = // "Pattern{Field(obj_type,false), Constant('(haNicMonitorSucceeded = "'), Field(fld1,false), Constant('", sysIpAddress ='), Field(hostip,false), Constant(')')}" -match("MESSAGE#82:SNMP_TRAP_SENT29", "nwparser.payload", "%{obj_type}(haNicMonitorSucceeded = \"%{fld1}\", sysIpAddress =%{hostip})", processor_chain([ +var part146 = match("MESSAGE#82:SNMP_TRAP_SENT29", "nwparser.payload", "%{obj_type}(haNicMonitorSucceeded = \"%{fld1}\", sysIpAddress =%{hostip})", processor_chain([ dup9, dup47, dup10, @@ -2049,8 +1844,7 @@ match("MESSAGE#82:SNMP_TRAP_SENT29", "nwparser.payload", "%{obj_type}(haNicMonit var msg86 = msg("SNMP_TRAP_SENT29", part146); -var part147 = // "Pattern{Field(fld1,false), Constant(':StatusPoll:'), Field(fld2,true), Constant(' - Device State changed to '), Field(disposition,true), Constant(' for '), Field(saddr,false)}" -match("MESSAGE#83:SNMP_TRAP_SENT:04", "nwparser.payload", "%{fld1}:StatusPoll:%{fld2->} - Device State changed to %{disposition->} for %{saddr}", processor_chain([ +var part147 = match("MESSAGE#83:SNMP_TRAP_SENT:04", "nwparser.payload", "%{fld1}:StatusPoll:%{fld2->} - Device State changed to %{disposition->} for %{saddr}", processor_chain([ dup9, dup4, setc("event_description","Device State changed"), @@ -2060,14 +1854,11 @@ var msg87 = msg("SNMP_TRAP_SENT:04", part147); var msg88 = msg("SNMP_TRAP_SENT:05", dup101); -var part148 = // "Pattern{Field(obj_type,true), Constant(' (appfwLogMsg = "'), Field(obj_name,true), Constant(' '), Field(info,false), Constant('",'), Field(p0,false)}" -match("MESSAGE#136:SNMP_TRAP_SENT:01/0", "nwparser.payload", "%{obj_type->} (appfwLogMsg = \"%{obj_name->} %{info}\",%{p0}"); +var part148 = match("MESSAGE#136:SNMP_TRAP_SENT:01/0", "nwparser.payload", "%{obj_type->} (appfwLogMsg = \"%{obj_name->} %{info}\",%{p0}"); -var part149 = // "Pattern{Constant('sysIpAddress = '), Field(hostip,false)}" -match("MESSAGE#136:SNMP_TRAP_SENT:01/1_0", "nwparser.p0", "sysIpAddress = %{hostip}"); +var part149 = match("MESSAGE#136:SNMP_TRAP_SENT:01/1_0", "nwparser.p0", "sysIpAddress = %{hostip}"); -var part150 = // "Pattern{Constant('nsPartitionName ='), Field(fld1,false)}" -match("MESSAGE#136:SNMP_TRAP_SENT:01/1_1", "nwparser.p0", "nsPartitionName =%{fld1}"); +var part150 = match("MESSAGE#136:SNMP_TRAP_SENT:01/1_1", "nwparser.p0", "nsPartitionName =%{fld1}"); var select41 = linear_select([ part149, @@ -2089,8 +1880,7 @@ var all31 = all_match({ var msg89 = msg("SNMP_TRAP_SENT:01", all31); -var part151 = // "Pattern{Field(obj_type,true), Constant(' (haNicsMonitorFailed = "'), Field(fld1,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#143:SNMP_TRAP_SENT:02", "nwparser.payload", "%{obj_type->} (haNicsMonitorFailed = \"%{fld1}\", sysIpAddress = %{hostip})", processor_chain([ +var part151 = match("MESSAGE#143:SNMP_TRAP_SENT:02", "nwparser.payload", "%{obj_type->} (haNicsMonitorFailed = \"%{fld1}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -2099,8 +1889,7 @@ match("MESSAGE#143:SNMP_TRAP_SENT:02", "nwparser.payload", "%{obj_type->} (haNic var msg90 = msg("SNMP_TRAP_SENT:02", part151); -var part152 = // "Pattern{Field(obj_type,true), Constant(' (partition id = '), Field(fld1,false), Constant(', entityName = "'), Field(obj_name,false), Constant('('), Field(fld31,false), Constant('", svcServiceFullName.'), Field(fld2,true), Constant(' = "'), Field(fld3,false), Constant('", sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#178:SNMP_TRAP_SENT27", "nwparser.payload", "%{obj_type->} (partition id = %{fld1}, entityName = \"%{obj_name}(%{fld31}\", svcServiceFullName.%{fld2->} = \"%{fld3}\", sysIpAddress = %{hostip})", processor_chain([ +var part152 = match("MESSAGE#178:SNMP_TRAP_SENT27", "nwparser.payload", "%{obj_type->} (partition id = %{fld1}, entityName = \"%{obj_name}(%{fld31}\", svcServiceFullName.%{fld2->} = \"%{fld3}\", sysIpAddress = %{hostip})", processor_chain([ dup9, dup47, dup10, @@ -2109,8 +1898,7 @@ match("MESSAGE#178:SNMP_TRAP_SENT27", "nwparser.payload", "%{obj_type->} (partit var msg91 = msg("SNMP_TRAP_SENT27", part152); -var part153 = // "Pattern{Field(obj_type,false), Constant('(sysHealthCounterName.PowerSupply1Status = "'), Field(dclass_counter1_string,false), Constant('", sysHealthCounterValue.PowerSupply1Status = '), Field(dclass_counter1,false), Constant(', sysHealthPowerSupplyStatus = "'), Field(result,false), Constant('", sysIpAddress ='), Field(hostip,false), Constant(')')}" -match("MESSAGE#179:SNMP_TRAP_SENT:03", "nwparser.payload", "%{obj_type}(sysHealthCounterName.PowerSupply1Status = \"%{dclass_counter1_string}\", sysHealthCounterValue.PowerSupply1Status = %{dclass_counter1}, sysHealthPowerSupplyStatus = \"%{result}\", sysIpAddress =%{hostip})", processor_chain([ +var part153 = match("MESSAGE#179:SNMP_TRAP_SENT:03", "nwparser.payload", "%{obj_type}(sysHealthCounterName.PowerSupply1Status = \"%{dclass_counter1_string}\", sysHealthCounterValue.PowerSupply1Status = %{dclass_counter1}, sysHealthPowerSupplyStatus = \"%{result}\", sysIpAddress =%{hostip})", processor_chain([ dup9, dup47, dup4, @@ -2156,8 +1944,7 @@ var select42 = linear_select([ msg92, ]); -var part154 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Client IP '), Field(hostip,true), Constant(' - Vserver '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Client_security_expression "CLIENT.REG(''), Field(info,false), Constant('').VALUE == '), Field(trigger_val,true), Constant(' || '), Field(change_new,true), Constant(' - '), Field(result,false)}" -match("MESSAGE#85:SSLVPN_CLISEC_CHECK", "nwparser.payload", "User %{username->} - Client IP %{hostip->} - Vserver %{saddr}:%{sport->} - Client_security_expression \"CLIENT.REG('%{info}').VALUE == %{trigger_val->} || %{change_new->} - %{result}", processor_chain([ +var part154 = match("MESSAGE#85:SSLVPN_CLISEC_CHECK", "nwparser.payload", "User %{username->} - Client IP %{hostip->} - Vserver %{saddr}:%{sport->} - Client_security_expression \"CLIENT.REG('%{info}').VALUE == %{trigger_val->} || %{change_new->} - %{result}", processor_chain([ dup9, dup47, dup4, @@ -2165,16 +1952,14 @@ match("MESSAGE#85:SSLVPN_CLISEC_CHECK", "nwparser.payload", "User %{username->} var msg93 = msg("SSLVPN_CLISEC_CHECK", part154); -var part155 = // "Pattern{Constant('SPCBId '), Field(sessionid,true), Constant(' - ClientIP '), Field(p0,false)}" -match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/1_1", "nwparser.p0", "SPCBId %{sessionid->} - ClientIP %{p0}"); +var part155 = match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/1_1", "nwparser.p0", "SPCBId %{sessionid->} - ClientIP %{p0}"); var select43 = linear_select([ dup49, part155, ]); -var part156 = // "Pattern{Field(,true), Constant(' '), Field(saddr,false), Constant('- ClientPort '), Field(sport,true), Constant(' - VserverServiceIP '), Field(daddr,true), Constant(' - VserverServicePort '), Field(dport,true), Constant(' - ClientVersion '), Field(s_sslver,true), Constant(' - CipherSuite "'), Field(s_cipher,false), Constant('" - Reason "'), Field(result,false), Constant('"')}" -match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/2", "nwparser.p0", "%{} %{saddr}- ClientPort %{sport->} - VserverServiceIP %{daddr->} - VserverServicePort %{dport->} - ClientVersion %{s_sslver->} - CipherSuite \"%{s_cipher}\" - Reason \"%{result}\""); +var part156 = match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/2", "nwparser.p0", "%{} %{saddr}- ClientPort %{sport->} - VserverServiceIP %{daddr->} - VserverServicePort %{dport->} - ClientVersion %{s_sslver->} - CipherSuite \"%{s_cipher}\" - Reason \"%{result}\""); var all32 = all_match({ processors: [ @@ -2194,16 +1979,14 @@ var all32 = all_match({ var msg94 = msg("SSLLOG_SSL_HANDSHAKE_FAILURE", all32); -var part157 = // "Pattern{Constant('SPCBId '), Field(sessionid,true), Constant(' ClientIP '), Field(p0,false)}" -match("MESSAGE#87:SSLLOG_SSL_HANDSHAKE_SUCCESS/1_0", "nwparser.p0", "SPCBId %{sessionid->} ClientIP %{p0}"); +var part157 = match("MESSAGE#87:SSLLOG_SSL_HANDSHAKE_SUCCESS/1_0", "nwparser.p0", "SPCBId %{sessionid->} ClientIP %{p0}"); var select44 = linear_select([ part157, dup49, ]); -var part158 = // "Pattern{Constant(''), Field(saddr,true), Constant(' - ClientPort '), Field(sport,true), Constant(' - VserverServiceIP '), Field(daddr,true), Constant(' - VserverServicePort '), Field(dport,true), Constant(' - ClientVersion '), Field(s_sslver,true), Constant(' - CipherSuite "'), Field(s_cipher,false), Constant('" - Session '), Field(info,false)}" -match("MESSAGE#87:SSLLOG_SSL_HANDSHAKE_SUCCESS/2", "nwparser.p0", "%{saddr->} - ClientPort %{sport->} - VserverServiceIP %{daddr->} - VserverServicePort %{dport->} - ClientVersion %{s_sslver->} - CipherSuite \"%{s_cipher}\" - Session %{info}"); +var part158 = match("MESSAGE#87:SSLLOG_SSL_HANDSHAKE_SUCCESS/2", "nwparser.p0", "%{saddr->} - ClientPort %{sport->} - VserverServiceIP %{daddr->} - VserverServicePort %{dport->} - ClientVersion %{s_sslver->} - CipherSuite \"%{s_cipher}\" - Session %{info}"); var all33 = all_match({ processors: [ @@ -2223,8 +2006,7 @@ var all33 = all_match({ var msg95 = msg("SSLLOG_SSL_HANDSHAKE_SUCCESS", all33); -var part159 = // "Pattern{Constant('SPCBId '), Field(sessionid,true), Constant(' - SubjectName "'), Field(cert_subject,false), Constant('"')}" -match("MESSAGE#88:SSLLOG_SSL_HANDSHAKE_SUBJECTNAME", "nwparser.payload", "SPCBId %{sessionid->} - SubjectName \"%{cert_subject}\"", processor_chain([ +var part159 = match("MESSAGE#88:SSLLOG_SSL_HANDSHAKE_SUBJECTNAME", "nwparser.payload", "SPCBId %{sessionid->} - SubjectName \"%{cert_subject}\"", processor_chain([ dup9, dup41, dup50, @@ -2232,8 +2014,7 @@ match("MESSAGE#88:SSLLOG_SSL_HANDSHAKE_SUBJECTNAME", "nwparser.payload", "SPCBId var msg96 = msg("SSLLOG_SSL_HANDSHAKE_SUBJECTNAME", part159); -var part160 = // "Pattern{Constant('SPCBId '), Field(sessionid,true), Constant(' - IssuerName "'), Field(fld1,false), Constant('"')}" -match("MESSAGE#89:SSLLOG_SSL_HANDSHAKE_ISSUERNAME", "nwparser.payload", "SPCBId %{sessionid->} - IssuerName \"%{fld1}\"", processor_chain([ +var part160 = match("MESSAGE#89:SSLLOG_SSL_HANDSHAKE_ISSUERNAME", "nwparser.payload", "SPCBId %{sessionid->} - IssuerName \"%{fld1}\"", processor_chain([ dup9, dup41, dup50, @@ -2241,8 +2022,7 @@ match("MESSAGE#89:SSLLOG_SSL_HANDSHAKE_ISSUERNAME", "nwparser.payload", "SPCBId var msg97 = msg("SSLLOG_SSL_HANDSHAKE_ISSUERNAME", part160); -var part161 = // "Pattern{Constant('Extracted_groups "'), Field(group,false), Constant('"')}" -match("MESSAGE#90:SSLVPN_AAAEXTRACTED_GROUPS", "nwparser.payload", "Extracted_groups \"%{group}\"", processor_chain([ +var part161 = match("MESSAGE#90:SSLVPN_AAAEXTRACTED_GROUPS", "nwparser.payload", "Extracted_groups \"%{group}\"", processor_chain([ dup2, setc("event_description","The groups extracted after user logs into SSLVPN"), dup3, @@ -2251,22 +2031,18 @@ match("MESSAGE#90:SSLVPN_AAAEXTRACTED_GROUPS", "nwparser.payload", "Extracted_gr var msg98 = msg("SSLVPN_AAAEXTRACTED_GROUPS", part161); -var part162 = // "Pattern{Constant('User '), Field(username,true), Constant(' : - Client IP '), Field(hostip,true), Constant(' - Vserver '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Client security expression CLIENT.REG(''), Field(info,false), Constant('') '), Field(p0,false)}" -match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/0", "nwparser.payload", "User %{username->} : - Client IP %{hostip->} - Vserver %{saddr}:%{sport->} - Client security expression CLIENT.REG('%{info}') %{p0}"); +var part162 = match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/0", "nwparser.payload", "User %{username->} : - Client IP %{hostip->} - Vserver %{saddr}:%{sport->} - Client security expression CLIENT.REG('%{info}') %{p0}"); -var part163 = // "Pattern{Constant('EXISTS '), Field(p0,false)}" -match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/1_0", "nwparser.p0", "EXISTS %{p0}"); +var part163 = match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/1_0", "nwparser.p0", "EXISTS %{p0}"); -var part164 = // "Pattern{Constant('.VALUE == '), Field(trigger_val,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/1_1", "nwparser.p0", ".VALUE == %{trigger_val->} %{p0}"); +var part164 = match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/1_1", "nwparser.p0", ".VALUE == %{trigger_val->} %{p0}"); var select45 = linear_select([ part163, part164, ]); -var part165 = // "Pattern{Constant('evaluated to '), Field(change_new,false), Constant('('), Field(ntype,false), Constant(')')}" -match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/2", "nwparser.p0", "evaluated to %{change_new}(%{ntype})"); +var part165 = match("MESSAGE#91:SSLVPN_CLISEC_EXP_EVAL/2", "nwparser.p0", "evaluated to %{change_new}(%{ntype})"); var all34 = all_match({ processors: [ @@ -2284,47 +2060,38 @@ var all34 = all_match({ var msg99 = msg("SSLVPN_CLISEC_EXP_EVAL", all34); -var part166 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/0", "nwparser.payload", "Context %{fld1->} - %{p0}"); +var part166 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/0", "nwparser.payload", "Context %{fld1->} - %{p0}"); -var part167 = // "Pattern{Constant('SessionId: '), Field(sessionid,true), Constant(' User '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/1_0", "nwparser.p0", "SessionId: %{sessionid->} User %{p0}"); +var part167 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/1_0", "nwparser.p0", "SessionId: %{sessionid->} User %{p0}"); -var part168 = // "Pattern{Field(fld5,true), Constant(' User '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/1_1", "nwparser.p0", "%{fld5->} User %{p0}"); +var part168 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/1_1", "nwparser.p0", "%{fld5->} User %{p0}"); var select46 = linear_select([ part167, part168, ]); -var part169 = // "Pattern{Field(username,true), Constant(' : Group(s) '), Field(group,true), Constant(' : '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/2", "nwparser.p0", "%{username->} : Group(s) %{group->} : %{p0}"); +var part169 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/2", "nwparser.p0", "%{username->} : Group(s) %{group->} : %{p0}"); -var part170 = // "Pattern{Constant('Vserver '), Field(hostip,true), Constant(' - '), Field(fld6,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/3_0", "nwparser.p0", "Vserver %{hostip->} - %{fld6->} %{p0}"); +var part170 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/3_0", "nwparser.p0", "Vserver %{hostip->} - %{fld6->} %{p0}"); -var part171 = // "Pattern{Constant('- '), Field(fld7,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/3_1", "nwparser.p0", "- %{fld7->} %{p0}"); +var part171 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/3_1", "nwparser.p0", "- %{fld7->} %{p0}"); var select47 = linear_select([ part170, part171, ]); -var part172 = // "Pattern{Constant('GMT '), Field(web_method,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/4_0", "nwparser.p0", "GMT %{web_method->} %{p0}"); +var part172 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/4_0", "nwparser.p0", "GMT %{web_method->} %{p0}"); -var part173 = // "Pattern{Field(web_method,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/4_1", "nwparser.p0", "%{web_method->} %{p0}"); +var part173 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/4_1", "nwparser.p0", "%{web_method->} %{p0}"); var select48 = linear_select([ part172, part173, ]); -var part174 = // "Pattern{Field(url,true), Constant(' '), Field(fld8,false)}" -match("MESSAGE#92:SSLVPN_HTTPREQUEST/5", "nwparser.p0", "%{url->} %{fld8}"); +var part174 = match("MESSAGE#92:SSLVPN_HTTPREQUEST/5", "nwparser.p0", "%{url->} %{fld8}"); var all35 = all_match({ processors: [ @@ -2346,11 +2113,9 @@ var all35 = all_match({ var msg100 = msg("SSLVPN_HTTPREQUEST", all35); -var part175 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Start_time '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Start_time %{p0}"); +var part175 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Start_time %{p0}"); -var part176 = // "Pattern{Field(duration_string,true), Constant(' - Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,true), Constant(' - Total_compressedbytes_send '), Field(comp_sbytes,true), Constant(' - Total_compressedbytes_recv '), Field(comp_rbytes,true), Constant(' - Compression_ratio_send '), Field(dclass_ratio1,true), Constant(' - Compression_ratio_recv '), Field(dclass_ratio2,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/3", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2}"); +var part176 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/3", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2}"); var all36 = all_match({ processors: [ @@ -2373,17 +2138,13 @@ var all36 = all_match({ var msg101 = msg("SSLVPN_ICAEND_CONNSTAT", all36); -var part177 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - username:domainname '), Field(username,false), Constant(':'), Field(ddomain,true), Constant(' - startTime '), Field(p0,false)}" -match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - username:domainname %{username}:%{ddomain->} - startTime %{p0}"); +var part177 = match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - username:domainname %{username}:%{ddomain->} - startTime %{p0}"); -var part178 = // "Pattern{Constant('" '), Field(fld10,true), Constant(' GMT" - endTime '), Field(p0,false)}" -match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - endTime %{p0}"); +var part178 = match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - endTime %{p0}"); -var part179 = // "Pattern{Constant('" '), Field(fld10,false), Constant('" - endTime '), Field(p0,false)}" -match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/1_1", "nwparser.p0", "\" %{fld10}\" - endTime %{p0}"); +var part179 = match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/1_1", "nwparser.p0", "\" %{fld10}\" - endTime %{p0}"); -var part180 = // "Pattern{Field(fld10,true), Constant(' - endTime '), Field(p0,false)}" -match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/1_2", "nwparser.p0", "%{fld10->} - endTime %{p0}"); +var part180 = match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/1_2", "nwparser.p0", "%{fld10->} - endTime %{p0}"); var select49 = linear_select([ part178, @@ -2391,14 +2152,11 @@ var select49 = linear_select([ part180, ]); -var part181 = // "Pattern{Field(duration_string,true), Constant(' - Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,true), Constant(' - Total_compressedbytes_send '), Field(comp_sbytes,true), Constant(' - Total_compressedbytes_recv '), Field(comp_rbytes,true), Constant(' - Compression_ratio_send '), Field(dclass_ratio1,true), Constant(' - Compression_ratio_recv '), Field(dclass_ratio2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/3", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} %{p0}"); +var part181 = match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/3", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} %{p0}"); -var part182 = // "Pattern{Constant('- connectionId '), Field(connectionid,false)}" -match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/4_0", "nwparser.p0", "- connectionId %{connectionid}"); +var part182 = match("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/4_0", "nwparser.p0", "- connectionId %{connectionid}"); -var part183 = // "Pattern{Field(fld2,false)}" -match_copy("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/4_1", "nwparser.p0", "fld2"); +var part183 = match_copy("MESSAGE#139:SSLVPN_ICAEND_CONNSTAT:01/4_1", "nwparser.p0", "fld2"); var select50 = linear_select([ part182, @@ -2432,8 +2190,7 @@ var select51 = linear_select([ msg102, ]); -var part184 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Browser_type '), Field(fld2,true), Constant(' - SSLVPN_client_type '), Field(info,true), Constant(' - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#94:SSLVPN_LOGIN/4", "nwparser.p0", "%{daddr}:%{dport->} - Browser_type %{fld2->} - SSLVPN_client_type %{info->} - Group(s) \"%{group}\""); +var part184 = match("MESSAGE#94:SSLVPN_LOGIN/4", "nwparser.p0", "%{daddr}:%{dport->} - Browser_type %{fld2->} - SSLVPN_client_type %{info->} - Group(s) \"%{group}\""); var all38 = all_match({ processors: [ @@ -2455,8 +2212,7 @@ var all38 = all_match({ var msg103 = msg("SSLVPN_LOGIN", all38); -var part185 = // "Pattern{Field(duration_string,true), Constant(' - Http_resources_accessed '), Field(fld3,true), Constant(' - NonHttp_services_accessed '), Field(fld4,true), Constant(' - Total_TCP_connections '), Field(fld5,true), Constant(' - Total_UDP_flows '), Field(fld6,true), Constant(' - Total_policies_allowed '), Field(fld7,true), Constant(' - Total_policies_denied '), Field(fld8,true), Constant(' - Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,true), Constant(' - Total_compressedbytes_send '), Field(comp_sbytes,true), Constant(' - Total_compressedbytes_recv '), Field(comp_rbytes,true), Constant(' - Compression_ratio_send '), Field(dclass_ratio1,true), Constant(' - Compression_ratio_recv '), Field(dclass_ratio2,true), Constant(' - LogoutMethod "'), Field(result,false), Constant('" - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#95:SSLVPN_LOGOUT/7", "nwparser.p0", "%{duration_string->} - Http_resources_accessed %{fld3->} - NonHttp_services_accessed %{fld4->} - Total_TCP_connections %{fld5->} - Total_UDP_flows %{fld6->} - Total_policies_allowed %{fld7->} - Total_policies_denied %{fld8->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} - LogoutMethod \"%{result}\" - Group(s) \"%{group}\""); +var part185 = match("MESSAGE#95:SSLVPN_LOGOUT/7", "nwparser.p0", "%{duration_string->} - Http_resources_accessed %{fld3->} - NonHttp_services_accessed %{fld4->} - Total_TCP_connections %{fld5->} - Total_UDP_flows %{fld6->} - Total_policies_allowed %{fld7->} - Total_policies_denied %{fld8->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} - LogoutMethod \"%{result}\" - Group(s) \"%{group}\""); var all39 = all_match({ processors: [ @@ -2486,8 +2242,7 @@ var all39 = all_match({ var msg104 = msg("SSLVPN_LOGOUT", all39); -var part186 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Last_contact '), Field(fld2,true), Constant(' - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#96:SSLVPN_TCPCONN_TIMEDOUT/4", "nwparser.p0", "%{daddr}:%{dport->} - Last_contact %{fld2->} - Group(s) \"%{group}\""); +var part186 = match("MESSAGE#96:SSLVPN_TCPCONN_TIMEDOUT/4", "nwparser.p0", "%{daddr}:%{dport->} - Last_contact %{fld2->} - Group(s) \"%{group}\""); var all40 = all_match({ processors: [ @@ -2509,11 +2264,9 @@ var all40 = all_match({ var msg105 = msg("SSLVPN_TCPCONN_TIMEDOUT", all40); -var part187 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Start_time '), Field(p0,false)}" -match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/2", "nwparser.p0", "%{daddr}:%{dport->} - Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Start_time %{p0}"); +var part187 = match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/2", "nwparser.p0", "%{daddr}:%{dport->} - Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Start_time %{p0}"); -var part188 = // "Pattern{Field(duration_string,true), Constant(' - Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,true), Constant(' - Access '), Field(disposition,true), Constant(' - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/5", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Access %{disposition->} - Group(s) \"%{group}\""); +var part188 = match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/5", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Access %{disposition->} - Group(s) \"%{group}\""); var all41 = all_match({ processors: [ @@ -2536,8 +2289,7 @@ var all41 = all_match({ var msg106 = msg("SSLVPN_UDPFLOWSTAT", all41); -var part189 = // "Pattern{Constant('Server port = '), Field(dport,true), Constant(' - Server server ip = '), Field(daddr,true), Constant(' - username:domain_name = '), Field(username,false), Constant(':'), Field(ddomain,true), Constant(' - application name = '), Field(application,false)}" -match("MESSAGE#98:SSLVPN_ICASTART", "nwparser.payload", "Server port = %{dport->} - Server server ip = %{daddr->} - username:domain_name = %{username}:%{ddomain->} - application name = %{application}", processor_chain([ +var part189 = match("MESSAGE#98:SSLVPN_ICASTART", "nwparser.payload", "Server port = %{dport->} - Server server ip = %{daddr->} - username:domain_name = %{username}:%{ddomain->} - application name = %{application}", processor_chain([ dup69, setc("event_description","ICA started"), dup3, @@ -2546,17 +2298,13 @@ match("MESSAGE#98:SSLVPN_ICASTART", "nwparser.payload", "Server port = %{dport-> var msg107 = msg("SSLVPN_ICASTART", part189); -var part190 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - username:domainname '), Field(username,false), Constant(':'), Field(ddomain,true), Constant(' - applicationName '), Field(application,true), Constant(' - startTime '), Field(p0,false)}" -match("MESSAGE#99:SSLVPN_ICASTART:01/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - username:domainname %{username}:%{ddomain->} - applicationName %{application->} - startTime %{p0}"); +var part190 = match("MESSAGE#99:SSLVPN_ICASTART:01/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - username:domainname %{username}:%{ddomain->} - applicationName %{application->} - startTime %{p0}"); -var part191 = // "Pattern{Constant('" '), Field(fld10,true), Constant(' GMT" - connectionId '), Field(p0,false)}" -match("MESSAGE#99:SSLVPN_ICASTART:01/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - connectionId %{p0}"); +var part191 = match("MESSAGE#99:SSLVPN_ICASTART:01/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - connectionId %{p0}"); -var part192 = // "Pattern{Constant('" '), Field(fld10,false), Constant('" - connectionId '), Field(p0,false)}" -match("MESSAGE#99:SSLVPN_ICASTART:01/1_1", "nwparser.p0", "\" %{fld10}\" - connectionId %{p0}"); +var part192 = match("MESSAGE#99:SSLVPN_ICASTART:01/1_1", "nwparser.p0", "\" %{fld10}\" - connectionId %{p0}"); -var part193 = // "Pattern{Field(fld10,true), Constant(' - connectionId '), Field(p0,false)}" -match("MESSAGE#99:SSLVPN_ICASTART:01/1_2", "nwparser.p0", "%{fld10->} - connectionId %{p0}"); +var part193 = match("MESSAGE#99:SSLVPN_ICASTART:01/1_2", "nwparser.p0", "%{fld10->} - connectionId %{p0}"); var select52 = linear_select([ part191, @@ -2564,8 +2312,7 @@ var select52 = linear_select([ part193, ]); -var part194 = // "Pattern{Field(fld5,false)}" -match_copy("MESSAGE#99:SSLVPN_ICASTART:01/2", "nwparser.p0", "fld5"); +var part194 = match_copy("MESSAGE#99:SSLVPN_ICASTART:01/2", "nwparser.p0", "fld5"); var all42 = all_match({ processors: [ @@ -2587,14 +2334,11 @@ var select53 = linear_select([ msg108, ]); -var part195 = // "Pattern{Field(action,false), Constant(': '), Field(fld1,true), Constant(' "')}" -match("MESSAGE#100:SSLVPN_Message/1_0", "nwparser.p0", "%{action}: %{fld1->} \""); +var part195 = match("MESSAGE#100:SSLVPN_Message/1_0", "nwparser.p0", "%{action}: %{fld1->} \""); -var part196 = // "Pattern{Field(action,true), Constant(' '), Field(fld1,false), Constant('"')}" -match("MESSAGE#100:SSLVPN_Message/1_1", "nwparser.p0", "%{action->} %{fld1}\""); +var part196 = match("MESSAGE#100:SSLVPN_Message/1_1", "nwparser.p0", "%{action->} %{fld1}\""); -var part197 = // "Pattern{Field(action,false), Constant(': '), Field(fld1,false)}" -match("MESSAGE#100:SSLVPN_Message/1_2", "nwparser.p0", "%{action}: %{fld1}"); +var part197 = match("MESSAGE#100:SSLVPN_Message/1_2", "nwparser.p0", "%{action}: %{fld1}"); var select54 = linear_select([ part195, @@ -2617,11 +2361,9 @@ var all43 = all_match({ var msg109 = msg("SSLVPN_Message", all43); -var part198 = // "Pattern{Field(,true), Constant(' '), Field(username,false), Constant('- Client_ip '), Field(hostip,true), Constant(' - Nat_ip '), Field(stransaddr,true), Constant(' - Vserver '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Start_time '), Field(p0,false)}" -match("MESSAGE#101:SSLVPN_TCPCONNSTAT/2", "nwparser.p0", "%{} %{username}- Client_ip %{hostip->} - Nat_ip %{stransaddr->} - Vserver %{daddr}:%{dport->} - Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Start_time %{p0}"); +var part198 = match("MESSAGE#101:SSLVPN_TCPCONNSTAT/2", "nwparser.p0", "%{} %{username}- Client_ip %{hostip->} - Nat_ip %{stransaddr->} - Vserver %{daddr}:%{dport->} - Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Start_time %{p0}"); -var part199 = // "Pattern{Field(duration_string,true), Constant(' - Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,true), Constant(' - Total_compressedbytes_send '), Field(comp_sbytes,true), Constant(' - Total_compressedbytes_recv '), Field(comp_rbytes,true), Constant(' - Compression_ratio_send '), Field(dclass_ratio1,true), Constant(' - Compression_ratio_recv '), Field(dclass_ratio2,true), Constant(' - Access '), Field(disposition,true), Constant(' - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#101:SSLVPN_TCPCONNSTAT/5", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} - Access %{disposition->} - Group(s) \"%{group}\""); +var part199 = match("MESSAGE#101:SSLVPN_TCPCONNSTAT/5", "nwparser.p0", "%{duration_string->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{comp_sbytes->} - Total_compressedbytes_recv %{comp_rbytes->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} - Access %{disposition->} - Group(s) \"%{group}\""); var all44 = all_match({ processors: [ @@ -2686,8 +2428,7 @@ var all46 = all_match({ var msg112 = msg("TCP_CONN_TERMINATE", all46); -var part200 = // "Pattern{Constant('Source '), Field(saddr,false), Constant('Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,false)}" -match("MESSAGE#140:TCP_CONN_TERMINATE:01", "nwparser.payload", "Source %{saddr}Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes}", processor_chain([ +var part200 = match("MESSAGE#140:TCP_CONN_TERMINATE:01", "nwparser.payload", "Source %{saddr}Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes}", processor_chain([ dup2, dup40, dup28, @@ -2703,11 +2444,9 @@ var select55 = linear_select([ msg113, ]); -var part201 = // "Pattern{Field(fld11,true), Constant(' GMT Total_bytes_send '), Field(p0,false)}" -match("MESSAGE#104:TCP_OTHERCONN_DELINK/1_0", "nwparser.p0", "%{fld11->} GMT Total_bytes_send %{p0}"); +var part201 = match("MESSAGE#104:TCP_OTHERCONN_DELINK/1_0", "nwparser.p0", "%{fld11->} GMT Total_bytes_send %{p0}"); -var part202 = // "Pattern{Field(fld11,true), Constant(' Total_bytes_send '), Field(p0,false)}" -match("MESSAGE#104:TCP_OTHERCONN_DELINK/1_1", "nwparser.p0", "%{fld11->} Total_bytes_send %{p0}"); +var part202 = match("MESSAGE#104:TCP_OTHERCONN_DELINK/1_1", "nwparser.p0", "%{fld11->} Total_bytes_send %{p0}"); var select56 = linear_select([ part201, @@ -2733,22 +2472,18 @@ var all47 = all_match({ var msg114 = msg("TCP_OTHERCONN_DELINK", all47); -var part203 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - NatIP '), Field(stransaddr,false), Constant(':'), Field(stransport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Start Time '), Field(p0,false)}" -match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Start Time %{p0}"); +var part203 = match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Start Time %{p0}"); -var part204 = // "Pattern{Field(fld10,true), Constant(' GMT - Delink Time '), Field(p0,false)}" -match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/1_0", "nwparser.p0", "%{fld10->} GMT - Delink Time %{p0}"); +var part204 = match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/1_0", "nwparser.p0", "%{fld10->} GMT - Delink Time %{p0}"); -var part205 = // "Pattern{Field(fld10,true), Constant(' - Delink Time '), Field(p0,false)}" -match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/1_1", "nwparser.p0", "%{fld10->} - Delink Time %{p0}"); +var part205 = match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/1_1", "nwparser.p0", "%{fld10->} - Delink Time %{p0}"); var select57 = linear_select([ part204, part205, ]); -var part206 = // "Pattern{Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,true), Constant(' - '), Field(info,false)}" -match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/3", "nwparser.p0", "%{sbytes->} - Total_bytes_recv %{rbytes->} - %{info}"); +var part206 = match("MESSAGE#105:TCP_NAT_OTHERCONN_DELINK/3", "nwparser.p0", "%{sbytes->} - Total_bytes_recv %{rbytes->} - %{info}"); var all48 = all_match({ processors: [ @@ -2770,8 +2505,7 @@ var all48 = all_match({ var msg115 = msg("TCP_NAT_OTHERCONN_DELINK", all48); -var part207 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "login '), Field(fld11,false), Constant('" - Status "Success'), Field(info,false), Constant('"')}" -match("MESSAGE#106:UI_CMD_EXECUTED:Login", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\" - Status \"Success%{info}\"", processor_chain([ +var part207 = match("MESSAGE#106:UI_CMD_EXECUTED:Login", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\" - Status \"Success%{info}\"", processor_chain([ dup69, dup84, dup3, @@ -2783,8 +2517,7 @@ match("MESSAGE#106:UI_CMD_EXECUTED:Login", "nwparser.payload", "User %{username- var msg116 = msg("UI_CMD_EXECUTED:Login", part207); -var part208 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "login '), Field(fld11,false), Constant('" - Status "ERROR:'), Field(info,false), Constant('"')}" -match("MESSAGE#107:UI_CMD_EXECUTED:LoginFail", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\" - Status \"ERROR:%{info}\"", processor_chain([ +var part208 = match("MESSAGE#107:UI_CMD_EXECUTED:LoginFail", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\" - Status \"ERROR:%{info}\"", processor_chain([ dup5, dup84, dup3, @@ -2796,8 +2529,7 @@ match("MESSAGE#107:UI_CMD_EXECUTED:LoginFail", "nwparser.payload", "User %{usern var msg117 = msg("UI_CMD_EXECUTED:LoginFail", part208); -var part209 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "logout '), Field(fld11,false), Constant('" - Status "Success'), Field(info,false), Constant('"')}" -match("MESSAGE#108:UI_CMD_EXECUTED:Logout", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"logout %{fld11}\" - Status \"Success%{info}\"", processor_chain([ +var part209 = match("MESSAGE#108:UI_CMD_EXECUTED:Logout", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"logout %{fld11}\" - Status \"Success%{info}\"", processor_chain([ dup71, dup84, dup3, @@ -2811,8 +2543,7 @@ var msg118 = msg("UI_CMD_EXECUTED:Logout", part209); var msg119 = msg("UI_CMD_EXECUTED", dup108); -var part210 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "login '), Field(fld11,false), Constant('"')}" -match("MESSAGE#144:UI_CMD_EXECUTED:01_Login", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\"", processor_chain([ +var part210 = match("MESSAGE#144:UI_CMD_EXECUTED:01_Login", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\"", processor_chain([ dup69, dup84, dup3, @@ -2823,8 +2554,7 @@ match("MESSAGE#144:UI_CMD_EXECUTED:01_Login", "nwparser.payload", "User %{userna var msg120 = msg("UI_CMD_EXECUTED:01_Login", part210); -var part211 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "logout '), Field(fld11,false), Constant('"')}" -match("MESSAGE#145:UI_CMD_EXECUTED:01_Logout", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"logout %{fld11}\"", processor_chain([ +var part211 = match("MESSAGE#145:UI_CMD_EXECUTED:01_Logout", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"logout %{fld11}\"", processor_chain([ dup71, dup84, dup3, @@ -2835,8 +2565,7 @@ match("MESSAGE#145:UI_CMD_EXECUTED:01_Logout", "nwparser.payload", "User %{usern var msg121 = msg("UI_CMD_EXECUTED:01_Logout", part211); -var part212 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(action,false), Constant('"')}" -match("MESSAGE#146:UI_CMD_EXECUTED:01", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\"", processor_chain([ +var part212 = match("MESSAGE#146:UI_CMD_EXECUTED:01", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\"", processor_chain([ dup88, dup89, dup3, @@ -2855,8 +2584,7 @@ var select58 = linear_select([ msg122, ]); -var part213 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Total_bytes_send '), Field(comp_sbytes,true), Constant(' - Total_bytes_recv '), Field(comp_rbytes,true), Constant(' - Denied_by_policy "'), Field(fld2,false), Constant('" - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#110:SSLVPN_NONHTTP_RESOURCEACCESS_DENIED/2", "nwparser.p0", "%{daddr}:%{dport->} - Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Total_bytes_send %{comp_sbytes->} - Total_bytes_recv %{comp_rbytes->} - Denied_by_policy \"%{fld2}\" - Group(s) \"%{group}\""); +var part213 = match("MESSAGE#110:SSLVPN_NONHTTP_RESOURCEACCESS_DENIED/2", "nwparser.p0", "%{daddr}:%{dport->} - Source %{saddr}:%{sport->} - Destination %{dtransaddr}:%{dtransport->} - Total_bytes_send %{comp_sbytes->} - Total_bytes_recv %{comp_rbytes->} - Denied_by_policy \"%{fld2}\" - Group(s) \"%{group}\""); var all49 = all_match({ processors: [ @@ -2874,24 +2602,21 @@ var all49 = all_match({ var msg123 = msg("SSLVPN_NONHTTP_RESOURCEACCESS_DENIED", all49); -var part214 = // "Pattern{Field(fld1,true), Constant(' - State Init')}" -match("MESSAGE#111:EVENT_VRIDINIT", "nwparser.payload", "%{fld1->} - State Init", processor_chain([ +var part214 = match("MESSAGE#111:EVENT_VRIDINIT", "nwparser.payload", "%{fld1->} - State Init", processor_chain([ dup9, dup4, ])); var msg124 = msg("EVENT_VRIDINIT", part214); -var part215 = // "Pattern{Constant('"REC: status '), Field(info,true), Constant(' from client '), Field(fld1,true), Constant(' for ID '), Field(id,false), Constant('"')}" -match("MESSAGE#112:CLUSTERD_Message:01", "nwparser.payload", "\"REC: status %{info->} from client %{fld1->} for ID %{id}\"", processor_chain([ +var part215 = match("MESSAGE#112:CLUSTERD_Message:01", "nwparser.payload", "\"REC: status %{info->} from client %{fld1->} for ID %{id}\"", processor_chain([ dup9, dup4, ])); var msg125 = msg("CLUSTERD_Message:01", part215); -var part216 = // "Pattern{Field(info,false), Constant('('), Field(saddr,false), Constant(') port('), Field(sport,false), Constant(') msglen('), Field(fld1,false), Constant(') rcv('), Field(packets,false), Constant(') R('), Field(result,false), Constant(') " ')}" -match("MESSAGE#113:CLUSTERD_Message:02/1_0", "nwparser.p0", "%{info}(%{saddr}) port(%{sport}) msglen(%{fld1}) rcv(%{packets}) R(%{result}) \" "); +var part216 = match("MESSAGE#113:CLUSTERD_Message:02/1_0", "nwparser.p0", "%{info}(%{saddr}) port(%{sport}) msglen(%{fld1}) rcv(%{packets}) R(%{result}) \" "); var select59 = linear_select([ part216, @@ -2916,11 +2641,9 @@ var select60 = linear_select([ msg126, ]); -var part217 = // "Pattern{Constant('"crypto: driver '), Field(fld1,true), Constant(' registers alg '), Field(fld2,true), Constant(' flags '), Field(fld3,true), Constant(' maxoplen '), Field(fld4,true), Constant(' "')}" -match("MESSAGE#114:IPSEC_Message/0_0", "nwparser.payload", "\"crypto: driver %{fld1->} registers alg %{fld2->} flags %{fld3->} maxoplen %{fld4->} \""); +var part217 = match("MESSAGE#114:IPSEC_Message/0_0", "nwparser.payload", "\"crypto: driver %{fld1->} registers alg %{fld2->} flags %{fld3->} maxoplen %{fld4->} \""); -var part218 = // "Pattern{Constant(' "'), Field(info,true), Constant(' "')}" -match("MESSAGE#114:IPSEC_Message/0_1", "nwparser.payload", " \"%{info->} \""); +var part218 = match("MESSAGE#114:IPSEC_Message/0_1", "nwparser.payload", " \"%{info->} \""); var select61 = linear_select([ part217, @@ -2939,16 +2662,14 @@ var all51 = all_match({ var msg127 = msg("IPSEC_Message", all51); -var part219 = // "Pattern{Constant('"'), Field(event_type,false), Constant(': '), Field(info,true), Constant(' "')}" -match("MESSAGE#115:NSNETSVC_Message", "nwparser.payload", "\"%{event_type}: %{info->} \"", processor_chain([ +var part219 = match("MESSAGE#115:NSNETSVC_Message", "nwparser.payload", "\"%{event_type}: %{info->} \"", processor_chain([ dup9, dup4, ])); var msg128 = msg("NSNETSVC_Message", part219); -var part220 = // "Pattern{Field(,true), Constant(' '), Field(username,false), Constant('- Vserver '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Total_bytes_send '), Field(sbytes,true), Constant(' - Remote_host '), Field(hostname,true), Constant(' - Denied_url '), Field(url,true), Constant(' - Denied_by_policy '), Field(policyname,true), Constant(' - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#116:SSLVPN_HTTP_RESOURCEACCESS_DENIED/2", "nwparser.p0", "%{} %{username}- Vserver %{daddr}:%{dport->} - Total_bytes_send %{sbytes->} - Remote_host %{hostname->} - Denied_url %{url->} - Denied_by_policy %{policyname->} - Group(s) \"%{group}\""); +var part220 = match("MESSAGE#116:SSLVPN_HTTP_RESOURCEACCESS_DENIED/2", "nwparser.p0", "%{} %{username}- Vserver %{daddr}:%{dport->} - Total_bytes_send %{sbytes->} - Remote_host %{hostname->} - Denied_url %{url->} - Denied_by_policy %{policyname->} - Group(s) \"%{group}\""); var all52 = all_match({ processors: [ @@ -2964,14 +2685,11 @@ var all52 = all_match({ var msg129 = msg("SSLVPN_HTTP_RESOURCEACCESS_DENIED", all52); -var part221 = // "Pattern{Constant('Client '), Field(saddr,true), Constant(' - Profile '), Field(p0,false)}" -match("MESSAGE#117:NSNETSVC_REQ_PARSE_ERROR/0", "nwparser.payload", "Client %{saddr->} - Profile %{p0}"); +var part221 = match("MESSAGE#117:NSNETSVC_REQ_PARSE_ERROR/0", "nwparser.payload", "Client %{saddr->} - Profile %{p0}"); -var part222 = // "Pattern{Field(info,false), Constant(', '), Field(event_description,true), Constant(' - URL')}" -match("MESSAGE#117:NSNETSVC_REQ_PARSE_ERROR/1_0", "nwparser.p0", "%{info}, %{event_description->} - URL"); +var part222 = match("MESSAGE#117:NSNETSVC_REQ_PARSE_ERROR/1_0", "nwparser.p0", "%{info}, %{event_description->} - URL"); -var part223 = // "Pattern{Field(info,true), Constant(' - '), Field(event_description,true), Constant(' - URL')}" -match("MESSAGE#117:NSNETSVC_REQ_PARSE_ERROR/1_1", "nwparser.p0", "%{info->} - %{event_description->} - URL"); +var part223 = match("MESSAGE#117:NSNETSVC_REQ_PARSE_ERROR/1_1", "nwparser.p0", "%{info->} - %{event_description->} - URL"); var select62 = linear_select([ part222, @@ -2991,20 +2709,15 @@ var all53 = all_match({ var msg130 = msg("NSNETSVC_REQ_PARSE_ERROR", all53); -var part224 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Vserver '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - NatIP '), Field(stransaddr,false), Constant(':'), Field(stransport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Delink Time '), Field(fld11,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#118:Source:01/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Vserver %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Delink Time %{fld11->} %{p0}"); +var part224 = match("MESSAGE#118:Source:01/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Vserver %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Delink Time %{fld11->} %{p0}"); -var part225 = // "Pattern{Constant('GMT - Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(p0,false)}" -match("MESSAGE#118:Source:01/1_0", "nwparser.p0", "GMT - Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); +var part225 = match("MESSAGE#118:Source:01/1_0", "nwparser.p0", "GMT - Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); -var part226 = // "Pattern{Constant('- Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(p0,false)}" -match("MESSAGE#118:Source:01/1_1", "nwparser.p0", "- Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); +var part226 = match("MESSAGE#118:Source:01/1_1", "nwparser.p0", "- Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); -var part227 = // "Pattern{Constant('GMT Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(p0,false)}" -match("MESSAGE#118:Source:01/1_2", "nwparser.p0", "GMT Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); +var part227 = match("MESSAGE#118:Source:01/1_2", "nwparser.p0", "GMT Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); -var part228 = // "Pattern{Constant('Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(p0,false)}" -match("MESSAGE#118:Source:01/1_3", "nwparser.p0", "Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); +var part228 = match("MESSAGE#118:Source:01/1_3", "nwparser.p0", "Total_bytes_send %{sbytes->} - Total_bytes_recv %{p0}"); var select63 = linear_select([ part225, @@ -3013,8 +2726,7 @@ var select63 = linear_select([ part228, ]); -var part229 = // "Pattern{Field(rbytes,false)}" -match_copy("MESSAGE#118:Source:01/2", "nwparser.p0", "rbytes"); +var part229 = match_copy("MESSAGE#118:Source:01/2", "nwparser.p0", "rbytes"); var all54 = all_match({ processors: [ @@ -3051,15 +2763,13 @@ var select64 = linear_select([ msg132, ]); -var part230 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(fld1,false), Constant('" - Status "'), Field(result,false), Constant('"')}" -match("MESSAGE#120:User", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{fld1}\" - Status \"%{result}\"", processor_chain([ +var part230 = match("MESSAGE#120:User", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{fld1}\" - Status \"%{result}\"", processor_chain([ dup2, ])); var msg133 = msg("User", part230); -var part231 = // "Pattern{Constant('SPCBId '), Field(sessionid,true), Constant(' - ClientIP '), Field(saddr,true), Constant(' - ClientPort '), Field(sport,true), Constant(' - VserverServiceIP '), Field(daddr,true), Constant(' - VserverServicePort '), Field(dport,true), Constant(' - ClientVersion '), Field(s_sslver,true), Constant(' - CipherSuite "'), Field(s_cipher,false), Constant('" - '), Field(result,false)}" -match("MESSAGE#121:SPCBId", "nwparser.payload", "SPCBId %{sessionid->} - ClientIP %{saddr->} - ClientPort %{sport->} - VserverServiceIP %{daddr->} - VserverServicePort %{dport->} - ClientVersion %{s_sslver->} - CipherSuite \"%{s_cipher}\" - %{result}", processor_chain([ +var part231 = match("MESSAGE#121:SPCBId", "nwparser.payload", "SPCBId %{sessionid->} - ClientIP %{saddr->} - ClientPort %{sport->} - VserverServiceIP %{daddr->} - VserverServicePort %{dport->} - ClientVersion %{s_sslver->} - CipherSuite \"%{s_cipher}\" - %{result}", processor_chain([ dup11, dup40, dup8, @@ -3078,8 +2788,7 @@ var msg138 = msg("APPFW_FIELDCONSISTENCY", dup109); var msg139 = msg("APPFW_REFERER_HEADER", dup109); -var part232 = // "Pattern{Field(product,false), Constant('|'), Field(version,false), Constant('|'), Field(rule,false), Constant('|'), Field(fld1,false), Constant('|'), Field(severity,false), Constant('|src='), Field(saddr,true), Constant(' spt='), Field(sport,true), Constant(' method='), Field(web_method,true), Constant(' request='), Field(url,true), Constant(' msg='), Field(info,true), Constant(' cn1='), Field(fld2,true), Constant(' cn2='), Field(fld3,true), Constant(' cs1='), Field(policyname,true), Constant(' cs2='), Field(fld5,true), Constant(' cs3='), Field(fld6,true), Constant(' cs4='), Field(severity,true), Constant(' cs5='), Field(fld8,true), Constant(' cs6='), Field(fld9,true), Constant(' act='), Field(action,false)}" -match("MESSAGE#127:APPFW_SIGNATURE_MATCH", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs3=%{fld6->} cs4=%{severity->} cs5=%{fld8->} cs6=%{fld9->} act=%{action}", processor_chain([ +var part232 = match("MESSAGE#127:APPFW_SIGNATURE_MATCH", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs3=%{fld6->} cs4=%{severity->} cs5=%{fld8->} cs6=%{fld9->} act=%{action}", processor_chain([ dup9, dup91, ])); @@ -3122,8 +2831,7 @@ var part233 = tagval("MESSAGE#130:CITRIX_TVM", "nwparser.payload", tvm, { var msg143 = msg("CITRIX_TVM", part233); -var part234 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' '), Field(url,true), Constant(' '), Field(event_description,false)}" -match("MESSAGE#131:APPFW_APPFW_POLICY_HIT", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{fld3->} %{url->} %{event_description}", processor_chain([ +var part234 = match("MESSAGE#131:APPFW_APPFW_POLICY_HIT", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{fld3->} %{url->} %{event_description}", processor_chain([ dup9, dup40, dup3, @@ -3132,8 +2840,7 @@ match("MESSAGE#131:APPFW_APPFW_POLICY_HIT", "nwparser.payload", "%{saddr->} %{fl var msg144 = msg("APPFW_APPFW_POLICY_HIT", part234); -var part235 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(url,true), Constant(' Unknown content-type header value='), Field(fld4,true), Constant(' '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#132:APPFW_APPFW_CONTENT_TYPE", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{rule_group->} %{url->} Unknown content-type header value=%{fld4->} %{info->} \u003c\u003c%{disposition}>", processor_chain([ +var part235 = match("MESSAGE#132:APPFW_APPFW_CONTENT_TYPE", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{rule_group->} %{url->} Unknown content-type header value=%{fld4->} %{info->} \u003c\u003c%{disposition}>", processor_chain([ dup9, dup91, dup4, @@ -3141,8 +2848,7 @@ match("MESSAGE#132:APPFW_APPFW_CONTENT_TYPE", "nwparser.payload", "%{saddr->} %{ var msg145 = msg("APPFW_APPFW_CONTENT_TYPE", part235); -var part236 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(url,true), Constant(' WSI check failed: '), Field(fld4,false), Constant(': '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#133:APPFW_RESP_APPFW_XML_WSI_ERR_BODY_ENV_NAMESPACE", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{rule_group->} %{url->} WSI check failed: %{fld4}: %{info->} \u003c\u003c%{disposition}>", processor_chain([ +var part236 = match("MESSAGE#133:APPFW_RESP_APPFW_XML_WSI_ERR_BODY_ENV_NAMESPACE", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{rule_group->} %{url->} WSI check failed: %{fld4}: %{info->} \u003c\u003c%{disposition}>", processor_chain([ dup9, dup91, dup4, @@ -3150,8 +2856,7 @@ match("MESSAGE#133:APPFW_RESP_APPFW_XML_WSI_ERR_BODY_ENV_NAMESPACE", "nwparser.p var msg146 = msg("APPFW_RESP_APPFW_XML_WSI_ERR_BODY_ENV_NAMESPACE", part236); -var part237 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(url,true), Constant(' Referer header check failed: referer header URL ''), Field(web_referer,false), Constant('' not in Start URL or closure list <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#134:APPFW_APPFW_REFERER_HEADER", "nwparser.payload", "%{saddr->} %{fld2->} %{fld3->} %{rule_group->} %{url->} Referer header check failed: referer header URL '%{web_referer}' not in Start URL or closure list \u003c\u003c%{disposition}>", processor_chain([ +var part237 = match("MESSAGE#134:APPFW_APPFW_REFERER_HEADER", "nwparser.payload", "%{saddr->} %{fld2->} %{fld3->} %{rule_group->} %{url->} Referer header check failed: referer header URL '%{web_referer}' not in Start URL or closure list \u003c\u003c%{disposition}>", processor_chain([ dup9, dup40, dup3, @@ -3161,8 +2866,7 @@ match("MESSAGE#134:APPFW_APPFW_REFERER_HEADER", "nwparser.payload", "%{saddr->} var msg147 = msg("APPFW_APPFW_REFERER_HEADER", part237); -var part238 = // "Pattern{Constant('"URL'), Field(url,false), Constant('Client IP'), Field(hostip,false), Constant('Client Dest'), Field(fld1,false)}" -match("MESSAGE#141:RESPONDER_Message", "nwparser.payload", "\"URL%{url}Client IP%{hostip}Client Dest%{fld1}", processor_chain([ +var part238 = match("MESSAGE#141:RESPONDER_Message", "nwparser.payload", "\"URL%{url}Client IP%{hostip}Client Dest%{fld1}", processor_chain([ dup9, dup3, dup4, @@ -3170,8 +2874,7 @@ match("MESSAGE#141:RESPONDER_Message", "nwparser.payload", "\"URL%{url}Client IP var msg148 = msg("RESPONDER_Message", part238); -var part239 = // "Pattern{Constant('"NSRateLimit='), Field(filter,false), Constant(', ClientIP='), Field(saddr,false), Constant('"')}" -match("MESSAGE#142:RESPONDER_Message:01", "nwparser.payload", "\"NSRateLimit=%{filter}, ClientIP=%{saddr}\"", processor_chain([ +var part239 = match("MESSAGE#142:RESPONDER_Message:01", "nwparser.payload", "\"NSRateLimit=%{filter}, ClientIP=%{saddr}\"", processor_chain([ dup9, dup3, dup4, @@ -3184,8 +2887,7 @@ var select65 = linear_select([ msg149, ]); -var part240 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' - '), Field(fld2,true), Constant(' - '), Field(event_description,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#147:APPFW_AF_MALFORMED_REQ_ERR", "nwparser.payload", "%{saddr->} %{fld1->} - %{fld2->} - %{event_description->} \u003c\u003c%{disposition}>", processor_chain([ +var part240 = match("MESSAGE#147:APPFW_AF_MALFORMED_REQ_ERR", "nwparser.payload", "%{saddr->} %{fld1->} - %{fld2->} - %{event_description->} \u003c\u003c%{disposition}>", processor_chain([ dup11, dup3, dup4, @@ -3193,8 +2895,7 @@ match("MESSAGE#147:APPFW_AF_MALFORMED_REQ_ERR", "nwparser.payload", "%{saddr->} var msg150 = msg("APPFW_AF_MALFORMED_REQ_ERR", part240); -var part241 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' - '), Field(fld2,true), Constant(' - '), Field(rule_group,true), Constant(' '), Field(url,true), Constant(' '), Field(event_description,true), Constant(' rule ID '), Field(rule_uid,false), Constant(': '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#148:APPFW_APPFW_SIGNATURE_MATCH", "nwparser.payload", "%{saddr->} %{fld1->} - %{fld2->} - %{rule_group->} %{url->} %{event_description->} rule ID %{rule_uid}: %{info->} \u003c\u003c%{disposition}>", processor_chain([ +var part241 = match("MESSAGE#148:APPFW_APPFW_SIGNATURE_MATCH", "nwparser.payload", "%{saddr->} %{fld1->} - %{fld2->} - %{rule_group->} %{url->} %{event_description->} rule ID %{rule_uid}: %{info->} \u003c\u003c%{disposition}>", processor_chain([ dup9, domain("web_domain","url"), root("web_root","url"), @@ -3206,8 +2907,7 @@ match("MESSAGE#148:APPFW_APPFW_SIGNATURE_MATCH", "nwparser.payload", "%{saddr->} var msg151 = msg("APPFW_APPFW_SIGNATURE_MATCH", part241); -var part242 = // "Pattern{Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(rule_group,true), Constant(' '), Field(url,true), Constant(' Signature violation rule ID '), Field(rule_uid,false), Constant(': '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#149:APPFW_APPFW_SIGNATURE_MATCH:01", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{rule_group->} %{url->} Signature violation rule ID %{rule_uid}: %{info->} \u003c\u003c%{disposition}>", processor_chain([ +var part242 = match("MESSAGE#149:APPFW_APPFW_SIGNATURE_MATCH:01", "nwparser.payload", "%{saddr->} %{fld1->} %{fld2->} %{rule_group->} %{url->} Signature violation rule ID %{rule_uid}: %{info->} \u003c\u003c%{disposition}>", processor_chain([ dup9, dup91, dup4, @@ -3221,8 +2921,7 @@ var select66 = linear_select([ msg152, ]); -var part243 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(action,false), Constant('" -serverIP '), Field(daddr,true), Constant(' -serverPort '), Field(dport,true), Constant(' -logLevel '), Field(fld1,true), Constant(' -dateFormat '), Field(fld2,true), Constant(' -logFacility '), Field(fld3,true), Constant(' -tcp '), Field(fld4,true), Constant(' -acl '), Field(fld5,true), Constant(' -timeZone '), Field(fld6,true), Constant(' -userDefinedAuditlog '), Field(fld7,true), Constant(' -appflowExport '), Field(fld8,false), Constant('" - Status "'), Field(disposition,false), Constant('"')}" -match("MESSAGE#150:GUI_CMD_EXECUTED:01", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" -serverIP %{daddr->} -serverPort %{dport->} -logLevel %{fld1->} -dateFormat %{fld2->} -logFacility %{fld3->} -tcp %{fld4->} -acl %{fld5->} -timeZone %{fld6->} -userDefinedAuditlog %{fld7->} -appflowExport %{fld8}\" - Status \"%{disposition}\"", processor_chain([ +var part243 = match("MESSAGE#150:GUI_CMD_EXECUTED:01", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" -serverIP %{daddr->} -serverPort %{dport->} -logLevel %{fld1->} -dateFormat %{fld2->} -logFacility %{fld3->} -tcp %{fld4->} -acl %{fld5->} -timeZone %{fld6->} -userDefinedAuditlog %{fld7->} -appflowExport %{fld8}\" - Status \"%{disposition}\"", processor_chain([ dup88, dup89, dup3, @@ -3231,8 +2930,7 @@ match("MESSAGE#150:GUI_CMD_EXECUTED:01", "nwparser.payload", "User %{username->} var msg153 = msg("GUI_CMD_EXECUTED:01", part243); -var part244 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(action,true), Constant(' -priority '), Field(fld1,true), Constant(' -devno '), Field(fld2,false), Constant('" - Status "'), Field(disposition,false), Constant('"')}" -match("MESSAGE#151:GUI_CMD_EXECUTED:02", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action->} -priority %{fld1->} -devno %{fld2}\" - Status \"%{disposition}\"", processor_chain([ +var part244 = match("MESSAGE#151:GUI_CMD_EXECUTED:02", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action->} -priority %{fld1->} -devno %{fld2}\" - Status \"%{disposition}\"", processor_chain([ dup88, dup89, dup3, @@ -3241,8 +2939,7 @@ match("MESSAGE#151:GUI_CMD_EXECUTED:02", "nwparser.payload", "User %{username->} var msg154 = msg("GUI_CMD_EXECUTED:02", part244); -var part245 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "login '), Field(fld11,false), Constant('" - Status "Success'), Field(info,false), Constant('"')}" -match("MESSAGE#152:GUI_CMD_EXECUTED:Login", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\" - Status \"Success%{info}\"", processor_chain([ +var part245 = match("MESSAGE#152:GUI_CMD_EXECUTED:Login", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"login %{fld11}\" - Status \"Success%{info}\"", processor_chain([ dup69, dup92, dup3, @@ -3254,8 +2951,7 @@ match("MESSAGE#152:GUI_CMD_EXECUTED:Login", "nwparser.payload", "User %{username var msg155 = msg("GUI_CMD_EXECUTED:Login", part245); -var part246 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "logout '), Field(fld11,false), Constant('" - Status "Success'), Field(info,false), Constant('"')}" -match("MESSAGE#153:GUI_CMD_EXECUTED:Logout", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"logout %{fld11}\" - Status \"Success%{info}\"", processor_chain([ +var part246 = match("MESSAGE#153:GUI_CMD_EXECUTED:Logout", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"logout %{fld11}\" - Status \"Success%{info}\"", processor_chain([ dup71, dup92, dup3, @@ -3269,8 +2965,7 @@ var msg156 = msg("GUI_CMD_EXECUTED:Logout", part246); var msg157 = msg("GUI_CMD_EXECUTED", dup108); -var part247 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(action,true), Constant(' - Status "'), Field(disposition,false), Constant('" - Message "'), Field(info,false), Constant('"')}" -match("MESSAGE#155:GUI_CMD_EXECUTED:03", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action->} - Status \"%{disposition}\" - Message \"%{info}\"", processor_chain([ +var part247 = match("MESSAGE#155:GUI_CMD_EXECUTED:03", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action->} - Status \"%{disposition}\" - Message \"%{info}\"", processor_chain([ dup88, dup89, dup4, @@ -3289,8 +2984,7 @@ var select67 = linear_select([ var msg159 = msg("CLI_CMD_EXECUTED", dup108); -var part248 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(action,false), Constant('" - Status "'), Field(disposition,false), Constant('"')}" -match("MESSAGE#157:API_CMD_EXECUTED", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" - Status \"%{disposition}\"", processor_chain([ +var part248 = match("MESSAGE#157:API_CMD_EXECUTED", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" - Status \"%{disposition}\"", processor_chain([ dup88, setc("event_description","API command executed in NetScaler"), dup3, @@ -3299,11 +2993,9 @@ match("MESSAGE#157:API_CMD_EXECUTED", "nwparser.payload", "User %{username->} - var msg160 = msg("API_CMD_EXECUTED", part248); -var part249 = // "Pattern{Field(result,true), Constant(' for user '), Field(username,true), Constant(' = '), Field(fld1,true), Constant(' "')}" -match("MESSAGE#158:AAA_Message/1_0", "nwparser.p0", "%{result->} for user %{username->} = %{fld1->} \""); +var part249 = match("MESSAGE#158:AAA_Message/1_0", "nwparser.p0", "%{result->} for user %{username->} = %{fld1->} \""); -var part250 = // "Pattern{Constant(''), Field(info,true), Constant(' "')}" -match("MESSAGE#158:AAA_Message/1_1", "nwparser.p0", "%{info->} \""); +var part250 = match("MESSAGE#158:AAA_Message/1_1", "nwparser.p0", "%{info->} \""); var select68 = linear_select([ part249, @@ -3323,8 +3015,7 @@ var all56 = all_match({ var msg161 = msg("AAA_Message", all56); -var part251 = // "Pattern{Constant('"'), Field(event_type,false), Constant(': created session for <<'), Field(domain,false), Constant('> with cookie: <<'), Field(web_cookie,false), Constant('>"')}" -match("MESSAGE#159:AAATM_Message:04", "nwparser.payload", "\"%{event_type}: created session for \u003c\u003c%{domain}> with cookie: \u003c\u003c%{web_cookie}>\"", processor_chain([ +var part251 = match("MESSAGE#159:AAATM_Message:04", "nwparser.payload", "\"%{event_type}: created session for \u003c\u003c%{domain}> with cookie: \u003c\u003c%{web_cookie}>\"", processor_chain([ dup9, dup91, dup4, @@ -3332,8 +3023,7 @@ match("MESSAGE#159:AAATM_Message:04", "nwparser.payload", "\"%{event_type}: crea var msg162 = msg("AAATM_Message:04", part251); -var part252 = // "Pattern{Field(fld1,true), Constant(' for user '), Field(username,true), Constant(' "')}" -match("MESSAGE#160:AAATM_Message/1_0", "nwparser.p0", "%{fld1->} for user %{username->} \""); +var part252 = match("MESSAGE#160:AAATM_Message/1_0", "nwparser.p0", "%{fld1->} for user %{username->} \""); var select69 = linear_select([ part252, @@ -3353,8 +3043,7 @@ var all57 = all_match({ var msg163 = msg("AAATM_Message", all57); -var part253 = // "Pattern{Constant('"'), Field(fld1,true), Constant(' creating session '), Field(info,false), Constant('"')}" -match("MESSAGE#161:AAATM_Message:01", "nwparser.payload", "\"%{fld1->} creating session %{info}\"", processor_chain([ +var part253 = match("MESSAGE#161:AAATM_Message:01", "nwparser.payload", "\"%{fld1->} creating session %{info}\"", processor_chain([ dup9, dup4, setc("event_type","creating session"), @@ -3362,8 +3051,7 @@ match("MESSAGE#161:AAATM_Message:01", "nwparser.payload", "\"%{fld1->} creating var msg164 = msg("AAATM_Message:01", part253); -var part254 = // "Pattern{Constant('"cookie idx is '), Field(fld1,false), Constant(', '), Field(info,false), Constant('"')}" -match("MESSAGE#162:AAATM_Message:02", "nwparser.payload", "\"cookie idx is %{fld1}, %{info}\"", processor_chain([ +var part254 = match("MESSAGE#162:AAATM_Message:02", "nwparser.payload", "\"cookie idx is %{fld1}, %{info}\"", processor_chain([ dup9, dup4, setc("event_type","cookie idx"), @@ -3371,8 +3059,7 @@ match("MESSAGE#162:AAATM_Message:02", "nwparser.payload", "\"cookie idx is %{fld var msg165 = msg("AAATM_Message:02", part254); -var part255 = // "Pattern{Constant('"sent request to '), Field(fld1,true), Constant(' for authentication, user <<'), Field(domain,false), Constant('\'), Field(username,false), Constant('>, client ip '), Field(saddr,false), Constant('"')}" -match("MESSAGE#163:AAATM_Message:03", "nwparser.payload", "\"sent request to %{fld1->} for authentication, user \u003c\u003c%{domain}\\%{username}>, client ip %{saddr}\"", processor_chain([ +var part255 = match("MESSAGE#163:AAATM_Message:03", "nwparser.payload", "\"sent request to %{fld1->} for authentication, user \u003c\u003c%{domain}\\%{username}>, client ip %{saddr}\"", processor_chain([ setc("eventcategory","1304000000"), dup4, setc("event_type","sent request"), @@ -3380,8 +3067,7 @@ match("MESSAGE#163:AAATM_Message:03", "nwparser.payload", "\"sent request to %{f var msg166 = msg("AAATM_Message:03", part255); -var part256 = // "Pattern{Constant('"authentication succeeded for user <<'), Field(domain,false), Constant('\'), Field(username,false), Constant('>, client ip '), Field(saddr,false), Constant(', setting up session"')}" -match("MESSAGE#164:AAATM_Message:05", "nwparser.payload", "\"authentication succeeded for user \u003c\u003c%{domain}\\%{username}>, client ip %{saddr}, setting up session\"", processor_chain([ +var part256 = match("MESSAGE#164:AAATM_Message:05", "nwparser.payload", "\"authentication succeeded for user \u003c\u003c%{domain}\\%{username}>, client ip %{saddr}, setting up session\"", processor_chain([ setc("eventcategory","1302000000"), dup4, setc("event_type","setting up session"), @@ -3401,22 +3087,18 @@ var select70 = linear_select([ msg168, ]); -var part257 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - SessionId: '), Field(sessionid,false), Constant('- '), Field(event_computer,true), Constant(' User '), Field(username,true), Constant(' : Group(s) '), Field(group,true), Constant(' : Vserver '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#166:AAATM_HTTPREQUEST/0", "nwparser.payload", "Context %{fld1->} - SessionId: %{sessionid}- %{event_computer->} User %{username->} : Group(s) %{group->} : Vserver %{daddr}:%{dport->} - %{fld2->} %{p0}"); +var part257 = match("MESSAGE#166:AAATM_HTTPREQUEST/0", "nwparser.payload", "Context %{fld1->} - SessionId: %{sessionid}- %{event_computer->} User %{username->} : Group(s) %{group->} : Vserver %{daddr}:%{dport->} - %{fld2->} %{p0}"); -var part258 = // "Pattern{Field(timezone,false), Constant(': SSO is '), Field(fld3,true), Constant(' : '), Field(p0,false)}" -match("MESSAGE#166:AAATM_HTTPREQUEST/1_0", "nwparser.p0", "%{timezone}: SSO is %{fld3->} : %{p0}"); +var part258 = match("MESSAGE#166:AAATM_HTTPREQUEST/1_0", "nwparser.p0", "%{timezone}: SSO is %{fld3->} : %{p0}"); -var part259 = // "Pattern{Field(timezone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#166:AAATM_HTTPREQUEST/1_1", "nwparser.p0", "%{timezone->} %{p0}"); +var part259 = match("MESSAGE#166:AAATM_HTTPREQUEST/1_1", "nwparser.p0", "%{timezone->} %{p0}"); var select71 = linear_select([ part258, part259, ]); -var part260 = // "Pattern{Field(web_method,true), Constant(' '), Field(url,true), Constant(' '), Field(fld4,false)}" -match("MESSAGE#166:AAATM_HTTPREQUEST/2", "nwparser.p0", "%{web_method->} %{url->} %{fld4}"); +var part260 = match("MESSAGE#166:AAATM_HTTPREQUEST/2", "nwparser.p0", "%{web_method->} %{url->} %{fld4}"); var all58 = all_match({ processors: [ @@ -3446,16 +3128,14 @@ var msg171 = msg("SSLVPN_REMOVE_SESSION", dup114); var msg172 = msg("SSLVPN_REMOVE_SESSION_INFO", dup114); -var part261 = // "Pattern{Constant('session_guid '), Field(fld1,true), Constant(' - device_serial_number '), Field(fld2,true), Constant(' - client_cookie '), Field(fld3,true), Constant(' - flags '), Field(fld4,true), Constant(' - ica_rtt '), Field(fld5,true), Constant(' - clientside_rxbytes '), Field(rbytes,false), Constant('- clientside_txbytes '), Field(sbytes,true), Constant(' - clientside_packet_retransmits '), Field(fld6,true), Constant(' - serverside_packet_retransmits '), Field(fld7,true), Constant(' - clientside_rtt '), Field(fld8,true), Constant(' - serverside_rtt '), Field(fld9,true), Constant(' - clientside_jitter '), Field(fld10,true), Constant(' - serverside_jitter '), Field(fld11,false)}" -match("MESSAGE#170:ICA_NETWORK_UPDATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - ica_rtt %{fld5->} - clientside_rxbytes %{rbytes}- clientside_txbytes %{sbytes->} - clientside_packet_retransmits %{fld6->} - serverside_packet_retransmits %{fld7->} - clientside_rtt %{fld8->} - serverside_rtt %{fld9->} - clientside_jitter %{fld10->} - serverside_jitter %{fld11}", processor_chain([ +var part261 = match("MESSAGE#170:ICA_NETWORK_UPDATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - ica_rtt %{fld5->} - clientside_rxbytes %{rbytes}- clientside_txbytes %{sbytes->} - clientside_packet_retransmits %{fld6->} - serverside_packet_retransmits %{fld7->} - clientside_rtt %{fld8->} - serverside_rtt %{fld9->} - clientside_jitter %{fld10->} - serverside_jitter %{fld11}", processor_chain([ dup9, dup4, ])); var msg173 = msg("ICA_NETWORK_UPDATE", part261); -var part262 = // "Pattern{Constant('session_guid '), Field(fld1,true), Constant(' - device_serial_number '), Field(fld2,true), Constant(' - client_cookie '), Field(fld3,true), Constant(' - flags '), Field(fld4,true), Constant(' - channel_update_begin '), Field(fld5,true), Constant(' - channel_update_end '), Field(fld6,true), Constant(' - channel_id_1 '), Field(fld7,true), Constant(' - channel_id_1_val '), Field(fld8,true), Constant(' - channel_id_2 '), Field(fld9,true), Constant(' - channel_id_2_val '), Field(fld10,true), Constant(' -channel_id_3 '), Field(fld11,true), Constant(' - channel_id_3_val '), Field(fld12,true), Constant(' - channel_id_4 '), Field(fld13,true), Constant(' - channel_id_4_val '), Field(fld14,true), Constant(' -channel_id_5 '), Field(fld15,true), Constant(' - channel_id_5_val '), Field(fld16,false)}" -match("MESSAGE#171:ICA_CHANNEL_UPDATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - channel_update_begin %{fld5->} - channel_update_end %{fld6->} - channel_id_1 %{fld7->} - channel_id_1_val %{fld8->} - channel_id_2 %{fld9->} - channel_id_2_val %{fld10->} -channel_id_3 %{fld11->} - channel_id_3_val %{fld12->} - channel_id_4 %{fld13->} - channel_id_4_val %{fld14->} -channel_id_5 %{fld15->} - channel_id_5_val %{fld16}", processor_chain([ +var part262 = match("MESSAGE#171:ICA_CHANNEL_UPDATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - channel_update_begin %{fld5->} - channel_update_end %{fld6->} - channel_id_1 %{fld7->} - channel_id_1_val %{fld8->} - channel_id_2 %{fld9->} - channel_id_2_val %{fld10->} -channel_id_3 %{fld11->} - channel_id_3_val %{fld12->} - channel_id_4 %{fld13->} - channel_id_4_val %{fld14->} -channel_id_5 %{fld15->} - channel_id_5_val %{fld16}", processor_chain([ dup9, date_time({ dest: "starttime", @@ -3476,8 +3156,7 @@ match("MESSAGE#171:ICA_CHANNEL_UPDATE", "nwparser.payload", "session_guid %{fld1 var msg174 = msg("ICA_CHANNEL_UPDATE", part262); -var part263 = // "Pattern{Constant('session_guid '), Field(fld1,true), Constant(' - device_serial_number '), Field(fld2,true), Constant(' - client_cookie '), Field(fld3,true), Constant(' - flags '), Field(fld4,true), Constant(' - nsica_session_status '), Field(fld5,true), Constant(' - nsica_session_client_ip '), Field(saddr,true), Constant(' - nsica_session_client_port '), Field(sport,true), Constant(' - nsica_session_server_ip '), Field(daddr,true), Constant(' - nsica_session_server_port '), Field(dport,true), Constant(' - nsica_session_reconnect_count '), Field(fld6,true), Constant(' - nsica_session_acr_count '), Field(fld7,true), Constant(' - connection_priority '), Field(fld8,true), Constant(' - timestamp '), Field(fld9,false)}" -match("MESSAGE#172:ICA_SESSION_UPDATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - nsica_session_status %{fld5->} - nsica_session_client_ip %{saddr->} - nsica_session_client_port %{sport->} - nsica_session_server_ip %{daddr->} - nsica_session_server_port %{dport->} - nsica_session_reconnect_count %{fld6->} - nsica_session_acr_count %{fld7->} - connection_priority %{fld8->} - timestamp %{fld9}", processor_chain([ +var part263 = match("MESSAGE#172:ICA_SESSION_UPDATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - nsica_session_status %{fld5->} - nsica_session_client_ip %{saddr->} - nsica_session_client_port %{sport->} - nsica_session_server_ip %{daddr->} - nsica_session_server_port %{dport->} - nsica_session_reconnect_count %{fld6->} - nsica_session_acr_count %{fld7->} - connection_priority %{fld8->} - timestamp %{fld9}", processor_chain([ dup9, dup4, ])); @@ -3486,16 +3165,14 @@ var msg175 = msg("ICA_SESSION_UPDATE", part263); var msg176 = msg("ICA_Message", dup111); -var part264 = // "Pattern{Constant('session_guid '), Field(fld1,true), Constant(' - device_serial_number '), Field(fld2,true), Constant(' - client_cookie '), Field(fld3,true), Constant(' - flags '), Field(fld4,true), Constant(' - session_setup_time '), Field(fld5,true), Constant(' - client_ip '), Field(saddr,true), Constant(' - client_type '), Field(fld6,true), Constant(' - client_launcher '), Field(fld7,true), Constant(' - client_version '), Field(version,true), Constant(' - client_hostname '), Field(shost,true), Constant(' - domain_name '), Field(domain,true), Constant(' - server_name '), Field(dhost,true), Constant(' - connection_priority '), Field(fld8,false)}" -match("MESSAGE#174:ICA_SESSION_SETUP", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - session_setup_time %{fld5->} - client_ip %{saddr->} - client_type %{fld6->} - client_launcher %{fld7->} - client_version %{version->} - client_hostname %{shost->} - domain_name %{domain->} - server_name %{dhost->} - connection_priority %{fld8}", processor_chain([ +var part264 = match("MESSAGE#174:ICA_SESSION_SETUP", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - session_setup_time %{fld5->} - client_ip %{saddr->} - client_type %{fld6->} - client_launcher %{fld7->} - client_version %{version->} - client_hostname %{shost->} - domain_name %{domain->} - server_name %{dhost->} - connection_priority %{fld8}", processor_chain([ dup9, dup4, ])); var msg177 = msg("ICA_SESSION_SETUP", part264); -var part265 = // "Pattern{Constant('session_guid '), Field(fld1,true), Constant(' - device_serial_number '), Field(fld2,true), Constant(' - client_cookie '), Field(fld3,true), Constant(' - flags '), Field(fld4,true), Constant(' - launch_mechanism '), Field(fld5,true), Constant(' - app_launch_time '), Field(fld6,true), Constant(' - app_process_id '), Field(fld7,true), Constant(' - app_name '), Field(fld8,true), Constant(' - module_path '), Field(filename,false)}" -match("MESSAGE#175:ICA_APPLICATION_LAUNCH", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - launch_mechanism %{fld5->} - app_launch_time %{fld6->} - app_process_id %{fld7->} - app_name %{fld8->} - module_path %{filename}", processor_chain([ +var part265 = match("MESSAGE#175:ICA_APPLICATION_LAUNCH", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - launch_mechanism %{fld5->} - app_launch_time %{fld6->} - app_process_id %{fld7->} - app_name %{fld8->} - module_path %{filename}", processor_chain([ dup9, date_time({ dest: "starttime", @@ -3509,8 +3186,7 @@ match("MESSAGE#175:ICA_APPLICATION_LAUNCH", "nwparser.payload", "session_guid %{ var msg178 = msg("ICA_APPLICATION_LAUNCH", part265); -var part266 = // "Pattern{Constant('session_guid '), Field(fld1,true), Constant(' - device_serial_number '), Field(fld2,true), Constant(' - client_cookie '), Field(fld3,true), Constant(' - flags '), Field(fld4,true), Constant(' - session_end_time '), Field(fld5,false)}" -match("MESSAGE#176:ICA_SESSION_TERMINATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - session_end_time %{fld5}", processor_chain([ +var part266 = match("MESSAGE#176:ICA_SESSION_TERMINATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - session_end_time %{fld5}", processor_chain([ dup9, date_time({ dest: "endtime", @@ -3524,8 +3200,7 @@ match("MESSAGE#176:ICA_SESSION_TERMINATE", "nwparser.payload", "session_guid %{f var msg179 = msg("ICA_SESSION_TERMINATE", part266); -var part267 = // "Pattern{Constant('session_guid '), Field(fld1,true), Constant(' - device_serial_number '), Field(fld2,true), Constant(' - client_cookie '), Field(fld3,true), Constant(' - flags '), Field(fld4,true), Constant(' - app_termination_type '), Field(fld5,true), Constant(' - app_process_id '), Field(fld6,true), Constant(' - app_termination_time '), Field(fld7,false)}" -match("MESSAGE#177:ICA_APPLICATION_TERMINATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - app_termination_type %{fld5->} - app_process_id %{fld6->} - app_termination_time %{fld7}", processor_chain([ +var part267 = match("MESSAGE#177:ICA_APPLICATION_TERMINATE", "nwparser.payload", "session_guid %{fld1->} - device_serial_number %{fld2->} - client_cookie %{fld3->} - flags %{fld4->} - app_termination_type %{fld5->} - app_process_id %{fld6->} - app_termination_time %{fld7}", processor_chain([ dup9, date_time({ dest: "endtime", @@ -3553,8 +3228,7 @@ var all59 = all_match({ var msg181 = msg("SSLVPN_REMOVE_SESSION_DEBUG", all59); -var part268 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Browser_type '), Field(user_agent,false), Constant('- Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#181:AAATM_LOGIN/4", "nwparser.p0", "%{daddr}:%{dport->} - Browser_type %{user_agent}- Group(s) \"%{group}\""); +var part268 = match("MESSAGE#181:AAATM_LOGIN/4", "nwparser.p0", "%{daddr}:%{dport->} - Browser_type %{user_agent}- Group(s) \"%{group}\""); var all60 = all_match({ processors: [ @@ -3574,8 +3248,7 @@ var all60 = all_match({ var msg182 = msg("AAATM_LOGIN", all60); -var part269 = // "Pattern{Field(duration_string,true), Constant(' - Http_resources_accessed '), Field(fld3,true), Constant(' - Total_TCP_connections '), Field(fld5,true), Constant(' - Total_policies_allowed '), Field(fld7,true), Constant(' - Total_policies_denied '), Field(fld8,true), Constant(' - Total_bytes_send '), Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,true), Constant(' - Total_compressedbytes_send '), Field(fld12,true), Constant(' - Total_compressedbytes_recv '), Field(fld13,true), Constant(' - Compression_ratio_send '), Field(dclass_ratio1,true), Constant(' - Compression_ratio_recv '), Field(dclass_ratio2,true), Constant(' - LogoutMethod "'), Field(result,false), Constant('" - Group(s) "'), Field(group,false), Constant('"')}" -match("MESSAGE#182:AAATM_LOGOUT/7", "nwparser.p0", "%{duration_string->} - Http_resources_accessed %{fld3->} - Total_TCP_connections %{fld5->} - Total_policies_allowed %{fld7->} - Total_policies_denied %{fld8->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{fld12->} - Total_compressedbytes_recv %{fld13->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} - LogoutMethod \"%{result}\" - Group(s) \"%{group}\""); +var part269 = match("MESSAGE#182:AAATM_LOGOUT/7", "nwparser.p0", "%{duration_string->} - Http_resources_accessed %{fld3->} - Total_TCP_connections %{fld5->} - Total_policies_allowed %{fld7->} - Total_policies_denied %{fld8->} - Total_bytes_send %{sbytes->} - Total_bytes_recv %{rbytes->} - Total_compressedbytes_send %{fld12->} - Total_compressedbytes_recv %{fld13->} - Compression_ratio_send %{dclass_ratio1->} - Compression_ratio_recv %{dclass_ratio2->} - LogoutMethod \"%{result}\" - Group(s) \"%{group}\""); var all61 = all_match({ processors: [ @@ -3722,149 +3395,101 @@ var chain1 = processor_chain([ }), ]); -var part270 = // "Pattern{Field(saddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#6:APPFW_APPFW_COOKIE/0", "nwparser.payload", "%{saddr->} %{p0}"); +var part270 = match("MESSAGE#6:APPFW_APPFW_COOKIE/0", "nwparser.payload", "%{saddr->} %{p0}"); -var part271 = // "Pattern{Field(url,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#7:APPFW_APPFW_DENYURL/2", "nwparser.p0", "%{url->} \u003c\u003c%{disposition}>"); +var part271 = match("MESSAGE#7:APPFW_APPFW_DENYURL/2", "nwparser.p0", "%{url->} \u003c\u003c%{disposition}>"); -var part272 = // "Pattern{Field(url,true), Constant(' '), Field(info,true), Constant(' <<'), Field(disposition,false), Constant('>')}" -match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/2", "nwparser.p0", "%{url->} %{info->} \u003c\u003c%{disposition}>"); +var part272 = match("MESSAGE#8:APPFW_APPFW_FIELDCONSISTENCY/2", "nwparser.p0", "%{url->} %{info->} \u003c\u003c%{disposition}>"); -var part273 = // "Pattern{Constant('"'), Field(p0,false)}" -match("MESSAGE#20:APPFW_Message/0", "nwparser.payload", "\"%{p0}"); +var part273 = match("MESSAGE#20:APPFW_Message/0", "nwparser.payload", "\"%{p0}"); -var part274 = // "Pattern{Constant('HASTATE '), Field(p0,false)}" -match("MESSAGE#23:DR_HA_Message/1_0", "nwparser.p0", "HASTATE %{p0}"); +var part274 = match("MESSAGE#23:DR_HA_Message/1_0", "nwparser.p0", "HASTATE %{p0}"); -var part275 = // "Pattern{Field(network_service,false), Constant(': '), Field(p0,false)}" -match("MESSAGE#23:DR_HA_Message/1_1", "nwparser.p0", "%{network_service}: %{p0}"); +var part275 = match("MESSAGE#23:DR_HA_Message/1_1", "nwparser.p0", "%{network_service}: %{p0}"); -var part276 = // "Pattern{Field(info,false), Constant('"')}" -match("MESSAGE#23:DR_HA_Message/2", "nwparser.p0", "%{info}\""); +var part276 = match("MESSAGE#23:DR_HA_Message/2", "nwparser.p0", "%{info}\""); -var part277 = // "Pattern{Constant('for '), Field(dclass_counter1,false)}" -match("MESSAGE#24:EVENT_ALERTENDED/1_0", "nwparser.p0", "for %{dclass_counter1}"); +var part277 = match("MESSAGE#24:EVENT_ALERTENDED/1_0", "nwparser.p0", "for %{dclass_counter1}"); -var part278 = // "Pattern{Field(space,false)}" -match_copy("MESSAGE#24:EVENT_ALERTENDED/1_1", "nwparser.p0", "space"); +var part278 = match_copy("MESSAGE#24:EVENT_ALERTENDED/1_1", "nwparser.p0", "space"); -var part279 = // "Pattern{Field(obj_type,true), Constant(' "'), Field(obj_name,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#28:EVENT_DEVICEDOWN/0", "nwparser.payload", "%{obj_type->} \"%{obj_name}\"%{p0}"); +var part279 = match("MESSAGE#28:EVENT_DEVICEDOWN/0", "nwparser.payload", "%{obj_type->} \"%{obj_name}\"%{p0}"); -var part280 = // "Pattern{Constant(' - State '), Field(event_state,false)}" -match("MESSAGE#28:EVENT_DEVICEDOWN/1_0", "nwparser.p0", " - State %{event_state}"); +var part280 = match("MESSAGE#28:EVENT_DEVICEDOWN/1_0", "nwparser.p0", " - State %{event_state}"); -var part281 = // "Pattern{}" -match_copy("MESSAGE#28:EVENT_DEVICEDOWN/1_1", "nwparser.p0", ""); +var part281 = match_copy("MESSAGE#28:EVENT_DEVICEDOWN/1_1", "nwparser.p0", ""); -var part282 = // "Pattern{Field(obj_type,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#31:EVENT_MONITORDOWN/0", "nwparser.payload", "%{obj_type->} %{p0}"); +var part282 = match("MESSAGE#31:EVENT_MONITORDOWN/0", "nwparser.payload", "%{obj_type->} %{p0}"); -var part283 = // "Pattern{Field(obj_name,true), Constant(' - State '), Field(event_state,false)}" -match("MESSAGE#31:EVENT_MONITORDOWN/1_0", "nwparser.p0", "%{obj_name->} - State %{event_state}"); +var part283 = match("MESSAGE#31:EVENT_MONITORDOWN/1_0", "nwparser.p0", "%{obj_name->} - State %{event_state}"); -var part284 = // "Pattern{Constant(''), Field(obj_name,false)}" -match("MESSAGE#31:EVENT_MONITORDOWN/1_2", "nwparser.p0", "%{obj_name}"); +var part284 = match("MESSAGE#31:EVENT_MONITORDOWN/1_2", "nwparser.p0", "%{obj_name}"); -var part285 = // "Pattern{Constant('" '), Field(p0,false)}" -match("MESSAGE#45:PITBOSS_Message1/0", "nwparser.payload", "\" %{p0}"); +var part285 = match("MESSAGE#45:PITBOSS_Message1/0", "nwparser.payload", "\" %{p0}"); -var part286 = // "Pattern{Constant(''), Field(info,false), Constant('"')}" -match("MESSAGE#45:PITBOSS_Message1/2", "nwparser.p0", "%{info}\""); +var part286 = match("MESSAGE#45:PITBOSS_Message1/2", "nwparser.p0", "%{info}\""); -var part287 = // "Pattern{Constant('sysIpAddress = '), Field(hostip,false), Constant(')')}" -match("MESSAGE#54:SNMP_TRAP_SENT7/3_3", "nwparser.p0", "sysIpAddress = %{hostip})"); +var part287 = match("MESSAGE#54:SNMP_TRAP_SENT7/3_3", "nwparser.p0", "sysIpAddress = %{hostip})"); -var part288 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/0", "nwparser.payload", "%{} %{p0}"); +var part288 = match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/0", "nwparser.payload", "%{} %{p0}"); -var part289 = // "Pattern{Constant('ClientIP '), Field(p0,false)}" -match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/1_0", "nwparser.p0", "ClientIP %{p0}"); +var part289 = match("MESSAGE#86:SSLLOG_SSL_HANDSHAKE_FAILURE/1_0", "nwparser.p0", "ClientIP %{p0}"); -var part290 = // "Pattern{Constant('" '), Field(fld10,true), Constant(' GMT" - End_time '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - End_time %{p0}"); +var part290 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_0", "nwparser.p0", "\" %{fld10->} GMT\" - End_time %{p0}"); -var part291 = // "Pattern{Constant('" '), Field(fld10,false), Constant('" - End_time '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_1", "nwparser.p0", "\" %{fld10}\" - End_time %{p0}"); +var part291 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_1", "nwparser.p0", "\" %{fld10}\" - End_time %{p0}"); -var part292 = // "Pattern{Field(fld10,true), Constant(' - End_time '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_2", "nwparser.p0", "%{fld10->} - End_time %{p0}"); +var part292 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/1_2", "nwparser.p0", "%{fld10->} - End_time %{p0}"); -var part293 = // "Pattern{Constant('" '), Field(fld11,true), Constant(' GMT" - Duration '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_0", "nwparser.p0", "\" %{fld11->} GMT\" - Duration %{p0}"); +var part293 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_0", "nwparser.p0", "\" %{fld11->} GMT\" - Duration %{p0}"); -var part294 = // "Pattern{Constant('" '), Field(fld11,false), Constant('" - Duration '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_1", "nwparser.p0", "\" %{fld11}\" - Duration %{p0}"); +var part294 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_1", "nwparser.p0", "\" %{fld11}\" - Duration %{p0}"); -var part295 = // "Pattern{Field(fld11,true), Constant(' - Duration '), Field(p0,false)}" -match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_2", "nwparser.p0", "%{fld11->} - Duration %{p0}"); +var part295 = match("MESSAGE#93:SSLVPN_ICAEND_CONNSTAT/2_2", "nwparser.p0", "%{fld11->} - Duration %{p0}"); -var part296 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - SessionId: '), Field(sessionid,false), Constant('- User '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/1_0", "nwparser.p0", "Context %{fld1->} - SessionId: %{sessionid}- User %{p0}"); +var part296 = match("MESSAGE#94:SSLVPN_LOGIN/1_0", "nwparser.p0", "Context %{fld1->} - SessionId: %{sessionid}- User %{p0}"); -var part297 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - User '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/1_1", "nwparser.p0", "Context %{fld1->} - User %{p0}"); +var part297 = match("MESSAGE#94:SSLVPN_LOGIN/1_1", "nwparser.p0", "Context %{fld1->} - User %{p0}"); -var part298 = // "Pattern{Constant('User '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/1_2", "nwparser.p0", "User %{p0}"); +var part298 = match("MESSAGE#94:SSLVPN_LOGIN/1_2", "nwparser.p0", "User %{p0}"); -var part299 = // "Pattern{Field(,true), Constant(' '), Field(username,false), Constant('- Client_ip '), Field(saddr,true), Constant(' - Nat_ip '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/2", "nwparser.p0", "%{} %{username}- Client_ip %{saddr->} - Nat_ip %{p0}"); +var part299 = match("MESSAGE#94:SSLVPN_LOGIN/2", "nwparser.p0", "%{} %{username}- Client_ip %{saddr->} - Nat_ip %{p0}"); -var part300 = // "Pattern{Constant('"'), Field(stransaddr,false), Constant('" - Vserver '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/3_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver %{p0}"); +var part300 = match("MESSAGE#94:SSLVPN_LOGIN/3_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver %{p0}"); -var part301 = // "Pattern{Field(stransaddr,true), Constant(' - Vserver '), Field(p0,false)}" -match("MESSAGE#94:SSLVPN_LOGIN/3_1", "nwparser.p0", "%{stransaddr->} - Vserver %{p0}"); +var part301 = match("MESSAGE#94:SSLVPN_LOGIN/3_1", "nwparser.p0", "%{stransaddr->} - Vserver %{p0}"); -var part302 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Start_time '), Field(p0,false)}" -match("MESSAGE#95:SSLVPN_LOGOUT/4", "nwparser.p0", "%{daddr}:%{dport->} - Start_time %{p0}"); +var part302 = match("MESSAGE#95:SSLVPN_LOGOUT/4", "nwparser.p0", "%{daddr}:%{dport->} - Start_time %{p0}"); -var part303 = // "Pattern{Constant('Context '), Field(fld1,true), Constant(' - SessionId: '), Field(sessionid,false), Constant('- User '), Field(username,true), Constant(' - Client_ip '), Field(hostip,true), Constant(' - Nat_ip '), Field(p0,false)}" -match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/0", "nwparser.payload", "Context %{fld1->} - SessionId: %{sessionid}- User %{username->} - Client_ip %{hostip->} - Nat_ip %{p0}"); +var part303 = match("MESSAGE#97:SSLVPN_UDPFLOWSTAT/0", "nwparser.payload", "Context %{fld1->} - SessionId: %{sessionid}- User %{username->} - Client_ip %{hostip->} - Nat_ip %{p0}"); -var part304 = // "Pattern{Field(,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#100:SSLVPN_Message/0", "nwparser.payload", "%{}\"%{p0}"); +var part304 = match("MESSAGE#100:SSLVPN_Message/0", "nwparser.payload", "%{}\"%{p0}"); -var part305 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Vserver '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - NatIP '), Field(stransaddr,false), Constant(':'), Field(stransport,true), Constant(' - Destination '), Field(dtransaddr,false), Constant(':'), Field(dtransport,true), Constant(' - Delink Time '), Field(p0,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Vserver %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Delink Time %{p0}"); +var part305 = match("MESSAGE#102:TCP_CONN_DELINK/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Vserver %{daddr}:%{dport->} - NatIP %{stransaddr}:%{stransport->} - Destination %{dtransaddr}:%{dtransport->} - Delink Time %{p0}"); -var part306 = // "Pattern{Field(fld11,true), Constant(' GMT - Total_bytes_send '), Field(p0,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/1_0", "nwparser.p0", "%{fld11->} GMT - Total_bytes_send %{p0}"); +var part306 = match("MESSAGE#102:TCP_CONN_DELINK/1_0", "nwparser.p0", "%{fld11->} GMT - Total_bytes_send %{p0}"); -var part307 = // "Pattern{Field(fld11,true), Constant(' - Total_bytes_send '), Field(p0,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/1_1", "nwparser.p0", "%{fld11->} - Total_bytes_send %{p0}"); +var part307 = match("MESSAGE#102:TCP_CONN_DELINK/1_1", "nwparser.p0", "%{fld11->} - Total_bytes_send %{p0}"); -var part308 = // "Pattern{Field(sbytes,true), Constant(' - Total_bytes_recv '), Field(rbytes,false)}" -match("MESSAGE#102:TCP_CONN_DELINK/2", "nwparser.p0", "%{sbytes->} - Total_bytes_recv %{rbytes}"); +var part308 = match("MESSAGE#102:TCP_CONN_DELINK/2", "nwparser.p0", "%{sbytes->} - Total_bytes_recv %{rbytes}"); -var part309 = // "Pattern{Constant('Source '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' - Destination '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' - Start Time '), Field(p0,false)}" -match("MESSAGE#103:TCP_CONN_TERMINATE/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{daddr}:%{dport->} - Start Time %{p0}"); +var part309 = match("MESSAGE#103:TCP_CONN_TERMINATE/0", "nwparser.payload", "Source %{saddr}:%{sport->} - Destination %{daddr}:%{dport->} - Start Time %{p0}"); -var part310 = // "Pattern{Field(fld10,true), Constant(' GMT - End Time '), Field(p0,false)}" -match("MESSAGE#103:TCP_CONN_TERMINATE/1_0", "nwparser.p0", "%{fld10->} GMT - End Time %{p0}"); +var part310 = match("MESSAGE#103:TCP_CONN_TERMINATE/1_0", "nwparser.p0", "%{fld10->} GMT - End Time %{p0}"); -var part311 = // "Pattern{Field(fld10,true), Constant(' - End Time '), Field(p0,false)}" -match("MESSAGE#103:TCP_CONN_TERMINATE/1_1", "nwparser.p0", "%{fld10->} - End Time %{p0}"); +var part311 = match("MESSAGE#103:TCP_CONN_TERMINATE/1_1", "nwparser.p0", "%{fld10->} - End Time %{p0}"); -var part312 = // "Pattern{Field(info,true), Constant(' "')}" -match("MESSAGE#113:CLUSTERD_Message:02/1_1", "nwparser.p0", "%{info->} \""); +var part312 = match("MESSAGE#113:CLUSTERD_Message:02/1_1", "nwparser.p0", "%{info->} \""); -var part313 = // "Pattern{Constant('"'), Field(event_type,false), Constant(': '), Field(p0,false)}" -match("MESSAGE#158:AAA_Message/0", "nwparser.payload", "\"%{event_type}: %{p0}"); +var part313 = match("MESSAGE#158:AAA_Message/0", "nwparser.payload", "\"%{event_type}: %{p0}"); -var part314 = // "Pattern{Constant('Sessionid '), Field(sessionid,true), Constant(' - User '), Field(username,true), Constant(' - Client_ip '), Field(saddr,true), Constant(' - Nat_ip '), Field(p0,false)}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/0", "nwparser.payload", "Sessionid %{sessionid->} - User %{username->} - Client_ip %{saddr->} - Nat_ip %{p0}"); +var part314 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/0", "nwparser.payload", "Sessionid %{sessionid->} - User %{username->} - Client_ip %{saddr->} - Nat_ip %{p0}"); -var part315 = // "Pattern{Constant('"'), Field(stransaddr,false), Constant('" - Vserver_ip '), Field(p0,false)}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver_ip %{p0}"); +var part315 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_0", "nwparser.p0", "\"%{stransaddr}\" - Vserver_ip %{p0}"); -var part316 = // "Pattern{Field(stransaddr,true), Constant(' - Vserver_ip '), Field(p0,false)}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_1", "nwparser.p0", "%{stransaddr->} - Vserver_ip %{p0}"); +var part316 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/1_1", "nwparser.p0", "%{stransaddr->} - Vserver_ip %{p0}"); -var part317 = // "Pattern{Field(daddr,true), Constant(' - Errmsg " '), Field(event_description,true), Constant(' "')}" -match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/2", "nwparser.p0", "%{daddr->} - Errmsg \" %{event_description->} \""); +var part317 = match("MESSAGE#167:SSLVPN_REMOVE_SESSION_ERR/2", "nwparser.p0", "%{daddr->} - Errmsg \" %{event_description->} \""); var select72 = linear_select([ dup21, @@ -3881,8 +3506,7 @@ var select74 = linear_select([ dup33, ]); -var part318 = // "Pattern{Field(fld1,false), Constant(':UserLogin:'), Field(username,true), Constant(' - '), Field(event_description,true), Constant(' from client IP Address '), Field(saddr,false)}" -match("MESSAGE#84:SNMP_TRAP_SENT:05", "nwparser.payload", "%{fld1}:UserLogin:%{username->} - %{event_description->} from client IP Address %{saddr}", processor_chain([ +var part318 = match("MESSAGE#84:SNMP_TRAP_SENT:05", "nwparser.payload", "%{fld1}:UserLogin:%{username->} - %{event_description->} from client IP Address %{saddr}", processor_chain([ dup5, dup4, ])); @@ -3920,28 +3544,24 @@ var select80 = linear_select([ dup82, ]); -var part319 = // "Pattern{Constant('User '), Field(username,true), Constant(' - Remote_ip '), Field(saddr,true), Constant(' - Command "'), Field(action,false), Constant('" - Status "'), Field(disposition,false), Constant('"')}" -match("MESSAGE#109:UI_CMD_EXECUTED", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" - Status \"%{disposition}\"", processor_chain([ +var part319 = match("MESSAGE#109:UI_CMD_EXECUTED", "nwparser.payload", "User %{username->} - Remote_ip %{saddr->} - Command \"%{action}\" - Status \"%{disposition}\"", processor_chain([ dup88, dup89, dup3, dup4, ])); -var part320 = // "Pattern{Field(product,false), Constant('|'), Field(version,false), Constant('|'), Field(rule,false), Constant('|'), Field(fld1,false), Constant('|'), Field(severity,false), Constant('|src='), Field(saddr,true), Constant(' spt='), Field(sport,true), Constant(' method='), Field(web_method,true), Constant(' request='), Field(url,true), Constant(' msg='), Field(info,true), Constant(' cn1='), Field(fld2,true), Constant(' cn2='), Field(fld3,true), Constant(' cs1='), Field(policyname,true), Constant(' cs2='), Field(fld5,true), Constant(' cs3='), Field(fld6,true), Constant(' cs4='), Field(severity,true), Constant(' cs5='), Field(fld8,true), Constant(' act='), Field(action,false)}" -match("MESSAGE#122:APPFW_COOKIE", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs3=%{fld6->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ +var part320 = match("MESSAGE#122:APPFW_COOKIE", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs3=%{fld6->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ dup9, dup91, ])); -var part321 = // "Pattern{Field(product,false), Constant('|'), Field(version,false), Constant('|'), Field(rule,false), Constant('|'), Field(fld1,false), Constant('|'), Field(severity,false), Constant('|src='), Field(saddr,true), Constant(' spt='), Field(sport,true), Constant(' method='), Field(web_method,true), Constant(' request='), Field(url,true), Constant(' msg='), Field(info,true), Constant(' cn1='), Field(fld2,true), Constant(' cn2='), Field(fld3,true), Constant(' cs1='), Field(policyname,true), Constant(' cs2='), Field(fld5,true), Constant(' cs4='), Field(severity,true), Constant(' cs5='), Field(fld8,true), Constant(' act='), Field(action,false)}" -match("MESSAGE#128:AF_400_RESP", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ +var part321 = match("MESSAGE#128:AF_400_RESP", "nwparser.payload", "%{product}|%{version}|%{rule}|%{fld1}|%{severity}|src=%{saddr->} spt=%{sport->} method=%{web_method->} request=%{url->} msg=%{info->} cn1=%{fld2->} cn2=%{fld3->} cs1=%{policyname->} cs2=%{fld5->} cs4=%{severity->} cs5=%{fld8->} act=%{action}", processor_chain([ dup11, dup91, ])); -var part322 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#165:AAATM_Message:06", "nwparser.payload", "info", processor_chain([ +var part322 = match_copy("MESSAGE#165:AAATM_Message:06", "nwparser.payload", "info", processor_chain([ dup9, dup4, ])); diff --git a/x-pack/filebeat/module/cyberark/corepas/config/pipeline.js b/x-pack/filebeat/module/cyberark/corepas/config/pipeline.js index 02a511984c0..0f8be954311 100644 --- a/x-pack/filebeat/module/cyberark/corepas/config/pipeline.js +++ b/x-pack/filebeat/module/cyberark/corepas/config/pipeline.js @@ -93,146 +93,99 @@ var dup29 = setc("ec_activity","Disable"); var dup30 = setc("eventcategory","1401050200"); -var dup31 = // "Pattern{Constant('Version='), Field(p0,false)}" -match("MESSAGE#568:300:02/0", "nwparser.payload", "Version=%{p0}"); +var dup31 = match("MESSAGE#568:300:02/0", "nwparser.payload", "Version=%{p0}"); -var dup32 = // "Pattern{Constant('"'), Field(version,false), Constant('";Message='), Field(p0,false)}" -match("MESSAGE#568:300:02/1_0", "nwparser.p0", "\"%{version}\";Message=%{p0}"); +var dup32 = match("MESSAGE#568:300:02/1_0", "nwparser.p0", "\"%{version}\";Message=%{p0}"); -var dup33 = // "Pattern{Field(version,false), Constant(';Message='), Field(p0,false)}" -match("MESSAGE#568:300:02/1_1", "nwparser.p0", "%{version};Message=%{p0}"); +var dup33 = match("MESSAGE#568:300:02/1_1", "nwparser.p0", "%{version};Message=%{p0}"); -var dup34 = // "Pattern{Constant('"'), Field(action,false), Constant('";Issuer='), Field(p0,false)}" -match("MESSAGE#568:300:02/2_0", "nwparser.p0", "\"%{action}\";Issuer=%{p0}"); +var dup34 = match("MESSAGE#568:300:02/2_0", "nwparser.p0", "\"%{action}\";Issuer=%{p0}"); -var dup35 = // "Pattern{Field(action,false), Constant(';Issuer='), Field(p0,false)}" -match("MESSAGE#568:300:02/2_1", "nwparser.p0", "%{action};Issuer=%{p0}"); +var dup35 = match("MESSAGE#568:300:02/2_1", "nwparser.p0", "%{action};Issuer=%{p0}"); -var dup36 = // "Pattern{Constant('"'), Field(username,false), Constant('";Station='), Field(p0,false)}" -match("MESSAGE#568:300:02/3_0", "nwparser.p0", "\"%{username}\";Station=%{p0}"); +var dup36 = match("MESSAGE#568:300:02/3_0", "nwparser.p0", "\"%{username}\";Station=%{p0}"); -var dup37 = // "Pattern{Field(username,false), Constant(';Station='), Field(p0,false)}" -match("MESSAGE#568:300:02/3_1", "nwparser.p0", "%{username};Station=%{p0}"); +var dup37 = match("MESSAGE#568:300:02/3_1", "nwparser.p0", "%{username};Station=%{p0}"); -var dup38 = // "Pattern{Constant('"'), Field(hostip,false), Constant('";File='), Field(p0,false)}" -match("MESSAGE#568:300:02/4_0", "nwparser.p0", "\"%{hostip}\";File=%{p0}"); +var dup38 = match("MESSAGE#568:300:02/4_0", "nwparser.p0", "\"%{hostip}\";File=%{p0}"); -var dup39 = // "Pattern{Field(hostip,false), Constant(';File='), Field(p0,false)}" -match("MESSAGE#568:300:02/4_1", "nwparser.p0", "%{hostip};File=%{p0}"); +var dup39 = match("MESSAGE#568:300:02/4_1", "nwparser.p0", "%{hostip};File=%{p0}"); -var dup40 = // "Pattern{Constant('"'), Field(filename,false), Constant('";Safe='), Field(p0,false)}" -match("MESSAGE#568:300:02/5_0", "nwparser.p0", "\"%{filename}\";Safe=%{p0}"); +var dup40 = match("MESSAGE#568:300:02/5_0", "nwparser.p0", "\"%{filename}\";Safe=%{p0}"); -var dup41 = // "Pattern{Field(filename,false), Constant(';Safe='), Field(p0,false)}" -match("MESSAGE#568:300:02/5_1", "nwparser.p0", "%{filename};Safe=%{p0}"); +var dup41 = match("MESSAGE#568:300:02/5_1", "nwparser.p0", "%{filename};Safe=%{p0}"); -var dup42 = // "Pattern{Constant('"'), Field(group_object,false), Constant('";Location='), Field(p0,false)}" -match("MESSAGE#568:300:02/6_0", "nwparser.p0", "\"%{group_object}\";Location=%{p0}"); +var dup42 = match("MESSAGE#568:300:02/6_0", "nwparser.p0", "\"%{group_object}\";Location=%{p0}"); -var dup43 = // "Pattern{Field(group_object,false), Constant(';Location='), Field(p0,false)}" -match("MESSAGE#568:300:02/6_1", "nwparser.p0", "%{group_object};Location=%{p0}"); +var dup43 = match("MESSAGE#568:300:02/6_1", "nwparser.p0", "%{group_object};Location=%{p0}"); -var dup44 = // "Pattern{Constant('"'), Field(directory,false), Constant('";Category='), Field(p0,false)}" -match("MESSAGE#568:300:02/7_0", "nwparser.p0", "\"%{directory}\";Category=%{p0}"); +var dup44 = match("MESSAGE#568:300:02/7_0", "nwparser.p0", "\"%{directory}\";Category=%{p0}"); -var dup45 = // "Pattern{Field(directory,false), Constant(';Category='), Field(p0,false)}" -match("MESSAGE#568:300:02/7_1", "nwparser.p0", "%{directory};Category=%{p0}"); +var dup45 = match("MESSAGE#568:300:02/7_1", "nwparser.p0", "%{directory};Category=%{p0}"); -var dup46 = // "Pattern{Constant('"'), Field(category,false), Constant('";RequestId='), Field(p0,false)}" -match("MESSAGE#568:300:02/8_0", "nwparser.p0", "\"%{category}\";RequestId=%{p0}"); +var dup46 = match("MESSAGE#568:300:02/8_0", "nwparser.p0", "\"%{category}\";RequestId=%{p0}"); -var dup47 = // "Pattern{Field(category,false), Constant(';RequestId='), Field(p0,false)}" -match("MESSAGE#568:300:02/8_1", "nwparser.p0", "%{category};RequestId=%{p0}"); +var dup47 = match("MESSAGE#568:300:02/8_1", "nwparser.p0", "%{category};RequestId=%{p0}"); -var dup48 = // "Pattern{Constant('"'), Field(id1,false), Constant('";Reason='), Field(p0,false)}" -match("MESSAGE#568:300:02/9_0", "nwparser.p0", "\"%{id1}\";Reason=%{p0}"); +var dup48 = match("MESSAGE#568:300:02/9_0", "nwparser.p0", "\"%{id1}\";Reason=%{p0}"); -var dup49 = // "Pattern{Field(id1,false), Constant(';Reason='), Field(p0,false)}" -match("MESSAGE#568:300:02/9_1", "nwparser.p0", "%{id1};Reason=%{p0}"); +var dup49 = match("MESSAGE#568:300:02/9_1", "nwparser.p0", "%{id1};Reason=%{p0}"); -var dup50 = // "Pattern{Constant('"'), Field(event_description,false), Constant('";Severity='), Field(p0,false)}" -match("MESSAGE#568:300:02/10_0", "nwparser.p0", "\"%{event_description}\";Severity=%{p0}"); +var dup50 = match("MESSAGE#568:300:02/10_0", "nwparser.p0", "\"%{event_description}\";Severity=%{p0}"); -var dup51 = // "Pattern{Field(event_description,false), Constant(';Severity='), Field(p0,false)}" -match("MESSAGE#568:300:02/10_1", "nwparser.p0", "%{event_description};Severity=%{p0}"); +var dup51 = match("MESSAGE#568:300:02/10_1", "nwparser.p0", "%{event_description};Severity=%{p0}"); -var dup52 = // "Pattern{Constant('"'), Field(severity,false), Constant('";SourceUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/11_0", "nwparser.p0", "\"%{severity}\";SourceUser=%{p0}"); +var dup52 = match("MESSAGE#568:300:02/11_0", "nwparser.p0", "\"%{severity}\";SourceUser=%{p0}"); -var dup53 = // "Pattern{Field(severity,false), Constant(';SourceUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/11_1", "nwparser.p0", "%{severity};SourceUser=%{p0}"); +var dup53 = match("MESSAGE#568:300:02/11_1", "nwparser.p0", "%{severity};SourceUser=%{p0}"); -var dup54 = // "Pattern{Constant('"'), Field(group,false), Constant('";TargetUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/12_0", "nwparser.p0", "\"%{group}\";TargetUser=%{p0}"); +var dup54 = match("MESSAGE#568:300:02/12_0", "nwparser.p0", "\"%{group}\";TargetUser=%{p0}"); -var dup55 = // "Pattern{Field(group,false), Constant(';TargetUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/12_1", "nwparser.p0", "%{group};TargetUser=%{p0}"); +var dup55 = match("MESSAGE#568:300:02/12_1", "nwparser.p0", "%{group};TargetUser=%{p0}"); -var dup56 = // "Pattern{Constant('"'), Field(uid,false), Constant('";GatewayStation='), Field(p0,false)}" -match("MESSAGE#568:300:02/13_0", "nwparser.p0", "\"%{uid}\";GatewayStation=%{p0}"); +var dup56 = match("MESSAGE#568:300:02/13_0", "nwparser.p0", "\"%{uid}\";GatewayStation=%{p0}"); -var dup57 = // "Pattern{Field(uid,false), Constant(';GatewayStation='), Field(p0,false)}" -match("MESSAGE#568:300:02/13_1", "nwparser.p0", "%{uid};GatewayStation=%{p0}"); +var dup57 = match("MESSAGE#568:300:02/13_1", "nwparser.p0", "%{uid};GatewayStation=%{p0}"); -var dup58 = // "Pattern{Constant('"'), Field(saddr,false), Constant('";TicketID='), Field(p0,false)}" -match("MESSAGE#568:300:02/14_0", "nwparser.p0", "\"%{saddr}\";TicketID=%{p0}"); +var dup58 = match("MESSAGE#568:300:02/14_0", "nwparser.p0", "\"%{saddr}\";TicketID=%{p0}"); -var dup59 = // "Pattern{Field(saddr,false), Constant(';TicketID='), Field(p0,false)}" -match("MESSAGE#568:300:02/14_1", "nwparser.p0", "%{saddr};TicketID=%{p0}"); +var dup59 = match("MESSAGE#568:300:02/14_1", "nwparser.p0", "%{saddr};TicketID=%{p0}"); -var dup60 = // "Pattern{Constant('"'), Field(operation_id,false), Constant('";PolicyID='), Field(p0,false)}" -match("MESSAGE#568:300:02/15_0", "nwparser.p0", "\"%{operation_id}\";PolicyID=%{p0}"); +var dup60 = match("MESSAGE#568:300:02/15_0", "nwparser.p0", "\"%{operation_id}\";PolicyID=%{p0}"); -var dup61 = // "Pattern{Field(operation_id,false), Constant(';PolicyID='), Field(p0,false)}" -match("MESSAGE#568:300:02/15_1", "nwparser.p0", "%{operation_id};PolicyID=%{p0}"); +var dup61 = match("MESSAGE#568:300:02/15_1", "nwparser.p0", "%{operation_id};PolicyID=%{p0}"); -var dup62 = // "Pattern{Constant('"'), Field(policyname,false), Constant('";UserName='), Field(p0,false)}" -match("MESSAGE#568:300:02/16_0", "nwparser.p0", "\"%{policyname}\";UserName=%{p0}"); +var dup62 = match("MESSAGE#568:300:02/16_0", "nwparser.p0", "\"%{policyname}\";UserName=%{p0}"); -var dup63 = // "Pattern{Field(policyname,false), Constant(';UserName='), Field(p0,false)}" -match("MESSAGE#568:300:02/16_1", "nwparser.p0", "%{policyname};UserName=%{p0}"); +var dup63 = match("MESSAGE#568:300:02/16_1", "nwparser.p0", "%{policyname};UserName=%{p0}"); -var dup64 = // "Pattern{Constant('"'), Field(fld11,false), Constant('";LogonDomain='), Field(p0,false)}" -match("MESSAGE#568:300:02/17_0", "nwparser.p0", "\"%{fld11}\";LogonDomain=%{p0}"); +var dup64 = match("MESSAGE#568:300:02/17_0", "nwparser.p0", "\"%{fld11}\";LogonDomain=%{p0}"); -var dup65 = // "Pattern{Field(fld11,false), Constant(';LogonDomain='), Field(p0,false)}" -match("MESSAGE#568:300:02/17_1", "nwparser.p0", "%{fld11};LogonDomain=%{p0}"); +var dup65 = match("MESSAGE#568:300:02/17_1", "nwparser.p0", "%{fld11};LogonDomain=%{p0}"); -var dup66 = // "Pattern{Constant('"'), Field(domain,false), Constant('";Address='), Field(p0,false)}" -match("MESSAGE#568:300:02/18_0", "nwparser.p0", "\"%{domain}\";Address=%{p0}"); +var dup66 = match("MESSAGE#568:300:02/18_0", "nwparser.p0", "\"%{domain}\";Address=%{p0}"); -var dup67 = // "Pattern{Field(domain,false), Constant(';Address='), Field(p0,false)}" -match("MESSAGE#568:300:02/18_1", "nwparser.p0", "%{domain};Address=%{p0}"); +var dup67 = match("MESSAGE#568:300:02/18_1", "nwparser.p0", "%{domain};Address=%{p0}"); -var dup68 = // "Pattern{Constant('"'), Field(fld14,false), Constant('";CPMStatus='), Field(p0,false)}" -match("MESSAGE#568:300:02/19_0", "nwparser.p0", "\"%{fld14}\";CPMStatus=%{p0}"); +var dup68 = match("MESSAGE#568:300:02/19_0", "nwparser.p0", "\"%{fld14}\";CPMStatus=%{p0}"); -var dup69 = // "Pattern{Field(fld14,false), Constant(';CPMStatus='), Field(p0,false)}" -match("MESSAGE#568:300:02/19_1", "nwparser.p0", "%{fld14};CPMStatus=%{p0}"); +var dup69 = match("MESSAGE#568:300:02/19_1", "nwparser.p0", "%{fld14};CPMStatus=%{p0}"); -var dup70 = // "Pattern{Constant('"'), Field(disposition,false), Constant('";Port='), Field(p0,false)}" -match("MESSAGE#568:300:02/20_0", "nwparser.p0", "\"%{disposition}\";Port=%{p0}"); +var dup70 = match("MESSAGE#568:300:02/20_0", "nwparser.p0", "\"%{disposition}\";Port=%{p0}"); -var dup71 = // "Pattern{Field(disposition,false), Constant(';Port='), Field(p0,false)}" -match("MESSAGE#568:300:02/20_1", "nwparser.p0", "%{disposition};Port=%{p0}"); +var dup71 = match("MESSAGE#568:300:02/20_1", "nwparser.p0", "%{disposition};Port=%{p0}"); -var dup72 = // "Pattern{Constant('"'), Field(dport,false), Constant('";Database='), Field(p0,false)}" -match("MESSAGE#568:300:02/21_0", "nwparser.p0", "\"%{dport}\";Database=%{p0}"); +var dup72 = match("MESSAGE#568:300:02/21_0", "nwparser.p0", "\"%{dport}\";Database=%{p0}"); -var dup73 = // "Pattern{Field(dport,false), Constant(';Database='), Field(p0,false)}" -match("MESSAGE#568:300:02/21_1", "nwparser.p0", "%{dport};Database=%{p0}"); +var dup73 = match("MESSAGE#568:300:02/21_1", "nwparser.p0", "%{dport};Database=%{p0}"); -var dup74 = // "Pattern{Constant('"'), Field(db_name,false), Constant('";DeviceType='), Field(p0,false)}" -match("MESSAGE#568:300:02/22_0", "nwparser.p0", "\"%{db_name}\";DeviceType=%{p0}"); +var dup74 = match("MESSAGE#568:300:02/22_0", "nwparser.p0", "\"%{db_name}\";DeviceType=%{p0}"); -var dup75 = // "Pattern{Field(db_name,false), Constant(';DeviceType='), Field(p0,false)}" -match("MESSAGE#568:300:02/22_1", "nwparser.p0", "%{db_name};DeviceType=%{p0}"); +var dup75 = match("MESSAGE#568:300:02/22_1", "nwparser.p0", "%{db_name};DeviceType=%{p0}"); -var dup76 = // "Pattern{Constant('"'), Field(obj_type,false), Constant('";ExtraDetails="ApplicationType='), Field(p0,false)}" -match("MESSAGE#568:300:02/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"ApplicationType=%{p0}"); +var dup76 = match("MESSAGE#568:300:02/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"ApplicationType=%{p0}"); -var dup77 = // "Pattern{Field(obj_type,false), Constant(';ExtraDetails="ApplicationType='), Field(p0,false)}" -match("MESSAGE#568:300:02/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"ApplicationType=%{p0}"); +var dup77 = match("MESSAGE#568:300:02/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"ApplicationType=%{p0}"); var dup78 = setc("eventcategory","1502000000"); @@ -248,203 +201,137 @@ var dup83 = setc("eventcategory","1501000000"); var dup84 = setc("eventcategory","1206000000"); -var dup85 = // "Pattern{Constant('"'), Field(version,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/1_0", "nwparser.p0", "\"%{version}\";%{p0}"); +var dup85 = match("MESSAGE#621:411/1_0", "nwparser.p0", "\"%{version}\";%{p0}"); -var dup86 = // "Pattern{Field(version,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/1_1", "nwparser.p0", "%{version};%{p0}"); +var dup86 = match("MESSAGE#621:411/1_1", "nwparser.p0", "%{version};%{p0}"); -var dup87 = // "Pattern{Constant('Message='), Field(p0,false)}" -match("MESSAGE#621:411/2", "nwparser.p0", "Message=%{p0}"); +var dup87 = match("MESSAGE#621:411/2", "nwparser.p0", "Message=%{p0}"); -var dup88 = // "Pattern{Constant('"'), Field(action,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/3_0", "nwparser.p0", "\"%{action}\";%{p0}"); +var dup88 = match("MESSAGE#621:411/3_0", "nwparser.p0", "\"%{action}\";%{p0}"); -var dup89 = // "Pattern{Field(action,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/3_1", "nwparser.p0", "%{action};%{p0}"); +var dup89 = match("MESSAGE#621:411/3_1", "nwparser.p0", "%{action};%{p0}"); -var dup90 = // "Pattern{Constant('Issuer='), Field(p0,false)}" -match("MESSAGE#621:411/4", "nwparser.p0", "Issuer=%{p0}"); +var dup90 = match("MESSAGE#621:411/4", "nwparser.p0", "Issuer=%{p0}"); -var dup91 = // "Pattern{Constant('"'), Field(username,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/5_0", "nwparser.p0", "\"%{username}\";%{p0}"); +var dup91 = match("MESSAGE#621:411/5_0", "nwparser.p0", "\"%{username}\";%{p0}"); -var dup92 = // "Pattern{Field(username,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/5_1", "nwparser.p0", "%{username};%{p0}"); +var dup92 = match("MESSAGE#621:411/5_1", "nwparser.p0", "%{username};%{p0}"); -var dup93 = // "Pattern{Constant('Station='), Field(p0,false)}" -match("MESSAGE#621:411/6", "nwparser.p0", "Station=%{p0}"); +var dup93 = match("MESSAGE#621:411/6", "nwparser.p0", "Station=%{p0}"); -var dup94 = // "Pattern{Constant('"'), Field(hostip,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/7_0", "nwparser.p0", "\"%{hostip}\";%{p0}"); +var dup94 = match("MESSAGE#621:411/7_0", "nwparser.p0", "\"%{hostip}\";%{p0}"); -var dup95 = // "Pattern{Field(hostip,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/7_1", "nwparser.p0", "%{hostip};%{p0}"); +var dup95 = match("MESSAGE#621:411/7_1", "nwparser.p0", "%{hostip};%{p0}"); -var dup96 = // "Pattern{Constant('File='), Field(p0,false)}" -match("MESSAGE#621:411/8", "nwparser.p0", "File=%{p0}"); +var dup96 = match("MESSAGE#621:411/8", "nwparser.p0", "File=%{p0}"); -var dup97 = // "Pattern{Constant('"'), Field(filename,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/9_0", "nwparser.p0", "\"%{filename}\";%{p0}"); +var dup97 = match("MESSAGE#621:411/9_0", "nwparser.p0", "\"%{filename}\";%{p0}"); -var dup98 = // "Pattern{Field(filename,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/9_1", "nwparser.p0", "%{filename};%{p0}"); +var dup98 = match("MESSAGE#621:411/9_1", "nwparser.p0", "%{filename};%{p0}"); -var dup99 = // "Pattern{Constant('Safe='), Field(p0,false)}" -match("MESSAGE#621:411/10", "nwparser.p0", "Safe=%{p0}"); +var dup99 = match("MESSAGE#621:411/10", "nwparser.p0", "Safe=%{p0}"); -var dup100 = // "Pattern{Constant('"'), Field(group_object,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/11_0", "nwparser.p0", "\"%{group_object}\";%{p0}"); +var dup100 = match("MESSAGE#621:411/11_0", "nwparser.p0", "\"%{group_object}\";%{p0}"); -var dup101 = // "Pattern{Field(group_object,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/11_1", "nwparser.p0", "%{group_object};%{p0}"); +var dup101 = match("MESSAGE#621:411/11_1", "nwparser.p0", "%{group_object};%{p0}"); -var dup102 = // "Pattern{Constant('Location='), Field(p0,false)}" -match("MESSAGE#621:411/12", "nwparser.p0", "Location=%{p0}"); +var dup102 = match("MESSAGE#621:411/12", "nwparser.p0", "Location=%{p0}"); -var dup103 = // "Pattern{Constant('"'), Field(directory,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/13_0", "nwparser.p0", "\"%{directory}\";%{p0}"); +var dup103 = match("MESSAGE#621:411/13_0", "nwparser.p0", "\"%{directory}\";%{p0}"); -var dup104 = // "Pattern{Field(directory,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/13_1", "nwparser.p0", "%{directory};%{p0}"); +var dup104 = match("MESSAGE#621:411/13_1", "nwparser.p0", "%{directory};%{p0}"); -var dup105 = // "Pattern{Constant('Category='), Field(p0,false)}" -match("MESSAGE#621:411/14", "nwparser.p0", "Category=%{p0}"); +var dup105 = match("MESSAGE#621:411/14", "nwparser.p0", "Category=%{p0}"); -var dup106 = // "Pattern{Constant('"'), Field(category,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/15_0", "nwparser.p0", "\"%{category}\";%{p0}"); +var dup106 = match("MESSAGE#621:411/15_0", "nwparser.p0", "\"%{category}\";%{p0}"); -var dup107 = // "Pattern{Field(category,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/15_1", "nwparser.p0", "%{category};%{p0}"); +var dup107 = match("MESSAGE#621:411/15_1", "nwparser.p0", "%{category};%{p0}"); -var dup108 = // "Pattern{Constant('RequestId='), Field(p0,false)}" -match("MESSAGE#621:411/16", "nwparser.p0", "RequestId=%{p0}"); +var dup108 = match("MESSAGE#621:411/16", "nwparser.p0", "RequestId=%{p0}"); -var dup109 = // "Pattern{Constant('"'), Field(id1,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/17_0", "nwparser.p0", "\"%{id1}\";%{p0}"); +var dup109 = match("MESSAGE#621:411/17_0", "nwparser.p0", "\"%{id1}\";%{p0}"); -var dup110 = // "Pattern{Field(id1,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/17_1", "nwparser.p0", "%{id1};%{p0}"); +var dup110 = match("MESSAGE#621:411/17_1", "nwparser.p0", "%{id1};%{p0}"); -var dup111 = // "Pattern{Constant('Reason='), Field(p0,false)}" -match("MESSAGE#621:411/18", "nwparser.p0", "Reason=%{p0}"); +var dup111 = match("MESSAGE#621:411/18", "nwparser.p0", "Reason=%{p0}"); -var dup112 = // "Pattern{Constant('"'), Field(event_description,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/19_0", "nwparser.p0", "\"%{event_description}\";%{p0}"); +var dup112 = match("MESSAGE#621:411/19_0", "nwparser.p0", "\"%{event_description}\";%{p0}"); -var dup113 = // "Pattern{Field(event_description,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/19_1", "nwparser.p0", "%{event_description};%{p0}"); +var dup113 = match("MESSAGE#621:411/19_1", "nwparser.p0", "%{event_description};%{p0}"); -var dup114 = // "Pattern{Constant('Severity='), Field(p0,false)}" -match("MESSAGE#621:411/20", "nwparser.p0", "Severity=%{p0}"); +var dup114 = match("MESSAGE#621:411/20", "nwparser.p0", "Severity=%{p0}"); -var dup115 = // "Pattern{Constant('"'), Field(severity,false), Constant('";SourceUser="'), Field(group,false), Constant('";TargetUser="'), Field(uid,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/21_0", "nwparser.p0", "\"%{severity}\";SourceUser=\"%{group}\";TargetUser=\"%{uid}\";%{p0}"); +var dup115 = match("MESSAGE#621:411/21_0", "nwparser.p0", "\"%{severity}\";SourceUser=\"%{group}\";TargetUser=\"%{uid}\";%{p0}"); -var dup116 = // "Pattern{Field(severity,false), Constant(';SourceUser='), Field(group,false), Constant(';TargetUser='), Field(uid,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/21_1", "nwparser.p0", "%{severity};SourceUser=%{group};TargetUser=%{uid};%{p0}"); +var dup116 = match("MESSAGE#621:411/21_1", "nwparser.p0", "%{severity};SourceUser=%{group};TargetUser=%{uid};%{p0}"); -var dup117 = // "Pattern{Constant('"'), Field(severity,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/21_2", "nwparser.p0", "\"%{severity}\";%{p0}"); +var dup117 = match("MESSAGE#621:411/21_2", "nwparser.p0", "\"%{severity}\";%{p0}"); -var dup118 = // "Pattern{Field(severity,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/21_3", "nwparser.p0", "%{severity};%{p0}"); +var dup118 = match("MESSAGE#621:411/21_3", "nwparser.p0", "%{severity};%{p0}"); -var dup119 = // "Pattern{Constant('GatewayStation='), Field(p0,false)}" -match("MESSAGE#621:411/22", "nwparser.p0", "GatewayStation=%{p0}"); +var dup119 = match("MESSAGE#621:411/22", "nwparser.p0", "GatewayStation=%{p0}"); -var dup120 = // "Pattern{Constant('"'), Field(saddr,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/23_0", "nwparser.p0", "\"%{saddr}\";%{p0}"); +var dup120 = match("MESSAGE#621:411/23_0", "nwparser.p0", "\"%{saddr}\";%{p0}"); -var dup121 = // "Pattern{Field(saddr,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/23_1", "nwparser.p0", "%{saddr};%{p0}"); +var dup121 = match("MESSAGE#621:411/23_1", "nwparser.p0", "%{saddr};%{p0}"); -var dup122 = // "Pattern{Constant('TicketID='), Field(p0,false)}" -match("MESSAGE#621:411/24", "nwparser.p0", "TicketID=%{p0}"); +var dup122 = match("MESSAGE#621:411/24", "nwparser.p0", "TicketID=%{p0}"); -var dup123 = // "Pattern{Constant('"'), Field(operation_id,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/25_0", "nwparser.p0", "\"%{operation_id}\";%{p0}"); +var dup123 = match("MESSAGE#621:411/25_0", "nwparser.p0", "\"%{operation_id}\";%{p0}"); -var dup124 = // "Pattern{Field(operation_id,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/25_1", "nwparser.p0", "%{operation_id};%{p0}"); +var dup124 = match("MESSAGE#621:411/25_1", "nwparser.p0", "%{operation_id};%{p0}"); -var dup125 = // "Pattern{Constant('PolicyID='), Field(p0,false)}" -match("MESSAGE#621:411/26", "nwparser.p0", "PolicyID=%{p0}"); +var dup125 = match("MESSAGE#621:411/26", "nwparser.p0", "PolicyID=%{p0}"); -var dup126 = // "Pattern{Constant('"'), Field(policyname,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/27_0", "nwparser.p0", "\"%{policyname}\";%{p0}"); +var dup126 = match("MESSAGE#621:411/27_0", "nwparser.p0", "\"%{policyname}\";%{p0}"); -var dup127 = // "Pattern{Field(policyname,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/27_1", "nwparser.p0", "%{policyname};%{p0}"); +var dup127 = match("MESSAGE#621:411/27_1", "nwparser.p0", "%{policyname};%{p0}"); -var dup128 = // "Pattern{Constant('UserName='), Field(p0,false)}" -match("MESSAGE#621:411/28", "nwparser.p0", "UserName=%{p0}"); +var dup128 = match("MESSAGE#621:411/28", "nwparser.p0", "UserName=%{p0}"); -var dup129 = // "Pattern{Constant('"'), Field(c_username,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/29_0", "nwparser.p0", "\"%{c_username}\";%{p0}"); +var dup129 = match("MESSAGE#621:411/29_0", "nwparser.p0", "\"%{c_username}\";%{p0}"); -var dup130 = // "Pattern{Field(c_username,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/29_1", "nwparser.p0", "%{c_username};%{p0}"); +var dup130 = match("MESSAGE#621:411/29_1", "nwparser.p0", "%{c_username};%{p0}"); -var dup131 = // "Pattern{Constant('LogonDomain='), Field(p0,false)}" -match("MESSAGE#621:411/30", "nwparser.p0", "LogonDomain=%{p0}"); +var dup131 = match("MESSAGE#621:411/30", "nwparser.p0", "LogonDomain=%{p0}"); -var dup132 = // "Pattern{Constant('"'), Field(domain,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/31_0", "nwparser.p0", "\"%{domain}\";%{p0}"); +var dup132 = match("MESSAGE#621:411/31_0", "nwparser.p0", "\"%{domain}\";%{p0}"); -var dup133 = // "Pattern{Field(domain,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/31_1", "nwparser.p0", "%{domain};%{p0}"); +var dup133 = match("MESSAGE#621:411/31_1", "nwparser.p0", "%{domain};%{p0}"); -var dup134 = // "Pattern{Constant('Address='), Field(p0,false)}" -match("MESSAGE#621:411/32", "nwparser.p0", "Address=%{p0}"); +var dup134 = match("MESSAGE#621:411/32", "nwparser.p0", "Address=%{p0}"); -var dup135 = // "Pattern{Constant('"'), Field(dhost,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/33_0", "nwparser.p0", "\"%{dhost}\";%{p0}"); +var dup135 = match("MESSAGE#621:411/33_0", "nwparser.p0", "\"%{dhost}\";%{p0}"); -var dup136 = // "Pattern{Field(dhost,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/33_1", "nwparser.p0", "%{dhost};%{p0}"); +var dup136 = match("MESSAGE#621:411/33_1", "nwparser.p0", "%{dhost};%{p0}"); -var dup137 = // "Pattern{Constant('CPMStatus='), Field(p0,false)}" -match("MESSAGE#621:411/34", "nwparser.p0", "CPMStatus=%{p0}"); +var dup137 = match("MESSAGE#621:411/34", "nwparser.p0", "CPMStatus=%{p0}"); -var dup138 = // "Pattern{Constant('"'), Field(disposition,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/35_0", "nwparser.p0", "\"%{disposition}\";%{p0}"); +var dup138 = match("MESSAGE#621:411/35_0", "nwparser.p0", "\"%{disposition}\";%{p0}"); -var dup139 = // "Pattern{Field(disposition,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/35_1", "nwparser.p0", "%{disposition};%{p0}"); +var dup139 = match("MESSAGE#621:411/35_1", "nwparser.p0", "%{disposition};%{p0}"); -var dup140 = // "Pattern{Constant('Port='), Field(p0,false)}" -match("MESSAGE#621:411/36", "nwparser.p0", "Port=%{p0}"); +var dup140 = match("MESSAGE#621:411/36", "nwparser.p0", "Port=%{p0}"); -var dup141 = // "Pattern{Constant('"'), Field(dport,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/37_0", "nwparser.p0", "\"%{dport}\";%{p0}"); +var dup141 = match("MESSAGE#621:411/37_0", "nwparser.p0", "\"%{dport}\";%{p0}"); -var dup142 = // "Pattern{Field(dport,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/37_1", "nwparser.p0", "%{dport};%{p0}"); +var dup142 = match("MESSAGE#621:411/37_1", "nwparser.p0", "%{dport};%{p0}"); -var dup143 = // "Pattern{Constant('Database='), Field(p0,false)}" -match("MESSAGE#621:411/38", "nwparser.p0", "Database=%{p0}"); +var dup143 = match("MESSAGE#621:411/38", "nwparser.p0", "Database=%{p0}"); -var dup144 = // "Pattern{Constant('"'), Field(db_name,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/39_0", "nwparser.p0", "\"%{db_name}\";%{p0}"); +var dup144 = match("MESSAGE#621:411/39_0", "nwparser.p0", "\"%{db_name}\";%{p0}"); -var dup145 = // "Pattern{Field(db_name,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/39_1", "nwparser.p0", "%{db_name};%{p0}"); +var dup145 = match("MESSAGE#621:411/39_1", "nwparser.p0", "%{db_name};%{p0}"); -var dup146 = // "Pattern{Constant('DeviceType='), Field(p0,false)}" -match("MESSAGE#621:411/40", "nwparser.p0", "DeviceType=%{p0}"); +var dup146 = match("MESSAGE#621:411/40", "nwparser.p0", "DeviceType=%{p0}"); -var dup147 = // "Pattern{Constant('"'), Field(obj_type,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/41_0", "nwparser.p0", "\"%{obj_type}\";%{p0}"); +var dup147 = match("MESSAGE#621:411/41_0", "nwparser.p0", "\"%{obj_type}\";%{p0}"); -var dup148 = // "Pattern{Field(obj_type,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/41_1", "nwparser.p0", "%{obj_type};%{p0}"); +var dup148 = match("MESSAGE#621:411/41_1", "nwparser.p0", "%{obj_type};%{p0}"); -var dup149 = // "Pattern{Constant('ExtraDetails='), Field(p0,false)}" -match("MESSAGE#621:411/42", "nwparser.p0", "ExtraDetails=%{p0}"); +var dup149 = match("MESSAGE#621:411/42", "nwparser.p0", "ExtraDetails=%{p0}"); -var dup150 = // "Pattern{Field(info,false), Constant(';')}" -match("MESSAGE#621:411/43_1", "nwparser.p0", "%{info};"); +var dup150 = match("MESSAGE#621:411/43_1", "nwparser.p0", "%{info};"); var dup151 = tagval("MESSAGE#0:1:01", "nwparser.payload", tvm, { "Address": "dhost", @@ -477,8 +364,7 @@ var dup151 = tagval("MESSAGE#0:1:01", "nwparser.payload", tvm, { dup3, ])); -var dup152 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#1:1", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup152 = match("MESSAGE#1:1", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup1, dup2, ])); @@ -514,8 +400,7 @@ var dup153 = tagval("MESSAGE#2:2:01", "nwparser.payload", tvm, { dup3, ])); -var dup154 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#3:2", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup154 = match("MESSAGE#3:2", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup4, dup2, ])); @@ -555,8 +440,7 @@ var dup155 = tagval("MESSAGE#6:4:01", "nwparser.payload", tvm, { dup3, ])); -var dup156 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#7:4", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup156 = match("MESSAGE#7:4", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup5, dup6, dup7, @@ -599,8 +483,7 @@ var dup157 = tagval("MESSAGE#20:13:01", "nwparser.payload", tvm, { dup3, ])); -var dup158 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#21:13", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup158 = match("MESSAGE#21:13", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup15, dup16, dup17, @@ -639,8 +522,7 @@ var dup159 = tagval("MESSAGE#26:16:01", "nwparser.payload", tvm, { dup3, ])); -var dup160 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#27:16", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup160 = match("MESSAGE#27:16", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup19, dup2, ])); @@ -676,8 +558,7 @@ var dup161 = tagval("MESSAGE#30:18:01", "nwparser.payload", tvm, { dup3, ])); -var dup162 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#31:18", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup162 = match("MESSAGE#31:18", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup15, dup2, ])); @@ -713,8 +594,7 @@ var dup163 = tagval("MESSAGE#38:22:01", "nwparser.payload", tvm, { dup3, ])); -var dup164 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#39:22", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup164 = match("MESSAGE#39:22", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup21, dup2, ])); @@ -750,8 +630,7 @@ var dup165 = tagval("MESSAGE#70:38:01", "nwparser.payload", tvm, { dup3, ])); -var dup166 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#71:38", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup166 = match("MESSAGE#71:38", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup23, dup2, ])); @@ -787,8 +666,7 @@ var dup167 = tagval("MESSAGE#116:61:01", "nwparser.payload", tvm, { dup3, ])); -var dup168 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#117:61", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup168 = match("MESSAGE#117:61", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup20, dup2, ])); @@ -824,8 +702,7 @@ var dup169 = tagval("MESSAGE#126:66:01", "nwparser.payload", tvm, { dup3, ])); -var dup170 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#127:66", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup170 = match("MESSAGE#127:66", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup26, dup2, ])); @@ -1011,8 +888,7 @@ var dup195 = tagval("MESSAGE#591:317:01", "nwparser.payload", tvm, { dup3, ])); -var dup196 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#592:317", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup196 = match("MESSAGE#592:317", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup79, dup80, dup81, @@ -1050,8 +926,7 @@ var dup197 = tagval("MESSAGE#595:355:01", "nwparser.payload", tvm, { dup3, ])); -var dup198 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#596:355", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup198 = match("MESSAGE#596:355", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup82, dup2, ])); @@ -1087,14 +962,12 @@ var dup199 = tagval("MESSAGE#599:357:01", "nwparser.payload", tvm, { dup3, ])); -var dup200 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#600:357", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var dup200 = match("MESSAGE#600:357", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup83, dup2, ])); -var dup201 = // "Pattern{Constant('Version='), Field(version,false), Constant(';Message='), Field(action,false), Constant(';Issuer='), Field(username,false), Constant(';Station='), Field(hostip,false), Constant(';File='), Field(filename,false), Constant(';Safe='), Field(group_object,false), Constant(';Location='), Field(directory,false), Constant(';Category='), Field(category,false), Constant(';RequestId='), Field(id1,false), Constant(';Reason='), Field(event_description,false), Constant(';Severity='), Field(severity,false), Constant(';GatewayStation='), Field(saddr,false), Constant(';TicketID='), Field(operation_id,false), Constant(';PolicyID='), Field(policyname,false), Constant(';UserName='), Field(c_username,false), Constant(';LogonDomain='), Field(domain,false), Constant(';Address='), Field(dhost,false), Constant(';CPMStatus='), Field(disposition,false), Constant(';Port="'), Field(dport,false), Constant('";Database='), Field(db_name,false), Constant(';DeviceType='), Field(obj_type,false), Constant(';ExtraDetails='), Field(info,false), Constant(';')}" -match("MESSAGE#617:372", "nwparser.payload", "Version=%{version};Message=%{action};Issuer=%{username};Station=%{hostip};File=%{filename};Safe=%{group_object};Location=%{directory};Category=%{category};RequestId=%{id1};Reason=%{event_description};Severity=%{severity};GatewayStation=%{saddr};TicketID=%{operation_id};PolicyID=%{policyname};UserName=%{c_username};LogonDomain=%{domain};Address=%{dhost};CPMStatus=%{disposition};Port=\"%{dport}\";Database=%{db_name};DeviceType=%{obj_type};ExtraDetails=%{info};", processor_chain([ +var dup201 = match("MESSAGE#617:372", "nwparser.payload", "Version=%{version};Message=%{action};Issuer=%{username};Station=%{hostip};File=%{filename};Safe=%{group_object};Location=%{directory};Category=%{category};RequestId=%{id1};Reason=%{event_description};Severity=%{severity};GatewayStation=%{saddr};TicketID=%{operation_id};PolicyID=%{policyname};UserName=%{c_username};LogonDomain=%{domain};Address=%{dhost};CPMStatus=%{disposition};Port=\"%{dport}\";Database=%{db_name};DeviceType=%{obj_type};ExtraDetails=%{info};", processor_chain([ dup4, dup2, dup3, @@ -1207,8 +1080,7 @@ var dup222 = linear_select([ dup148, ]); -var hdr1 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hproduct,true), Constant(' ProductName="'), Field(hdevice,false), Constant('",ProductAccount="'), Field(hfld1,false), Constant('",ProductProcess="'), Field(process,false), Constant('",EventId="'), Field(messageid,false), Constant('", '), Field(p0,false)}" -match("HEADER#0:0001", "message", "%{hmonth->} %{hday->} %{htime->} %{hproduct->} ProductName=\"%{hdevice}\",ProductAccount=\"%{hfld1}\",ProductProcess=\"%{process}\",EventId=\"%{messageid}\", %{p0}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "%{hmonth->} %{hday->} %{htime->} %{hproduct->} ProductName=\"%{hdevice}\",ProductAccount=\"%{hfld1}\",ProductProcess=\"%{process}\",EventId=\"%{messageid}\", %{p0}", processor_chain([ setc("header_id","0001"), call({ dest: "nwparser.payload", @@ -1227,8 +1099,7 @@ match("HEADER#0:0001", "message", "%{hmonth->} %{hday->} %{htime->} %{hproduct-> }), ])); -var hdr2 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hdatetime,true), Constant(' '), Field(hproduct,true), Constant(' ProductName="'), Field(hdevice,false), Constant('",ProductAccount="'), Field(hfld4,false), Constant('",ProductProcess="'), Field(process,false), Constant('",EventId="'), Field(messageid,false), Constant('", '), Field(p0,false)}" -match("HEADER#1:0005", "message", "%{hfld1->} %{hdatetime->} %{hproduct->} ProductName=\"%{hdevice}\",ProductAccount=\"%{hfld4}\",ProductProcess=\"%{process}\",EventId=\"%{messageid}\", %{p0}", processor_chain([ +var hdr2 = match("HEADER#1:0005", "message", "%{hfld1->} %{hdatetime->} %{hproduct->} ProductName=\"%{hdevice}\",ProductAccount=\"%{hfld4}\",ProductProcess=\"%{process}\",EventId=\"%{messageid}\", %{p0}", processor_chain([ setc("header_id","0005"), call({ dest: "nwparser.payload", @@ -1247,23 +1118,19 @@ match("HEADER#1:0005", "message", "%{hfld1->} %{hdatetime->} %{hproduct->} Produ }), ])); -var hdr3 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hproduct,true), Constant(' %CYBERARK: MessageID="'), Field(messageid,false), Constant('";'), Field(payload,false)}" -match("HEADER#2:0002", "message", "%{hmonth->} %{hday->} %{htime->} %{hproduct->} %CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ +var hdr3 = match("HEADER#2:0002", "message", "%{hmonth->} %{hday->} %{htime->} %{hproduct->} %CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ setc("header_id","0002"), ])); -var hdr4 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hdatetime,true), Constant(' '), Field(hostname,true), Constant(' %CYBERARK: MessageID="'), Field(messageid,false), Constant('";'), Field(payload,false)}" -match("HEADER#3:0003", "message", "%{hfld1->} %{hdatetime->} %{hostname->} %CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ +var hdr4 = match("HEADER#3:0003", "message", "%{hfld1->} %{hdatetime->} %{hostname->} %CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ setc("header_id","0003"), ])); -var hdr5 = // "Pattern{Constant('%CYBERARK: MessageID="'), Field(messageid,false), Constant('";'), Field(payload,false)}" -match("HEADER#4:0004", "message", "%CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ +var hdr5 = match("HEADER#4:0004", "message", "%CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ setc("header_id","0004"), ])); -var hdr6 = // "Pattern{Field(hdatetime,true), Constant(' '), Field(hostname,true), Constant(' %CYBERARK: MessageID="'), Field(messageid,false), Constant('";'), Field(payload,false)}" -match("HEADER#5:0006", "message", "%{hdatetime->} %{hostname->} %CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ +var hdr6 = match("HEADER#5:0006", "message", "%{hdatetime->} %{hostname->} %CYBERARK: MessageID=\"%{messageid}\";%{payload}", processor_chain([ setc("header_id","0006"), ])); @@ -1349,8 +1216,7 @@ var part1 = tagval("MESSAGE#8:7:01", "nwparser.payload", tvm, { var msg9 = msg("7:01", part1); -var part2 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#9:7", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part2 = match("MESSAGE#9:7", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup10, dup6, dup7, @@ -1403,8 +1269,7 @@ var part3 = tagval("MESSAGE#10:8:01", "nwparser.payload", tvm, { var msg11 = msg("8:01", part3); -var part4 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#11:8", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part4 = match("MESSAGE#11:8", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup12, dup6, dup13, @@ -1455,8 +1320,7 @@ var part5 = tagval("MESSAGE#12:9:01", "nwparser.payload", tvm, { var msg13 = msg("9:01", part5); -var part6 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#13:9", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part6 = match("MESSAGE#13:9", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup1, dup14, dup9, @@ -1550,8 +1414,7 @@ var part7 = tagval("MESSAGE#24:15:01", "nwparser.payload", tvm, { var msg25 = msg("15:01", part7); -var part8 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#25:15", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part8 = match("MESSAGE#25:15", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup15, dup18, dup9, @@ -1627,8 +1490,7 @@ var part9 = tagval("MESSAGE#32:19:01", "nwparser.payload", tvm, { var msg33 = msg("19:01", part9); -var part10 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#33:19", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part10 = match("MESSAGE#33:19", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup20, dup16, dup11, @@ -1676,8 +1538,7 @@ var part11 = tagval("MESSAGE#34:20:01", "nwparser.payload", tvm, { var msg35 = msg("20:01", part11); -var part12 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#35:20", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part12 = match("MESSAGE#35:20", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup19, dup16, dup2, @@ -1725,8 +1586,7 @@ var part13 = tagval("MESSAGE#36:21:01", "nwparser.payload", tvm, { var msg37 = msg("21:01", part13); -var part14 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#37:21", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part14 = match("MESSAGE#37:21", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup15, dup16, dup9, @@ -1782,8 +1642,7 @@ var part15 = tagval("MESSAGE#40:23:01", "nwparser.payload", tvm, { var msg41 = msg("23:01", part15); -var part16 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#41:23", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part16 = match("MESSAGE#41:23", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup22, dup2, ])); @@ -2576,8 +2435,7 @@ var part18 = tagval("MESSAGE#200:103:01", "nwparser.payload", tvm, { var msg201 = msg("103:01", part18); -var part19 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#201:103", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part19 = match("MESSAGE#201:103", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup27, dup6, dup7, @@ -2628,8 +2486,7 @@ var part20 = tagval("MESSAGE#202:104:01", "nwparser.payload", tvm, { var msg203 = msg("104:01", part20); -var part21 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#203:104", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part21 = match("MESSAGE#203:104", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup27, dup6, dup29, @@ -2928,8 +2785,7 @@ var part22 = tagval("MESSAGE#260:134:01", "nwparser.payload", tvm, { var msg261 = msg("134:01", part22); -var part23 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#261:134", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part23 = match("MESSAGE#261:134", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup30, dup2, ])); @@ -4318,8 +4174,7 @@ var select285 = linear_select([ msg568, ]); -var part24 = // "Pattern{Field(application,false), Constant(';DstHost='), Field(dhost,false), Constant(';Protocol='), Field(protocol,false), Constant(';PSMID='), Field(fld10,false), Constant(';SessionID='), Field(sessionid,false), Constant(';SrcHost='), Field(shost,false), Constant(';User='), Field(c_username,false), Constant(';"')}" -match("MESSAGE#568:300:02/24", "nwparser.p0", "%{application};DstHost=%{dhost};Protocol=%{protocol};PSMID=%{fld10};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};\""); +var part24 = match("MESSAGE#568:300:02/24", "nwparser.p0", "%{application};DstHost=%{dhost};Protocol=%{protocol};PSMID=%{fld10};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};\""); var all1 = all_match({ processors: [ @@ -4410,8 +4265,7 @@ var select287 = linear_select([ msg573, ]); -var part26 = // "Pattern{Field(application,false), Constant(';DstHost='), Field(dhost,false), Constant(';Protocol='), Field(protocol,false), Constant(';PSMID='), Field(fld12,false), Constant(';SessionDuration='), Field(duration_string,false), Constant(';SessionID='), Field(sessionid,false), Constant(';SrcHost='), Field(shost,false), Constant(';User='), Field(c_username,false), Constant(';"')}" -match("MESSAGE#573:302:02/24", "nwparser.p0", "%{application};DstHost=%{dhost};Protocol=%{protocol};PSMID=%{fld12};SessionDuration=%{duration_string};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};\""); +var part26 = match("MESSAGE#573:302:02/24", "nwparser.p0", "%{application};DstHost=%{dhost};Protocol=%{protocol};PSMID=%{fld12};SessionDuration=%{duration_string};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};\""); var all2 = all_match({ processors: [ @@ -4470,19 +4324,16 @@ var select289 = linear_select([ msg578, ]); -var part27 = // "Pattern{Constant('"'), Field(obj_type,false), Constant('";ExtraDetails="DstHost='), Field(p0,false)}" -match("MESSAGE#578:304:02/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"DstHost=%{p0}"); +var part27 = match("MESSAGE#578:304:02/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"DstHost=%{p0}"); -var part28 = // "Pattern{Field(obj_type,false), Constant(';ExtraDetails="DstHost='), Field(p0,false)}" -match("MESSAGE#578:304:02/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"DstHost=%{p0}"); +var part28 = match("MESSAGE#578:304:02/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"DstHost=%{p0}"); var select290 = linear_select([ part27, part28, ]); -var part29 = // "Pattern{Field(dhost,false), Constant(';Protocol='), Field(protocol,false), Constant(';PSMID='), Field(fld10,false), Constant(';SessionDuration='), Field(duration_string,false), Constant(';SessionID='), Field(sessionid,false), Constant(';SrcHost='), Field(shost,false), Constant(';User='), Field(c_username,false), Constant(';"')}" -match("MESSAGE#578:304:02/24", "nwparser.p0", "%{dhost};Protocol=%{protocol};PSMID=%{fld10};SessionDuration=%{duration_string};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};\""); +var part29 = match("MESSAGE#578:304:02/24", "nwparser.p0", "%{dhost};Protocol=%{protocol};PSMID=%{fld10};SessionDuration=%{duration_string};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};\""); var all3 = all_match({ processors: [ @@ -4592,8 +4443,7 @@ var part30 = tagval("MESSAGE#587:308:01", "nwparser.payload", tvm, { var msg588 = msg("308:01", part30); -var part31 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#588:308", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part31 = match("MESSAGE#588:308", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup78, dup2, ])); @@ -4642,8 +4492,7 @@ var part32 = tagval("MESSAGE#589:309:01", "nwparser.payload", tvm, { var msg590 = msg("309:01", part32); -var part33 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#590:309", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part33 = match("MESSAGE#590:309", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup10, dup6, dup7, @@ -4746,8 +4595,7 @@ var part34 = tagval("MESSAGE#603:190:01", "nwparser.payload", tvm, { var msg604 = msg("190:01", part34); -var part35 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#604:190", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part35 = match("MESSAGE#604:190", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup84, dup2, ])); @@ -4819,30 +4667,25 @@ var msg619 = msg("374", dup201); var msg620 = msg("376", dup201); -var part36 = // "Pattern{Constant('"'), Field(fld89,false), Constant('";LogonDomain='), Field(p0,false)}" -match("MESSAGE#620:411:01/17_0", "nwparser.p0", "\"%{fld89}\";LogonDomain=%{p0}"); +var part36 = match("MESSAGE#620:411:01/17_0", "nwparser.p0", "\"%{fld89}\";LogonDomain=%{p0}"); -var part37 = // "Pattern{Field(fld89,false), Constant(';LogonDomain='), Field(p0,false)}" -match("MESSAGE#620:411:01/17_1", "nwparser.p0", "%{fld89};LogonDomain=%{p0}"); +var part37 = match("MESSAGE#620:411:01/17_1", "nwparser.p0", "%{fld89};LogonDomain=%{p0}"); var select310 = linear_select([ part36, part37, ]); -var part38 = // "Pattern{Constant('"'), Field(obj_type,false), Constant('";ExtraDetails="Command='), Field(p0,false)}" -match("MESSAGE#620:411:01/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"Command=%{p0}"); +var part38 = match("MESSAGE#620:411:01/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"Command=%{p0}"); -var part39 = // "Pattern{Field(obj_type,false), Constant(';ExtraDetails="Command='), Field(p0,false)}" -match("MESSAGE#620:411:01/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"Command=%{p0}"); +var part39 = match("MESSAGE#620:411:01/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"Command=%{p0}"); var select311 = linear_select([ part38, part39, ]); -var part40 = // "Pattern{Field(param,false), Constant(';ConnectionComponentId='), Field(fld67,false), Constant(';DstHost='), Field(dhost,false), Constant(';Protocol='), Field(protocol,false), Constant(';PSMID='), Field(fld11,false), Constant(';RDPOffset='), Field(fld12,false), Constant(';SessionID='), Field(sessionid,false), Constant(';SrcHost='), Field(shost,false), Constant(';User='), Field(c_username,false), Constant(';VIDOffset='), Field(fld13,false), Constant(';')}" -match("MESSAGE#620:411:01/24", "nwparser.p0", "%{param};ConnectionComponentId=%{fld67};DstHost=%{dhost};Protocol=%{protocol};PSMID=%{fld11};RDPOffset=%{fld12};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};VIDOffset=%{fld13};"); +var part40 = match("MESSAGE#620:411:01/24", "nwparser.p0", "%{param};ConnectionComponentId=%{fld67};DstHost=%{dhost};Protocol=%{protocol};PSMID=%{fld11};RDPOffset=%{fld12};SessionID=%{sessionid};SrcHost=%{shost};User=%{c_username};VIDOffset=%{fld13};"); var all4 = all_match({ processors: [ @@ -4882,8 +4725,7 @@ var all4 = all_match({ var msg621 = msg("411:01", all4); -var part41 = // "Pattern{Constant('"Command='), Field(param,false), Constant(';ConnectionComponentId='), Field(fld1,false), Constant(';DstHost='), Field(fld2,false), Constant(';ProcessId='), Field(process_id,false), Constant(';ProcessName='), Field(process,false), Constant(';Protocol='), Field(protocol,false), Constant(';PSMID='), Field(fld3,false), Constant(';RDPOffset='), Field(fld4,false), Constant(';SessionID='), Field(sessionid,false), Constant(';SrcHost='), Field(shost,false), Constant(';User='), Field(fld5,false), Constant(';VIDOffset='), Field(fld6,false), Constant(';"')}" -match("MESSAGE#621:411/43_0", "nwparser.p0", "\"Command=%{param};ConnectionComponentId=%{fld1};DstHost=%{fld2};ProcessId=%{process_id};ProcessName=%{process};Protocol=%{protocol};PSMID=%{fld3};RDPOffset=%{fld4};SessionID=%{sessionid};SrcHost=%{shost};User=%{fld5};VIDOffset=%{fld6};\""); +var part41 = match("MESSAGE#621:411/43_0", "nwparser.p0", "\"Command=%{param};ConnectionComponentId=%{fld1};DstHost=%{fld2};ProcessId=%{process_id};ProcessName=%{process};Protocol=%{protocol};PSMID=%{fld3};RDPOffset=%{fld4};SessionID=%{sessionid};SrcHost=%{shost};User=%{fld5};VIDOffset=%{fld6};\""); var select312 = linear_select([ part41, @@ -4951,8 +4793,7 @@ var select313 = linear_select([ msg622, ]); -var part42 = // "Pattern{Constant('Version='), Field(version,false), Constant(';Message='), Field(action,false), Constant(';Issuer='), Field(username,false), Constant(';Station='), Field(hostip,false), Constant(';File='), Field(filename,false), Constant(';Safe='), Field(group_object,false), Constant(';Location="'), Field(directory,false), Constant('";Category='), Field(category,false), Constant(';RequestId='), Field(id1,false), Constant(';Reason='), Field(event_description,false), Constant(';Severity='), Field(severity,false), Constant(';GatewayStation='), Field(saddr,false), Constant(';TicketID='), Field(operation_id,false), Constant(';PolicyID='), Field(policyname,false), Constant(';UserName='), Field(c_username,false), Constant(';LogonDomain='), Field(domain,false), Constant(';Address='), Field(dhost,false), Constant(';CPMStatus='), Field(disposition,false), Constant(';Port="'), Field(dport,false), Constant('";Database='), Field(db_name,false), Constant(';DeviceType='), Field(obj_type,false), Constant(';ExtraDetails='), Field(info,false)}" -match("MESSAGE#622:385", "nwparser.payload", "Version=%{version};Message=%{action};Issuer=%{username};Station=%{hostip};File=%{filename};Safe=%{group_object};Location=\"%{directory}\";Category=%{category};RequestId=%{id1};Reason=%{event_description};Severity=%{severity};GatewayStation=%{saddr};TicketID=%{operation_id};PolicyID=%{policyname};UserName=%{c_username};LogonDomain=%{domain};Address=%{dhost};CPMStatus=%{disposition};Port=\"%{dport}\";Database=%{db_name};DeviceType=%{obj_type};ExtraDetails=%{info}", processor_chain([ +var part42 = match("MESSAGE#622:385", "nwparser.payload", "Version=%{version};Message=%{action};Issuer=%{username};Station=%{hostip};File=%{filename};Safe=%{group_object};Location=\"%{directory}\";Category=%{category};RequestId=%{id1};Reason=%{event_description};Severity=%{severity};GatewayStation=%{saddr};TicketID=%{operation_id};PolicyID=%{policyname};UserName=%{c_username};LogonDomain=%{domain};Address=%{dhost};CPMStatus=%{disposition};Port=\"%{dport}\";Database=%{db_name};DeviceType=%{obj_type};ExtraDetails=%{info}", processor_chain([ dup4, dup2, dup3, @@ -4960,8 +4801,7 @@ match("MESSAGE#622:385", "nwparser.payload", "Version=%{version};Message=%{actio var msg623 = msg("385", part42); -var part43 = // "Pattern{Constant('"Command='), Field(param,false), Constant(';ConnectionComponentId='), Field(fld1,false), Constant(';DstHost='), Field(fld2,false), Constant(';Protocol='), Field(protocol,false), Constant(';PSMID='), Field(fld3,false), Constant(';SessionID='), Field(sessionid,false), Constant(';SrcHost='), Field(shost,false), Constant(';SSHOffset='), Field(fld4,false), Constant(';User='), Field(fld5,false), Constant(';VIDOffset='), Field(fld6,false), Constant(';"')}" -match("MESSAGE#623:361/43_0", "nwparser.p0", "\"Command=%{param};ConnectionComponentId=%{fld1};DstHost=%{fld2};Protocol=%{protocol};PSMID=%{fld3};SessionID=%{sessionid};SrcHost=%{shost};SSHOffset=%{fld4};User=%{fld5};VIDOffset=%{fld6};\""); +var part43 = match("MESSAGE#623:361/43_0", "nwparser.p0", "\"Command=%{param};ConnectionComponentId=%{fld1};DstHost=%{fld2};Protocol=%{protocol};PSMID=%{fld3};SessionID=%{sessionid};SrcHost=%{shost};SSHOffset=%{fld4};User=%{fld5};VIDOffset=%{fld6};\""); var select314 = linear_select([ part43, @@ -5024,8 +4864,7 @@ var all6 = all_match({ var msg624 = msg("361", all6); -var part44 = // "Pattern{Constant('"Command='), Field(param,false), Constant(';ConnectionComponentId='), Field(fld1,false), Constant(';DstHost='), Field(fld2,false), Constant(';Protocol='), Field(protocol,false), Constant(';PSMID='), Field(fld3,false), Constant(';SessionID='), Field(sessionid,false), Constant(';SrcHost='), Field(shost,false), Constant(';TXTOffset='), Field(fld4,false), Constant(';User='), Field(fld5,false), Constant(';VIDOffset='), Field(fld6,false), Constant(';"')}" -match("MESSAGE#624:412/43_0", "nwparser.p0", "\"Command=%{param};ConnectionComponentId=%{fld1};DstHost=%{fld2};Protocol=%{protocol};PSMID=%{fld3};SessionID=%{sessionid};SrcHost=%{shost};TXTOffset=%{fld4};User=%{fld5};VIDOffset=%{fld6};\""); +var part44 = match("MESSAGE#624:412/43_0", "nwparser.p0", "\"Command=%{param};ConnectionComponentId=%{fld1};DstHost=%{fld2};Protocol=%{protocol};PSMID=%{fld3};SessionID=%{sessionid};SrcHost=%{shost};TXTOffset=%{fld4};User=%{fld5};VIDOffset=%{fld6};\""); var select315 = linear_select([ part44, @@ -5426,344 +5265,231 @@ var chain1 = processor_chain([ }), ]); -var part45 = // "Pattern{Constant('Version='), Field(p0,false)}" -match("MESSAGE#568:300:02/0", "nwparser.payload", "Version=%{p0}"); +var part45 = match("MESSAGE#568:300:02/0", "nwparser.payload", "Version=%{p0}"); -var part46 = // "Pattern{Constant('"'), Field(version,false), Constant('";Message='), Field(p0,false)}" -match("MESSAGE#568:300:02/1_0", "nwparser.p0", "\"%{version}\";Message=%{p0}"); +var part46 = match("MESSAGE#568:300:02/1_0", "nwparser.p0", "\"%{version}\";Message=%{p0}"); -var part47 = // "Pattern{Field(version,false), Constant(';Message='), Field(p0,false)}" -match("MESSAGE#568:300:02/1_1", "nwparser.p0", "%{version};Message=%{p0}"); +var part47 = match("MESSAGE#568:300:02/1_1", "nwparser.p0", "%{version};Message=%{p0}"); -var part48 = // "Pattern{Constant('"'), Field(action,false), Constant('";Issuer='), Field(p0,false)}" -match("MESSAGE#568:300:02/2_0", "nwparser.p0", "\"%{action}\";Issuer=%{p0}"); +var part48 = match("MESSAGE#568:300:02/2_0", "nwparser.p0", "\"%{action}\";Issuer=%{p0}"); -var part49 = // "Pattern{Field(action,false), Constant(';Issuer='), Field(p0,false)}" -match("MESSAGE#568:300:02/2_1", "nwparser.p0", "%{action};Issuer=%{p0}"); +var part49 = match("MESSAGE#568:300:02/2_1", "nwparser.p0", "%{action};Issuer=%{p0}"); -var part50 = // "Pattern{Constant('"'), Field(username,false), Constant('";Station='), Field(p0,false)}" -match("MESSAGE#568:300:02/3_0", "nwparser.p0", "\"%{username}\";Station=%{p0}"); +var part50 = match("MESSAGE#568:300:02/3_0", "nwparser.p0", "\"%{username}\";Station=%{p0}"); -var part51 = // "Pattern{Field(username,false), Constant(';Station='), Field(p0,false)}" -match("MESSAGE#568:300:02/3_1", "nwparser.p0", "%{username};Station=%{p0}"); +var part51 = match("MESSAGE#568:300:02/3_1", "nwparser.p0", "%{username};Station=%{p0}"); -var part52 = // "Pattern{Constant('"'), Field(hostip,false), Constant('";File='), Field(p0,false)}" -match("MESSAGE#568:300:02/4_0", "nwparser.p0", "\"%{hostip}\";File=%{p0}"); +var part52 = match("MESSAGE#568:300:02/4_0", "nwparser.p0", "\"%{hostip}\";File=%{p0}"); -var part53 = // "Pattern{Field(hostip,false), Constant(';File='), Field(p0,false)}" -match("MESSAGE#568:300:02/4_1", "nwparser.p0", "%{hostip};File=%{p0}"); +var part53 = match("MESSAGE#568:300:02/4_1", "nwparser.p0", "%{hostip};File=%{p0}"); -var part54 = // "Pattern{Constant('"'), Field(filename,false), Constant('";Safe='), Field(p0,false)}" -match("MESSAGE#568:300:02/5_0", "nwparser.p0", "\"%{filename}\";Safe=%{p0}"); +var part54 = match("MESSAGE#568:300:02/5_0", "nwparser.p0", "\"%{filename}\";Safe=%{p0}"); -var part55 = // "Pattern{Field(filename,false), Constant(';Safe='), Field(p0,false)}" -match("MESSAGE#568:300:02/5_1", "nwparser.p0", "%{filename};Safe=%{p0}"); +var part55 = match("MESSAGE#568:300:02/5_1", "nwparser.p0", "%{filename};Safe=%{p0}"); -var part56 = // "Pattern{Constant('"'), Field(group_object,false), Constant('";Location='), Field(p0,false)}" -match("MESSAGE#568:300:02/6_0", "nwparser.p0", "\"%{group_object}\";Location=%{p0}"); +var part56 = match("MESSAGE#568:300:02/6_0", "nwparser.p0", "\"%{group_object}\";Location=%{p0}"); -var part57 = // "Pattern{Field(group_object,false), Constant(';Location='), Field(p0,false)}" -match("MESSAGE#568:300:02/6_1", "nwparser.p0", "%{group_object};Location=%{p0}"); +var part57 = match("MESSAGE#568:300:02/6_1", "nwparser.p0", "%{group_object};Location=%{p0}"); -var part58 = // "Pattern{Constant('"'), Field(directory,false), Constant('";Category='), Field(p0,false)}" -match("MESSAGE#568:300:02/7_0", "nwparser.p0", "\"%{directory}\";Category=%{p0}"); +var part58 = match("MESSAGE#568:300:02/7_0", "nwparser.p0", "\"%{directory}\";Category=%{p0}"); -var part59 = // "Pattern{Field(directory,false), Constant(';Category='), Field(p0,false)}" -match("MESSAGE#568:300:02/7_1", "nwparser.p0", "%{directory};Category=%{p0}"); +var part59 = match("MESSAGE#568:300:02/7_1", "nwparser.p0", "%{directory};Category=%{p0}"); -var part60 = // "Pattern{Constant('"'), Field(category,false), Constant('";RequestId='), Field(p0,false)}" -match("MESSAGE#568:300:02/8_0", "nwparser.p0", "\"%{category}\";RequestId=%{p0}"); +var part60 = match("MESSAGE#568:300:02/8_0", "nwparser.p0", "\"%{category}\";RequestId=%{p0}"); -var part61 = // "Pattern{Field(category,false), Constant(';RequestId='), Field(p0,false)}" -match("MESSAGE#568:300:02/8_1", "nwparser.p0", "%{category};RequestId=%{p0}"); +var part61 = match("MESSAGE#568:300:02/8_1", "nwparser.p0", "%{category};RequestId=%{p0}"); -var part62 = // "Pattern{Constant('"'), Field(id1,false), Constant('";Reason='), Field(p0,false)}" -match("MESSAGE#568:300:02/9_0", "nwparser.p0", "\"%{id1}\";Reason=%{p0}"); +var part62 = match("MESSAGE#568:300:02/9_0", "nwparser.p0", "\"%{id1}\";Reason=%{p0}"); -var part63 = // "Pattern{Field(id1,false), Constant(';Reason='), Field(p0,false)}" -match("MESSAGE#568:300:02/9_1", "nwparser.p0", "%{id1};Reason=%{p0}"); +var part63 = match("MESSAGE#568:300:02/9_1", "nwparser.p0", "%{id1};Reason=%{p0}"); -var part64 = // "Pattern{Constant('"'), Field(event_description,false), Constant('";Severity='), Field(p0,false)}" -match("MESSAGE#568:300:02/10_0", "nwparser.p0", "\"%{event_description}\";Severity=%{p0}"); +var part64 = match("MESSAGE#568:300:02/10_0", "nwparser.p0", "\"%{event_description}\";Severity=%{p0}"); -var part65 = // "Pattern{Field(event_description,false), Constant(';Severity='), Field(p0,false)}" -match("MESSAGE#568:300:02/10_1", "nwparser.p0", "%{event_description};Severity=%{p0}"); +var part65 = match("MESSAGE#568:300:02/10_1", "nwparser.p0", "%{event_description};Severity=%{p0}"); -var part66 = // "Pattern{Constant('"'), Field(severity,false), Constant('";SourceUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/11_0", "nwparser.p0", "\"%{severity}\";SourceUser=%{p0}"); +var part66 = match("MESSAGE#568:300:02/11_0", "nwparser.p0", "\"%{severity}\";SourceUser=%{p0}"); -var part67 = // "Pattern{Field(severity,false), Constant(';SourceUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/11_1", "nwparser.p0", "%{severity};SourceUser=%{p0}"); +var part67 = match("MESSAGE#568:300:02/11_1", "nwparser.p0", "%{severity};SourceUser=%{p0}"); -var part68 = // "Pattern{Constant('"'), Field(group,false), Constant('";TargetUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/12_0", "nwparser.p0", "\"%{group}\";TargetUser=%{p0}"); +var part68 = match("MESSAGE#568:300:02/12_0", "nwparser.p0", "\"%{group}\";TargetUser=%{p0}"); -var part69 = // "Pattern{Field(group,false), Constant(';TargetUser='), Field(p0,false)}" -match("MESSAGE#568:300:02/12_1", "nwparser.p0", "%{group};TargetUser=%{p0}"); +var part69 = match("MESSAGE#568:300:02/12_1", "nwparser.p0", "%{group};TargetUser=%{p0}"); -var part70 = // "Pattern{Constant('"'), Field(uid,false), Constant('";GatewayStation='), Field(p0,false)}" -match("MESSAGE#568:300:02/13_0", "nwparser.p0", "\"%{uid}\";GatewayStation=%{p0}"); +var part70 = match("MESSAGE#568:300:02/13_0", "nwparser.p0", "\"%{uid}\";GatewayStation=%{p0}"); -var part71 = // "Pattern{Field(uid,false), Constant(';GatewayStation='), Field(p0,false)}" -match("MESSAGE#568:300:02/13_1", "nwparser.p0", "%{uid};GatewayStation=%{p0}"); +var part71 = match("MESSAGE#568:300:02/13_1", "nwparser.p0", "%{uid};GatewayStation=%{p0}"); -var part72 = // "Pattern{Constant('"'), Field(saddr,false), Constant('";TicketID='), Field(p0,false)}" -match("MESSAGE#568:300:02/14_0", "nwparser.p0", "\"%{saddr}\";TicketID=%{p0}"); +var part72 = match("MESSAGE#568:300:02/14_0", "nwparser.p0", "\"%{saddr}\";TicketID=%{p0}"); -var part73 = // "Pattern{Field(saddr,false), Constant(';TicketID='), Field(p0,false)}" -match("MESSAGE#568:300:02/14_1", "nwparser.p0", "%{saddr};TicketID=%{p0}"); +var part73 = match("MESSAGE#568:300:02/14_1", "nwparser.p0", "%{saddr};TicketID=%{p0}"); -var part74 = // "Pattern{Constant('"'), Field(operation_id,false), Constant('";PolicyID='), Field(p0,false)}" -match("MESSAGE#568:300:02/15_0", "nwparser.p0", "\"%{operation_id}\";PolicyID=%{p0}"); +var part74 = match("MESSAGE#568:300:02/15_0", "nwparser.p0", "\"%{operation_id}\";PolicyID=%{p0}"); -var part75 = // "Pattern{Field(operation_id,false), Constant(';PolicyID='), Field(p0,false)}" -match("MESSAGE#568:300:02/15_1", "nwparser.p0", "%{operation_id};PolicyID=%{p0}"); +var part75 = match("MESSAGE#568:300:02/15_1", "nwparser.p0", "%{operation_id};PolicyID=%{p0}"); -var part76 = // "Pattern{Constant('"'), Field(policyname,false), Constant('";UserName='), Field(p0,false)}" -match("MESSAGE#568:300:02/16_0", "nwparser.p0", "\"%{policyname}\";UserName=%{p0}"); +var part76 = match("MESSAGE#568:300:02/16_0", "nwparser.p0", "\"%{policyname}\";UserName=%{p0}"); -var part77 = // "Pattern{Field(policyname,false), Constant(';UserName='), Field(p0,false)}" -match("MESSAGE#568:300:02/16_1", "nwparser.p0", "%{policyname};UserName=%{p0}"); +var part77 = match("MESSAGE#568:300:02/16_1", "nwparser.p0", "%{policyname};UserName=%{p0}"); -var part78 = // "Pattern{Constant('"'), Field(fld11,false), Constant('";LogonDomain='), Field(p0,false)}" -match("MESSAGE#568:300:02/17_0", "nwparser.p0", "\"%{fld11}\";LogonDomain=%{p0}"); +var part78 = match("MESSAGE#568:300:02/17_0", "nwparser.p0", "\"%{fld11}\";LogonDomain=%{p0}"); -var part79 = // "Pattern{Field(fld11,false), Constant(';LogonDomain='), Field(p0,false)}" -match("MESSAGE#568:300:02/17_1", "nwparser.p0", "%{fld11};LogonDomain=%{p0}"); +var part79 = match("MESSAGE#568:300:02/17_1", "nwparser.p0", "%{fld11};LogonDomain=%{p0}"); -var part80 = // "Pattern{Constant('"'), Field(domain,false), Constant('";Address='), Field(p0,false)}" -match("MESSAGE#568:300:02/18_0", "nwparser.p0", "\"%{domain}\";Address=%{p0}"); +var part80 = match("MESSAGE#568:300:02/18_0", "nwparser.p0", "\"%{domain}\";Address=%{p0}"); -var part81 = // "Pattern{Field(domain,false), Constant(';Address='), Field(p0,false)}" -match("MESSAGE#568:300:02/18_1", "nwparser.p0", "%{domain};Address=%{p0}"); +var part81 = match("MESSAGE#568:300:02/18_1", "nwparser.p0", "%{domain};Address=%{p0}"); -var part82 = // "Pattern{Constant('"'), Field(fld14,false), Constant('";CPMStatus='), Field(p0,false)}" -match("MESSAGE#568:300:02/19_0", "nwparser.p0", "\"%{fld14}\";CPMStatus=%{p0}"); +var part82 = match("MESSAGE#568:300:02/19_0", "nwparser.p0", "\"%{fld14}\";CPMStatus=%{p0}"); -var part83 = // "Pattern{Field(fld14,false), Constant(';CPMStatus='), Field(p0,false)}" -match("MESSAGE#568:300:02/19_1", "nwparser.p0", "%{fld14};CPMStatus=%{p0}"); +var part83 = match("MESSAGE#568:300:02/19_1", "nwparser.p0", "%{fld14};CPMStatus=%{p0}"); -var part84 = // "Pattern{Constant('"'), Field(disposition,false), Constant('";Port='), Field(p0,false)}" -match("MESSAGE#568:300:02/20_0", "nwparser.p0", "\"%{disposition}\";Port=%{p0}"); +var part84 = match("MESSAGE#568:300:02/20_0", "nwparser.p0", "\"%{disposition}\";Port=%{p0}"); -var part85 = // "Pattern{Field(disposition,false), Constant(';Port='), Field(p0,false)}" -match("MESSAGE#568:300:02/20_1", "nwparser.p0", "%{disposition};Port=%{p0}"); +var part85 = match("MESSAGE#568:300:02/20_1", "nwparser.p0", "%{disposition};Port=%{p0}"); -var part86 = // "Pattern{Constant('"'), Field(dport,false), Constant('";Database='), Field(p0,false)}" -match("MESSAGE#568:300:02/21_0", "nwparser.p0", "\"%{dport}\";Database=%{p0}"); +var part86 = match("MESSAGE#568:300:02/21_0", "nwparser.p0", "\"%{dport}\";Database=%{p0}"); -var part87 = // "Pattern{Field(dport,false), Constant(';Database='), Field(p0,false)}" -match("MESSAGE#568:300:02/21_1", "nwparser.p0", "%{dport};Database=%{p0}"); +var part87 = match("MESSAGE#568:300:02/21_1", "nwparser.p0", "%{dport};Database=%{p0}"); -var part88 = // "Pattern{Constant('"'), Field(db_name,false), Constant('";DeviceType='), Field(p0,false)}" -match("MESSAGE#568:300:02/22_0", "nwparser.p0", "\"%{db_name}\";DeviceType=%{p0}"); +var part88 = match("MESSAGE#568:300:02/22_0", "nwparser.p0", "\"%{db_name}\";DeviceType=%{p0}"); -var part89 = // "Pattern{Field(db_name,false), Constant(';DeviceType='), Field(p0,false)}" -match("MESSAGE#568:300:02/22_1", "nwparser.p0", "%{db_name};DeviceType=%{p0}"); +var part89 = match("MESSAGE#568:300:02/22_1", "nwparser.p0", "%{db_name};DeviceType=%{p0}"); -var part90 = // "Pattern{Constant('"'), Field(obj_type,false), Constant('";ExtraDetails="ApplicationType='), Field(p0,false)}" -match("MESSAGE#568:300:02/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"ApplicationType=%{p0}"); +var part90 = match("MESSAGE#568:300:02/23_0", "nwparser.p0", "\"%{obj_type}\";ExtraDetails=\"ApplicationType=%{p0}"); -var part91 = // "Pattern{Field(obj_type,false), Constant(';ExtraDetails="ApplicationType='), Field(p0,false)}" -match("MESSAGE#568:300:02/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"ApplicationType=%{p0}"); +var part91 = match("MESSAGE#568:300:02/23_1", "nwparser.p0", "%{obj_type};ExtraDetails=\"ApplicationType=%{p0}"); -var part92 = // "Pattern{Constant('"'), Field(version,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/1_0", "nwparser.p0", "\"%{version}\";%{p0}"); +var part92 = match("MESSAGE#621:411/1_0", "nwparser.p0", "\"%{version}\";%{p0}"); -var part93 = // "Pattern{Field(version,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/1_1", "nwparser.p0", "%{version};%{p0}"); +var part93 = match("MESSAGE#621:411/1_1", "nwparser.p0", "%{version};%{p0}"); -var part94 = // "Pattern{Constant('Message='), Field(p0,false)}" -match("MESSAGE#621:411/2", "nwparser.p0", "Message=%{p0}"); +var part94 = match("MESSAGE#621:411/2", "nwparser.p0", "Message=%{p0}"); -var part95 = // "Pattern{Constant('"'), Field(action,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/3_0", "nwparser.p0", "\"%{action}\";%{p0}"); +var part95 = match("MESSAGE#621:411/3_0", "nwparser.p0", "\"%{action}\";%{p0}"); -var part96 = // "Pattern{Field(action,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/3_1", "nwparser.p0", "%{action};%{p0}"); +var part96 = match("MESSAGE#621:411/3_1", "nwparser.p0", "%{action};%{p0}"); -var part97 = // "Pattern{Constant('Issuer='), Field(p0,false)}" -match("MESSAGE#621:411/4", "nwparser.p0", "Issuer=%{p0}"); +var part97 = match("MESSAGE#621:411/4", "nwparser.p0", "Issuer=%{p0}"); -var part98 = // "Pattern{Constant('"'), Field(username,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/5_0", "nwparser.p0", "\"%{username}\";%{p0}"); +var part98 = match("MESSAGE#621:411/5_0", "nwparser.p0", "\"%{username}\";%{p0}"); -var part99 = // "Pattern{Field(username,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/5_1", "nwparser.p0", "%{username};%{p0}"); +var part99 = match("MESSAGE#621:411/5_1", "nwparser.p0", "%{username};%{p0}"); -var part100 = // "Pattern{Constant('Station='), Field(p0,false)}" -match("MESSAGE#621:411/6", "nwparser.p0", "Station=%{p0}"); +var part100 = match("MESSAGE#621:411/6", "nwparser.p0", "Station=%{p0}"); -var part101 = // "Pattern{Constant('"'), Field(hostip,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/7_0", "nwparser.p0", "\"%{hostip}\";%{p0}"); +var part101 = match("MESSAGE#621:411/7_0", "nwparser.p0", "\"%{hostip}\";%{p0}"); -var part102 = // "Pattern{Field(hostip,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/7_1", "nwparser.p0", "%{hostip};%{p0}"); +var part102 = match("MESSAGE#621:411/7_1", "nwparser.p0", "%{hostip};%{p0}"); -var part103 = // "Pattern{Constant('File='), Field(p0,false)}" -match("MESSAGE#621:411/8", "nwparser.p0", "File=%{p0}"); +var part103 = match("MESSAGE#621:411/8", "nwparser.p0", "File=%{p0}"); -var part104 = // "Pattern{Constant('"'), Field(filename,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/9_0", "nwparser.p0", "\"%{filename}\";%{p0}"); +var part104 = match("MESSAGE#621:411/9_0", "nwparser.p0", "\"%{filename}\";%{p0}"); -var part105 = // "Pattern{Field(filename,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/9_1", "nwparser.p0", "%{filename};%{p0}"); +var part105 = match("MESSAGE#621:411/9_1", "nwparser.p0", "%{filename};%{p0}"); -var part106 = // "Pattern{Constant('Safe='), Field(p0,false)}" -match("MESSAGE#621:411/10", "nwparser.p0", "Safe=%{p0}"); +var part106 = match("MESSAGE#621:411/10", "nwparser.p0", "Safe=%{p0}"); -var part107 = // "Pattern{Constant('"'), Field(group_object,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/11_0", "nwparser.p0", "\"%{group_object}\";%{p0}"); +var part107 = match("MESSAGE#621:411/11_0", "nwparser.p0", "\"%{group_object}\";%{p0}"); -var part108 = // "Pattern{Field(group_object,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/11_1", "nwparser.p0", "%{group_object};%{p0}"); +var part108 = match("MESSAGE#621:411/11_1", "nwparser.p0", "%{group_object};%{p0}"); -var part109 = // "Pattern{Constant('Location='), Field(p0,false)}" -match("MESSAGE#621:411/12", "nwparser.p0", "Location=%{p0}"); +var part109 = match("MESSAGE#621:411/12", "nwparser.p0", "Location=%{p0}"); -var part110 = // "Pattern{Constant('"'), Field(directory,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/13_0", "nwparser.p0", "\"%{directory}\";%{p0}"); +var part110 = match("MESSAGE#621:411/13_0", "nwparser.p0", "\"%{directory}\";%{p0}"); -var part111 = // "Pattern{Field(directory,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/13_1", "nwparser.p0", "%{directory};%{p0}"); +var part111 = match("MESSAGE#621:411/13_1", "nwparser.p0", "%{directory};%{p0}"); -var part112 = // "Pattern{Constant('Category='), Field(p0,false)}" -match("MESSAGE#621:411/14", "nwparser.p0", "Category=%{p0}"); +var part112 = match("MESSAGE#621:411/14", "nwparser.p0", "Category=%{p0}"); -var part113 = // "Pattern{Constant('"'), Field(category,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/15_0", "nwparser.p0", "\"%{category}\";%{p0}"); +var part113 = match("MESSAGE#621:411/15_0", "nwparser.p0", "\"%{category}\";%{p0}"); -var part114 = // "Pattern{Field(category,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/15_1", "nwparser.p0", "%{category};%{p0}"); +var part114 = match("MESSAGE#621:411/15_1", "nwparser.p0", "%{category};%{p0}"); -var part115 = // "Pattern{Constant('RequestId='), Field(p0,false)}" -match("MESSAGE#621:411/16", "nwparser.p0", "RequestId=%{p0}"); +var part115 = match("MESSAGE#621:411/16", "nwparser.p0", "RequestId=%{p0}"); -var part116 = // "Pattern{Constant('"'), Field(id1,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/17_0", "nwparser.p0", "\"%{id1}\";%{p0}"); +var part116 = match("MESSAGE#621:411/17_0", "nwparser.p0", "\"%{id1}\";%{p0}"); -var part117 = // "Pattern{Field(id1,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/17_1", "nwparser.p0", "%{id1};%{p0}"); +var part117 = match("MESSAGE#621:411/17_1", "nwparser.p0", "%{id1};%{p0}"); -var part118 = // "Pattern{Constant('Reason='), Field(p0,false)}" -match("MESSAGE#621:411/18", "nwparser.p0", "Reason=%{p0}"); +var part118 = match("MESSAGE#621:411/18", "nwparser.p0", "Reason=%{p0}"); -var part119 = // "Pattern{Constant('"'), Field(event_description,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/19_0", "nwparser.p0", "\"%{event_description}\";%{p0}"); +var part119 = match("MESSAGE#621:411/19_0", "nwparser.p0", "\"%{event_description}\";%{p0}"); -var part120 = // "Pattern{Field(event_description,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/19_1", "nwparser.p0", "%{event_description};%{p0}"); +var part120 = match("MESSAGE#621:411/19_1", "nwparser.p0", "%{event_description};%{p0}"); -var part121 = // "Pattern{Constant('Severity='), Field(p0,false)}" -match("MESSAGE#621:411/20", "nwparser.p0", "Severity=%{p0}"); +var part121 = match("MESSAGE#621:411/20", "nwparser.p0", "Severity=%{p0}"); -var part122 = // "Pattern{Constant('"'), Field(severity,false), Constant('";SourceUser="'), Field(group,false), Constant('";TargetUser="'), Field(uid,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/21_0", "nwparser.p0", "\"%{severity}\";SourceUser=\"%{group}\";TargetUser=\"%{uid}\";%{p0}"); +var part122 = match("MESSAGE#621:411/21_0", "nwparser.p0", "\"%{severity}\";SourceUser=\"%{group}\";TargetUser=\"%{uid}\";%{p0}"); -var part123 = // "Pattern{Field(severity,false), Constant(';SourceUser='), Field(group,false), Constant(';TargetUser='), Field(uid,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/21_1", "nwparser.p0", "%{severity};SourceUser=%{group};TargetUser=%{uid};%{p0}"); +var part123 = match("MESSAGE#621:411/21_1", "nwparser.p0", "%{severity};SourceUser=%{group};TargetUser=%{uid};%{p0}"); -var part124 = // "Pattern{Constant('"'), Field(severity,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/21_2", "nwparser.p0", "\"%{severity}\";%{p0}"); +var part124 = match("MESSAGE#621:411/21_2", "nwparser.p0", "\"%{severity}\";%{p0}"); -var part125 = // "Pattern{Field(severity,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/21_3", "nwparser.p0", "%{severity};%{p0}"); +var part125 = match("MESSAGE#621:411/21_3", "nwparser.p0", "%{severity};%{p0}"); -var part126 = // "Pattern{Constant('GatewayStation='), Field(p0,false)}" -match("MESSAGE#621:411/22", "nwparser.p0", "GatewayStation=%{p0}"); +var part126 = match("MESSAGE#621:411/22", "nwparser.p0", "GatewayStation=%{p0}"); -var part127 = // "Pattern{Constant('"'), Field(saddr,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/23_0", "nwparser.p0", "\"%{saddr}\";%{p0}"); +var part127 = match("MESSAGE#621:411/23_0", "nwparser.p0", "\"%{saddr}\";%{p0}"); -var part128 = // "Pattern{Field(saddr,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/23_1", "nwparser.p0", "%{saddr};%{p0}"); +var part128 = match("MESSAGE#621:411/23_1", "nwparser.p0", "%{saddr};%{p0}"); -var part129 = // "Pattern{Constant('TicketID='), Field(p0,false)}" -match("MESSAGE#621:411/24", "nwparser.p0", "TicketID=%{p0}"); +var part129 = match("MESSAGE#621:411/24", "nwparser.p0", "TicketID=%{p0}"); -var part130 = // "Pattern{Constant('"'), Field(operation_id,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/25_0", "nwparser.p0", "\"%{operation_id}\";%{p0}"); +var part130 = match("MESSAGE#621:411/25_0", "nwparser.p0", "\"%{operation_id}\";%{p0}"); -var part131 = // "Pattern{Field(operation_id,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/25_1", "nwparser.p0", "%{operation_id};%{p0}"); +var part131 = match("MESSAGE#621:411/25_1", "nwparser.p0", "%{operation_id};%{p0}"); -var part132 = // "Pattern{Constant('PolicyID='), Field(p0,false)}" -match("MESSAGE#621:411/26", "nwparser.p0", "PolicyID=%{p0}"); +var part132 = match("MESSAGE#621:411/26", "nwparser.p0", "PolicyID=%{p0}"); -var part133 = // "Pattern{Constant('"'), Field(policyname,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/27_0", "nwparser.p0", "\"%{policyname}\";%{p0}"); +var part133 = match("MESSAGE#621:411/27_0", "nwparser.p0", "\"%{policyname}\";%{p0}"); -var part134 = // "Pattern{Field(policyname,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/27_1", "nwparser.p0", "%{policyname};%{p0}"); +var part134 = match("MESSAGE#621:411/27_1", "nwparser.p0", "%{policyname};%{p0}"); -var part135 = // "Pattern{Constant('UserName='), Field(p0,false)}" -match("MESSAGE#621:411/28", "nwparser.p0", "UserName=%{p0}"); +var part135 = match("MESSAGE#621:411/28", "nwparser.p0", "UserName=%{p0}"); -var part136 = // "Pattern{Constant('"'), Field(c_username,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/29_0", "nwparser.p0", "\"%{c_username}\";%{p0}"); +var part136 = match("MESSAGE#621:411/29_0", "nwparser.p0", "\"%{c_username}\";%{p0}"); -var part137 = // "Pattern{Field(c_username,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/29_1", "nwparser.p0", "%{c_username};%{p0}"); +var part137 = match("MESSAGE#621:411/29_1", "nwparser.p0", "%{c_username};%{p0}"); -var part138 = // "Pattern{Constant('LogonDomain='), Field(p0,false)}" -match("MESSAGE#621:411/30", "nwparser.p0", "LogonDomain=%{p0}"); +var part138 = match("MESSAGE#621:411/30", "nwparser.p0", "LogonDomain=%{p0}"); -var part139 = // "Pattern{Constant('"'), Field(domain,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/31_0", "nwparser.p0", "\"%{domain}\";%{p0}"); +var part139 = match("MESSAGE#621:411/31_0", "nwparser.p0", "\"%{domain}\";%{p0}"); -var part140 = // "Pattern{Field(domain,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/31_1", "nwparser.p0", "%{domain};%{p0}"); +var part140 = match("MESSAGE#621:411/31_1", "nwparser.p0", "%{domain};%{p0}"); -var part141 = // "Pattern{Constant('Address='), Field(p0,false)}" -match("MESSAGE#621:411/32", "nwparser.p0", "Address=%{p0}"); +var part141 = match("MESSAGE#621:411/32", "nwparser.p0", "Address=%{p0}"); -var part142 = // "Pattern{Constant('"'), Field(dhost,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/33_0", "nwparser.p0", "\"%{dhost}\";%{p0}"); +var part142 = match("MESSAGE#621:411/33_0", "nwparser.p0", "\"%{dhost}\";%{p0}"); -var part143 = // "Pattern{Field(dhost,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/33_1", "nwparser.p0", "%{dhost};%{p0}"); +var part143 = match("MESSAGE#621:411/33_1", "nwparser.p0", "%{dhost};%{p0}"); -var part144 = // "Pattern{Constant('CPMStatus='), Field(p0,false)}" -match("MESSAGE#621:411/34", "nwparser.p0", "CPMStatus=%{p0}"); +var part144 = match("MESSAGE#621:411/34", "nwparser.p0", "CPMStatus=%{p0}"); -var part145 = // "Pattern{Constant('"'), Field(disposition,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/35_0", "nwparser.p0", "\"%{disposition}\";%{p0}"); +var part145 = match("MESSAGE#621:411/35_0", "nwparser.p0", "\"%{disposition}\";%{p0}"); -var part146 = // "Pattern{Field(disposition,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/35_1", "nwparser.p0", "%{disposition};%{p0}"); +var part146 = match("MESSAGE#621:411/35_1", "nwparser.p0", "%{disposition};%{p0}"); -var part147 = // "Pattern{Constant('Port='), Field(p0,false)}" -match("MESSAGE#621:411/36", "nwparser.p0", "Port=%{p0}"); +var part147 = match("MESSAGE#621:411/36", "nwparser.p0", "Port=%{p0}"); -var part148 = // "Pattern{Constant('"'), Field(dport,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/37_0", "nwparser.p0", "\"%{dport}\";%{p0}"); +var part148 = match("MESSAGE#621:411/37_0", "nwparser.p0", "\"%{dport}\";%{p0}"); -var part149 = // "Pattern{Field(dport,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/37_1", "nwparser.p0", "%{dport};%{p0}"); +var part149 = match("MESSAGE#621:411/37_1", "nwparser.p0", "%{dport};%{p0}"); -var part150 = // "Pattern{Constant('Database='), Field(p0,false)}" -match("MESSAGE#621:411/38", "nwparser.p0", "Database=%{p0}"); +var part150 = match("MESSAGE#621:411/38", "nwparser.p0", "Database=%{p0}"); -var part151 = // "Pattern{Constant('"'), Field(db_name,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/39_0", "nwparser.p0", "\"%{db_name}\";%{p0}"); +var part151 = match("MESSAGE#621:411/39_0", "nwparser.p0", "\"%{db_name}\";%{p0}"); -var part152 = // "Pattern{Field(db_name,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/39_1", "nwparser.p0", "%{db_name};%{p0}"); +var part152 = match("MESSAGE#621:411/39_1", "nwparser.p0", "%{db_name};%{p0}"); -var part153 = // "Pattern{Constant('DeviceType='), Field(p0,false)}" -match("MESSAGE#621:411/40", "nwparser.p0", "DeviceType=%{p0}"); +var part153 = match("MESSAGE#621:411/40", "nwparser.p0", "DeviceType=%{p0}"); -var part154 = // "Pattern{Constant('"'), Field(obj_type,false), Constant('";'), Field(p0,false)}" -match("MESSAGE#621:411/41_0", "nwparser.p0", "\"%{obj_type}\";%{p0}"); +var part154 = match("MESSAGE#621:411/41_0", "nwparser.p0", "\"%{obj_type}\";%{p0}"); -var part155 = // "Pattern{Field(obj_type,false), Constant(';'), Field(p0,false)}" -match("MESSAGE#621:411/41_1", "nwparser.p0", "%{obj_type};%{p0}"); +var part155 = match("MESSAGE#621:411/41_1", "nwparser.p0", "%{obj_type};%{p0}"); -var part156 = // "Pattern{Constant('ExtraDetails='), Field(p0,false)}" -match("MESSAGE#621:411/42", "nwparser.p0", "ExtraDetails=%{p0}"); +var part156 = match("MESSAGE#621:411/42", "nwparser.p0", "ExtraDetails=%{p0}"); -var part157 = // "Pattern{Field(info,false), Constant(';')}" -match("MESSAGE#621:411/43_1", "nwparser.p0", "%{info};"); +var part157 = match("MESSAGE#621:411/43_1", "nwparser.p0", "%{info};"); var part158 = tagval("MESSAGE#0:1:01", "nwparser.payload", tvm, { "Address": "dhost", @@ -5796,8 +5522,7 @@ var part158 = tagval("MESSAGE#0:1:01", "nwparser.payload", tvm, { dup3, ])); -var part159 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#1:1", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part159 = match("MESSAGE#1:1", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup1, dup2, ])); @@ -5833,8 +5558,7 @@ var part160 = tagval("MESSAGE#2:2:01", "nwparser.payload", tvm, { dup3, ])); -var part161 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#3:2", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part161 = match("MESSAGE#3:2", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup4, dup2, ])); @@ -5874,8 +5598,7 @@ var part162 = tagval("MESSAGE#6:4:01", "nwparser.payload", tvm, { dup3, ])); -var part163 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#7:4", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part163 = match("MESSAGE#7:4", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup5, dup6, dup7, @@ -5918,8 +5641,7 @@ var part164 = tagval("MESSAGE#20:13:01", "nwparser.payload", tvm, { dup3, ])); -var part165 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#21:13", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part165 = match("MESSAGE#21:13", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup15, dup16, dup17, @@ -5958,8 +5680,7 @@ var part166 = tagval("MESSAGE#26:16:01", "nwparser.payload", tvm, { dup3, ])); -var part167 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#27:16", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part167 = match("MESSAGE#27:16", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup19, dup2, ])); @@ -5995,8 +5716,7 @@ var part168 = tagval("MESSAGE#30:18:01", "nwparser.payload", tvm, { dup3, ])); -var part169 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#31:18", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part169 = match("MESSAGE#31:18", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup15, dup2, ])); @@ -6032,8 +5752,7 @@ var part170 = tagval("MESSAGE#38:22:01", "nwparser.payload", tvm, { dup3, ])); -var part171 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#39:22", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part171 = match("MESSAGE#39:22", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup21, dup2, ])); @@ -6069,8 +5788,7 @@ var part172 = tagval("MESSAGE#70:38:01", "nwparser.payload", tvm, { dup3, ])); -var part173 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#71:38", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part173 = match("MESSAGE#71:38", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup23, dup2, ])); @@ -6106,8 +5824,7 @@ var part174 = tagval("MESSAGE#116:61:01", "nwparser.payload", tvm, { dup3, ])); -var part175 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#117:61", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part175 = match("MESSAGE#117:61", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup20, dup2, ])); @@ -6143,8 +5860,7 @@ var part176 = tagval("MESSAGE#126:66:01", "nwparser.payload", tvm, { dup3, ])); -var part177 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#127:66", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part177 = match("MESSAGE#127:66", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup26, dup2, ])); @@ -6330,8 +6046,7 @@ var part179 = tagval("MESSAGE#591:317:01", "nwparser.payload", tvm, { dup3, ])); -var part180 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#592:317", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part180 = match("MESSAGE#592:317", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup79, dup80, dup81, @@ -6369,8 +6084,7 @@ var part181 = tagval("MESSAGE#595:355:01", "nwparser.payload", tvm, { dup3, ])); -var part182 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#596:355", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part182 = match("MESSAGE#596:355", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup82, dup2, ])); @@ -6406,14 +6120,12 @@ var part183 = tagval("MESSAGE#599:357:01", "nwparser.payload", tvm, { dup3, ])); -var part184 = // "Pattern{Field(product,true), Constant(' '), Field(version,false), Constant('",ProductAccount="'), Field(service_account,false), Constant('",ProductProcess="'), Field(fld2,false), Constant('",EventId="'), Field(id,false), Constant('",EventClass="'), Field(fld3,false), Constant('",EventSeverity="'), Field(severity,false), Constant('",EventMessage="'), Field(action,false), Constant('",ActingUserName="'), Field(username,false), Constant('",ActingAddress="'), Field(hostip,false), Constant('",ActionSourceUser="'), Field(fld4,false), Constant('",ActionTargetUser="'), Field(c_username,false), Constant('",ActionObject="'), Field(filename,false), Constant('",ActionSafe="'), Field(group_object,false), Constant('",ActionLocation="'), Field(directory,false), Constant('",ActionCategory="'), Field(category,false), Constant('",ActionRequestId="'), Field(id1,false), Constant('",ActionReason="'), Field(event_description,false), Constant('",ActionExtraDetails="'), Field(info,false), Constant('"')}" -match("MESSAGE#600:357", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ +var part184 = match("MESSAGE#600:357", "nwparser.payload", "%{product->} %{version}\",ProductAccount=\"%{service_account}\",ProductProcess=\"%{fld2}\",EventId=\"%{id}\",EventClass=\"%{fld3}\",EventSeverity=\"%{severity}\",EventMessage=\"%{action}\",ActingUserName=\"%{username}\",ActingAddress=\"%{hostip}\",ActionSourceUser=\"%{fld4}\",ActionTargetUser=\"%{c_username}\",ActionObject=\"%{filename}\",ActionSafe=\"%{group_object}\",ActionLocation=\"%{directory}\",ActionCategory=\"%{category}\",ActionRequestId=\"%{id1}\",ActionReason=\"%{event_description}\",ActionExtraDetails=\"%{info}\"", processor_chain([ dup83, dup2, ])); -var part185 = // "Pattern{Constant('Version='), Field(version,false), Constant(';Message='), Field(action,false), Constant(';Issuer='), Field(username,false), Constant(';Station='), Field(hostip,false), Constant(';File='), Field(filename,false), Constant(';Safe='), Field(group_object,false), Constant(';Location='), Field(directory,false), Constant(';Category='), Field(category,false), Constant(';RequestId='), Field(id1,false), Constant(';Reason='), Field(event_description,false), Constant(';Severity='), Field(severity,false), Constant(';GatewayStation='), Field(saddr,false), Constant(';TicketID='), Field(operation_id,false), Constant(';PolicyID='), Field(policyname,false), Constant(';UserName='), Field(c_username,false), Constant(';LogonDomain='), Field(domain,false), Constant(';Address='), Field(dhost,false), Constant(';CPMStatus='), Field(disposition,false), Constant(';Port="'), Field(dport,false), Constant('";Database='), Field(db_name,false), Constant(';DeviceType='), Field(obj_type,false), Constant(';ExtraDetails='), Field(info,false), Constant(';')}" -match("MESSAGE#617:372", "nwparser.payload", "Version=%{version};Message=%{action};Issuer=%{username};Station=%{hostip};File=%{filename};Safe=%{group_object};Location=%{directory};Category=%{category};RequestId=%{id1};Reason=%{event_description};Severity=%{severity};GatewayStation=%{saddr};TicketID=%{operation_id};PolicyID=%{policyname};UserName=%{c_username};LogonDomain=%{domain};Address=%{dhost};CPMStatus=%{disposition};Port=\"%{dport}\";Database=%{db_name};DeviceType=%{obj_type};ExtraDetails=%{info};", processor_chain([ +var part185 = match("MESSAGE#617:372", "nwparser.payload", "Version=%{version};Message=%{action};Issuer=%{username};Station=%{hostip};File=%{filename};Safe=%{group_object};Location=%{directory};Category=%{category};RequestId=%{id1};Reason=%{event_description};Severity=%{severity};GatewayStation=%{saddr};TicketID=%{operation_id};PolicyID=%{policyname};UserName=%{c_username};LogonDomain=%{domain};Address=%{dhost};CPMStatus=%{disposition};Port=\"%{dport}\";Database=%{db_name};DeviceType=%{obj_type};ExtraDetails=%{info};", processor_chain([ dup4, dup2, dup3, diff --git a/x-pack/filebeat/module/f5/bigipafm/config/pipeline.js b/x-pack/filebeat/module/f5/bigipafm/config/pipeline.js index a32c606c1ba..e749db584be 100644 --- a/x-pack/filebeat/module/f5/bigipafm/config/pipeline.js +++ b/x-pack/filebeat/module/f5/bigipafm/config/pipeline.js @@ -33,8 +33,7 @@ var map_getEventCategoryActivity = { var dup1 = constant("Deny"); -var hdr1 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hfld2,true), Constant(' '), Field(hhostname,true), Constant(' '), Field(hfld3,true), Constant(' '), Field(hfld4,true), Constant(' '), Field(hfld5,true), Constant(' [F5@'), Field(hfld6,true), Constant(' '), Field(payload,false)}" -match("HEADER#0:0001", "message", "%{hfld1->} %{hfld2->} %{hhostname->} %{hfld3->} %{hfld4->} %{hfld5->} [F5@%{hfld6->} %{payload}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "%{hfld1->} %{hfld2->} %{hhostname->} %{hfld3->} %{hfld4->} %{hfld5->} [F5@%{hfld6->} %{payload}", processor_chain([ setc("header_id","0001"), setc("messageid","BIGIP_AFM"), ])); diff --git a/x-pack/filebeat/module/fortinet/fortimail/config/pipeline.js b/x-pack/filebeat/module/fortinet/fortimail/config/pipeline.js index b40147eb1d5..28f099e0484 100644 --- a/x-pack/filebeat/module/fortinet/fortimail/config/pipeline.js +++ b/x-pack/filebeat/module/fortinet/fortimail/config/pipeline.js @@ -31,20 +31,15 @@ var dup1 = call({ ], }); -var dup2 = // "Pattern{Constant('user='), Field(username,true), Constant(' ui='), Field(p0,false)}" -match("MESSAGE#0:event_admin/0", "nwparser.payload", "user=%{username->} ui=%{p0}"); +var dup2 = match("MESSAGE#0:event_admin/0", "nwparser.payload", "user=%{username->} ui=%{p0}"); -var dup3 = // "Pattern{Field(network_service,false), Constant('('), Field(saddr,false), Constant(') action='), Field(p0,false)}" -match("MESSAGE#0:event_admin/1_0", "nwparser.p0", "%{network_service}(%{saddr}) action=%{p0}"); +var dup3 = match("MESSAGE#0:event_admin/1_0", "nwparser.p0", "%{network_service}(%{saddr}) action=%{p0}"); -var dup4 = // "Pattern{Field(network_service,true), Constant(' action='), Field(p0,false)}" -match("MESSAGE#0:event_admin/1_1", "nwparser.p0", "%{network_service->} action=%{p0}"); +var dup4 = match("MESSAGE#0:event_admin/1_1", "nwparser.p0", "%{network_service->} action=%{p0}"); -var dup5 = // "Pattern{Constant('"'), Field(event_description,false), Constant('"')}" -match("MESSAGE#0:event_admin/3_0", "nwparser.p0", "\"%{event_description}\""); +var dup5 = match("MESSAGE#0:event_admin/3_0", "nwparser.p0", "\"%{event_description}\""); -var dup6 = // "Pattern{Field(event_description,false)}" -match_copy("MESSAGE#0:event_admin/3_1", "nwparser.p0", "event_description"); +var dup6 = match_copy("MESSAGE#0:event_admin/3_1", "nwparser.p0", "event_description"); var dup7 = setc("eventcategory","1401000000"); @@ -70,139 +65,97 @@ var dup14 = setf("category","msgIdPart2"); var dup15 = setf("severity","hseverity"); -var dup16 = // "Pattern{Field(action,true), Constant(' status='), Field(event_state,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#1:event_pop3/2", "nwparser.p0", "%{action->} status=%{event_state->} msg=%{p0}"); +var dup16 = match("MESSAGE#1:event_pop3/2", "nwparser.p0", "%{action->} status=%{event_state->} msg=%{p0}"); var dup17 = setc("eventcategory","1602000000"); -var dup18 = // "Pattern{Constant('user='), Field(username,false), Constant('ui='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/0", "nwparser.payload", "user=%{username}ui=%{p0}"); +var dup18 = match("MESSAGE#5:event_smtp:01/0", "nwparser.payload", "user=%{username}ui=%{p0}"); -var dup19 = // "Pattern{Field(network_service,false), Constant('('), Field(hostip,false), Constant(') action='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/1_0", "nwparser.p0", "%{network_service}(%{hostip}) action=%{p0}"); +var dup19 = match("MESSAGE#5:event_smtp:01/1_0", "nwparser.p0", "%{network_service}(%{hostip}) action=%{p0}"); -var dup20 = // "Pattern{Field(network_service,false), Constant('action='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/1_1", "nwparser.p0", "%{network_service}action=%{p0}"); +var dup20 = match("MESSAGE#5:event_smtp:01/1_1", "nwparser.p0", "%{network_service}action=%{p0}"); -var dup21 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/2", "nwparser.p0", "%{action}status=%{event_state}session_id=%{p0}"); +var dup21 = match("MESSAGE#5:event_smtp:01/2", "nwparser.p0", "%{action}status=%{event_state}session_id=%{p0}"); -var dup22 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('"msg="STARTTLS='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/3_0", "nwparser.p0", "\"%{sessionid}\"msg=\"STARTTLS=%{p0}"); +var dup22 = match("MESSAGE#5:event_smtp:01/3_0", "nwparser.p0", "\"%{sessionid}\"msg=\"STARTTLS=%{p0}"); -var dup23 = // "Pattern{Field(sessionid,false), Constant('msg="STARTTLS='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/3_1", "nwparser.p0", "%{sessionid}msg=\"STARTTLS=%{p0}"); +var dup23 = match("MESSAGE#5:event_smtp:01/3_1", "nwparser.p0", "%{sessionid}msg=\"STARTTLS=%{p0}"); -var dup24 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('" msg='), Field(p0,false)}" -match("MESSAGE#16:event_smtp/3_0", "nwparser.p0", "\"%{sessionid}\" msg=%{p0}"); +var dup24 = match("MESSAGE#16:event_smtp/3_0", "nwparser.p0", "\"%{sessionid}\" msg=%{p0}"); -var dup25 = // "Pattern{Field(sessionid,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#16:event_smtp/3_1", "nwparser.p0", "%{sessionid->} msg=%{p0}"); +var dup25 = match("MESSAGE#16:event_smtp/3_1", "nwparser.p0", "%{sessionid->} msg=%{p0}"); -var dup26 = // "Pattern{Constant('from='), Field(p0,false)}" -match("MESSAGE#20:virus/0", "nwparser.payload", "from=%{p0}"); +var dup26 = match("MESSAGE#20:virus/0", "nwparser.payload", "from=%{p0}"); -var dup27 = // "Pattern{Constant('"'), Field(from,false), Constant('" to='), Field(p0,false)}" -match("MESSAGE#20:virus/1_0", "nwparser.p0", "\"%{from}\" to=%{p0}"); +var dup27 = match("MESSAGE#20:virus/1_0", "nwparser.p0", "\"%{from}\" to=%{p0}"); -var dup28 = // "Pattern{Field(from,true), Constant(' to='), Field(p0,false)}" -match("MESSAGE#20:virus/1_1", "nwparser.p0", "%{from->} to=%{p0}"); +var dup28 = match("MESSAGE#20:virus/1_1", "nwparser.p0", "%{from->} to=%{p0}"); -var dup29 = // "Pattern{Constant('"'), Field(to,false), Constant('" src='), Field(p0,false)}" -match("MESSAGE#20:virus/2_0", "nwparser.p0", "\"%{to}\" src=%{p0}"); +var dup29 = match("MESSAGE#20:virus/2_0", "nwparser.p0", "\"%{to}\" src=%{p0}"); -var dup30 = // "Pattern{Field(to,true), Constant(' src='), Field(p0,false)}" -match("MESSAGE#20:virus/2_1", "nwparser.p0", "%{to->} src=%{p0}"); +var dup30 = match("MESSAGE#20:virus/2_1", "nwparser.p0", "%{to->} src=%{p0}"); -var dup31 = // "Pattern{Constant('"'), Field(saddr,false), Constant('" session_id='), Field(p0,false)}" -match("MESSAGE#20:virus/3_0", "nwparser.p0", "\"%{saddr}\" session_id=%{p0}"); +var dup31 = match("MESSAGE#20:virus/3_0", "nwparser.p0", "\"%{saddr}\" session_id=%{p0}"); -var dup32 = // "Pattern{Field(saddr,true), Constant(' session_id='), Field(p0,false)}" -match("MESSAGE#20:virus/3_1", "nwparser.p0", "%{saddr->} session_id=%{p0}"); +var dup32 = match("MESSAGE#20:virus/3_1", "nwparser.p0", "%{saddr->} session_id=%{p0}"); var dup33 = setc("eventcategory","1003010000"); var dup34 = setf("event_type","messageid"); -var dup35 = // "Pattern{Constant('session_id='), Field(p0,false)}" -match("MESSAGE#23:statistics/0", "nwparser.payload", "session_id=%{p0}"); +var dup35 = match("MESSAGE#23:statistics/0", "nwparser.payload", "session_id=%{p0}"); -var dup36 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('" from='), Field(p0,false)}" -match("MESSAGE#23:statistics/1_0", "nwparser.p0", "\"%{sessionid}\" from=%{p0}"); +var dup36 = match("MESSAGE#23:statistics/1_0", "nwparser.p0", "\"%{sessionid}\" from=%{p0}"); -var dup37 = // "Pattern{Field(sessionid,true), Constant(' from='), Field(p0,false)}" -match("MESSAGE#23:statistics/1_1", "nwparser.p0", "%{sessionid->} from=%{p0}"); +var dup37 = match("MESSAGE#23:statistics/1_1", "nwparser.p0", "%{sessionid->} from=%{p0}"); -var dup38 = // "Pattern{Constant('"'), Field(from,false), Constant('" mailer='), Field(p0,false)}" -match("MESSAGE#23:statistics/2_0", "nwparser.p0", "\"%{from}\" mailer=%{p0}"); +var dup38 = match("MESSAGE#23:statistics/2_0", "nwparser.p0", "\"%{from}\" mailer=%{p0}"); -var dup39 = // "Pattern{Field(from,true), Constant(' mailer='), Field(p0,false)}" -match("MESSAGE#23:statistics/2_1", "nwparser.p0", "%{from->} mailer=%{p0}"); +var dup39 = match("MESSAGE#23:statistics/2_1", "nwparser.p0", "%{from->} mailer=%{p0}"); -var dup40 = // "Pattern{Constant('"'), Field(agent,false), Constant('" client_name="'), Field(p0,false)}" -match("MESSAGE#23:statistics/3_0", "nwparser.p0", "\"%{agent}\" client_name=\"%{p0}"); +var dup40 = match("MESSAGE#23:statistics/3_0", "nwparser.p0", "\"%{agent}\" client_name=\"%{p0}"); -var dup41 = // "Pattern{Field(agent,true), Constant(' client_name="'), Field(p0,false)}" -match("MESSAGE#23:statistics/3_1", "nwparser.p0", "%{agent->} client_name=\"%{p0}"); +var dup41 = match("MESSAGE#23:statistics/3_1", "nwparser.p0", "%{agent->} client_name=\"%{p0}"); -var dup42 = // "Pattern{Field(fqdn,true), Constant(' ['), Field(saddr,false), Constant('] ('), Field(info,false), Constant(')"'), Field(p0,false)}" -match("MESSAGE#23:statistics/4_0", "nwparser.p0", "%{fqdn->} [%{saddr}] (%{info})\"%{p0}"); +var dup42 = match("MESSAGE#23:statistics/4_0", "nwparser.p0", "%{fqdn->} [%{saddr}] (%{info})\"%{p0}"); -var dup43 = // "Pattern{Field(fqdn,true), Constant(' ['), Field(saddr,false), Constant(']"'), Field(p0,false)}" -match("MESSAGE#23:statistics/4_1", "nwparser.p0", "%{fqdn->} [%{saddr}]\"%{p0}"); +var dup43 = match("MESSAGE#23:statistics/4_1", "nwparser.p0", "%{fqdn->} [%{saddr}]\"%{p0}"); -var dup44 = // "Pattern{Field(saddr,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#23:statistics/4_2", "nwparser.p0", "%{saddr}\"%{p0}"); +var dup44 = match("MESSAGE#23:statistics/4_2", "nwparser.p0", "%{saddr}\"%{p0}"); -var dup45 = // "Pattern{Constant('"'), Field(context,false), Constant('" to='), Field(p0,false)}" -match("MESSAGE#23:statistics/6_0", "nwparser.p0", "\"%{context}\" to=%{p0}"); +var dup45 = match("MESSAGE#23:statistics/6_0", "nwparser.p0", "\"%{context}\" to=%{p0}"); -var dup46 = // "Pattern{Field(context,true), Constant(' to='), Field(p0,false)}" -match("MESSAGE#23:statistics/6_1", "nwparser.p0", "%{context->} to=%{p0}"); +var dup46 = match("MESSAGE#23:statistics/6_1", "nwparser.p0", "%{context->} to=%{p0}"); -var dup47 = // "Pattern{Constant('"'), Field(to,false), Constant('" direction='), Field(p0,false)}" -match("MESSAGE#23:statistics/7_0", "nwparser.p0", "\"%{to}\" direction=%{p0}"); +var dup47 = match("MESSAGE#23:statistics/7_0", "nwparser.p0", "\"%{to}\" direction=%{p0}"); -var dup48 = // "Pattern{Field(to,true), Constant(' direction='), Field(p0,false)}" -match("MESSAGE#23:statistics/7_1", "nwparser.p0", "%{to->} direction=%{p0}"); +var dup48 = match("MESSAGE#23:statistics/7_1", "nwparser.p0", "%{to->} direction=%{p0}"); -var dup49 = // "Pattern{Constant('"'), Field(direction,false), Constant('" message_length='), Field(p0,false)}" -match("MESSAGE#23:statistics/8_0", "nwparser.p0", "\"%{direction}\" message_length=%{p0}"); +var dup49 = match("MESSAGE#23:statistics/8_0", "nwparser.p0", "\"%{direction}\" message_length=%{p0}"); -var dup50 = // "Pattern{Field(direction,true), Constant(' message_length='), Field(p0,false)}" -match("MESSAGE#23:statistics/8_1", "nwparser.p0", "%{direction->} message_length=%{p0}"); +var dup50 = match("MESSAGE#23:statistics/8_1", "nwparser.p0", "%{direction->} message_length=%{p0}"); -var dup51 = // "Pattern{Field(fld4,true), Constant(' virus='), Field(p0,false)}" -match("MESSAGE#23:statistics/9", "nwparser.p0", "%{fld4->} virus=%{p0}"); +var dup51 = match("MESSAGE#23:statistics/9", "nwparser.p0", "%{fld4->} virus=%{p0}"); -var dup52 = // "Pattern{Constant('"'), Field(virusname,false), Constant('" disposition='), Field(p0,false)}" -match("MESSAGE#23:statistics/10_0", "nwparser.p0", "\"%{virusname}\" disposition=%{p0}"); +var dup52 = match("MESSAGE#23:statistics/10_0", "nwparser.p0", "\"%{virusname}\" disposition=%{p0}"); -var dup53 = // "Pattern{Field(virusname,true), Constant(' disposition='), Field(p0,false)}" -match("MESSAGE#23:statistics/10_1", "nwparser.p0", "%{virusname->} disposition=%{p0}"); +var dup53 = match("MESSAGE#23:statistics/10_1", "nwparser.p0", "%{virusname->} disposition=%{p0}"); -var dup54 = // "Pattern{Constant('"'), Field(disposition,false), Constant('" classifier='), Field(p0,false)}" -match("MESSAGE#23:statistics/11_0", "nwparser.p0", "\"%{disposition}\" classifier=%{p0}"); +var dup54 = match("MESSAGE#23:statistics/11_0", "nwparser.p0", "\"%{disposition}\" classifier=%{p0}"); -var dup55 = // "Pattern{Field(disposition,true), Constant(' classifier='), Field(p0,false)}" -match("MESSAGE#23:statistics/11_1", "nwparser.p0", "%{disposition->} classifier=%{p0}"); +var dup55 = match("MESSAGE#23:statistics/11_1", "nwparser.p0", "%{disposition->} classifier=%{p0}"); -var dup56 = // "Pattern{Constant('"'), Field(filter,false), Constant('" subject='), Field(p0,false)}" -match("MESSAGE#23:statistics/12_0", "nwparser.p0", "\"%{filter}\" subject=%{p0}"); +var dup56 = match("MESSAGE#23:statistics/12_0", "nwparser.p0", "\"%{filter}\" subject=%{p0}"); -var dup57 = // "Pattern{Field(filter,true), Constant(' subject='), Field(p0,false)}" -match("MESSAGE#23:statistics/12_1", "nwparser.p0", "%{filter->} subject=%{p0}"); +var dup57 = match("MESSAGE#23:statistics/12_1", "nwparser.p0", "%{filter->} subject=%{p0}"); -var dup58 = // "Pattern{Constant('"'), Field(subject,false), Constant('"')}" -match("MESSAGE#23:statistics/13_0", "nwparser.p0", "\"%{subject}\""); +var dup58 = match("MESSAGE#23:statistics/13_0", "nwparser.p0", "\"%{subject}\""); -var dup59 = // "Pattern{Field(subject,false)}" -match_copy("MESSAGE#23:statistics/13_1", "nwparser.p0", "subject"); +var dup59 = match_copy("MESSAGE#23:statistics/13_1", "nwparser.p0", "subject"); var dup60 = setc("eventcategory","1207000000"); -var dup61 = // "Pattern{Field(,false), Constant('resolved='), Field(p0,false)}" -match("MESSAGE#24:statistics:01/5", "nwparser.p0", "%{}resolved=%{p0}"); +var dup61 = match("MESSAGE#24:statistics:01/5", "nwparser.p0", "%{}resolved=%{p0}"); var dup62 = setc("eventcategory","1207040000"); @@ -322,25 +275,21 @@ var dup82 = all_match({ ]), }); -var hdr1 = // "Pattern{Constant('date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' device_id='), Field(hfld1,true), Constant(' log_id='), Field(hfld2,true), Constant(' log_part='), Field(hfld3,true), Constant(' type='), Field(msgIdPart1,true), Constant(' subtype='), Field(msgIdPart2,true), Constant(' pri='), Field(hseverity,true), Constant(' '), Field(payload,false)}" -match("HEADER#0:0001", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} log_part=%{hfld3->} type=%{msgIdPart1->} subtype=%{msgIdPart2->} pri=%{hseverity->} %{payload}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} log_part=%{hfld3->} type=%{msgIdPart1->} subtype=%{msgIdPart2->} pri=%{hseverity->} %{payload}", processor_chain([ setc("header_id","0001"), dup1, ])); -var hdr2 = // "Pattern{Constant('date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' device_id='), Field(hfld1,true), Constant(' log_id='), Field(hfld2,true), Constant(' log_part='), Field(hfld3,true), Constant(' type='), Field(messageid,true), Constant(' pri='), Field(hseverity,true), Constant(' '), Field(payload,false)}" -match("HEADER#1:0002", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} log_part=%{hfld3->} type=%{messageid->} pri=%{hseverity->} %{payload}", processor_chain([ +var hdr2 = match("HEADER#1:0002", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} log_part=%{hfld3->} type=%{messageid->} pri=%{hseverity->} %{payload}", processor_chain([ setc("header_id","0002"), ])); -var hdr3 = // "Pattern{Constant('date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' device_id='), Field(hfld1,true), Constant(' log_id='), Field(hfld2,true), Constant(' type='), Field(msgIdPart1,true), Constant(' subtype='), Field(msgIdPart2,true), Constant(' pri='), Field(hseverity,true), Constant(' '), Field(payload,false)}" -match("HEADER#2:0003", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} type=%{msgIdPart1->} subtype=%{msgIdPart2->} pri=%{hseverity->} %{payload}", processor_chain([ +var hdr3 = match("HEADER#2:0003", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} type=%{msgIdPart1->} subtype=%{msgIdPart2->} pri=%{hseverity->} %{payload}", processor_chain([ setc("header_id","0003"), dup1, ])); -var hdr4 = // "Pattern{Constant('date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' device_id='), Field(hfld1,true), Constant(' log_id='), Field(hfld2,true), Constant(' type='), Field(messageid,true), Constant(' pri='), Field(hseverity,true), Constant(' '), Field(payload,false)}" -match("HEADER#3:0004", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} type=%{messageid->} pri=%{hseverity->} %{payload}", processor_chain([ +var hdr4 = match("HEADER#3:0004", "message", "date=%{hdate->} time=%{htime->} device_id=%{hfld1->} log_id=%{hfld2->} type=%{messageid->} pri=%{hseverity->} %{payload}", processor_chain([ setc("header_id","0004"), ])); @@ -351,8 +300,7 @@ var select1 = linear_select([ hdr4, ]); -var part1 = // "Pattern{Field(action,true), Constant(' status='), Field(event_state,true), Constant(' reason='), Field(result,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#0:event_admin/2", "nwparser.p0", "%{action->} status=%{event_state->} reason=%{result->} msg=%{p0}"); +var part1 = match("MESSAGE#0:event_admin/2", "nwparser.p0", "%{action->} status=%{event_state->} reason=%{result->} msg=%{p0}"); var all1 = all_match({ processors: [ @@ -404,22 +352,18 @@ var msg4 = msg("event_system", dup82); var msg5 = msg("event_imap", dup82); -var part2 = // "Pattern{Field(fld1,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/4", "nwparser.p0", "%{fld1}, relay=%{p0}"); +var part2 = match("MESSAGE#5:event_smtp:01/4", "nwparser.p0", "%{fld1}, relay=%{p0}"); -var part3 = // "Pattern{Field(shost,false), Constant('['), Field(saddr,false), Constant('], version='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/5_0", "nwparser.p0", "%{shost}[%{saddr}], version=%{p0}"); +var part3 = match("MESSAGE#5:event_smtp:01/5_0", "nwparser.p0", "%{shost}[%{saddr}], version=%{p0}"); -var part4 = // "Pattern{Field(shost,false), Constant(', version='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/5_1", "nwparser.p0", "%{shost}, version=%{p0}"); +var part4 = match("MESSAGE#5:event_smtp:01/5_1", "nwparser.p0", "%{shost}, version=%{p0}"); var select2 = linear_select([ part3, part4, ]); -var part5 = // "Pattern{Field(version,false), Constant(', verify='), Field(fld2,false), Constant(', cipher='), Field(s_cipher,false), Constant(', bits='), Field(fld3,false), Constant('"')}" -match("MESSAGE#5:event_smtp:01/6", "nwparser.p0", "%{version}, verify=%{fld2}, cipher=%{s_cipher}, bits=%{fld3}\""); +var part5 = match("MESSAGE#5:event_smtp:01/6", "nwparser.p0", "%{version}, verify=%{fld2}, cipher=%{s_cipher}, bits=%{fld3}\""); var all3 = all_match({ processors: [ @@ -446,8 +390,7 @@ var all3 = all_match({ var msg6 = msg("event_smtp:01", all3); -var part6 = // "Pattern{Field(fld1,false), Constant(', cert-subject='), Field(cert_subject,false), Constant(', cert-issuer='), Field(fld2,false), Constant(', verifymsg='), Field(fld3,false), Constant('"')}" -match("MESSAGE#6:event_smtp:02/4", "nwparser.p0", "%{fld1}, cert-subject=%{cert_subject}, cert-issuer=%{fld2}, verifymsg=%{fld3}\""); +var part6 = match("MESSAGE#6:event_smtp:02/4", "nwparser.p0", "%{fld1}, cert-subject=%{cert_subject}, cert-issuer=%{fld2}, verifymsg=%{fld3}\""); var all4 = all_match({ processors: [ @@ -472,8 +415,7 @@ var all4 = all_match({ var msg7 = msg("event_smtp:02", all4); -var part7 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="to=<<'), Field(to,false), Constant('>, delay='), Field(fld1,false), Constant(', xdelay='), Field(fld2,false), Constant(', mailer='), Field(protocol,false), Constant(', pri='), Field(fld3,false), Constant(', relay='), Field(shost,false), Constant('['), Field(saddr,false), Constant('], dsn='), Field(fld4,false), Constant(', stat='), Field(fld5,false), Constant('"')}" -match("MESSAGE#7:event_smtp:03/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"to=\u003c\u003c%{to}>, delay=%{fld1}, xdelay=%{fld2}, mailer=%{protocol}, pri=%{fld3}, relay=%{shost}[%{saddr}], dsn=%{fld4}, stat=%{fld5}\""); +var part7 = match("MESSAGE#7:event_smtp:03/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"to=\u003c\u003c%{to}>, delay=%{fld1}, xdelay=%{fld2}, mailer=%{protocol}, pri=%{fld3}, relay=%{shost}[%{saddr}], dsn=%{fld4}, stat=%{fld5}\""); var all5 = all_match({ processors: [ @@ -496,31 +438,24 @@ var all5 = all_match({ var msg8 = msg("event_smtp:03", all5); -var part8 = // "Pattern{Constant('user='), Field(username,false), Constant('ui='), Field(network_service,false), Constant('action='), Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="from=<<'), Field(from,false), Constant('>, size='), Field(bytes,false), Constant(', class='), Field(fld2,false), Constant(', nrcpts='), Field(p0,false)}" -match("MESSAGE#8:event_smtp:04/0", "nwparser.payload", "user=%{username}ui=%{network_service}action=%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"from=\u003c\u003c%{from}>, size=%{bytes}, class=%{fld2}, nrcpts=%{p0}"); +var part8 = match("MESSAGE#8:event_smtp:04/0", "nwparser.payload", "user=%{username}ui=%{network_service}action=%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"from=\u003c\u003c%{from}>, size=%{bytes}, class=%{fld2}, nrcpts=%{p0}"); -var part9 = // "Pattern{Field(fld3,false), Constant(', msgid=<<'), Field(fld4,false), Constant('>, proto='), Field(p0,false)}" -match("MESSAGE#8:event_smtp:04/1_0", "nwparser.p0", "%{fld3}, msgid=\u003c\u003c%{fld4}>, proto=%{p0}"); +var part9 = match("MESSAGE#8:event_smtp:04/1_0", "nwparser.p0", "%{fld3}, msgid=\u003c\u003c%{fld4}>, proto=%{p0}"); -var part10 = // "Pattern{Field(fld3,false), Constant(', proto='), Field(p0,false)}" -match("MESSAGE#8:event_smtp:04/1_1", "nwparser.p0", "%{fld3}, proto=%{p0}"); +var part10 = match("MESSAGE#8:event_smtp:04/1_1", "nwparser.p0", "%{fld3}, proto=%{p0}"); var select3 = linear_select([ part9, part10, ]); -var part11 = // "Pattern{Field(protocol,false), Constant(', daemon='), Field(process,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#8:event_smtp:04/2", "nwparser.p0", "%{protocol}, daemon=%{process}, relay=%{p0}"); +var part11 = match("MESSAGE#8:event_smtp:04/2", "nwparser.p0", "%{protocol}, daemon=%{process}, relay=%{p0}"); -var part12 = // "Pattern{Field(shost,false), Constant('['), Field(saddr,false), Constant('] (may be forged)"')}" -match("MESSAGE#8:event_smtp:04/3_0", "nwparser.p0", "%{shost}[%{saddr}] (may be forged)\""); +var part12 = match("MESSAGE#8:event_smtp:04/3_0", "nwparser.p0", "%{shost}[%{saddr}] (may be forged)\""); -var part13 = // "Pattern{Field(shost,false), Constant('['), Field(saddr,false), Constant(']"')}" -match("MESSAGE#8:event_smtp:04/3_1", "nwparser.p0", "%{shost}[%{saddr}]\""); +var part13 = match("MESSAGE#8:event_smtp:04/3_1", "nwparser.p0", "%{shost}[%{saddr}]\""); -var part14 = // "Pattern{Field(shost,false), Constant('"')}" -match("MESSAGE#8:event_smtp:04/3_2", "nwparser.p0", "%{shost}\""); +var part14 = match("MESSAGE#8:event_smtp:04/3_2", "nwparser.p0", "%{shost}\""); var select4 = linear_select([ part12, @@ -550,8 +485,7 @@ var all6 = all_match({ var msg9 = msg("event_smtp:04", all6); -var part15 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="Milter: to=<<'), Field(to,false), Constant('>, reject='), Field(fld1,false), Constant('"')}" -match("MESSAGE#9:event_smtp:05/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"Milter: to=\u003c\u003c%{to}>, reject=%{fld1}\""); +var part15 = match("MESSAGE#9:event_smtp:05/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"Milter: to=\u003c\u003c%{to}>, reject=%{fld1}\""); var all7 = all_match({ processors: [ @@ -574,22 +508,18 @@ var all7 = all_match({ var msg10 = msg("event_smtp:05", all7); -var part16 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="timeout waiting for input from'), Field(p0,false)}" -match("MESSAGE#10:event_smtp:06/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"timeout waiting for input from%{p0}"); +var part16 = match("MESSAGE#10:event_smtp:06/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"timeout waiting for input from%{p0}"); -var part17 = // "Pattern{Constant('['), Field(saddr,false), Constant(']during server cmd'), Field(p0,false)}" -match("MESSAGE#10:event_smtp:06/3_0", "nwparser.p0", "[%{saddr}]during server cmd%{p0}"); +var part17 = match("MESSAGE#10:event_smtp:06/3_0", "nwparser.p0", "[%{saddr}]during server cmd%{p0}"); -var part18 = // "Pattern{Field(saddr,false), Constant('during server cmd'), Field(p0,false)}" -match("MESSAGE#10:event_smtp:06/3_1", "nwparser.p0", "%{saddr}during server cmd%{p0}"); +var part18 = match("MESSAGE#10:event_smtp:06/3_1", "nwparser.p0", "%{saddr}during server cmd%{p0}"); var select5 = linear_select([ part17, part18, ]); -var part19 = // "Pattern{Field(fld5,false), Constant('"')}" -match("MESSAGE#10:event_smtp:06/4", "nwparser.p0", "%{fld5}\""); +var part19 = match("MESSAGE#10:event_smtp:06/4", "nwparser.p0", "%{fld5}\""); var all8 = all_match({ processors: [ @@ -614,8 +544,7 @@ var all8 = all_match({ var msg11 = msg("event_smtp:06", all8); -var part20 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="collect:'), Field(fld1,false), Constant('timeout on connection from'), Field(shost,false), Constant(', from=<<'), Field(from,false), Constant('>"')}" -match("MESSAGE#11:event_smtp:07/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"collect:%{fld1}timeout on connection from%{shost}, from=\u003c\u003c%{from}>\""); +var part20 = match("MESSAGE#11:event_smtp:07/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"collect:%{fld1}timeout on connection from%{shost}, from=\u003c\u003c%{from}>\""); var all9 = all_match({ processors: [ @@ -638,8 +567,7 @@ var all9 = all_match({ var msg12 = msg("event_smtp:07", all9); -var part21 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="DSN: to <<'), Field(to,false), Constant('>; reason:'), Field(result,false), Constant('; sessionid:'), Field(fld5,false), Constant('"')}" -match("MESSAGE#12:event_smtp:08/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"DSN: to \u003c\u003c%{to}>; reason:%{result}; sessionid:%{fld5}\""); +var part21 = match("MESSAGE#12:event_smtp:08/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"DSN: to \u003c\u003c%{to}>; reason:%{result}; sessionid:%{fld5}\""); var all10 = all_match({ processors: [ @@ -662,8 +590,7 @@ var all10 = all_match({ var msg13 = msg("event_smtp:08", all10); -var part22 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="lost input channel from'), Field(shost,false), Constant('['), Field(saddr,false), Constant('] (may be forged) to SMTP_MTA after rcpt"')}" -match("MESSAGE#13:event_smtp:09/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"lost input channel from%{shost}[%{saddr}] (may be forged) to SMTP_MTA after rcpt\""); +var part22 = match("MESSAGE#13:event_smtp:09/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"lost input channel from%{shost}[%{saddr}] (may be forged) to SMTP_MTA after rcpt\""); var all11 = all_match({ processors: [ @@ -686,8 +613,7 @@ var all11 = all_match({ var msg14 = msg("event_smtp:09", all11); -var part23 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" msg="'), Field(shost,false), Constant('['), Field(saddr,false), Constant(']: possible SMTP attack: command='), Field(fld1,false), Constant(', count='), Field(dclass_counter1,false), Constant('"')}" -match("MESSAGE#14:event_smtp:10/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"%{shost}[%{saddr}]: possible SMTP attack: command=%{fld1}, count=%{dclass_counter1}\""); +var part23 = match("MESSAGE#14:event_smtp:10/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" msg=\"%{shost}[%{saddr}]: possible SMTP attack: command=%{fld1}, count=%{dclass_counter1}\""); var all12 = all_match({ processors: [ @@ -711,20 +637,15 @@ var all12 = all_match({ var msg15 = msg("event_smtp:10", all12); -var part24 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id="'), Field(sessionid,false), Constant('" log_part='), Field(id1,true), Constant(' msg="to=<<'), Field(to,false), Constant(', delay='), Field(p0,false)}" -match("MESSAGE#15:event_smtp:11/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" log_part=%{id1->} msg=\"to=\u003c\u003c%{to}, delay=%{p0}"); +var part24 = match("MESSAGE#15:event_smtp:11/2", "nwparser.p0", "%{action}status=%{event_state}session_id=\"%{sessionid}\" log_part=%{id1->} msg=\"to=\u003c\u003c%{to}, delay=%{p0}"); -var part25 = // "Pattern{Field(fld1,false), Constant(', xdelay='), Field(fld2,false), Constant(', mailer='), Field(protocol,false), Constant(', pri='), Field(fld3,false), Constant(', relay='), Field(shost,false), Constant('"')}" -match("MESSAGE#15:event_smtp:11/3_0", "nwparser.p0", "%{fld1}, xdelay=%{fld2}, mailer=%{protocol}, pri=%{fld3}, relay=%{shost}\""); +var part25 = match("MESSAGE#15:event_smtp:11/3_0", "nwparser.p0", "%{fld1}, xdelay=%{fld2}, mailer=%{protocol}, pri=%{fld3}, relay=%{shost}\""); -var part26 = // "Pattern{Field(fld1,false), Constant(', xdelay='), Field(fld2,false), Constant(', mailer='), Field(protocol,false), Constant(', pri='), Field(fld3,false), Constant('"')}" -match("MESSAGE#15:event_smtp:11/3_1", "nwparser.p0", "%{fld1}, xdelay=%{fld2}, mailer=%{protocol}, pri=%{fld3}\""); +var part26 = match("MESSAGE#15:event_smtp:11/3_1", "nwparser.p0", "%{fld1}, xdelay=%{fld2}, mailer=%{protocol}, pri=%{fld3}\""); -var part27 = // "Pattern{Field(fld1,false), Constant(', xdelay='), Field(fld2,false), Constant(', mailer='), Field(protocol,false), Constant('"')}" -match("MESSAGE#15:event_smtp:11/3_2", "nwparser.p0", "%{fld1}, xdelay=%{fld2}, mailer=%{protocol}\""); +var part27 = match("MESSAGE#15:event_smtp:11/3_2", "nwparser.p0", "%{fld1}, xdelay=%{fld2}, mailer=%{protocol}\""); -var part28 = // "Pattern{Field(fld1,false), Constant('"')}" -match("MESSAGE#15:event_smtp:11/3_3", "nwparser.p0", "%{fld1}\""); +var part28 = match("MESSAGE#15:event_smtp:11/3_3", "nwparser.p0", "%{fld1}\""); var select6 = linear_select([ part25, @@ -755,8 +676,7 @@ var all13 = all_match({ var msg16 = msg("event_smtp:11", all13); -var part29 = // "Pattern{Field(action,true), Constant(' status='), Field(event_state,true), Constant(' session_id='), Field(p0,false)}" -match("MESSAGE#16:event_smtp/2", "nwparser.p0", "%{action->} status=%{event_state->} session_id=%{p0}"); +var part29 = match("MESSAGE#16:event_smtp/2", "nwparser.p0", "%{action->} status=%{event_state->} session_id=%{p0}"); var all14 = all_match({ processors: [ @@ -819,8 +739,7 @@ var select7 = linear_select([ msg18, ]); -var part31 = // "Pattern{Constant('msg='), Field(p0,false)}" -match("MESSAGE#18:event_update/0", "nwparser.payload", "msg=%{p0}"); +var part31 = match("MESSAGE#18:event_update/0", "nwparser.payload", "msg=%{p0}"); var all15 = all_match({ processors: [ @@ -842,19 +761,16 @@ var all15 = all_match({ var msg19 = msg("event_update", all15); -var part32 = // "Pattern{Field(network_service,false), Constant('('), Field(saddr,false), Constant(') module='), Field(p0,false)}" -match("MESSAGE#19:event_config/1_0", "nwparser.p0", "%{network_service}(%{saddr}) module=%{p0}"); +var part32 = match("MESSAGE#19:event_config/1_0", "nwparser.p0", "%{network_service}(%{saddr}) module=%{p0}"); -var part33 = // "Pattern{Field(network_service,true), Constant(' module='), Field(p0,false)}" -match("MESSAGE#19:event_config/1_1", "nwparser.p0", "%{network_service->} module=%{p0}"); +var part33 = match("MESSAGE#19:event_config/1_1", "nwparser.p0", "%{network_service->} module=%{p0}"); var select8 = linear_select([ part32, part33, ]); -var part34 = // "Pattern{Field(fld1,true), Constant(' submodule='), Field(fld2,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#19:event_config/2", "nwparser.p0", "%{fld1->} submodule=%{fld2->} msg=%{p0}"); +var part34 = match("MESSAGE#19:event_config/2", "nwparser.p0", "%{fld1->} submodule=%{fld2->} msg=%{p0}"); var all16 = all_match({ processors: [ @@ -906,19 +822,16 @@ var all17 = all_match({ var msg21 = msg("virus", all17); -var part35 = // "Pattern{Constant('"'), Field(to,false), Constant('" client_name="'), Field(p0,false)}" -match("MESSAGE#21:virus_infected/2_0", "nwparser.p0", "\"%{to}\" client_name=\"%{p0}"); +var part35 = match("MESSAGE#21:virus_infected/2_0", "nwparser.p0", "\"%{to}\" client_name=\"%{p0}"); -var part36 = // "Pattern{Field(to,true), Constant(' client_name="'), Field(p0,false)}" -match("MESSAGE#21:virus_infected/2_1", "nwparser.p0", "%{to->} client_name=\"%{p0}"); +var part36 = match("MESSAGE#21:virus_infected/2_1", "nwparser.p0", "%{to->} client_name=\"%{p0}"); var select10 = linear_select([ part35, part36, ]); -var part37 = // "Pattern{Field(fqdn,false), Constant('" client_ip="'), Field(saddr,false), Constant('" session_id='), Field(p0,false)}" -match("MESSAGE#21:virus_infected/3", "nwparser.p0", "%{fqdn}\" client_ip=\"%{saddr}\" session_id=%{p0}"); +var part37 = match("MESSAGE#21:virus_infected/3", "nwparser.p0", "%{fqdn}\" client_ip=\"%{saddr}\" session_id=%{p0}"); var all18 = all_match({ processors: [ @@ -943,28 +856,22 @@ var all18 = all_match({ var msg22 = msg("virus_infected", all18); -var part38 = // "Pattern{Constant('from="'), Field(from,false), Constant('" to='), Field(p0,false)}" -match("MESSAGE#22:virus_file-signature/0_0", "nwparser.payload", "from=\"%{from}\" to=%{p0}"); +var part38 = match("MESSAGE#22:virus_file-signature/0_0", "nwparser.payload", "from=\"%{from}\" to=%{p0}"); -var part39 = // "Pattern{Field(from,true), Constant(' to='), Field(p0,false)}" -match("MESSAGE#22:virus_file-signature/0_1", "nwparser.payload", "%{from->} to=%{p0}"); +var part39 = match("MESSAGE#22:virus_file-signature/0_1", "nwparser.payload", "%{from->} to=%{p0}"); var select11 = linear_select([ part38, part39, ]); -var part40 = // "Pattern{Constant('"'), Field(sdomain,true), Constant(' ['), Field(saddr,false), Constant(']" session_id='), Field(p0,false)}" -match("MESSAGE#22:virus_file-signature/2_0", "nwparser.p0", "\"%{sdomain->} [%{saddr}]\" session_id=%{p0}"); +var part40 = match("MESSAGE#22:virus_file-signature/2_0", "nwparser.p0", "\"%{sdomain->} [%{saddr}]\" session_id=%{p0}"); -var part41 = // "Pattern{Field(sdomain,true), Constant(' ['), Field(saddr,false), Constant('] session_id='), Field(p0,false)}" -match("MESSAGE#22:virus_file-signature/2_1", "nwparser.p0", "%{sdomain->} [%{saddr}] session_id=%{p0}"); +var part41 = match("MESSAGE#22:virus_file-signature/2_1", "nwparser.p0", "%{sdomain->} [%{saddr}] session_id=%{p0}"); -var part42 = // "Pattern{Constant('"['), Field(saddr,false), Constant(']" session_id='), Field(p0,false)}" -match("MESSAGE#22:virus_file-signature/2_2", "nwparser.p0", "\"[%{saddr}]\" session_id=%{p0}"); +var part42 = match("MESSAGE#22:virus_file-signature/2_2", "nwparser.p0", "\"[%{saddr}]\" session_id=%{p0}"); -var part43 = // "Pattern{Constant('['), Field(saddr,false), Constant('] session_id='), Field(p0,false)}" -match("MESSAGE#22:virus_file-signature/2_3", "nwparser.p0", "[%{saddr}] session_id=%{p0}"); +var part43 = match("MESSAGE#22:virus_file-signature/2_3", "nwparser.p0", "[%{saddr}] session_id=%{p0}"); var select12 = linear_select([ part40, @@ -975,8 +882,7 @@ var select12 = linear_select([ dup32, ]); -var part44 = // "Pattern{Constant('"Attachment file ('), Field(filename,false), Constant(') has sha1 hash value: '), Field(checksum,false), Constant('"')}" -match("MESSAGE#22:virus_file-signature/4_0", "nwparser.p0", "\"Attachment file (%{filename}) has sha1 hash value: %{checksum}\""); +var part44 = match("MESSAGE#22:virus_file-signature/4_0", "nwparser.p0", "\"Attachment file (%{filename}) has sha1 hash value: %{checksum}\""); var select13 = linear_select([ part44, @@ -1006,8 +912,7 @@ var all19 = all_match({ var msg23 = msg("virus_file-signature", all19); -var part45 = // "Pattern{Field(,false), Constant('MSISDN='), Field(fld3,true), Constant(' resolved='), Field(p0,false)}" -match("MESSAGE#23:statistics/5", "nwparser.p0", "%{}MSISDN=%{fld3->} resolved=%{p0}"); +var part45 = match("MESSAGE#23:statistics/5", "nwparser.p0", "%{}MSISDN=%{fld3->} resolved=%{p0}"); var all20 = all_match({ processors: [ @@ -1071,74 +976,61 @@ var all21 = all_match({ var msg25 = msg("statistics:01", all21); -var part46 = // "Pattern{Constant('"'), Field(direction,false), Constant('" subject='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/4_0", "nwparser.p0", "\"%{direction}\" subject=%{p0}"); +var part46 = match("MESSAGE#25:statistics:02/4_0", "nwparser.p0", "\"%{direction}\" subject=%{p0}"); -var part47 = // "Pattern{Field(direction,true), Constant(' subject='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/4_1", "nwparser.p0", "%{direction->} subject=%{p0}"); +var part47 = match("MESSAGE#25:statistics:02/4_1", "nwparser.p0", "%{direction->} subject=%{p0}"); var select14 = linear_select([ part46, part47, ]); -var part48 = // "Pattern{Constant('"'), Field(subject,false), Constant('" classifier='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/5_0", "nwparser.p0", "\"%{subject}\" classifier=%{p0}"); +var part48 = match("MESSAGE#25:statistics:02/5_0", "nwparser.p0", "\"%{subject}\" classifier=%{p0}"); -var part49 = // "Pattern{Field(subject,true), Constant(' classifier='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/5_1", "nwparser.p0", "%{subject->} classifier=%{p0}"); +var part49 = match("MESSAGE#25:statistics:02/5_1", "nwparser.p0", "%{subject->} classifier=%{p0}"); var select15 = linear_select([ part48, part49, ]); -var part50 = // "Pattern{Constant('"'), Field(filter,false), Constant('" disposition='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/6_0", "nwparser.p0", "\"%{filter}\" disposition=%{p0}"); +var part50 = match("MESSAGE#25:statistics:02/6_0", "nwparser.p0", "\"%{filter}\" disposition=%{p0}"); -var part51 = // "Pattern{Field(filter,true), Constant(' disposition='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/6_1", "nwparser.p0", "%{filter->} disposition=%{p0}"); +var part51 = match("MESSAGE#25:statistics:02/6_1", "nwparser.p0", "%{filter->} disposition=%{p0}"); var select16 = linear_select([ part50, part51, ]); -var part52 = // "Pattern{Constant('"'), Field(disposition,false), Constant('" client_name="'), Field(p0,false)}" -match("MESSAGE#25:statistics:02/7_0", "nwparser.p0", "\"%{disposition}\" client_name=\"%{p0}"); +var part52 = match("MESSAGE#25:statistics:02/7_0", "nwparser.p0", "\"%{disposition}\" client_name=\"%{p0}"); -var part53 = // "Pattern{Field(disposition,true), Constant(' client_name="'), Field(p0,false)}" -match("MESSAGE#25:statistics:02/7_1", "nwparser.p0", "%{disposition->} client_name=\"%{p0}"); +var part53 = match("MESSAGE#25:statistics:02/7_1", "nwparser.p0", "%{disposition->} client_name=\"%{p0}"); var select17 = linear_select([ part52, part53, ]); -var part54 = // "Pattern{Constant('"'), Field(context,false), Constant('" virus='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/10_0", "nwparser.p0", "\"%{context}\" virus=%{p0}"); +var part54 = match("MESSAGE#25:statistics:02/10_0", "nwparser.p0", "\"%{context}\" virus=%{p0}"); -var part55 = // "Pattern{Field(context,true), Constant(' virus='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/10_1", "nwparser.p0", "%{context->} virus=%{p0}"); +var part55 = match("MESSAGE#25:statistics:02/10_1", "nwparser.p0", "%{context->} virus=%{p0}"); var select18 = linear_select([ part54, part55, ]); -var part56 = // "Pattern{Constant('"'), Field(virusname,false), Constant('" message_length='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/11_0", "nwparser.p0", "\"%{virusname}\" message_length=%{p0}"); +var part56 = match("MESSAGE#25:statistics:02/11_0", "nwparser.p0", "\"%{virusname}\" message_length=%{p0}"); -var part57 = // "Pattern{Field(virusname,true), Constant(' message_length='), Field(p0,false)}" -match("MESSAGE#25:statistics:02/11_1", "nwparser.p0", "%{virusname->} message_length=%{p0}"); +var part57 = match("MESSAGE#25:statistics:02/11_1", "nwparser.p0", "%{virusname->} message_length=%{p0}"); var select19 = linear_select([ part56, part57, ]); -var part58 = // "Pattern{Field(fld4,false)}" -match_copy("MESSAGE#25:statistics:02/12", "nwparser.p0", "fld4"); +var part58 = match_copy("MESSAGE#25:statistics:02/12", "nwparser.p0", "fld4"); var all22 = all_match({ processors: [ @@ -1170,17 +1062,13 @@ var all22 = all_match({ var msg26 = msg("statistics:02", all22); -var part59 = // "Pattern{Constant('session_id="'), Field(sessionid,false), Constant('" client_name="'), Field(p0,false)}" -match("MESSAGE#26:statistics:03/0", "nwparser.payload", "session_id=\"%{sessionid}\" client_name=\"%{p0}"); +var part59 = match("MESSAGE#26:statistics:03/0", "nwparser.payload", "session_id=\"%{sessionid}\" client_name=\"%{p0}"); -var part60 = // "Pattern{Field(fqdn,false), Constant('['), Field(saddr,false), Constant('] (may be forged)"'), Field(p0,false)}" -match("MESSAGE#26:statistics:03/1_0", "nwparser.p0", "%{fqdn}[%{saddr}] (may be forged)\"%{p0}"); +var part60 = match("MESSAGE#26:statistics:03/1_0", "nwparser.p0", "%{fqdn}[%{saddr}] (may be forged)\"%{p0}"); -var part61 = // "Pattern{Field(fqdn,false), Constant('['), Field(saddr,false), Constant(']"'), Field(p0,false)}" -match("MESSAGE#26:statistics:03/1_1", "nwparser.p0", "%{fqdn}[%{saddr}]\"%{p0}"); +var part61 = match("MESSAGE#26:statistics:03/1_1", "nwparser.p0", "%{fqdn}[%{saddr}]\"%{p0}"); -var part62 = // "Pattern{Constant('['), Field(saddr,false), Constant(']"'), Field(p0,false)}" -match("MESSAGE#26:statistics:03/1_2", "nwparser.p0", "[%{saddr}]\"%{p0}"); +var part62 = match("MESSAGE#26:statistics:03/1_2", "nwparser.p0", "[%{saddr}]\"%{p0}"); var select20 = linear_select([ part60, @@ -1188,22 +1076,18 @@ var select20 = linear_select([ part62, ]); -var part63 = // "Pattern{Constant('dst_ip="'), Field(daddr,false), Constant('" from="'), Field(from,false), Constant('" to="'), Field(to,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#26:statistics:03/2", "nwparser.p0", "dst_ip=\"%{daddr}\" from=\"%{from}\" to=\"%{to}\"%{p0}"); +var part63 = match("MESSAGE#26:statistics:03/2", "nwparser.p0", "dst_ip=\"%{daddr}\" from=\"%{from}\" to=\"%{to}\"%{p0}"); -var part64 = // "Pattern{Constant(' polid="'), Field(fld5,false), Constant('" domain="'), Field(domain,false), Constant('" subject="'), Field(subject,false), Constant('" mailer="'), Field(agent,false), Constant('" resolved="'), Field(context,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#26:statistics:03/3_0", "nwparser.p0", " polid=\"%{fld5}\" domain=\"%{domain}\" subject=\"%{subject}\" mailer=\"%{agent}\" resolved=\"%{context}\"%{p0}"); +var part64 = match("MESSAGE#26:statistics:03/3_0", "nwparser.p0", " polid=\"%{fld5}\" domain=\"%{domain}\" subject=\"%{subject}\" mailer=\"%{agent}\" resolved=\"%{context}\"%{p0}"); -var part65 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#26:statistics:03/3_1", "nwparser.p0", "p0"); +var part65 = match_copy("MESSAGE#26:statistics:03/3_1", "nwparser.p0", "p0"); var select21 = linear_select([ part64, part65, ]); -var part66 = // "Pattern{Field(,false), Constant('direction="'), Field(direction,false), Constant('" virus="'), Field(virusname,false), Constant('" disposition="'), Field(disposition,false), Constant('" classifier="'), Field(filter,false), Constant('" message_length='), Field(fld4,false)}" -match("MESSAGE#26:statistics:03/4", "nwparser.p0", "%{}direction=\"%{direction}\" virus=\"%{virusname}\" disposition=\"%{disposition}\" classifier=\"%{filter}\" message_length=%{fld4}"); +var part66 = match("MESSAGE#26:statistics:03/4", "nwparser.p0", "%{}direction=\"%{direction}\" virus=\"%{virusname}\" disposition=\"%{disposition}\" classifier=\"%{filter}\" message_length=%{fld4}"); var all23 = all_match({ processors: [ @@ -1227,34 +1111,26 @@ var all23 = all_match({ var msg27 = msg("statistics:03", all23); -var part67 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('" client_name='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/1_0", "nwparser.p0", "\"%{sessionid}\" client_name=%{p0}"); +var part67 = match("MESSAGE#27:statistics:04/1_0", "nwparser.p0", "\"%{sessionid}\" client_name=%{p0}"); -var part68 = // "Pattern{Field(sessionid,true), Constant(' client_name='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/1_1", "nwparser.p0", "%{sessionid->} client_name=%{p0}"); +var part68 = match("MESSAGE#27:statistics:04/1_1", "nwparser.p0", "%{sessionid->} client_name=%{p0}"); var select22 = linear_select([ part67, part68, ]); -var part69 = // "Pattern{Constant('"'), Field(fqdn,false), Constant('['), Field(saddr,false), Constant(']"dst_ip='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/2_0", "nwparser.p0", "\"%{fqdn}[%{saddr}]\"dst_ip=%{p0}"); +var part69 = match("MESSAGE#27:statistics:04/2_0", "nwparser.p0", "\"%{fqdn}[%{saddr}]\"dst_ip=%{p0}"); -var part70 = // "Pattern{Field(fqdn,false), Constant('['), Field(saddr,false), Constant(']dst_ip='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/2_1", "nwparser.p0", "%{fqdn}[%{saddr}]dst_ip=%{p0}"); +var part70 = match("MESSAGE#27:statistics:04/2_1", "nwparser.p0", "%{fqdn}[%{saddr}]dst_ip=%{p0}"); -var part71 = // "Pattern{Constant('"['), Field(saddr,false), Constant(']"dst_ip='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/2_2", "nwparser.p0", "\"[%{saddr}]\"dst_ip=%{p0}"); +var part71 = match("MESSAGE#27:statistics:04/2_2", "nwparser.p0", "\"[%{saddr}]\"dst_ip=%{p0}"); -var part72 = // "Pattern{Constant('['), Field(saddr,false), Constant(']dst_ip='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/2_3", "nwparser.p0", "[%{saddr}]dst_ip=%{p0}"); +var part72 = match("MESSAGE#27:statistics:04/2_3", "nwparser.p0", "[%{saddr}]dst_ip=%{p0}"); -var part73 = // "Pattern{Constant('"'), Field(saddr,false), Constant('"dst_ip='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/2_4", "nwparser.p0", "\"%{saddr}\"dst_ip=%{p0}"); +var part73 = match("MESSAGE#27:statistics:04/2_4", "nwparser.p0", "\"%{saddr}\"dst_ip=%{p0}"); -var part74 = // "Pattern{Field(saddr,false), Constant('dst_ip='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/2_5", "nwparser.p0", "%{saddr}dst_ip=%{p0}"); +var part74 = match("MESSAGE#27:statistics:04/2_5", "nwparser.p0", "%{saddr}dst_ip=%{p0}"); var select23 = linear_select([ part69, @@ -1265,132 +1141,108 @@ var select23 = linear_select([ part74, ]); -var part75 = // "Pattern{Constant('"'), Field(daddr,false), Constant('" from='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/3_0", "nwparser.p0", "\"%{daddr}\" from=%{p0}"); +var part75 = match("MESSAGE#27:statistics:04/3_0", "nwparser.p0", "\"%{daddr}\" from=%{p0}"); -var part76 = // "Pattern{Field(daddr,true), Constant(' from='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/3_1", "nwparser.p0", "%{daddr->} from=%{p0}"); +var part76 = match("MESSAGE#27:statistics:04/3_1", "nwparser.p0", "%{daddr->} from=%{p0}"); var select24 = linear_select([ part75, part76, ]); -var part77 = // "Pattern{Constant('"'), Field(from,false), Constant('" hfrom='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/4_0", "nwparser.p0", "\"%{from}\" hfrom=%{p0}"); +var part77 = match("MESSAGE#27:statistics:04/4_0", "nwparser.p0", "\"%{from}\" hfrom=%{p0}"); -var part78 = // "Pattern{Field(from,true), Constant(' hfrom='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/4_1", "nwparser.p0", "%{from->} hfrom=%{p0}"); +var part78 = match("MESSAGE#27:statistics:04/4_1", "nwparser.p0", "%{from->} hfrom=%{p0}"); var select25 = linear_select([ part77, part78, ]); -var part79 = // "Pattern{Constant('"'), Field(fld3,false), Constant('" to='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/5_0", "nwparser.p0", "\"%{fld3}\" to=%{p0}"); +var part79 = match("MESSAGE#27:statistics:04/5_0", "nwparser.p0", "\"%{fld3}\" to=%{p0}"); -var part80 = // "Pattern{Field(fld3,true), Constant(' to='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/5_1", "nwparser.p0", "%{fld3->} to=%{p0}"); +var part80 = match("MESSAGE#27:statistics:04/5_1", "nwparser.p0", "%{fld3->} to=%{p0}"); var select26 = linear_select([ part79, part80, ]); -var part81 = // "Pattern{Constant('"'), Field(to,false), Constant('" polid='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/6_0", "nwparser.p0", "\"%{to}\" polid=%{p0}"); +var part81 = match("MESSAGE#27:statistics:04/6_0", "nwparser.p0", "\"%{to}\" polid=%{p0}"); -var part82 = // "Pattern{Field(to,true), Constant(' polid='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/6_1", "nwparser.p0", "%{to->} polid=%{p0}"); +var part82 = match("MESSAGE#27:statistics:04/6_1", "nwparser.p0", "%{to->} polid=%{p0}"); var select27 = linear_select([ part81, part82, ]); -var part83 = // "Pattern{Constant('"'), Field(fld5,false), Constant('" domain='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/7_0", "nwparser.p0", "\"%{fld5}\" domain=%{p0}"); +var part83 = match("MESSAGE#27:statistics:04/7_0", "nwparser.p0", "\"%{fld5}\" domain=%{p0}"); -var part84 = // "Pattern{Field(fld5,true), Constant(' domain='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/7_1", "nwparser.p0", "%{fld5->} domain=%{p0}"); +var part84 = match("MESSAGE#27:statistics:04/7_1", "nwparser.p0", "%{fld5->} domain=%{p0}"); var select28 = linear_select([ part83, part84, ]); -var part85 = // "Pattern{Constant('"'), Field(domain,false), Constant('" subject='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/8_0", "nwparser.p0", "\"%{domain}\" subject=%{p0}"); +var part85 = match("MESSAGE#27:statistics:04/8_0", "nwparser.p0", "\"%{domain}\" subject=%{p0}"); -var part86 = // "Pattern{Field(domain,true), Constant(' subject='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/8_1", "nwparser.p0", "%{domain->} subject=%{p0}"); +var part86 = match("MESSAGE#27:statistics:04/8_1", "nwparser.p0", "%{domain->} subject=%{p0}"); var select29 = linear_select([ part85, part86, ]); -var part87 = // "Pattern{Constant('"'), Field(subject,false), Constant('" mailer='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/9_0", "nwparser.p0", "\"%{subject}\" mailer=%{p0}"); +var part87 = match("MESSAGE#27:statistics:04/9_0", "nwparser.p0", "\"%{subject}\" mailer=%{p0}"); -var part88 = // "Pattern{Field(subject,true), Constant(' mailer='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/9_1", "nwparser.p0", "%{subject->} mailer=%{p0}"); +var part88 = match("MESSAGE#27:statistics:04/9_1", "nwparser.p0", "%{subject->} mailer=%{p0}"); var select30 = linear_select([ part87, part88, ]); -var part89 = // "Pattern{Constant('"'), Field(agent,false), Constant('" resolved='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/10_0", "nwparser.p0", "\"%{agent}\" resolved=%{p0}"); +var part89 = match("MESSAGE#27:statistics:04/10_0", "nwparser.p0", "\"%{agent}\" resolved=%{p0}"); -var part90 = // "Pattern{Field(agent,true), Constant(' resolved='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/10_1", "nwparser.p0", "%{agent->} resolved=%{p0}"); +var part90 = match("MESSAGE#27:statistics:04/10_1", "nwparser.p0", "%{agent->} resolved=%{p0}"); var select31 = linear_select([ part89, part90, ]); -var part91 = // "Pattern{Constant('"'), Field(context,false), Constant('" direction='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/11_0", "nwparser.p0", "\"%{context}\" direction=%{p0}"); +var part91 = match("MESSAGE#27:statistics:04/11_0", "nwparser.p0", "\"%{context}\" direction=%{p0}"); -var part92 = // "Pattern{Field(context,true), Constant(' direction='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/11_1", "nwparser.p0", "%{context->} direction=%{p0}"); +var part92 = match("MESSAGE#27:statistics:04/11_1", "nwparser.p0", "%{context->} direction=%{p0}"); var select32 = linear_select([ part91, part92, ]); -var part93 = // "Pattern{Constant('"'), Field(direction,false), Constant('" virus='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/12_0", "nwparser.p0", "\"%{direction}\" virus=%{p0}"); +var part93 = match("MESSAGE#27:statistics:04/12_0", "nwparser.p0", "\"%{direction}\" virus=%{p0}"); -var part94 = // "Pattern{Field(direction,true), Constant(' virus='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/12_1", "nwparser.p0", "%{direction->} virus=%{p0}"); +var part94 = match("MESSAGE#27:statistics:04/12_1", "nwparser.p0", "%{direction->} virus=%{p0}"); var select33 = linear_select([ part93, part94, ]); -var part95 = // "Pattern{Constant('"'), Field(filter,false), Constant('" message_length='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/15_0", "nwparser.p0", "\"%{filter}\" message_length=%{p0}"); +var part95 = match("MESSAGE#27:statistics:04/15_0", "nwparser.p0", "\"%{filter}\" message_length=%{p0}"); -var part96 = // "Pattern{Field(filter,true), Constant(' message_length='), Field(p0,false)}" -match("MESSAGE#27:statistics:04/15_1", "nwparser.p0", "%{filter->} message_length=%{p0}"); +var part96 = match("MESSAGE#27:statistics:04/15_1", "nwparser.p0", "%{filter->} message_length=%{p0}"); var select34 = linear_select([ part95, part96, ]); -var part97 = // "Pattern{Constant('"'), Field(fld6,false), Constant('"')}" -match("MESSAGE#27:statistics:04/16_0", "nwparser.p0", "\"%{fld6}\""); +var part97 = match("MESSAGE#27:statistics:04/16_0", "nwparser.p0", "\"%{fld6}\""); -var part98 = // "Pattern{Field(fld6,false)}" -match_copy("MESSAGE#27:statistics:04/16_1", "nwparser.p0", "fld6"); +var part98 = match_copy("MESSAGE#27:statistics:04/16_1", "nwparser.p0", "fld6"); var select35 = linear_select([ part97, @@ -1472,36 +1324,29 @@ var select36 = linear_select([ msg29, ]); -var part100 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('" client_name="'), Field(p0,false)}" -match("MESSAGE#29:spam/1_0", "nwparser.p0", "\"%{sessionid}\" client_name=\"%{p0}"); +var part100 = match("MESSAGE#29:spam/1_0", "nwparser.p0", "\"%{sessionid}\" client_name=\"%{p0}"); -var part101 = // "Pattern{Field(sessionid,true), Constant(' client_name="'), Field(p0,false)}" -match("MESSAGE#29:spam/1_1", "nwparser.p0", "%{sessionid->} client_name=\"%{p0}"); +var part101 = match("MESSAGE#29:spam/1_1", "nwparser.p0", "%{sessionid->} client_name=\"%{p0}"); var select37 = linear_select([ part100, part101, ]); -var part102 = // "Pattern{Field(,false), Constant('from='), Field(p0,false)}" -match("MESSAGE#29:spam/3", "nwparser.p0", "%{}from=%{p0}"); +var part102 = match("MESSAGE#29:spam/3", "nwparser.p0", "%{}from=%{p0}"); -var part103 = // "Pattern{Constant('"'), Field(to,false), Constant('" subject='), Field(p0,false)}" -match("MESSAGE#29:spam/5_0", "nwparser.p0", "\"%{to}\" subject=%{p0}"); +var part103 = match("MESSAGE#29:spam/5_0", "nwparser.p0", "\"%{to}\" subject=%{p0}"); -var part104 = // "Pattern{Field(to,true), Constant(' subject='), Field(p0,false)}" -match("MESSAGE#29:spam/5_1", "nwparser.p0", "%{to->} subject=%{p0}"); +var part104 = match("MESSAGE#29:spam/5_1", "nwparser.p0", "%{to->} subject=%{p0}"); var select38 = linear_select([ part103, part104, ]); -var part105 = // "Pattern{Constant('"'), Field(subject,false), Constant('" msg='), Field(p0,false)}" -match("MESSAGE#29:spam/6_0", "nwparser.p0", "\"%{subject}\" msg=%{p0}"); +var part105 = match("MESSAGE#29:spam/6_0", "nwparser.p0", "\"%{subject}\" msg=%{p0}"); -var part106 = // "Pattern{Field(subject,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#29:spam/6_1", "nwparser.p0", "%{subject->} msg=%{p0}"); +var part106 = match("MESSAGE#29:spam/6_1", "nwparser.p0", "%{subject->} msg=%{p0}"); var select39 = linear_select([ part105, @@ -1533,8 +1378,7 @@ var all25 = all_match({ var msg30 = msg("spam", all25); -var part107 = // "Pattern{Constant('session_id="'), Field(sessionid,false), Constant('" client_name="'), Field(fqdn,true), Constant(' ['), Field(saddr,false), Constant('] ('), Field(fld2,false), Constant(')" dst_ip="'), Field(daddr,false), Constant('" from="'), Field(from,false), Constant('" to="'), Field(to,false), Constant('" subject="'), Field(subject,false), Constant('" msg="'), Field(event_description,false), Constant('"')}" -match("MESSAGE#30:spam:04", "nwparser.payload", "session_id=\"%{sessionid}\" client_name=\"%{fqdn->} [%{saddr}] (%{fld2})\" dst_ip=\"%{daddr}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" msg=\"%{event_description}\"", processor_chain([ +var part107 = match("MESSAGE#30:spam:04", "nwparser.payload", "session_id=\"%{sessionid}\" client_name=\"%{fqdn->} [%{saddr}] (%{fld2})\" dst_ip=\"%{daddr}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" msg=\"%{event_description}\"", processor_chain([ dup62, dup8, dup9, @@ -1547,22 +1391,18 @@ match("MESSAGE#30:spam:04", "nwparser.payload", "session_id=\"%{sessionid}\" cli var msg31 = msg("spam:04", part107); -var part108 = // "Pattern{Constant('session_id="'), Field(sessionid,false), Constant('" client_name='), Field(p0,false)}" -match("MESSAGE#31:spam:03/0", "nwparser.payload", "session_id=\"%{sessionid}\" client_name=%{p0}"); +var part108 = match("MESSAGE#31:spam:03/0", "nwparser.payload", "session_id=\"%{sessionid}\" client_name=%{p0}"); -var part109 = // "Pattern{Constant('"'), Field(fqdn,true), Constant(' ['), Field(saddr,false), Constant(']" '), Field(p0,false)}" -match("MESSAGE#31:spam:03/1_0", "nwparser.p0", "\"%{fqdn->} [%{saddr}]\" %{p0}"); +var part109 = match("MESSAGE#31:spam:03/1_0", "nwparser.p0", "\"%{fqdn->} [%{saddr}]\" %{p0}"); -var part110 = // "Pattern{Constant(' "'), Field(fqdn,false), Constant('" client_ip="'), Field(saddr,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#31:spam:03/1_1", "nwparser.p0", " \"%{fqdn}\" client_ip=\"%{saddr}\"%{p0}"); +var part110 = match("MESSAGE#31:spam:03/1_1", "nwparser.p0", " \"%{fqdn}\" client_ip=\"%{saddr}\"%{p0}"); var select40 = linear_select([ part109, part110, ]); -var part111 = // "Pattern{Field(,false), Constant('dst_ip="'), Field(daddr,false), Constant('" from="'), Field(from,false), Constant('" to="'), Field(to,false), Constant('" subject="'), Field(subject,false), Constant('" msg="'), Field(event_description,false), Constant('"')}" -match("MESSAGE#31:spam:03/2", "nwparser.p0", "%{}dst_ip=\"%{daddr}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" msg=\"%{event_description}\""); +var part111 = match("MESSAGE#31:spam:03/2", "nwparser.p0", "%{}dst_ip=\"%{daddr}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" msg=\"%{event_description}\""); var all26 = all_match({ processors: [ @@ -1584,8 +1424,7 @@ var all26 = all_match({ var msg32 = msg("spam:03", all26); -var part112 = // "Pattern{Constant('session_id="'), Field(sessionid,false), Constant('" from="'), Field(from,false), Constant('" to="'), Field(to,false), Constant('" subject="'), Field(subject,false), Constant('" msg="'), Field(event_description,false), Constant('"')}" -match("MESSAGE#32:spam:02", "nwparser.payload", "session_id=\"%{sessionid}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" msg=\"%{event_description}\"", processor_chain([ +var part112 = match("MESSAGE#32:spam:02", "nwparser.payload", "session_id=\"%{sessionid}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" msg=\"%{event_description}\"", processor_chain([ dup62, dup8, dup9, @@ -1598,11 +1437,9 @@ match("MESSAGE#32:spam:02", "nwparser.payload", "session_id=\"%{sessionid}\" fro var msg33 = msg("spam:02", part112); -var part113 = // "Pattern{Constant('"'), Field(to,false), Constant('" msg='), Field(p0,false)}" -match("MESSAGE#33:spam:01/3_0", "nwparser.p0", "\"%{to}\" msg=%{p0}"); +var part113 = match("MESSAGE#33:spam:01/3_0", "nwparser.p0", "\"%{to}\" msg=%{p0}"); -var part114 = // "Pattern{Field(to,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#33:spam:01/3_1", "nwparser.p0", "%{to->} msg=%{p0}"); +var part114 = match("MESSAGE#33:spam:01/3_1", "nwparser.p0", "%{to->} msg=%{p0}"); var select41 = linear_select([ part113, @@ -1658,146 +1495,99 @@ var chain1 = processor_chain([ }), ]); -var part115 = // "Pattern{Constant('user='), Field(username,true), Constant(' ui='), Field(p0,false)}" -match("MESSAGE#0:event_admin/0", "nwparser.payload", "user=%{username->} ui=%{p0}"); +var part115 = match("MESSAGE#0:event_admin/0", "nwparser.payload", "user=%{username->} ui=%{p0}"); -var part116 = // "Pattern{Field(network_service,false), Constant('('), Field(saddr,false), Constant(') action='), Field(p0,false)}" -match("MESSAGE#0:event_admin/1_0", "nwparser.p0", "%{network_service}(%{saddr}) action=%{p0}"); +var part116 = match("MESSAGE#0:event_admin/1_0", "nwparser.p0", "%{network_service}(%{saddr}) action=%{p0}"); -var part117 = // "Pattern{Field(network_service,true), Constant(' action='), Field(p0,false)}" -match("MESSAGE#0:event_admin/1_1", "nwparser.p0", "%{network_service->} action=%{p0}"); +var part117 = match("MESSAGE#0:event_admin/1_1", "nwparser.p0", "%{network_service->} action=%{p0}"); -var part118 = // "Pattern{Constant('"'), Field(event_description,false), Constant('"')}" -match("MESSAGE#0:event_admin/3_0", "nwparser.p0", "\"%{event_description}\""); +var part118 = match("MESSAGE#0:event_admin/3_0", "nwparser.p0", "\"%{event_description}\""); -var part119 = // "Pattern{Field(event_description,false)}" -match_copy("MESSAGE#0:event_admin/3_1", "nwparser.p0", "event_description"); +var part119 = match_copy("MESSAGE#0:event_admin/3_1", "nwparser.p0", "event_description"); -var part120 = // "Pattern{Field(action,true), Constant(' status='), Field(event_state,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#1:event_pop3/2", "nwparser.p0", "%{action->} status=%{event_state->} msg=%{p0}"); +var part120 = match("MESSAGE#1:event_pop3/2", "nwparser.p0", "%{action->} status=%{event_state->} msg=%{p0}"); -var part121 = // "Pattern{Constant('user='), Field(username,false), Constant('ui='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/0", "nwparser.payload", "user=%{username}ui=%{p0}"); +var part121 = match("MESSAGE#5:event_smtp:01/0", "nwparser.payload", "user=%{username}ui=%{p0}"); -var part122 = // "Pattern{Field(network_service,false), Constant('('), Field(hostip,false), Constant(') action='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/1_0", "nwparser.p0", "%{network_service}(%{hostip}) action=%{p0}"); +var part122 = match("MESSAGE#5:event_smtp:01/1_0", "nwparser.p0", "%{network_service}(%{hostip}) action=%{p0}"); -var part123 = // "Pattern{Field(network_service,false), Constant('action='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/1_1", "nwparser.p0", "%{network_service}action=%{p0}"); +var part123 = match("MESSAGE#5:event_smtp:01/1_1", "nwparser.p0", "%{network_service}action=%{p0}"); -var part124 = // "Pattern{Field(action,false), Constant('status='), Field(event_state,false), Constant('session_id='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/2", "nwparser.p0", "%{action}status=%{event_state}session_id=%{p0}"); +var part124 = match("MESSAGE#5:event_smtp:01/2", "nwparser.p0", "%{action}status=%{event_state}session_id=%{p0}"); -var part125 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('"msg="STARTTLS='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/3_0", "nwparser.p0", "\"%{sessionid}\"msg=\"STARTTLS=%{p0}"); +var part125 = match("MESSAGE#5:event_smtp:01/3_0", "nwparser.p0", "\"%{sessionid}\"msg=\"STARTTLS=%{p0}"); -var part126 = // "Pattern{Field(sessionid,false), Constant('msg="STARTTLS='), Field(p0,false)}" -match("MESSAGE#5:event_smtp:01/3_1", "nwparser.p0", "%{sessionid}msg=\"STARTTLS=%{p0}"); +var part126 = match("MESSAGE#5:event_smtp:01/3_1", "nwparser.p0", "%{sessionid}msg=\"STARTTLS=%{p0}"); -var part127 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('" msg='), Field(p0,false)}" -match("MESSAGE#16:event_smtp/3_0", "nwparser.p0", "\"%{sessionid}\" msg=%{p0}"); +var part127 = match("MESSAGE#16:event_smtp/3_0", "nwparser.p0", "\"%{sessionid}\" msg=%{p0}"); -var part128 = // "Pattern{Field(sessionid,true), Constant(' msg='), Field(p0,false)}" -match("MESSAGE#16:event_smtp/3_1", "nwparser.p0", "%{sessionid->} msg=%{p0}"); +var part128 = match("MESSAGE#16:event_smtp/3_1", "nwparser.p0", "%{sessionid->} msg=%{p0}"); -var part129 = // "Pattern{Constant('from='), Field(p0,false)}" -match("MESSAGE#20:virus/0", "nwparser.payload", "from=%{p0}"); +var part129 = match("MESSAGE#20:virus/0", "nwparser.payload", "from=%{p0}"); -var part130 = // "Pattern{Constant('"'), Field(from,false), Constant('" to='), Field(p0,false)}" -match("MESSAGE#20:virus/1_0", "nwparser.p0", "\"%{from}\" to=%{p0}"); +var part130 = match("MESSAGE#20:virus/1_0", "nwparser.p0", "\"%{from}\" to=%{p0}"); -var part131 = // "Pattern{Field(from,true), Constant(' to='), Field(p0,false)}" -match("MESSAGE#20:virus/1_1", "nwparser.p0", "%{from->} to=%{p0}"); +var part131 = match("MESSAGE#20:virus/1_1", "nwparser.p0", "%{from->} to=%{p0}"); -var part132 = // "Pattern{Constant('"'), Field(to,false), Constant('" src='), Field(p0,false)}" -match("MESSAGE#20:virus/2_0", "nwparser.p0", "\"%{to}\" src=%{p0}"); +var part132 = match("MESSAGE#20:virus/2_0", "nwparser.p0", "\"%{to}\" src=%{p0}"); -var part133 = // "Pattern{Field(to,true), Constant(' src='), Field(p0,false)}" -match("MESSAGE#20:virus/2_1", "nwparser.p0", "%{to->} src=%{p0}"); +var part133 = match("MESSAGE#20:virus/2_1", "nwparser.p0", "%{to->} src=%{p0}"); -var part134 = // "Pattern{Constant('"'), Field(saddr,false), Constant('" session_id='), Field(p0,false)}" -match("MESSAGE#20:virus/3_0", "nwparser.p0", "\"%{saddr}\" session_id=%{p0}"); +var part134 = match("MESSAGE#20:virus/3_0", "nwparser.p0", "\"%{saddr}\" session_id=%{p0}"); -var part135 = // "Pattern{Field(saddr,true), Constant(' session_id='), Field(p0,false)}" -match("MESSAGE#20:virus/3_1", "nwparser.p0", "%{saddr->} session_id=%{p0}"); +var part135 = match("MESSAGE#20:virus/3_1", "nwparser.p0", "%{saddr->} session_id=%{p0}"); -var part136 = // "Pattern{Constant('session_id='), Field(p0,false)}" -match("MESSAGE#23:statistics/0", "nwparser.payload", "session_id=%{p0}"); +var part136 = match("MESSAGE#23:statistics/0", "nwparser.payload", "session_id=%{p0}"); -var part137 = // "Pattern{Constant('"'), Field(sessionid,false), Constant('" from='), Field(p0,false)}" -match("MESSAGE#23:statistics/1_0", "nwparser.p0", "\"%{sessionid}\" from=%{p0}"); +var part137 = match("MESSAGE#23:statistics/1_0", "nwparser.p0", "\"%{sessionid}\" from=%{p0}"); -var part138 = // "Pattern{Field(sessionid,true), Constant(' from='), Field(p0,false)}" -match("MESSAGE#23:statistics/1_1", "nwparser.p0", "%{sessionid->} from=%{p0}"); +var part138 = match("MESSAGE#23:statistics/1_1", "nwparser.p0", "%{sessionid->} from=%{p0}"); -var part139 = // "Pattern{Constant('"'), Field(from,false), Constant('" mailer='), Field(p0,false)}" -match("MESSAGE#23:statistics/2_0", "nwparser.p0", "\"%{from}\" mailer=%{p0}"); +var part139 = match("MESSAGE#23:statistics/2_0", "nwparser.p0", "\"%{from}\" mailer=%{p0}"); -var part140 = // "Pattern{Field(from,true), Constant(' mailer='), Field(p0,false)}" -match("MESSAGE#23:statistics/2_1", "nwparser.p0", "%{from->} mailer=%{p0}"); +var part140 = match("MESSAGE#23:statistics/2_1", "nwparser.p0", "%{from->} mailer=%{p0}"); -var part141 = // "Pattern{Constant('"'), Field(agent,false), Constant('" client_name="'), Field(p0,false)}" -match("MESSAGE#23:statistics/3_0", "nwparser.p0", "\"%{agent}\" client_name=\"%{p0}"); +var part141 = match("MESSAGE#23:statistics/3_0", "nwparser.p0", "\"%{agent}\" client_name=\"%{p0}"); -var part142 = // "Pattern{Field(agent,true), Constant(' client_name="'), Field(p0,false)}" -match("MESSAGE#23:statistics/3_1", "nwparser.p0", "%{agent->} client_name=\"%{p0}"); +var part142 = match("MESSAGE#23:statistics/3_1", "nwparser.p0", "%{agent->} client_name=\"%{p0}"); -var part143 = // "Pattern{Field(fqdn,true), Constant(' ['), Field(saddr,false), Constant('] ('), Field(info,false), Constant(')"'), Field(p0,false)}" -match("MESSAGE#23:statistics/4_0", "nwparser.p0", "%{fqdn->} [%{saddr}] (%{info})\"%{p0}"); +var part143 = match("MESSAGE#23:statistics/4_0", "nwparser.p0", "%{fqdn->} [%{saddr}] (%{info})\"%{p0}"); -var part144 = // "Pattern{Field(fqdn,true), Constant(' ['), Field(saddr,false), Constant(']"'), Field(p0,false)}" -match("MESSAGE#23:statistics/4_1", "nwparser.p0", "%{fqdn->} [%{saddr}]\"%{p0}"); +var part144 = match("MESSAGE#23:statistics/4_1", "nwparser.p0", "%{fqdn->} [%{saddr}]\"%{p0}"); -var part145 = // "Pattern{Field(saddr,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#23:statistics/4_2", "nwparser.p0", "%{saddr}\"%{p0}"); +var part145 = match("MESSAGE#23:statistics/4_2", "nwparser.p0", "%{saddr}\"%{p0}"); -var part146 = // "Pattern{Constant('"'), Field(context,false), Constant('" to='), Field(p0,false)}" -match("MESSAGE#23:statistics/6_0", "nwparser.p0", "\"%{context}\" to=%{p0}"); +var part146 = match("MESSAGE#23:statistics/6_0", "nwparser.p0", "\"%{context}\" to=%{p0}"); -var part147 = // "Pattern{Field(context,true), Constant(' to='), Field(p0,false)}" -match("MESSAGE#23:statistics/6_1", "nwparser.p0", "%{context->} to=%{p0}"); +var part147 = match("MESSAGE#23:statistics/6_1", "nwparser.p0", "%{context->} to=%{p0}"); -var part148 = // "Pattern{Constant('"'), Field(to,false), Constant('" direction='), Field(p0,false)}" -match("MESSAGE#23:statistics/7_0", "nwparser.p0", "\"%{to}\" direction=%{p0}"); +var part148 = match("MESSAGE#23:statistics/7_0", "nwparser.p0", "\"%{to}\" direction=%{p0}"); -var part149 = // "Pattern{Field(to,true), Constant(' direction='), Field(p0,false)}" -match("MESSAGE#23:statistics/7_1", "nwparser.p0", "%{to->} direction=%{p0}"); +var part149 = match("MESSAGE#23:statistics/7_1", "nwparser.p0", "%{to->} direction=%{p0}"); -var part150 = // "Pattern{Constant('"'), Field(direction,false), Constant('" message_length='), Field(p0,false)}" -match("MESSAGE#23:statistics/8_0", "nwparser.p0", "\"%{direction}\" message_length=%{p0}"); +var part150 = match("MESSAGE#23:statistics/8_0", "nwparser.p0", "\"%{direction}\" message_length=%{p0}"); -var part151 = // "Pattern{Field(direction,true), Constant(' message_length='), Field(p0,false)}" -match("MESSAGE#23:statistics/8_1", "nwparser.p0", "%{direction->} message_length=%{p0}"); +var part151 = match("MESSAGE#23:statistics/8_1", "nwparser.p0", "%{direction->} message_length=%{p0}"); -var part152 = // "Pattern{Field(fld4,true), Constant(' virus='), Field(p0,false)}" -match("MESSAGE#23:statistics/9", "nwparser.p0", "%{fld4->} virus=%{p0}"); +var part152 = match("MESSAGE#23:statistics/9", "nwparser.p0", "%{fld4->} virus=%{p0}"); -var part153 = // "Pattern{Constant('"'), Field(virusname,false), Constant('" disposition='), Field(p0,false)}" -match("MESSAGE#23:statistics/10_0", "nwparser.p0", "\"%{virusname}\" disposition=%{p0}"); +var part153 = match("MESSAGE#23:statistics/10_0", "nwparser.p0", "\"%{virusname}\" disposition=%{p0}"); -var part154 = // "Pattern{Field(virusname,true), Constant(' disposition='), Field(p0,false)}" -match("MESSAGE#23:statistics/10_1", "nwparser.p0", "%{virusname->} disposition=%{p0}"); +var part154 = match("MESSAGE#23:statistics/10_1", "nwparser.p0", "%{virusname->} disposition=%{p0}"); -var part155 = // "Pattern{Constant('"'), Field(disposition,false), Constant('" classifier='), Field(p0,false)}" -match("MESSAGE#23:statistics/11_0", "nwparser.p0", "\"%{disposition}\" classifier=%{p0}"); +var part155 = match("MESSAGE#23:statistics/11_0", "nwparser.p0", "\"%{disposition}\" classifier=%{p0}"); -var part156 = // "Pattern{Field(disposition,true), Constant(' classifier='), Field(p0,false)}" -match("MESSAGE#23:statistics/11_1", "nwparser.p0", "%{disposition->} classifier=%{p0}"); +var part156 = match("MESSAGE#23:statistics/11_1", "nwparser.p0", "%{disposition->} classifier=%{p0}"); -var part157 = // "Pattern{Constant('"'), Field(filter,false), Constant('" subject='), Field(p0,false)}" -match("MESSAGE#23:statistics/12_0", "nwparser.p0", "\"%{filter}\" subject=%{p0}"); +var part157 = match("MESSAGE#23:statistics/12_0", "nwparser.p0", "\"%{filter}\" subject=%{p0}"); -var part158 = // "Pattern{Field(filter,true), Constant(' subject='), Field(p0,false)}" -match("MESSAGE#23:statistics/12_1", "nwparser.p0", "%{filter->} subject=%{p0}"); +var part158 = match("MESSAGE#23:statistics/12_1", "nwparser.p0", "%{filter->} subject=%{p0}"); -var part159 = // "Pattern{Constant('"'), Field(subject,false), Constant('"')}" -match("MESSAGE#23:statistics/13_0", "nwparser.p0", "\"%{subject}\""); +var part159 = match("MESSAGE#23:statistics/13_0", "nwparser.p0", "\"%{subject}\""); -var part160 = // "Pattern{Field(subject,false)}" -match_copy("MESSAGE#23:statistics/13_1", "nwparser.p0", "subject"); +var part160 = match_copy("MESSAGE#23:statistics/13_1", "nwparser.p0", "subject"); -var part161 = // "Pattern{Field(,false), Constant('resolved='), Field(p0,false)}" -match("MESSAGE#24:statistics:01/5", "nwparser.p0", "%{}resolved=%{p0}"); +var part161 = match("MESSAGE#24:statistics:01/5", "nwparser.p0", "%{}resolved=%{p0}"); var select43 = linear_select([ dup3, diff --git a/x-pack/filebeat/module/fortinet/fortimanager/config/pipeline.js b/x-pack/filebeat/module/fortinet/fortimanager/config/pipeline.js index ca32adec710..4cb7669b950 100644 --- a/x-pack/filebeat/module/fortinet/fortimanager/config/pipeline.js +++ b/x-pack/filebeat/module/fortinet/fortimanager/config/pipeline.js @@ -124,8 +124,7 @@ var dup23 = lookup({ key: dup15, }); -var hdr1 = // "Pattern{Constant('date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' devname='), Field(hdevice,true), Constant(' device_id='), Field(hfld1,true), Constant(' log_id='), Field(id,true), Constant(' type='), Field(hfld2,true), Constant(' subtype='), Field(hfld3,true), Constant(' pri='), Field(hseverity,true), Constant(' '), Field(payload,false)}" -match("HEADER#0:0001", "message", "date=%{hdate->} time=%{htime->} devname=%{hdevice->} device_id=%{hfld1->} log_id=%{id->} type=%{hfld2->} subtype=%{hfld3->} pri=%{hseverity->} %{payload}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "date=%{hdate->} time=%{htime->} devname=%{hdevice->} device_id=%{hfld1->} log_id=%{id->} type=%{hfld2->} subtype=%{hfld3->} pri=%{hseverity->} %{payload}", processor_chain([ setc("header_id","0001"), call({ dest: "nwparser.messageid", @@ -137,26 +136,22 @@ match("HEADER#0:0001", "message", "date=%{hdate->} time=%{htime->} devname=%{hde }), ])); -var hdr2 = // "Pattern{Constant('logver='), Field(hfld1,true), Constant(' date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' log_id='), Field(id,true), Constant(' '), Field(payload,false)}" -match("HEADER#1:0002", "message", "logver=%{hfld1->} date=%{hdate->} time=%{htime->} log_id=%{id->} %{payload}", processor_chain([ +var hdr2 = match("HEADER#1:0002", "message", "logver=%{hfld1->} date=%{hdate->} time=%{htime->} log_id=%{id->} %{payload}", processor_chain([ setc("header_id","0002"), dup1, ])); -var hdr3 = // "Pattern{Constant('date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' logver='), Field(fld1,true), Constant(' '), Field(payload,false)}" -match("HEADER#2:0003", "message", "date=%{hdate->} time=%{htime->} logver=%{fld1->} %{payload}", processor_chain([ +var hdr3 = match("HEADER#2:0003", "message", "date=%{hdate->} time=%{htime->} logver=%{fld1->} %{payload}", processor_chain([ setc("header_id","0003"), dup1, ])); -var hdr4 = // "Pattern{Constant('logver='), Field(hfld1,true), Constant(' dtime='), Field(hdatetime,true), Constant(' devid='), Field(hfld2,true), Constant(' devname='), Field(hdevice,true), Constant(' '), Field(payload,false)}" -match("HEADER#3:0004", "message", "logver=%{hfld1->} dtime=%{hdatetime->} devid=%{hfld2->} devname=%{hdevice->} %{payload}", processor_chain([ +var hdr4 = match("HEADER#3:0004", "message", "logver=%{hfld1->} dtime=%{hdatetime->} devid=%{hfld2->} devname=%{hdevice->} %{payload}", processor_chain([ setc("header_id","0004"), dup2, ])); -var hdr5 = // "Pattern{Constant('logver='), Field(hfld1,true), Constant(' devname="'), Field(hdevice,false), Constant('" devid="'), Field(hfld2,false), Constant('" '), Field(payload,false)}" -match("HEADER#4:0005", "message", "logver=%{hfld1->} devname=\"%{hdevice}\" devid=\"%{hfld2}\" %{payload}", processor_chain([ +var hdr5 = match("HEADER#4:0005", "message", "logver=%{hfld1->} devname=\"%{hdevice}\" devid=\"%{hfld2}\" %{payload}", processor_chain([ setc("header_id","0005"), dup2, ])); @@ -169,8 +164,7 @@ var select1 = linear_select([ hdr5, ]); -var part1 = // "Pattern{Constant('user='), Field(fld1,true), Constant(' adom='), Field(domain,true), Constant(' user='), Field(username,true), Constant(' ui='), Field(fld2,true), Constant(' action='), Field(action,true), Constant(' status='), Field(event_state,true), Constant(' msg="'), Field(event_description,false), Constant('"')}" -match("MESSAGE#0:fortinetmgr:01", "nwparser.payload", "user=%{fld1->} adom=%{domain->} user=%{username->} ui=%{fld2->} action=%{action->} status=%{event_state->} msg=\"%{event_description}\"", processor_chain([ +var part1 = match("MESSAGE#0:fortinetmgr:01", "nwparser.payload", "user=%{fld1->} adom=%{domain->} user=%{username->} ui=%{fld2->} action=%{action->} status=%{event_state->} msg=\"%{event_description}\"", processor_chain([ dup3, dup4, dup5, @@ -183,8 +177,7 @@ match("MESSAGE#0:fortinetmgr:01", "nwparser.payload", "user=%{fld1->} adom=%{dom var msg1 = msg("fortinetmgr:01", part1); -var part2 = // "Pattern{Constant('user='), Field(username,true), Constant(' adom='), Field(domain,true), Constant(' msg="'), Field(event_description,false), Constant('"')}" -match("MESSAGE#1:fortinetmgr", "nwparser.payload", "user=%{username->} adom=%{domain->} msg=\"%{event_description}\"", processor_chain([ +var part2 = match("MESSAGE#1:fortinetmgr", "nwparser.payload", "user=%{username->} adom=%{domain->} msg=\"%{event_description}\"", processor_chain([ dup3, dup4, dup5, @@ -197,42 +190,33 @@ match("MESSAGE#1:fortinetmgr", "nwparser.payload", "user=%{username->} adom=%{do var msg2 = msg("fortinetmgr", part2); -var part3 = // "Pattern{Constant('user="'), Field(username,false), Constant('" userfrom='), Field(fld7,true), Constant(' msg="'), Field(p0,false)}" -match("MESSAGE#2:fortinetmgr:04/0", "nwparser.payload", "user=\"%{username}\" userfrom=%{fld7->} msg=\"%{p0}"); +var part3 = match("MESSAGE#2:fortinetmgr:04/0", "nwparser.payload", "user=\"%{username}\" userfrom=%{fld7->} msg=\"%{p0}"); -var part4 = // "Pattern{Constant('User'), Field(p0,false)}" -match("MESSAGE#2:fortinetmgr:04/1_0", "nwparser.p0", "User%{p0}"); +var part4 = match("MESSAGE#2:fortinetmgr:04/1_0", "nwparser.p0", "User%{p0}"); -var part5 = // "Pattern{Constant('user'), Field(p0,false)}" -match("MESSAGE#2:fortinetmgr:04/1_1", "nwparser.p0", "user%{p0}"); +var part5 = match("MESSAGE#2:fortinetmgr:04/1_1", "nwparser.p0", "user%{p0}"); var select2 = linear_select([ part4, part5, ]); -var part6 = // "Pattern{Field(,false), Constant('''), Field(fld3,false), Constant('' with profile ''), Field(fld4,false), Constant('' '), Field(fld5,true), Constant(' from '), Field(fld6,false), Constant('('), Field(hostip,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#2:fortinetmgr:04/2", "nwparser.p0", "%{}'%{fld3}' with profile '%{fld4}' %{fld5->} from %{fld6}(%{hostip})%{p0}"); +var part6 = match("MESSAGE#2:fortinetmgr:04/2", "nwparser.p0", "%{}'%{fld3}' with profile '%{fld4}' %{fld5->} from %{fld6}(%{hostip})%{p0}"); -var part7 = // "Pattern{Constant('."'), Field(p0,false)}" -match("MESSAGE#2:fortinetmgr:04/3_0", "nwparser.p0", ".\"%{p0}"); +var part7 = match("MESSAGE#2:fortinetmgr:04/3_0", "nwparser.p0", ".\"%{p0}"); -var part8 = // "Pattern{Constant('"'), Field(p0,false)}" -match("MESSAGE#2:fortinetmgr:04/3_1", "nwparser.p0", "\"%{p0}"); +var part8 = match("MESSAGE#2:fortinetmgr:04/3_1", "nwparser.p0", "\"%{p0}"); var select3 = linear_select([ part7, part8, ]); -var part9 = // "Pattern{Field(,false), Constant('adminprof='), Field(p0,false)}" -match("MESSAGE#2:fortinetmgr:04/4", "nwparser.p0", "%{}adminprof=%{p0}"); +var part9 = match("MESSAGE#2:fortinetmgr:04/4", "nwparser.p0", "%{}adminprof=%{p0}"); -var part10 = // "Pattern{Field(fld2,true), Constant(' sid='), Field(sid,true), Constant(' user_type="'), Field(profile,false), Constant('"')}" -match("MESSAGE#2:fortinetmgr:04/5_0", "nwparser.p0", "%{fld2->} sid=%{sid->} user_type=\"%{profile}\""); +var part10 = match("MESSAGE#2:fortinetmgr:04/5_0", "nwparser.p0", "%{fld2->} sid=%{sid->} user_type=\"%{profile}\""); -var part11 = // "Pattern{Field(fld2,false)}" -match_copy("MESSAGE#2:fortinetmgr:04/5_1", "nwparser.p0", "fld2"); +var part11 = match_copy("MESSAGE#2:fortinetmgr:04/5_1", "nwparser.p0", "fld2"); var select4 = linear_select([ part10, @@ -268,8 +252,7 @@ var all1 = all_match({ var msg3 = msg("fortinetmgr:04", all1); -var part12 = // "Pattern{Constant('user='), Field(username,true), Constant(' userfrom='), Field(fld4,true), Constant(' msg="'), Field(event_description,false), Constant('" adminprof='), Field(fld2,false)}" -match("MESSAGE#3:fortinetmgr:02", "nwparser.payload", "user=%{username->} userfrom=%{fld4->} msg=\"%{event_description}\" adminprof=%{fld2}", processor_chain([ +var part12 = match("MESSAGE#3:fortinetmgr:02", "nwparser.payload", "user=%{username->} userfrom=%{fld4->} msg=\"%{event_description}\" adminprof=%{fld2}", processor_chain([ dup3, dup4, dup5, @@ -282,8 +265,7 @@ match("MESSAGE#3:fortinetmgr:02", "nwparser.payload", "user=%{username->} userfr var msg4 = msg("fortinetmgr:02", part12); -var part13 = // "Pattern{Constant('user="'), Field(username,false), Constant('" msg="Login from ssh:'), Field(fld1,true), Constant(' for '), Field(fld2,true), Constant(' from '), Field(saddr,true), Constant(' port '), Field(sport,false), Constant('" remote_ip="'), Field(daddr,false), Constant('" remote_port='), Field(dport,true), Constant(' valid='), Field(fld3,true), Constant(' authmsg="'), Field(result,false), Constant('" extrainfo='), Field(fld5,false)}" -match("MESSAGE#4:fortinetmgr:03", "nwparser.payload", "user=\"%{username}\" msg=\"Login from ssh:%{fld1->} for %{fld2->} from %{saddr->} port %{sport}\" remote_ip=\"%{daddr}\" remote_port=%{dport->} valid=%{fld3->} authmsg=\"%{result}\" extrainfo=%{fld5}", processor_chain([ +var part13 = match("MESSAGE#4:fortinetmgr:03", "nwparser.payload", "user=\"%{username}\" msg=\"Login from ssh:%{fld1->} for %{fld2->} from %{saddr->} port %{sport}\" remote_ip=\"%{daddr}\" remote_port=%{dport->} valid=%{fld3->} authmsg=\"%{result}\" extrainfo=%{fld5}", processor_chain([ dup11, dup4, dup5, @@ -302,22 +284,18 @@ match("MESSAGE#4:fortinetmgr:03", "nwparser.payload", "user=\"%{username}\" msg= var msg5 = msg("fortinetmgr:03", part13); -var part14 = // "Pattern{Constant('user="'), Field(username,false), Constant('" userfrom="'), Field(fld1,false), Constant('"msg="'), Field(p0,false)}" -match("MESSAGE#5:fortinetmgr:05/0", "nwparser.payload", "user=\"%{username}\" userfrom=\"%{fld1}\"msg=\"%{p0}"); +var part14 = match("MESSAGE#5:fortinetmgr:05/0", "nwparser.payload", "user=\"%{username}\" userfrom=\"%{fld1}\"msg=\"%{p0}"); -var part15 = // "Pattern{Constant('dev='), Field(fld2,false), Constant(',vdom='), Field(fld3,false), Constant(',type='), Field(fld4,false), Constant(',key='), Field(fld5,false), Constant(',act='), Field(action,false), Constant(',pkgname='), Field(fld7,false), Constant(',allowaccess='), Field(fld8,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#5:fortinetmgr:05/1_0", "nwparser.p0", "dev=%{fld2},vdom=%{fld3},type=%{fld4},key=%{fld5},act=%{action},pkgname=%{fld7},allowaccess=%{fld8}\"%{p0}"); +var part15 = match("MESSAGE#5:fortinetmgr:05/1_0", "nwparser.p0", "dev=%{fld2},vdom=%{fld3},type=%{fld4},key=%{fld5},act=%{action},pkgname=%{fld7},allowaccess=%{fld8}\"%{p0}"); -var part16 = // "Pattern{Field(event_description,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#5:fortinetmgr:05/1_1", "nwparser.p0", "%{event_description}\"%{p0}"); +var part16 = match("MESSAGE#5:fortinetmgr:05/1_1", "nwparser.p0", "%{event_description}\"%{p0}"); var select5 = linear_select([ part15, part16, ]); -var part17 = // "Pattern{Field(domain,false), Constant('" adom="')}" -match("MESSAGE#5:fortinetmgr:05/2", "nwparser.p0", "%{domain}\" adom=\""); +var part17 = match("MESSAGE#5:fortinetmgr:05/2", "nwparser.p0", "%{domain}\" adom=\""); var all2 = all_match({ processors: [ diff --git a/x-pack/filebeat/module/juniper/netscreen/config/pipeline.js b/x-pack/filebeat/module/juniper/netscreen/config/pipeline.js index 4f4110c94a8..a35f5d2a21f 100644 --- a/x-pack/filebeat/module/juniper/netscreen/config/pipeline.js +++ b/x-pack/filebeat/module/juniper/netscreen/config/pipeline.js @@ -49,14 +49,11 @@ var dup4 = setf("msg","$MSG"); var dup5 = setf("severity","hseverity"); -var dup6 = // "Pattern{Constant('Address '), Field(group_object,true), Constant(' for '), Field(p0,false)}" -match("MESSAGE#2:00001:02/0", "nwparser.payload", "Address %{group_object->} for %{p0}"); +var dup6 = match("MESSAGE#2:00001:02/0", "nwparser.payload", "Address %{group_object->} for %{p0}"); -var dup7 = // "Pattern{Constant('domain address '), Field(domain,true), Constant(' in zone '), Field(p0,false)}" -match("MESSAGE#2:00001:02/1_1", "nwparser.p0", "domain address %{domain->} in zone %{p0}"); +var dup7 = match("MESSAGE#2:00001:02/1_1", "nwparser.p0", "domain address %{domain->} in zone %{p0}"); -var dup8 = // "Pattern{Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#4:00001:04/3_0", "nwparser.p0", " (%{fld1})"); +var dup8 = match("MESSAGE#4:00001:04/3_0", "nwparser.p0", " (%{fld1})"); var dup9 = date_time({ dest: "event_time", @@ -66,26 +63,19 @@ var dup9 = date_time({ ], }); -var dup10 = // "Pattern{Constant('('), Field(fld1,false), Constant(')')}" -match("MESSAGE#5:00001:05/1_0", "nwparser.p0", "(%{fld1})"); +var dup10 = match("MESSAGE#5:00001:05/1_0", "nwparser.p0", "(%{fld1})"); -var dup11 = // "Pattern{Field(fld1,false)}" -match_copy("MESSAGE#5:00001:05/1_1", "nwparser.p0", "fld1"); +var dup11 = match_copy("MESSAGE#5:00001:05/1_1", "nwparser.p0", "fld1"); -var dup12 = // "Pattern{Constant('Address '), Field(p0,false)}" -match("MESSAGE#8:00001:08/0", "nwparser.payload", "Address %{p0}"); +var dup12 = match("MESSAGE#8:00001:08/0", "nwparser.payload", "Address %{p0}"); -var dup13 = // "Pattern{Constant('MIP('), Field(interface,false), Constant(') '), Field(p0,false)}" -match("MESSAGE#8:00001:08/1_0", "nwparser.p0", "MIP(%{interface}) %{p0}"); +var dup13 = match("MESSAGE#8:00001:08/1_0", "nwparser.p0", "MIP(%{interface}) %{p0}"); -var dup14 = // "Pattern{Field(group_object,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#8:00001:08/1_1", "nwparser.p0", "%{group_object->} %{p0}"); +var dup14 = match("MESSAGE#8:00001:08/1_1", "nwparser.p0", "%{group_object->} %{p0}"); -var dup15 = // "Pattern{Constant('admin '), Field(p0,false)}" -match("MESSAGE#8:00001:08/3_0", "nwparser.p0", "admin %{p0}"); +var dup15 = match("MESSAGE#8:00001:08/3_0", "nwparser.p0", "admin %{p0}"); -var dup16 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#8:00001:08/3_1", "nwparser.p0", "p0"); +var dup16 = match_copy("MESSAGE#8:00001:08/3_1", "nwparser.p0", "p0"); var dup17 = setc("eventcategory","1502000000"); @@ -93,25 +83,19 @@ var dup18 = setc("eventcategory","1703000000"); var dup19 = setc("eventcategory","1603000000"); -var dup20 = // "Pattern{Constant('from host '), Field(saddr,true), Constant(' ')}" -match("MESSAGE#25:00002:20/1_1", "nwparser.p0", "from host %{saddr->} "); +var dup20 = match("MESSAGE#25:00002:20/1_1", "nwparser.p0", "from host %{saddr->} "); -var dup21 = // "Pattern{}" -match_copy("MESSAGE#25:00002:20/1_2", "nwparser.p0", ""); +var dup21 = match_copy("MESSAGE#25:00002:20/1_2", "nwparser.p0", ""); var dup22 = setc("eventcategory","1502050000"); -var dup23 = // "Pattern{Constant(''), Field(p0,false)}" -match("MESSAGE#26:00002:21/1", "nwparser.p0", "%{p0}"); +var dup23 = match("MESSAGE#26:00002:21/1", "nwparser.p0", "%{p0}"); -var dup24 = // "Pattern{Constant('password '), Field(p0,false)}" -match("MESSAGE#26:00002:21/2_0", "nwparser.p0", "password %{p0}"); +var dup24 = match("MESSAGE#26:00002:21/2_0", "nwparser.p0", "password %{p0}"); -var dup25 = // "Pattern{Constant('name '), Field(p0,false)}" -match("MESSAGE#26:00002:21/2_1", "nwparser.p0", "name %{p0}"); +var dup25 = match("MESSAGE#26:00002:21/2_1", "nwparser.p0", "name %{p0}"); -var dup26 = // "Pattern{Field(administrator,false)}" -match_copy("MESSAGE#27:00002:22/1_2", "nwparser.p0", "administrator"); +var dup26 = match_copy("MESSAGE#27:00002:22/1_2", "nwparser.p0", "administrator"); var dup27 = setc("eventcategory","1801010000"); @@ -131,8 +115,7 @@ var dup34 = setc("ec_activity","Logoff"); var dup35 = setc("eventcategory","1303000000"); -var dup36 = // "Pattern{Field(disposition,false)}" -match_copy("MESSAGE#42:00002:38/1_1", "nwparser.p0", "disposition"); +var dup36 = match_copy("MESSAGE#42:00002:38/1_1", "nwparser.p0", "disposition"); var dup37 = setc("eventcategory","1402020200"); @@ -140,11 +123,9 @@ var dup38 = setc("ec_theme","UserGroup"); var dup39 = setc("ec_outcome","Error"); -var dup40 = // "Pattern{Constant('via '), Field(p0,false)}" -match("MESSAGE#46:00002:42/1_1", "nwparser.p0", "via %{p0}"); +var dup40 = match("MESSAGE#46:00002:42/1_1", "nwparser.p0", "via %{p0}"); -var dup41 = // "Pattern{Field(fld1,false), Constant(')')}" -match("MESSAGE#46:00002:42/4", "nwparser.p0", "%{fld1})"); +var dup41 = match("MESSAGE#46:00002:42/4", "nwparser.p0", "%{fld1})"); var dup42 = setc("eventcategory","1402020300"); @@ -152,40 +133,31 @@ var dup43 = setc("ec_activity","Modify"); var dup44 = setc("eventcategory","1605000000"); -var dup45 = // "Pattern{Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(p0,false)}" -match("MESSAGE#52:00002:48/3_1", "nwparser.p0", "%{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{p0}"); +var dup45 = match("MESSAGE#52:00002:48/3_1", "nwparser.p0", "%{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{p0}"); -var dup46 = // "Pattern{Constant('admin '), Field(administrator,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#53:00002:52/3_0", "nwparser.p0", "admin %{administrator->} via %{p0}"); +var dup46 = match("MESSAGE#53:00002:52/3_0", "nwparser.p0", "admin %{administrator->} via %{p0}"); -var dup47 = // "Pattern{Field(username,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#53:00002:52/3_2", "nwparser.p0", "%{username->} via %{p0}"); +var dup47 = match("MESSAGE#53:00002:52/3_2", "nwparser.p0", "%{username->} via %{p0}"); -var dup48 = // "Pattern{Constant('NSRP Peer . ('), Field(p0,false)}" -match("MESSAGE#53:00002:52/4_0", "nwparser.p0", "NSRP Peer . (%{p0}"); +var dup48 = match("MESSAGE#53:00002:52/4_0", "nwparser.p0", "NSRP Peer . (%{p0}"); -var dup49 = // "Pattern{Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#55:00002:54/2", "nwparser.p0", ". (%{fld1})"); +var dup49 = match("MESSAGE#55:00002:54/2", "nwparser.p0", ". (%{fld1})"); var dup50 = setc("eventcategory","1701020000"); var dup51 = setc("ec_theme","Configuration"); -var dup52 = // "Pattern{Constant('changed'), Field(p0,false)}" -match("MESSAGE#56:00002/1_1", "nwparser.p0", "changed%{p0}"); +var dup52 = match("MESSAGE#56:00002/1_1", "nwparser.p0", "changed%{p0}"); var dup53 = setc("eventcategory","1301000000"); var dup54 = setc("ec_outcome","Failure"); -var dup55 = // "Pattern{Constant('The '), Field(p0,false)}" -match("MESSAGE#61:00003:05/0", "nwparser.payload", "The %{p0}"); +var dup55 = match("MESSAGE#61:00003:05/0", "nwparser.payload", "The %{p0}"); -var dup56 = // "Pattern{Constant('interface'), Field(p0,false)}" -match("MESSAGE#66:00004:04/1_0", "nwparser.p0", "interface%{p0}"); +var dup56 = match("MESSAGE#66:00004:04/1_0", "nwparser.p0", "interface%{p0}"); -var dup57 = // "Pattern{Constant('Interface'), Field(p0,false)}" -match("MESSAGE#66:00004:04/1_1", "nwparser.p0", "Interface%{p0}"); +var dup57 = match("MESSAGE#66:00004:04/1_1", "nwparser.p0", "Interface%{p0}"); var dup58 = setc("eventcategory","1001000000"); @@ -215,68 +187,47 @@ var dup61 = call({ var dup62 = setc("eventcategory","1608010000"); -var dup63 = // "Pattern{Constant('DNS entries have been '), Field(p0,false)}" -match("MESSAGE#76:00004:14/0", "nwparser.payload", "DNS entries have been %{p0}"); +var dup63 = match("MESSAGE#76:00004:14/0", "nwparser.payload", "DNS entries have been %{p0}"); -var dup64 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(p0,false)}" -match("MESSAGE#79:00004:17/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{p0}"); +var dup64 = match("MESSAGE#79:00004:17/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{p0}"); -var dup65 = // "Pattern{Field(zone,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#79:00004:17/1_0", "nwparser.p0", "%{zone}, %{p0}"); +var dup65 = match("MESSAGE#79:00004:17/1_0", "nwparser.p0", "%{zone}, %{p0}"); -var dup66 = // "Pattern{Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#79:00004:17/1_1", "nwparser.p0", "%{zone->} %{p0}"); +var dup66 = match("MESSAGE#79:00004:17/1_1", "nwparser.p0", "%{zone->} %{p0}"); -var dup67 = // "Pattern{Constant('int '), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#79:00004:17/2", "nwparser.p0", "int %{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); +var dup67 = match("MESSAGE#79:00004:17/2", "nwparser.p0", "int %{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); -var dup68 = // "Pattern{Field(dport,false), Constant(','), Field(p0,false)}" -match("MESSAGE#83:00005:03/1_0", "nwparser.p0", "%{dport},%{p0}"); +var dup68 = match("MESSAGE#83:00005:03/1_0", "nwparser.p0", "%{dport},%{p0}"); -var dup69 = // "Pattern{Field(dport,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#83:00005:03/1_1", "nwparser.p0", "%{dport->} %{p0}"); +var dup69 = match("MESSAGE#83:00005:03/1_1", "nwparser.p0", "%{dport->} %{p0}"); -var dup70 = // "Pattern{Field(space,false), Constant('using protocol '), Field(p0,false)}" -match("MESSAGE#83:00005:03/2", "nwparser.p0", "%{space}using protocol %{p0}"); +var dup70 = match("MESSAGE#83:00005:03/2", "nwparser.p0", "%{space}using protocol %{p0}"); -var dup71 = // "Pattern{Field(protocol,false), Constant(','), Field(p0,false)}" -match("MESSAGE#83:00005:03/3_0", "nwparser.p0", "%{protocol},%{p0}"); +var dup71 = match("MESSAGE#83:00005:03/3_0", "nwparser.p0", "%{protocol},%{p0}"); -var dup72 = // "Pattern{Field(protocol,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#83:00005:03/3_1", "nwparser.p0", "%{protocol->} %{p0}"); +var dup72 = match("MESSAGE#83:00005:03/3_1", "nwparser.p0", "%{protocol->} %{p0}"); -var dup73 = // "Pattern{Constant('. '), Field(p0,false)}" -match("MESSAGE#83:00005:03/5_1", "nwparser.p0", ". %{p0}"); +var dup73 = match("MESSAGE#83:00005:03/5_1", "nwparser.p0", ". %{p0}"); -var dup74 = // "Pattern{Field(fld2,false), Constant(': SYN '), Field(p0,false)}" -match("MESSAGE#86:00005:06/0_0", "nwparser.payload", "%{fld2}: SYN %{p0}"); +var dup74 = match("MESSAGE#86:00005:06/0_0", "nwparser.payload", "%{fld2}: SYN %{p0}"); -var dup75 = // "Pattern{Constant('SYN '), Field(p0,false)}" -match("MESSAGE#86:00005:06/0_1", "nwparser.payload", "SYN %{p0}"); +var dup75 = match("MESSAGE#86:00005:06/0_1", "nwparser.payload", "SYN %{p0}"); -var dup76 = // "Pattern{Constant('timeout value '), Field(p0,false)}" -match("MESSAGE#87:00005:07/1_2", "nwparser.p0", "timeout value %{p0}"); +var dup76 = match("MESSAGE#87:00005:07/1_2", "nwparser.p0", "timeout value %{p0}"); -var dup77 = // "Pattern{Constant('destination '), Field(p0,false)}" -match("MESSAGE#88:00005:08/2_0", "nwparser.p0", "destination %{p0}"); +var dup77 = match("MESSAGE#88:00005:08/2_0", "nwparser.p0", "destination %{p0}"); -var dup78 = // "Pattern{Constant('source '), Field(p0,false)}" -match("MESSAGE#88:00005:08/2_1", "nwparser.p0", "source %{p0}"); +var dup78 = match("MESSAGE#88:00005:08/2_1", "nwparser.p0", "source %{p0}"); -var dup79 = // "Pattern{Constant('A '), Field(p0,false)}" -match("MESSAGE#97:00005:17/0", "nwparser.payload", "A %{p0}"); +var dup79 = match("MESSAGE#97:00005:17/0", "nwparser.payload", "A %{p0}"); -var dup80 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#98:00005:18/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var dup80 = match("MESSAGE#98:00005:18/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var dup81 = // "Pattern{Constant(', int '), Field(p0,false)}" -match("MESSAGE#98:00005:18/1_0", "nwparser.p0", ", int %{p0}"); +var dup81 = match("MESSAGE#98:00005:18/1_0", "nwparser.p0", ", int %{p0}"); -var dup82 = // "Pattern{Constant('int '), Field(p0,false)}" -match("MESSAGE#98:00005:18/1_1", "nwparser.p0", "int %{p0}"); +var dup82 = match("MESSAGE#98:00005:18/1_1", "nwparser.p0", "int %{p0}"); -var dup83 = // "Pattern{Constant(''), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#98:00005:18/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); +var dup83 = match("MESSAGE#98:00005:18/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); var dup84 = setc("eventcategory","1002020000"); @@ -284,176 +235,123 @@ var dup85 = setc("eventcategory","1002000000"); var dup86 = setc("eventcategory","1603110000"); -var dup87 = // "Pattern{Constant('HA '), Field(p0,false)}" -match("MESSAGE#111:00007:04/0", "nwparser.payload", "HA %{p0}"); +var dup87 = match("MESSAGE#111:00007:04/0", "nwparser.payload", "HA %{p0}"); -var dup88 = // "Pattern{Constant('encryption '), Field(p0,false)}" -match("MESSAGE#111:00007:04/1_0", "nwparser.p0", "encryption %{p0}"); +var dup88 = match("MESSAGE#111:00007:04/1_0", "nwparser.p0", "encryption %{p0}"); -var dup89 = // "Pattern{Constant('authentication '), Field(p0,false)}" -match("MESSAGE#111:00007:04/1_1", "nwparser.p0", "authentication %{p0}"); +var dup89 = match("MESSAGE#111:00007:04/1_1", "nwparser.p0", "authentication %{p0}"); -var dup90 = // "Pattern{Constant('key '), Field(p0,false)}" -match("MESSAGE#111:00007:04/3_1", "nwparser.p0", "key %{p0}"); +var dup90 = match("MESSAGE#111:00007:04/3_1", "nwparser.p0", "key %{p0}"); var dup91 = setc("eventcategory","1613040200"); -var dup92 = // "Pattern{Constant('disabled'), Field(,false)}" -match("MESSAGE#118:00007:11/1_0", "nwparser.p0", "disabled%{}"); +var dup92 = match("MESSAGE#118:00007:11/1_0", "nwparser.p0", "disabled%{}"); -var dup93 = // "Pattern{Constant('set to '), Field(trigger_val,false)}" -match("MESSAGE#118:00007:11/1_1", "nwparser.p0", "set to %{trigger_val}"); +var dup93 = match("MESSAGE#118:00007:11/1_1", "nwparser.p0", "set to %{trigger_val}"); -var dup94 = // "Pattern{Constant('up'), Field(,false)}" -match("MESSAGE#127:00007:21/1_0", "nwparser.p0", "up%{}"); +var dup94 = match("MESSAGE#127:00007:21/1_0", "nwparser.p0", "up%{}"); -var dup95 = // "Pattern{Constant('down'), Field(,false)}" -match("MESSAGE#127:00007:21/1_1", "nwparser.p0", "down%{}"); +var dup95 = match("MESSAGE#127:00007:21/1_1", "nwparser.p0", "down%{}"); -var dup96 = // "Pattern{Constant(' '), Field(p0,false)}" -match("MESSAGE#139:00007:33/2_1", "nwparser.p0", " %{p0}"); +var dup96 = match("MESSAGE#139:00007:33/2_1", "nwparser.p0", " %{p0}"); var dup97 = setc("eventcategory","1613050200"); -var dup98 = // "Pattern{Constant('set'), Field(,false)}" -match("MESSAGE#143:00007:37/1_0", "nwparser.p0", "set%{}"); +var dup98 = match("MESSAGE#143:00007:37/1_0", "nwparser.p0", "set%{}"); -var dup99 = // "Pattern{Constant('unset'), Field(,false)}" -match("MESSAGE#143:00007:37/1_1", "nwparser.p0", "unset%{}"); +var dup99 = match("MESSAGE#143:00007:37/1_1", "nwparser.p0", "unset%{}"); -var dup100 = // "Pattern{Constant('undefined '), Field(p0,false)}" -match("MESSAGE#144:00007:38/1_0", "nwparser.p0", "undefined %{p0}"); +var dup100 = match("MESSAGE#144:00007:38/1_0", "nwparser.p0", "undefined %{p0}"); -var dup101 = // "Pattern{Constant('set '), Field(p0,false)}" -match("MESSAGE#144:00007:38/1_1", "nwparser.p0", "set %{p0}"); +var dup101 = match("MESSAGE#144:00007:38/1_1", "nwparser.p0", "set %{p0}"); -var dup102 = // "Pattern{Constant('active '), Field(p0,false)}" -match("MESSAGE#144:00007:38/1_2", "nwparser.p0", "active %{p0}"); +var dup102 = match("MESSAGE#144:00007:38/1_2", "nwparser.p0", "active %{p0}"); -var dup103 = // "Pattern{Constant('to '), Field(p0,false)}" -match("MESSAGE#144:00007:38/2", "nwparser.p0", "to %{p0}"); +var dup103 = match("MESSAGE#144:00007:38/2", "nwparser.p0", "to %{p0}"); -var dup104 = // "Pattern{Constant('created '), Field(p0,false)}" -match("MESSAGE#157:00007:51/1_0", "nwparser.p0", "created %{p0}"); +var dup104 = match("MESSAGE#157:00007:51/1_0", "nwparser.p0", "created %{p0}"); -var dup105 = // "Pattern{Constant(', '), Field(p0,false)}" -match("MESSAGE#157:00007:51/3_0", "nwparser.p0", ", %{p0}"); +var dup105 = match("MESSAGE#157:00007:51/3_0", "nwparser.p0", ", %{p0}"); -var dup106 = // "Pattern{Constant('is '), Field(p0,false)}" -match("MESSAGE#157:00007:51/5_0", "nwparser.p0", "is %{p0}"); +var dup106 = match("MESSAGE#157:00007:51/5_0", "nwparser.p0", "is %{p0}"); -var dup107 = // "Pattern{Constant('was '), Field(p0,false)}" -match("MESSAGE#157:00007:51/5_1", "nwparser.p0", "was %{p0}"); +var dup107 = match("MESSAGE#157:00007:51/5_1", "nwparser.p0", "was %{p0}"); -var dup108 = // "Pattern{Constant(''), Field(fld2,false)}" -match("MESSAGE#157:00007:51/6", "nwparser.p0", "%{fld2}"); +var dup108 = match("MESSAGE#157:00007:51/6", "nwparser.p0", "%{fld2}"); -var dup109 = // "Pattern{Constant('threshold '), Field(p0,false)}" -match("MESSAGE#163:00007:57/1_0", "nwparser.p0", "threshold %{p0}"); +var dup109 = match("MESSAGE#163:00007:57/1_0", "nwparser.p0", "threshold %{p0}"); -var dup110 = // "Pattern{Constant('interval '), Field(p0,false)}" -match("MESSAGE#163:00007:57/1_1", "nwparser.p0", "interval %{p0}"); +var dup110 = match("MESSAGE#163:00007:57/1_1", "nwparser.p0", "interval %{p0}"); -var dup111 = // "Pattern{Constant('of '), Field(p0,false)}" -match("MESSAGE#163:00007:57/3_0", "nwparser.p0", "of %{p0}"); +var dup111 = match("MESSAGE#163:00007:57/3_0", "nwparser.p0", "of %{p0}"); -var dup112 = // "Pattern{Constant('that '), Field(p0,false)}" -match("MESSAGE#163:00007:57/3_1", "nwparser.p0", "that %{p0}"); +var dup112 = match("MESSAGE#163:00007:57/3_1", "nwparser.p0", "that %{p0}"); -var dup113 = // "Pattern{Constant('Zone '), Field(p0,false)}" -match("MESSAGE#170:00007:64/0_0", "nwparser.payload", "Zone %{p0}"); +var dup113 = match("MESSAGE#170:00007:64/0_0", "nwparser.payload", "Zone %{p0}"); -var dup114 = // "Pattern{Constant('Interface '), Field(p0,false)}" -match("MESSAGE#170:00007:64/0_1", "nwparser.payload", "Interface %{p0}"); +var dup114 = match("MESSAGE#170:00007:64/0_1", "nwparser.payload", "Interface %{p0}"); -var dup115 = // "Pattern{Constant('n '), Field(p0,false)}" -match("MESSAGE#172:00007:66/2_1", "nwparser.p0", "n %{p0}"); +var dup115 = match("MESSAGE#172:00007:66/2_1", "nwparser.p0", "n %{p0}"); -var dup116 = // "Pattern{Constant('.'), Field(,false)}" -match("MESSAGE#174:00007:68/4", "nwparser.p0", ".%{}"); +var dup116 = match("MESSAGE#174:00007:68/4", "nwparser.p0", ".%{}"); var dup117 = setc("eventcategory","1603090000"); -var dup118 = // "Pattern{Constant('for '), Field(p0,false)}" -match("MESSAGE#195:00009:06/1", "nwparser.p0", "for %{p0}"); +var dup118 = match("MESSAGE#195:00009:06/1", "nwparser.p0", "for %{p0}"); -var dup119 = // "Pattern{Constant('the '), Field(p0,false)}" -match("MESSAGE#195:00009:06/2_0", "nwparser.p0", "the %{p0}"); +var dup119 = match("MESSAGE#195:00009:06/2_0", "nwparser.p0", "the %{p0}"); -var dup120 = // "Pattern{Constant('removed '), Field(p0,false)}" -match("MESSAGE#195:00009:06/4_0", "nwparser.p0", "removed %{p0}"); +var dup120 = match("MESSAGE#195:00009:06/4_0", "nwparser.p0", "removed %{p0}"); var dup121 = setc("eventcategory","1603030000"); -var dup122 = // "Pattern{Constant('interface '), Field(p0,false)}" -match("MESSAGE#202:00009:14/2_0", "nwparser.p0", "interface %{p0}"); +var dup122 = match("MESSAGE#202:00009:14/2_0", "nwparser.p0", "interface %{p0}"); -var dup123 = // "Pattern{Constant('the interface '), Field(p0,false)}" -match("MESSAGE#202:00009:14/2_1", "nwparser.p0", "the interface %{p0}"); +var dup123 = match("MESSAGE#202:00009:14/2_1", "nwparser.p0", "the interface %{p0}"); -var dup124 = // "Pattern{Field(interface,false)}" -match_copy("MESSAGE#202:00009:14/4_1", "nwparser.p0", "interface"); +var dup124 = match_copy("MESSAGE#202:00009:14/4_1", "nwparser.p0", "interface"); -var dup125 = // "Pattern{Constant('s '), Field(p0,false)}" -match("MESSAGE#203:00009:15/1_1", "nwparser.p0", "s %{p0}"); +var dup125 = match("MESSAGE#203:00009:15/1_1", "nwparser.p0", "s %{p0}"); -var dup126 = // "Pattern{Constant('on interface '), Field(interface,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#203:00009:15/2", "nwparser.p0", "on interface %{interface->} %{p0}"); +var dup126 = match("MESSAGE#203:00009:15/2", "nwparser.p0", "on interface %{interface->} %{p0}"); -var dup127 = // "Pattern{Constant('has been '), Field(p0,false)}" -match("MESSAGE#203:00009:15/3_0", "nwparser.p0", "has been %{p0}"); +var dup127 = match("MESSAGE#203:00009:15/3_0", "nwparser.p0", "has been %{p0}"); -var dup128 = // "Pattern{Constant(''), Field(disposition,false), Constant('.')}" -match("MESSAGE#203:00009:15/4", "nwparser.p0", "%{disposition}."); +var dup128 = match("MESSAGE#203:00009:15/4", "nwparser.p0", "%{disposition}."); -var dup129 = // "Pattern{Constant('removed from '), Field(p0,false)}" -match("MESSAGE#204:00009:16/3_0", "nwparser.p0", "removed from %{p0}"); +var dup129 = match("MESSAGE#204:00009:16/3_0", "nwparser.p0", "removed from %{p0}"); -var dup130 = // "Pattern{Constant('added to '), Field(p0,false)}" -match("MESSAGE#204:00009:16/3_1", "nwparser.p0", "added to %{p0}"); +var dup130 = match("MESSAGE#204:00009:16/3_1", "nwparser.p0", "added to %{p0}"); -var dup131 = // "Pattern{Constant(''), Field(interface,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#210:00009:21/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times. (%{fld1})"); +var dup131 = match("MESSAGE#210:00009:21/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times. (%{fld1})"); -var dup132 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#219:00010:03/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); +var dup132 = match("MESSAGE#219:00010:03/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); -var dup133 = // "Pattern{Constant('Interface '), Field(p0,false)}" -match("MESSAGE#224:00011:04/1_1", "nwparser.p0", "Interface %{p0}"); +var dup133 = match("MESSAGE#224:00011:04/1_1", "nwparser.p0", "Interface %{p0}"); -var dup134 = // "Pattern{Constant('set to '), Field(fld2,false)}" -match("MESSAGE#233:00011:14/1_0", "nwparser.p0", "set to %{fld2}"); +var dup134 = match("MESSAGE#233:00011:14/1_0", "nwparser.p0", "set to %{fld2}"); -var dup135 = // "Pattern{Constant('gateway '), Field(p0,false)}" -match("MESSAGE#237:00011:18/4_1", "nwparser.p0", "gateway %{p0}"); +var dup135 = match("MESSAGE#237:00011:18/4_1", "nwparser.p0", "gateway %{p0}"); -var dup136 = // "Pattern{Field(,true), Constant(' '), Field(disposition,false)}" -match("MESSAGE#238:00011:19/6", "nwparser.p0", "%{} %{disposition}"); +var dup136 = match("MESSAGE#238:00011:19/6", "nwparser.p0", "%{} %{disposition}"); -var dup137 = // "Pattern{Constant('port number '), Field(p0,false)}" -match("MESSAGE#274:00015:02/1_1", "nwparser.p0", "port number %{p0}"); +var dup137 = match("MESSAGE#274:00015:02/1_1", "nwparser.p0", "port number %{p0}"); -var dup138 = // "Pattern{Constant('has been '), Field(disposition,false)}" -match("MESSAGE#274:00015:02/2", "nwparser.p0", "has been %{disposition}"); +var dup138 = match("MESSAGE#274:00015:02/2", "nwparser.p0", "has been %{disposition}"); -var dup139 = // "Pattern{Constant('IP '), Field(p0,false)}" -match("MESSAGE#276:00015:04/1_0", "nwparser.p0", "IP %{p0}"); +var dup139 = match("MESSAGE#276:00015:04/1_0", "nwparser.p0", "IP %{p0}"); -var dup140 = // "Pattern{Constant('port '), Field(p0,false)}" -match("MESSAGE#276:00015:04/1_1", "nwparser.p0", "port %{p0}"); +var dup140 = match("MESSAGE#276:00015:04/1_1", "nwparser.p0", "port %{p0}"); var dup141 = setc("eventcategory","1702030000"); -var dup142 = // "Pattern{Constant('up '), Field(p0,false)}" -match("MESSAGE#284:00015:12/3_0", "nwparser.p0", "up %{p0}"); +var dup142 = match("MESSAGE#284:00015:12/3_0", "nwparser.p0", "up %{p0}"); -var dup143 = // "Pattern{Constant('down '), Field(p0,false)}" -match("MESSAGE#284:00015:12/3_1", "nwparser.p0", "down %{p0}"); +var dup143 = match("MESSAGE#284:00015:12/3_1", "nwparser.p0", "down %{p0}"); var dup144 = setc("eventcategory","1601000000"); -var dup145 = // "Pattern{Constant('('), Field(fld1,false), Constant(') ')}" -match("MESSAGE#294:00015:22/2_0", "nwparser.p0", "(%{fld1}) "); +var dup145 = match("MESSAGE#294:00015:22/2_0", "nwparser.p0", "(%{fld1}) "); var dup146 = date_time({ dest: "event_time", @@ -473,360 +371,251 @@ var dup150 = setc("ec_theme","TEV"); var dup151 = setc("eventcategory","1103010000"); -var dup152 = // "Pattern{Constant(': '), Field(p0,false)}" -match("MESSAGE#317:00017:01/2_0", "nwparser.p0", ": %{p0}"); +var dup152 = match("MESSAGE#317:00017:01/2_0", "nwparser.p0", ": %{p0}"); -var dup153 = // "Pattern{Constant('IP '), Field(p0,false)}" -match("MESSAGE#320:00017:04/0", "nwparser.payload", "IP %{p0}"); +var dup153 = match("MESSAGE#320:00017:04/0", "nwparser.payload", "IP %{p0}"); -var dup154 = // "Pattern{Constant('address pool '), Field(p0,false)}" -match("MESSAGE#320:00017:04/1_0", "nwparser.p0", "address pool %{p0}"); +var dup154 = match("MESSAGE#320:00017:04/1_0", "nwparser.p0", "address pool %{p0}"); -var dup155 = // "Pattern{Constant('pool '), Field(p0,false)}" -match("MESSAGE#320:00017:04/1_1", "nwparser.p0", "pool %{p0}"); +var dup155 = match("MESSAGE#320:00017:04/1_1", "nwparser.p0", "pool %{p0}"); -var dup156 = // "Pattern{Constant('enabled '), Field(p0,false)}" -match("MESSAGE#326:00017:10/1_0", "nwparser.p0", "enabled %{p0}"); +var dup156 = match("MESSAGE#326:00017:10/1_0", "nwparser.p0", "enabled %{p0}"); -var dup157 = // "Pattern{Constant('disabled '), Field(p0,false)}" -match("MESSAGE#326:00017:10/1_1", "nwparser.p0", "disabled %{p0}"); +var dup157 = match("MESSAGE#326:00017:10/1_1", "nwparser.p0", "disabled %{p0}"); -var dup158 = // "Pattern{Constant('AH '), Field(p0,false)}" -match("MESSAGE#332:00017:15/1_0", "nwparser.p0", "AH %{p0}"); +var dup158 = match("MESSAGE#332:00017:15/1_0", "nwparser.p0", "AH %{p0}"); -var dup159 = // "Pattern{Constant('ESP '), Field(p0,false)}" -match("MESSAGE#332:00017:15/1_1", "nwparser.p0", "ESP %{p0}"); +var dup159 = match("MESSAGE#332:00017:15/1_1", "nwparser.p0", "ESP %{p0}"); -var dup160 = // "Pattern{Constant('’'), Field(p0,false)}" -match("MESSAGE#347:00018:02/1_0", "nwparser.p0", "’%{p0}"); +var dup160 = match("MESSAGE#354:00018:11/0", "nwparser.payload", "%{} %{p0}"); -var dup161 = // "Pattern{Constant('&'), Field(p0,false)}" -match("MESSAGE#347:00018:02/1_1", "nwparser.p0", "\u0026%{p0}"); +var dup161 = match("MESSAGE#356:00018:32/0_0", "nwparser.payload", "Source%{p0}"); -var dup162 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#354:00018:11/0", "nwparser.payload", "%{} %{p0}"); +var dup162 = match("MESSAGE#356:00018:32/0_1", "nwparser.payload", "Destination%{p0}"); -var dup163 = // "Pattern{Constant('Source'), Field(p0,false)}" -match("MESSAGE#356:00018:32/0_0", "nwparser.payload", "Source%{p0}"); +var dup163 = match("MESSAGE#356:00018:32/2_0", "nwparser.p0", "from %{p0}"); -var dup164 = // "Pattern{Constant('Destination'), Field(p0,false)}" -match("MESSAGE#356:00018:32/0_1", "nwparser.payload", "Destination%{p0}"); +var dup164 = match("MESSAGE#356:00018:32/3", "nwparser.p0", "policy ID %{policy_id->} by admin %{administrator->} via NSRP Peer . (%{fld1})"); -var dup165 = // "Pattern{Constant('from '), Field(p0,false)}" -match("MESSAGE#356:00018:32/2_0", "nwparser.p0", "from %{p0}"); +var dup165 = match("MESSAGE#375:00019:01/0", "nwparser.payload", "Attempt to enable %{p0}"); -var dup166 = // "Pattern{Constant('policy ID '), Field(policy_id,true), Constant(' by admin '), Field(administrator,true), Constant(' via NSRP Peer . ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#356:00018:32/3", "nwparser.p0", "policy ID %{policy_id->} by admin %{administrator->} via NSRP Peer . (%{fld1})"); +var dup166 = match("MESSAGE#375:00019:01/1_0", "nwparser.p0", "traffic logging via syslog %{p0}"); -var dup167 = // "Pattern{Constant('Attempt to enable '), Field(p0,false)}" -match("MESSAGE#375:00019:01/0", "nwparser.payload", "Attempt to enable %{p0}"); +var dup167 = match("MESSAGE#375:00019:01/1_1", "nwparser.p0", "syslog %{p0}"); -var dup168 = // "Pattern{Constant('traffic logging via syslog '), Field(p0,false)}" -match("MESSAGE#375:00019:01/1_0", "nwparser.p0", "traffic logging via syslog %{p0}"); +var dup168 = match("MESSAGE#378:00019:04/0", "nwparser.payload", "Syslog %{p0}"); -var dup169 = // "Pattern{Constant('syslog '), Field(p0,false)}" -match("MESSAGE#375:00019:01/1_1", "nwparser.p0", "syslog %{p0}"); +var dup169 = match("MESSAGE#378:00019:04/1_0", "nwparser.p0", "host %{p0}"); -var dup170 = // "Pattern{Constant('Syslog '), Field(p0,false)}" -match("MESSAGE#378:00019:04/0", "nwparser.payload", "Syslog %{p0}"); +var dup170 = match("MESSAGE#378:00019:04/3_1", "nwparser.p0", "domain name %{p0}"); -var dup171 = // "Pattern{Constant('host '), Field(p0,false)}" -match("MESSAGE#378:00019:04/1_0", "nwparser.p0", "host %{p0}"); +var dup171 = match("MESSAGE#378:00019:04/4", "nwparser.p0", "has been changed to %{fld2}"); -var dup172 = // "Pattern{Constant('domain name '), Field(p0,false)}" -match("MESSAGE#378:00019:04/3_1", "nwparser.p0", "domain name %{p0}"); +var dup172 = match("MESSAGE#380:00019:06/1_0", "nwparser.p0", "security facility %{p0}"); -var dup173 = // "Pattern{Constant('has been changed to '), Field(fld2,false)}" -match("MESSAGE#378:00019:04/4", "nwparser.p0", "has been changed to %{fld2}"); +var dup173 = match("MESSAGE#380:00019:06/1_1", "nwparser.p0", "facility %{p0}"); -var dup174 = // "Pattern{Constant('security facility '), Field(p0,false)}" -match("MESSAGE#380:00019:06/1_0", "nwparser.p0", "security facility %{p0}"); +var dup174 = match("MESSAGE#380:00019:06/3_0", "nwparser.p0", "local0%{}"); -var dup175 = // "Pattern{Constant('facility '), Field(p0,false)}" -match("MESSAGE#380:00019:06/1_1", "nwparser.p0", "facility %{p0}"); +var dup175 = match("MESSAGE#380:00019:06/3_1", "nwparser.p0", "local1%{}"); -var dup176 = // "Pattern{Constant('local0'), Field(,false)}" -match("MESSAGE#380:00019:06/3_0", "nwparser.p0", "local0%{}"); +var dup176 = match("MESSAGE#380:00019:06/3_2", "nwparser.p0", "local2%{}"); -var dup177 = // "Pattern{Constant('local1'), Field(,false)}" -match("MESSAGE#380:00019:06/3_1", "nwparser.p0", "local1%{}"); +var dup177 = match("MESSAGE#380:00019:06/3_3", "nwparser.p0", "local3%{}"); -var dup178 = // "Pattern{Constant('local2'), Field(,false)}" -match("MESSAGE#380:00019:06/3_2", "nwparser.p0", "local2%{}"); +var dup178 = match("MESSAGE#380:00019:06/3_4", "nwparser.p0", "local4%{}"); -var dup179 = // "Pattern{Constant('local3'), Field(,false)}" -match("MESSAGE#380:00019:06/3_3", "nwparser.p0", "local3%{}"); +var dup179 = match("MESSAGE#380:00019:06/3_5", "nwparser.p0", "local5%{}"); -var dup180 = // "Pattern{Constant('local4'), Field(,false)}" -match("MESSAGE#380:00019:06/3_4", "nwparser.p0", "local4%{}"); +var dup180 = match("MESSAGE#380:00019:06/3_6", "nwparser.p0", "local6%{}"); -var dup181 = // "Pattern{Constant('local5'), Field(,false)}" -match("MESSAGE#380:00019:06/3_5", "nwparser.p0", "local5%{}"); +var dup181 = match("MESSAGE#380:00019:06/3_7", "nwparser.p0", "local7%{}"); -var dup182 = // "Pattern{Constant('local6'), Field(,false)}" -match("MESSAGE#380:00019:06/3_6", "nwparser.p0", "local6%{}"); +var dup182 = match("MESSAGE#380:00019:06/3_8", "nwparser.p0", "auth/sec%{}"); -var dup183 = // "Pattern{Constant('local7'), Field(,false)}" -match("MESSAGE#380:00019:06/3_7", "nwparser.p0", "local7%{}"); +var dup183 = match("MESSAGE#384:00019:10/0", "nwparser.payload", "%{fld2->} %{p0}"); -var dup184 = // "Pattern{Constant('auth/sec'), Field(,false)}" -match("MESSAGE#380:00019:06/3_8", "nwparser.p0", "auth/sec%{}"); +var dup184 = setc("eventcategory","1603020000"); -var dup185 = // "Pattern{Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#384:00019:10/0", "nwparser.payload", "%{fld2->} %{p0}"); +var dup185 = setc("eventcategory","1803000000"); -var dup186 = setc("eventcategory","1603020000"); +var dup186 = match("MESSAGE#405:00022/0", "nwparser.payload", "All %{p0}"); -var dup187 = setc("eventcategory","1803000000"); +var dup187 = setc("eventcategory","1603010000"); -var dup188 = // "Pattern{Constant('All '), Field(p0,false)}" -match("MESSAGE#405:00022/0", "nwparser.payload", "All %{p0}"); +var dup188 = setc("eventcategory","1603100000"); -var dup189 = setc("eventcategory","1603010000"); +var dup189 = match("MESSAGE#414:00022:09/1_0", "nwparser.p0", "primary %{p0}"); -var dup190 = setc("eventcategory","1603100000"); +var dup190 = match("MESSAGE#414:00022:09/1_1", "nwparser.p0", "secondary %{p0}"); -var dup191 = // "Pattern{Constant('primary '), Field(p0,false)}" -match("MESSAGE#414:00022:09/1_0", "nwparser.p0", "primary %{p0}"); +var dup191 = match("MESSAGE#414:00022:09/3_0", "nwparser.p0", "t %{p0}"); -var dup192 = // "Pattern{Constant('secondary '), Field(p0,false)}" -match("MESSAGE#414:00022:09/1_1", "nwparser.p0", "secondary %{p0}"); +var dup192 = match("MESSAGE#414:00022:09/3_1", "nwparser.p0", "w %{p0}"); -var dup193 = // "Pattern{Constant('t '), Field(p0,false)}" -match("MESSAGE#414:00022:09/3_0", "nwparser.p0", "t %{p0}"); +var dup193 = match("MESSAGE#423:00024/1", "nwparser.p0", "server %{p0}"); -var dup194 = // "Pattern{Constant('w '), Field(p0,false)}" -match("MESSAGE#414:00022:09/3_1", "nwparser.p0", "w %{p0}"); +var dup194 = match("MESSAGE#426:00024:03/1_0", "nwparser.p0", "has %{p0}"); -var dup195 = // "Pattern{Constant('server '), Field(p0,false)}" -match("MESSAGE#423:00024/1", "nwparser.p0", "server %{p0}"); +var dup195 = match("MESSAGE#434:00026:01/0", "nwparser.payload", "SCS%{p0}"); -var dup196 = // "Pattern{Constant('has '), Field(p0,false)}" -match("MESSAGE#426:00024:03/1_0", "nwparser.p0", "has %{p0}"); +var dup196 = match("MESSAGE#434:00026:01/3_0", "nwparser.p0", "bound to %{p0}"); -var dup197 = // "Pattern{Constant('SCS'), Field(p0,false)}" -match("MESSAGE#434:00026:01/0", "nwparser.payload", "SCS%{p0}"); +var dup197 = match("MESSAGE#434:00026:01/3_1", "nwparser.p0", "unbound from %{p0}"); -var dup198 = // "Pattern{Constant('bound to '), Field(p0,false)}" -match("MESSAGE#434:00026:01/3_0", "nwparser.p0", "bound to %{p0}"); +var dup198 = setc("eventcategory","1801030000"); -var dup199 = // "Pattern{Constant('unbound from '), Field(p0,false)}" -match("MESSAGE#434:00026:01/3_1", "nwparser.p0", "unbound from %{p0}"); +var dup199 = setc("eventcategory","1302010200"); -var dup200 = setc("eventcategory","1801030000"); +var dup200 = match("MESSAGE#441:00026:08/1_1", "nwparser.p0", "PKA RSA %{p0}"); -var dup201 = setc("eventcategory","1302010200"); +var dup201 = match("MESSAGE#443:00026:10/3_1", "nwparser.p0", "unbind %{p0}"); -var dup202 = // "Pattern{Constant('PKA RSA '), Field(p0,false)}" -match("MESSAGE#441:00026:08/1_1", "nwparser.p0", "PKA RSA %{p0}"); +var dup202 = match("MESSAGE#443:00026:10/4", "nwparser.p0", "PKA key %{p0}"); -var dup203 = // "Pattern{Constant('unbind '), Field(p0,false)}" -match("MESSAGE#443:00026:10/3_1", "nwparser.p0", "unbind %{p0}"); +var dup203 = setc("eventcategory","1304000000"); -var dup204 = // "Pattern{Constant('PKA key '), Field(p0,false)}" -match("MESSAGE#443:00026:10/4", "nwparser.p0", "PKA key %{p0}"); +var dup204 = match("MESSAGE#446:00027/0", "nwparser.payload", "Multiple login failures %{p0}"); -var dup205 = setc("eventcategory","1304000000"); +var dup205 = match("MESSAGE#446:00027/1_0", "nwparser.p0", "occurred for %{p0}"); -var dup206 = // "Pattern{Constant('Multiple login failures '), Field(p0,false)}" -match("MESSAGE#446:00027/0", "nwparser.payload", "Multiple login failures %{p0}"); +var dup206 = setc("eventcategory","1401030000"); -var dup207 = // "Pattern{Constant('occurred for '), Field(p0,false)}" -match("MESSAGE#446:00027/1_0", "nwparser.p0", "occurred for %{p0}"); +var dup207 = match("MESSAGE#451:00027:05/5_0", "nwparser.p0", "aborted%{}"); -var dup208 = setc("eventcategory","1401030000"); +var dup208 = match("MESSAGE#451:00027:05/5_1", "nwparser.p0", "performed%{}"); -var dup209 = // "Pattern{Constant('aborted'), Field(,false)}" -match("MESSAGE#451:00027:05/5_0", "nwparser.p0", "aborted%{}"); +var dup209 = setc("eventcategory","1605020000"); -var dup210 = // "Pattern{Constant('performed'), Field(,false)}" -match("MESSAGE#451:00027:05/5_1", "nwparser.p0", "performed%{}"); +var dup210 = match("MESSAGE#466:00029:03/0", "nwparser.payload", "IP pool of DHCP server on %{p0}"); -var dup211 = setc("eventcategory","1605020000"); +var dup211 = setc("ec_subject","Certificate"); -var dup212 = // "Pattern{Constant('IP pool of DHCP server on '), Field(p0,false)}" -match("MESSAGE#466:00029:03/0", "nwparser.payload", "IP pool of DHCP server on %{p0}"); +var dup212 = match("MESSAGE#492:00030:17/1_0", "nwparser.p0", "certificate %{p0}"); -var dup213 = setc("ec_subject","Certificate"); +var dup213 = match("MESSAGE#492:00030:17/1_1", "nwparser.p0", "CRL %{p0}"); -var dup214 = // "Pattern{Constant('certificate '), Field(p0,false)}" -match("MESSAGE#492:00030:17/1_0", "nwparser.p0", "certificate %{p0}"); +var dup214 = match("MESSAGE#493:00030:40/1_0", "nwparser.p0", "auto %{p0}"); -var dup215 = // "Pattern{Constant('CRL '), Field(p0,false)}" -match("MESSAGE#492:00030:17/1_1", "nwparser.p0", "CRL %{p0}"); +var dup215 = match("MESSAGE#508:00030:55/1_0", "nwparser.p0", "RSA %{p0}"); -var dup216 = // "Pattern{Constant('auto '), Field(p0,false)}" -match("MESSAGE#493:00030:40/1_0", "nwparser.p0", "auto %{p0}"); +var dup216 = match("MESSAGE#508:00030:55/1_1", "nwparser.p0", "DSA %{p0}"); -var dup217 = // "Pattern{Constant('RSA '), Field(p0,false)}" -match("MESSAGE#508:00030:55/1_0", "nwparser.p0", "RSA %{p0}"); +var dup217 = match("MESSAGE#508:00030:55/2", "nwparser.p0", "key pair.%{}"); -var dup218 = // "Pattern{Constant('DSA '), Field(p0,false)}" -match("MESSAGE#508:00030:55/1_1", "nwparser.p0", "DSA %{p0}"); +var dup218 = setc("ec_subject","CryptoKey"); -var dup219 = // "Pattern{Constant('key pair.'), Field(,false)}" -match("MESSAGE#508:00030:55/2", "nwparser.p0", "key pair.%{}"); +var dup219 = setc("ec_subject","Configuration"); -var dup220 = setc("ec_subject","CryptoKey"); +var dup220 = setc("ec_activity","Request"); -var dup221 = setc("ec_subject","Configuration"); +var dup221 = match("MESSAGE#539:00030:86/0", "nwparser.payload", "FIPS test for %{p0}"); -var dup222 = setc("ec_activity","Request"); +var dup222 = match("MESSAGE#539:00030:86/1_0", "nwparser.p0", "ECDSA %{p0}"); -var dup223 = // "Pattern{Constant('FIPS test for '), Field(p0,false)}" -match("MESSAGE#539:00030:86/0", "nwparser.payload", "FIPS test for %{p0}"); +var dup223 = setc("eventcategory","1612000000"); -var dup224 = // "Pattern{Constant('ECDSA '), Field(p0,false)}" -match("MESSAGE#539:00030:86/1_0", "nwparser.p0", "ECDSA %{p0}"); +var dup224 = match("MESSAGE#543:00031:02/1_0", "nwparser.p0", "yes %{p0}"); -var dup225 = setc("eventcategory","1612000000"); +var dup225 = match("MESSAGE#543:00031:02/1_1", "nwparser.p0", "no %{p0}"); -var dup226 = // "Pattern{Constant('yes '), Field(p0,false)}" -match("MESSAGE#543:00031:02/1_0", "nwparser.p0", "yes %{p0}"); +var dup226 = match("MESSAGE#545:00031:04/1_1", "nwparser.p0", "location %{p0}"); -var dup227 = // "Pattern{Constant('no '), Field(p0,false)}" -match("MESSAGE#543:00031:02/1_1", "nwparser.p0", "no %{p0}"); +var dup227 = match("MESSAGE#548:00031:05/2", "nwparser.p0", "%{} %{interface}"); -var dup228 = // "Pattern{Constant('location '), Field(p0,false)}" -match("MESSAGE#545:00031:04/1_1", "nwparser.p0", "location %{p0}"); +var dup228 = match("MESSAGE#549:00031:06/0", "nwparser.payload", "arp re%{p0}"); -var dup229 = // "Pattern{Field(,true), Constant(' '), Field(interface,false)}" -match("MESSAGE#548:00031:05/2", "nwparser.p0", "%{} %{interface}"); +var dup229 = match("MESSAGE#549:00031:06/1_1", "nwparser.p0", "q %{p0}"); -var dup230 = // "Pattern{Constant('arp re'), Field(p0,false)}" -match("MESSAGE#549:00031:06/0", "nwparser.payload", "arp re%{p0}"); +var dup230 = match("MESSAGE#549:00031:06/1_2", "nwparser.p0", "ply %{p0}"); -var dup231 = // "Pattern{Constant('q '), Field(p0,false)}" -match("MESSAGE#549:00031:06/1_1", "nwparser.p0", "q %{p0}"); +var dup231 = match("MESSAGE#549:00031:06/9_0", "nwparser.p0", "%{interface->} (%{fld1})"); -var dup232 = // "Pattern{Constant('ply '), Field(p0,false)}" -match("MESSAGE#549:00031:06/1_2", "nwparser.p0", "ply %{p0}"); +var dup232 = setc("eventcategory","1201000000"); -var dup233 = // "Pattern{Field(interface,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#549:00031:06/9_0", "nwparser.p0", "%{interface->} (%{fld1})"); +var dup233 = match("MESSAGE#561:00033/0_0", "nwparser.payload", "Global PRO %{p0}"); -var dup234 = setc("eventcategory","1201000000"); +var dup234 = match("MESSAGE#561:00033/0_1", "nwparser.payload", "%{fld3->} %{p0}"); -var dup235 = // "Pattern{Constant('Global PRO '), Field(p0,false)}" -match("MESSAGE#561:00033/0_0", "nwparser.payload", "Global PRO %{p0}"); +var dup235 = match("MESSAGE#569:00033:08/0", "nwparser.payload", "NACN Policy Manager %{p0}"); -var dup236 = // "Pattern{Field(fld3,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#561:00033/0_1", "nwparser.payload", "%{fld3->} %{p0}"); +var dup236 = match("MESSAGE#569:00033:08/1_0", "nwparser.p0", "1 %{p0}"); -var dup237 = // "Pattern{Constant('NACN Policy Manager '), Field(p0,false)}" -match("MESSAGE#569:00033:08/0", "nwparser.payload", "NACN Policy Manager %{p0}"); +var dup237 = match("MESSAGE#569:00033:08/1_1", "nwparser.p0", "2 %{p0}"); -var dup238 = // "Pattern{Constant('1 '), Field(p0,false)}" -match("MESSAGE#569:00033:08/1_0", "nwparser.p0", "1 %{p0}"); +var dup238 = match("MESSAGE#571:00033:10/3_1", "nwparser.p0", "unset %{p0}"); -var dup239 = // "Pattern{Constant('2 '), Field(p0,false)}" -match("MESSAGE#569:00033:08/1_1", "nwparser.p0", "2 %{p0}"); +var dup239 = match("MESSAGE#581:00033:21/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var dup240 = // "Pattern{Constant('unset '), Field(p0,false)}" -match("MESSAGE#571:00033:10/3_1", "nwparser.p0", "unset %{p0}"); +var dup240 = setc("eventcategory","1401000000"); -var dup241 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#581:00033:21/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var dup241 = match("MESSAGE#586:00034:01/2_1", "nwparser.p0", "SSH %{p0}"); -var dup242 = setc("eventcategory","1401000000"); +var dup242 = match("MESSAGE#588:00034:03/0_0", "nwparser.payload", "SCS: NetScreen %{p0}"); -var dup243 = // "Pattern{Constant('SSH '), Field(p0,false)}" -match("MESSAGE#586:00034:01/2_1", "nwparser.p0", "SSH %{p0}"); +var dup243 = match("MESSAGE#588:00034:03/0_1", "nwparser.payload", "NetScreen %{p0}"); -var dup244 = // "Pattern{Constant('SCS: NetScreen '), Field(p0,false)}" -match("MESSAGE#588:00034:03/0_0", "nwparser.payload", "SCS: NetScreen %{p0}"); +var dup244 = match("MESSAGE#595:00034:10/0", "nwparser.payload", "S%{p0}"); -var dup245 = // "Pattern{Constant('NetScreen '), Field(p0,false)}" -match("MESSAGE#588:00034:03/0_1", "nwparser.payload", "NetScreen %{p0}"); +var dup245 = match("MESSAGE#595:00034:10/1_0", "nwparser.p0", "CS: SSH%{p0}"); -var dup246 = // "Pattern{Constant('S'), Field(p0,false)}" -match("MESSAGE#595:00034:10/0", "nwparser.payload", "S%{p0}"); +var dup246 = match("MESSAGE#595:00034:10/1_1", "nwparser.p0", "SH%{p0}"); -var dup247 = // "Pattern{Constant('CS: SSH'), Field(p0,false)}" -match("MESSAGE#595:00034:10/1_0", "nwparser.p0", "CS: SSH%{p0}"); +var dup247 = match("MESSAGE#596:00034:12/3_0", "nwparser.p0", "the root system %{p0}"); -var dup248 = // "Pattern{Constant('SH'), Field(p0,false)}" -match("MESSAGE#595:00034:10/1_1", "nwparser.p0", "SH%{p0}"); +var dup248 = match("MESSAGE#596:00034:12/3_1", "nwparser.p0", "vsys %{fld2->} %{p0}"); -var dup249 = // "Pattern{Constant('the root system '), Field(p0,false)}" -match("MESSAGE#596:00034:12/3_0", "nwparser.p0", "the root system %{p0}"); +var dup249 = match("MESSAGE#599:00034:18/1_0", "nwparser.p0", "CS: SSH %{p0}"); -var dup250 = // "Pattern{Constant('vsys '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#596:00034:12/3_1", "nwparser.p0", "vsys %{fld2->} %{p0}"); +var dup250 = match("MESSAGE#599:00034:18/1_1", "nwparser.p0", "SH %{p0}"); -var dup251 = // "Pattern{Constant('CS: SSH '), Field(p0,false)}" -match("MESSAGE#599:00034:18/1_0", "nwparser.p0", "CS: SSH %{p0}"); +var dup251 = match("MESSAGE#630:00035:06/1_0", "nwparser.p0", "a %{p0}"); -var dup252 = // "Pattern{Constant('SH '), Field(p0,false)}" -match("MESSAGE#599:00034:18/1_1", "nwparser.p0", "SH %{p0}"); +var dup252 = match("MESSAGE#630:00035:06/1_1", "nwparser.p0", "ert %{p0}"); -var dup253 = // "Pattern{Constant('a '), Field(p0,false)}" -match("MESSAGE#630:00035:06/1_0", "nwparser.p0", "a %{p0}"); +var dup253 = match("MESSAGE#633:00035:09/0", "nwparser.payload", "SSL %{p0}"); -var dup254 = // "Pattern{Constant('ert '), Field(p0,false)}" -match("MESSAGE#630:00035:06/1_1", "nwparser.p0", "ert %{p0}"); +var dup254 = setc("eventcategory","1608000000"); -var dup255 = // "Pattern{Constant('SSL '), Field(p0,false)}" -match("MESSAGE#633:00035:09/0", "nwparser.payload", "SSL %{p0}"); +var dup255 = match("MESSAGE#644:00037:01/1_0", "nwparser.p0", "id: %{p0}"); -var dup256 = setc("eventcategory","1608000000"); +var dup256 = match("MESSAGE#644:00037:01/1_1", "nwparser.p0", "ID %{p0}"); -var dup257 = // "Pattern{Constant('id: '), Field(p0,false)}" -match("MESSAGE#644:00037:01/1_0", "nwparser.p0", "id: %{p0}"); +var dup257 = match("MESSAGE#659:00044/1_0", "nwparser.p0", "permit %{p0}"); -var dup258 = // "Pattern{Constant('ID '), Field(p0,false)}" -match("MESSAGE#644:00037:01/1_1", "nwparser.p0", "ID %{p0}"); +var dup258 = match("MESSAGE#675:00055/0", "nwparser.payload", "IGMP %{p0}"); -var dup259 = // "Pattern{Constant('permit '), Field(p0,false)}" -match("MESSAGE#659:00044/1_0", "nwparser.p0", "permit %{p0}"); +var dup259 = match("MESSAGE#677:00055:02/0", "nwparser.payload", "IGMP will %{p0}"); -var dup260 = // "Pattern{Constant('IGMP '), Field(p0,false)}" -match("MESSAGE#675:00055/0", "nwparser.payload", "IGMP %{p0}"); +var dup260 = match("MESSAGE#677:00055:02/1_0", "nwparser.p0", "not do %{p0}"); -var dup261 = // "Pattern{Constant('IGMP will '), Field(p0,false)}" -match("MESSAGE#677:00055:02/0", "nwparser.payload", "IGMP will %{p0}"); +var dup261 = match("MESSAGE#677:00055:02/1_1", "nwparser.p0", "do %{p0}"); -var dup262 = // "Pattern{Constant('not do '), Field(p0,false)}" -match("MESSAGE#677:00055:02/1_0", "nwparser.p0", "not do %{p0}"); +var dup262 = match("MESSAGE#689:00059/1_1", "nwparser.p0", "shut down %{p0}"); -var dup263 = // "Pattern{Constant('do '), Field(p0,false)}" -match("MESSAGE#677:00055:02/1_1", "nwparser.p0", "do %{p0}"); +var dup263 = match("MESSAGE#707:00070/0", "nwparser.payload", "NSRP: %{p0}"); -var dup264 = // "Pattern{Constant('shut down '), Field(p0,false)}" -match("MESSAGE#689:00059/1_1", "nwparser.p0", "shut down %{p0}"); +var dup264 = match("MESSAGE#707:00070/1_0", "nwparser.p0", "Unit %{p0}"); -var dup265 = // "Pattern{Constant('NSRP: '), Field(p0,false)}" -match("MESSAGE#707:00070/0", "nwparser.payload", "NSRP: %{p0}"); +var dup265 = match("MESSAGE#707:00070/1_1", "nwparser.p0", "local unit= %{p0}"); -var dup266 = // "Pattern{Constant('Unit '), Field(p0,false)}" -match("MESSAGE#707:00070/1_0", "nwparser.p0", "Unit %{p0}"); +var dup266 = match("MESSAGE#707:00070/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); -var dup267 = // "Pattern{Constant('local unit= '), Field(p0,false)}" -match("MESSAGE#707:00070/1_1", "nwparser.p0", "local unit= %{p0}"); +var dup267 = match("MESSAGE#708:00070:01/0", "nwparser.payload", "The local device %{fld2->} in the Virtual Sec%{p0}"); -var dup268 = // "Pattern{Field(fld2,true), Constant(' of VSD group '), Field(group,true), Constant(' '), Field(info,false)}" -match("MESSAGE#707:00070/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); +var dup268 = match("MESSAGE#708:00070:01/1_0", "nwparser.p0", "ruity%{p0}"); -var dup269 = // "Pattern{Constant('The local device '), Field(fld2,true), Constant(' in the Virtual Sec'), Field(p0,false)}" -match("MESSAGE#708:00070:01/0", "nwparser.payload", "The local device %{fld2->} in the Virtual Sec%{p0}"); +var dup269 = match("MESSAGE#708:00070:01/1_1", "nwparser.p0", "urity%{p0}"); -var dup270 = // "Pattern{Constant('ruity'), Field(p0,false)}" -match("MESSAGE#708:00070:01/1_0", "nwparser.p0", "ruity%{p0}"); +var dup270 = match("MESSAGE#713:00072:01/2", "nwparser.p0", "%{}Device group %{group->} changed state"); -var dup271 = // "Pattern{Constant('urity'), Field(p0,false)}" -match("MESSAGE#708:00070:01/1_1", "nwparser.p0", "urity%{p0}"); +var dup271 = match("MESSAGE#717:00075/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); -var dup272 = // "Pattern{Field(,false), Constant('Device group '), Field(group,true), Constant(' changed state')}" -match("MESSAGE#713:00072:01/2", "nwparser.p0", "%{}Device group %{group->} changed state"); +var dup272 = setc("eventcategory","1805010000"); -var dup273 = // "Pattern{Constant(''), Field(fld2,true), Constant(' of VSD group '), Field(group,true), Constant(' '), Field(info,false)}" -match("MESSAGE#717:00075/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); +var dup273 = setc("eventcategory","1805000000"); -var dup274 = setc("eventcategory","1805010000"); - -var dup275 = setc("eventcategory","1805000000"); - -var dup276 = date_time({ +var dup274 = date_time({ dest: "starttime", args: ["fld2"], fmts: [ @@ -834,7 +623,7 @@ var dup276 = date_time({ ], }); -var dup277 = call({ +var dup275 = call({ dest: "nwparser.bytes", fn: CALC, args: [ @@ -844,13 +633,13 @@ var dup277 = call({ ], }); -var dup278 = setc("action","Deny"); +var dup276 = setc("action","Deny"); -var dup279 = setc("disposition","Deny"); +var dup277 = setc("disposition","Deny"); -var dup280 = setc("direction","outgoing"); +var dup278 = setc("direction","outgoing"); -var dup281 = call({ +var dup279 = call({ dest: "nwparser.inout", fn: DIRCHK, args: [ @@ -862,36 +651,29 @@ var dup281 = call({ ], }); -var dup282 = setc("direction","incoming"); +var dup280 = setc("direction","incoming"); -var dup283 = setc("eventcategory","1801000000"); +var dup281 = setc("eventcategory","1801000000"); -var dup284 = setf("action","disposition"); +var dup282 = setf("action","disposition"); -var dup285 = // "Pattern{Constant('start_time='), Field(p0,false)}" -match("MESSAGE#748:00257:19/0", "nwparser.payload", "start_time=%{p0}"); +var dup283 = match("MESSAGE#748:00257:19/0", "nwparser.payload", "start_time=%{p0}"); -var dup286 = // "Pattern{Constant('\"'), Field(fld2,false), Constant('\"'), Field(p0,false)}" -match("MESSAGE#748:00257:19/1_0", "nwparser.p0", "\\\"%{fld2}\\\"%{p0}"); +var dup284 = match("MESSAGE#748:00257:19/1_0", "nwparser.p0", "\\\"%{fld2}\\\"%{p0}"); -var dup287 = // "Pattern{Constant(' "'), Field(fld2,false), Constant('" '), Field(p0,false)}" -match("MESSAGE#748:00257:19/1_1", "nwparser.p0", " \"%{fld2}\" %{p0}"); +var dup285 = match("MESSAGE#748:00257:19/1_1", "nwparser.p0", " \"%{fld2}\" %{p0}"); -var dup288 = // "Pattern{Field(daddr,false)}" -match_copy("MESSAGE#756:00257:10/1_1", "nwparser.p0", "daddr"); +var dup286 = match_copy("MESSAGE#756:00257:10/1_1", "nwparser.p0", "daddr"); -var dup289 = // "Pattern{Constant('Admin '), Field(p0,false)}" -match("MESSAGE#760:00259/0_0", "nwparser.payload", "Admin %{p0}"); +var dup287 = match("MESSAGE#760:00259/0_0", "nwparser.payload", "Admin %{p0}"); -var dup290 = // "Pattern{Constant('Vsys admin '), Field(p0,false)}" -match("MESSAGE#760:00259/0_1", "nwparser.payload", "Vsys admin %{p0}"); +var dup288 = match("MESSAGE#760:00259/0_1", "nwparser.payload", "Vsys admin %{p0}"); -var dup291 = // "Pattern{Constant('Telnet '), Field(p0,false)}" -match("MESSAGE#760:00259/2_1", "nwparser.p0", "Telnet %{p0}"); +var dup289 = match("MESSAGE#760:00259/2_1", "nwparser.p0", "Telnet %{p0}"); -var dup292 = setc("eventcategory","1401050200"); +var dup290 = setc("eventcategory","1401050200"); -var dup293 = call({ +var dup291 = call({ dest: "nwparser.inout", fn: DIRCHK, args: [ @@ -901,7 +683,7 @@ var dup293 = call({ ], }); -var dup294 = call({ +var dup292 = call({ dest: "nwparser.inout", fn: DIRCHK, args: [ @@ -913,117 +695,85 @@ var dup294 = call({ ], }); -var dup295 = // "Pattern{Constant(''), Field(interface,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#777:00406/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times."); +var dup293 = match("MESSAGE#777:00406/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times."); -var dup296 = // "Pattern{Constant(''), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#790:00423/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times."); +var dup294 = match("MESSAGE#790:00423/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times."); -var dup297 = // "Pattern{Constant(''), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times.'), Field(p0,false)}" -match("MESSAGE#793:00430/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times.%{p0}"); +var dup295 = match("MESSAGE#793:00430/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times.%{p0}"); -var dup298 = // "Pattern{Field(obj_type,true), Constant(' '), Field(disposition,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#795:00431/0", "nwparser.payload", "%{obj_type->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var dup296 = match("MESSAGE#795:00431/0", "nwparser.payload", "%{obj_type->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var dup299 = setc("eventcategory","1204000000"); +var dup297 = setc("eventcategory","1204000000"); -var dup300 = // "Pattern{Field(signame,true), Constant(' '), Field(disposition,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#797:00433/0", "nwparser.payload", "%{signame->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var dup298 = match("MESSAGE#797:00433/0", "nwparser.payload", "%{signame->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var dup301 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(p0,false)}" -match("MESSAGE#804:00437:01/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{p0}"); +var dup299 = match("MESSAGE#804:00437:01/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{p0}"); -var dup302 = // "Pattern{Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#817:00511:01/1_0", "nwparser.p0", "%{administrator->} (%{fld1})"); +var dup300 = match("MESSAGE#817:00511:01/1_0", "nwparser.p0", "%{administrator->} (%{fld1})"); -var dup303 = setc("eventcategory","1801020000"); +var dup301 = setc("eventcategory","1801020000"); -var dup304 = setc("disposition","failed"); +var dup302 = setc("disposition","failed"); -var dup305 = // "Pattern{Constant('ut '), Field(p0,false)}" -match("MESSAGE#835:00515:04/2_1", "nwparser.p0", "ut %{p0}"); +var dup303 = match("MESSAGE#835:00515:04/2_1", "nwparser.p0", "ut %{p0}"); -var dup306 = // "Pattern{Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#835:00515:04/4_0", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport}"); +var dup304 = match("MESSAGE#835:00515:04/4_0", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport}"); -var dup307 = // "Pattern{Constant('user '), Field(p0,false)}" -match("MESSAGE#837:00515:05/1_0", "nwparser.p0", "user %{p0}"); +var dup305 = match("MESSAGE#837:00515:05/1_0", "nwparser.p0", "user %{p0}"); -var dup308 = // "Pattern{Constant('the '), Field(logon_type,false)}" -match("MESSAGE#837:00515:05/5_0", "nwparser.p0", "the %{logon_type}"); +var dup306 = match("MESSAGE#837:00515:05/5_0", "nwparser.p0", "the %{logon_type}"); -var dup309 = // "Pattern{Constant('WebAuth user '), Field(p0,false)}" -match("MESSAGE#869:00519:01/1_0", "nwparser.p0", "WebAuth user %{p0}"); +var dup307 = match("MESSAGE#869:00519:01/1_0", "nwparser.p0", "WebAuth user %{p0}"); -var dup310 = // "Pattern{Constant('backup1 '), Field(p0,false)}" -match("MESSAGE#876:00520:02/1_1", "nwparser.p0", "backup1 %{p0}"); +var dup308 = match("MESSAGE#876:00520:02/1_1", "nwparser.p0", "backup1 %{p0}"); -var dup311 = // "Pattern{Constant('backup2 '), Field(p0,false)}" -match("MESSAGE#876:00520:02/1_2", "nwparser.p0", "backup2 %{p0}"); +var dup309 = match("MESSAGE#876:00520:02/1_2", "nwparser.p0", "backup2 %{p0}"); -var dup312 = // "Pattern{Constant(','), Field(p0,false)}" -match("MESSAGE#890:00524:13/1_0", "nwparser.p0", ",%{p0}"); +var dup310 = match("MESSAGE#890:00524:13/1_0", "nwparser.p0", ",%{p0}"); -var dup313 = // "Pattern{Constant('assigned '), Field(p0,false)}" -match("MESSAGE#901:00527/1_0", "nwparser.p0", "assigned %{p0}"); +var dup311 = match("MESSAGE#901:00527/1_0", "nwparser.p0", "assigned %{p0}"); -var dup314 = // "Pattern{Constant('assigned to '), Field(p0,false)}" -match("MESSAGE#901:00527/3_0", "nwparser.p0", "assigned to %{p0}"); +var dup312 = match("MESSAGE#901:00527/3_0", "nwparser.p0", "assigned to %{p0}"); -var dup315 = setc("eventcategory","1803020000"); +var dup313 = setc("eventcategory","1803020000"); -var dup316 = setc("eventcategory","1613030000"); +var dup314 = setc("eventcategory","1613030000"); -var dup317 = // "Pattern{Constant('''), Field(administrator,false), Constant('' '), Field(p0,false)}" -match("MESSAGE#927:00528:15/1_0", "nwparser.p0", "'%{administrator}' %{p0}"); +var dup315 = match("MESSAGE#927:00528:15/1_0", "nwparser.p0", "'%{administrator}' %{p0}"); -var dup318 = // "Pattern{Constant('SSH: P'), Field(p0,false)}" -match("MESSAGE#930:00528:18/0", "nwparser.payload", "SSH: P%{p0}"); +var dup316 = match("MESSAGE#930:00528:18/0", "nwparser.payload", "SSH: P%{p0}"); -var dup319 = // "Pattern{Constant('KA '), Field(p0,false)}" -match("MESSAGE#930:00528:18/1_0", "nwparser.p0", "KA %{p0}"); +var dup317 = match("MESSAGE#930:00528:18/1_0", "nwparser.p0", "KA %{p0}"); -var dup320 = // "Pattern{Constant('assword '), Field(p0,false)}" -match("MESSAGE#930:00528:18/1_1", "nwparser.p0", "assword %{p0}"); +var dup318 = match("MESSAGE#930:00528:18/1_1", "nwparser.p0", "assword %{p0}"); -var dup321 = // "Pattern{Constant('\''), Field(administrator,false), Constant('\' '), Field(p0,false)}" -match("MESSAGE#930:00528:18/3_0", "nwparser.p0", "\\'%{administrator}\\' %{p0}"); +var dup319 = match("MESSAGE#930:00528:18/3_0", "nwparser.p0", "\\'%{administrator}\\' %{p0}"); -var dup322 = // "Pattern{Constant('at host '), Field(saddr,false)}" -match("MESSAGE#930:00528:18/4", "nwparser.p0", "at host %{saddr}"); +var dup320 = match("MESSAGE#930:00528:18/4", "nwparser.p0", "at host %{saddr}"); -var dup323 = // "Pattern{Field(,false), Constant('S'), Field(p0,false)}" -match("MESSAGE#932:00528:19/0", "nwparser.payload", "%{}S%{p0}"); +var dup321 = match("MESSAGE#932:00528:19/0", "nwparser.payload", "%{}S%{p0}"); -var dup324 = // "Pattern{Constant('CS '), Field(p0,false)}" -match("MESSAGE#932:00528:19/1_0", "nwparser.p0", "CS %{p0}"); +var dup322 = match("MESSAGE#932:00528:19/1_0", "nwparser.p0", "CS %{p0}"); -var dup325 = setc("event_description","Cannot connect to NSM server"); +var dup323 = setc("event_description","Cannot connect to NSM server"); -var dup326 = setc("eventcategory","1603040000"); +var dup324 = setc("eventcategory","1603040000"); -var dup327 = // "Pattern{Constant('from server.ini file.'), Field(,false)}" -match("MESSAGE#1060:00553/2", "nwparser.p0", "from server.ini file.%{}"); +var dup325 = match("MESSAGE#1060:00553/2", "nwparser.p0", "from server.ini file.%{}"); -var dup328 = // "Pattern{Constant('pattern '), Field(p0,false)}" -match("MESSAGE#1064:00553:04/1_0", "nwparser.p0", "pattern %{p0}"); +var dup326 = match("MESSAGE#1064:00553:04/1_0", "nwparser.p0", "pattern %{p0}"); -var dup329 = // "Pattern{Constant('server.ini '), Field(p0,false)}" -match("MESSAGE#1064:00553:04/1_1", "nwparser.p0", "server.ini %{p0}"); +var dup327 = match("MESSAGE#1064:00553:04/1_1", "nwparser.p0", "server.ini %{p0}"); -var dup330 = // "Pattern{Constant('file.'), Field(,false)}" -match("MESSAGE#1068:00553:08/2", "nwparser.p0", "file.%{}"); +var dup328 = match("MESSAGE#1068:00553:08/2", "nwparser.p0", "file.%{}"); -var dup331 = // "Pattern{Constant('AV pattern '), Field(p0,false)}" -match("MESSAGE#1087:00554:04/1_1", "nwparser.p0", "AV pattern %{p0}"); +var dup329 = match("MESSAGE#1087:00554:04/1_1", "nwparser.p0", "AV pattern %{p0}"); -var dup332 = // "Pattern{Constant('added into '), Field(p0,false)}" -match("MESSAGE#1116:00556:14/1_0", "nwparser.p0", "added into %{p0}"); +var dup330 = match("MESSAGE#1116:00556:14/1_0", "nwparser.p0", "added into %{p0}"); -var dup333 = // "Pattern{Constant('loader '), Field(p0,false)}" -match("MESSAGE#1157:00767:11/1_0", "nwparser.p0", "loader %{p0}"); +var dup331 = match("MESSAGE#1157:00767:11/1_0", "nwparser.p0", "loader %{p0}"); -var dup334 = call({ +var dup332 = call({ dest: "nwparser.inout", fn: DIRCHK, args: [ @@ -1035,13 +785,12 @@ var dup334 = call({ ], }); -var dup335 = linear_select([ +var dup333 = linear_select([ dup10, dup11, ]); -var dup336 = // "Pattern{Constant('Policy ID='), Field(policy_id,true), Constant(' Rate='), Field(fld2,true), Constant(' exceeds threshold')}" -match("MESSAGE#7:00001:07", "nwparser.payload", "Policy ID=%{policy_id->} Rate=%{fld2->} exceeds threshold", processor_chain([ +var dup334 = match("MESSAGE#7:00001:07", "nwparser.payload", "Policy ID=%{policy_id->} Rate=%{fld2->} exceeds threshold", processor_chain([ dup1, dup2, dup3, @@ -1049,38 +798,37 @@ match("MESSAGE#7:00001:07", "nwparser.payload", "Policy ID=%{policy_id->} Rate=% dup5, ])); -var dup337 = linear_select([ +var dup335 = linear_select([ dup13, dup14, ]); -var dup338 = linear_select([ +var dup336 = linear_select([ dup15, dup16, ]); -var dup339 = linear_select([ +var dup337 = linear_select([ dup56, dup57, ]); -var dup340 = linear_select([ +var dup338 = linear_select([ dup65, dup66, ]); -var dup341 = linear_select([ +var dup339 = linear_select([ dup68, dup69, ]); -var dup342 = linear_select([ +var dup340 = linear_select([ dup71, dup72, ]); -var dup343 = // "Pattern{Field(signame,true), Constant(' from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' protocol '), Field(protocol,true), Constant(' ('), Field(interface,false), Constant(')')}" -match("MESSAGE#84:00005:04", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{interface})", processor_chain([ +var dup341 = match("MESSAGE#84:00005:04", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{interface})", processor_chain([ dup58, dup2, dup3, @@ -1089,138 +837,135 @@ match("MESSAGE#84:00005:04", "nwparser.payload", "%{signame->} from %{saddr}/%{s dup61, ])); -var dup344 = linear_select([ +var dup342 = linear_select([ dup74, dup75, ]); -var dup345 = linear_select([ +var dup343 = linear_select([ dup81, dup82, ]); -var dup346 = linear_select([ +var dup344 = linear_select([ dup24, dup90, ]); -var dup347 = linear_select([ +var dup345 = linear_select([ dup94, dup95, ]); -var dup348 = linear_select([ +var dup346 = linear_select([ dup98, dup99, ]); -var dup349 = linear_select([ +var dup347 = linear_select([ dup100, dup101, dup102, ]); -var dup350 = linear_select([ +var dup348 = linear_select([ dup113, dup114, ]); -var dup351 = linear_select([ +var dup349 = linear_select([ dup111, dup16, ]); -var dup352 = linear_select([ +var dup350 = linear_select([ dup127, dup107, ]); -var dup353 = linear_select([ +var dup351 = linear_select([ dup8, dup21, ]); -var dup354 = linear_select([ +var dup352 = linear_select([ dup122, dup133, ]); -var dup355 = linear_select([ +var dup353 = linear_select([ dup142, dup143, ]); -var dup356 = linear_select([ +var dup354 = linear_select([ dup145, dup21, ]); -var dup357 = linear_select([ +var dup355 = linear_select([ dup127, dup106, ]); -var dup358 = linear_select([ +var dup356 = linear_select([ dup152, dup96, ]); -var dup359 = linear_select([ +var dup357 = linear_select([ dup154, dup155, ]); -var dup360 = linear_select([ +var dup358 = linear_select([ dup156, dup157, ]); -var dup361 = linear_select([ +var dup359 = linear_select([ dup99, dup134, ]); -var dup362 = linear_select([ +var dup360 = linear_select([ dup158, dup159, ]); -var dup363 = linear_select([ - dup160, +var dup361 = linear_select([ dup161, + dup162, ]); -var dup364 = linear_select([ +var dup362 = linear_select([ dup163, - dup164, -]); - -var dup365 = linear_select([ - dup165, dup103, ]); -var dup366 = linear_select([ - dup164, - dup163, +var dup363 = linear_select([ + dup162, + dup161, ]); -var dup367 = linear_select([ +var dup364 = linear_select([ dup46, dup47, ]); -var dup368 = linear_select([ - dup168, - dup169, +var dup365 = linear_select([ + dup166, + dup167, ]); -var dup369 = linear_select([ - dup174, - dup175, +var dup366 = linear_select([ + dup172, + dup173, ]); -var dup370 = linear_select([ +var dup367 = linear_select([ + dup174, + dup175, dup176, dup177, dup178, @@ -1228,47 +973,44 @@ var dup370 = linear_select([ dup180, dup181, dup182, - dup183, - dup184, ]); -var dup371 = linear_select([ +var dup368 = linear_select([ dup49, dup21, ]); -var dup372 = linear_select([ - dup191, - dup192, +var dup369 = linear_select([ + dup189, + dup190, ]); -var dup373 = linear_select([ +var dup370 = linear_select([ dup96, dup152, ]); -var dup374 = linear_select([ - dup198, - dup199, +var dup371 = linear_select([ + dup196, + dup197, ]); -var dup375 = linear_select([ +var dup372 = linear_select([ dup24, - dup202, + dup200, ]); -var dup376 = linear_select([ +var dup373 = linear_select([ dup103, - dup165, + dup163, ]); -var dup377 = linear_select([ - dup207, +var dup374 = linear_select([ + dup205, dup118, ]); -var dup378 = // "Pattern{Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#477:00030:02", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ +var dup375 = match("MESSAGE#477:00030:02", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -1276,88 +1018,87 @@ match("MESSAGE#477:00030:02", "nwparser.payload", "%{change_attribute->} has bee dup5, ])); -var dup379 = linear_select([ - dup214, +var dup376 = linear_select([ + dup212, + dup213, +]); + +var dup377 = linear_select([ dup215, + dup216, ]); -var dup380 = linear_select([ - dup217, - dup218, +var dup378 = linear_select([ + dup222, + dup215, ]); -var dup381 = linear_select([ +var dup379 = linear_select([ dup224, - dup217, + dup225, ]); -var dup382 = linear_select([ - dup226, - dup227, +var dup380 = linear_select([ + dup231, + dup124, ]); -var dup383 = linear_select([ - dup233, - dup124, +var dup381 = linear_select([ + dup229, + dup230, ]); -var dup384 = linear_select([ - dup231, - dup232, +var dup382 = linear_select([ + dup233, + dup234, ]); -var dup385 = linear_select([ - dup235, +var dup383 = linear_select([ dup236, + dup237, ]); -var dup386 = linear_select([ - dup238, - dup239, +var dup384 = linear_select([ + dup242, + dup243, ]); -var dup387 = linear_select([ - dup244, +var dup385 = linear_select([ dup245, + dup246, ]); -var dup388 = linear_select([ +var dup386 = linear_select([ dup247, dup248, ]); -var dup389 = linear_select([ +var dup387 = linear_select([ dup249, dup250, ]); -var dup390 = linear_select([ +var dup388 = linear_select([ dup251, dup252, ]); -var dup391 = linear_select([ - dup253, - dup254, -]); - -var dup392 = linear_select([ - dup262, - dup263, +var dup389 = linear_select([ + dup260, + dup261, ]); -var dup393 = linear_select([ - dup266, - dup267, +var dup390 = linear_select([ + dup264, + dup265, ]); -var dup394 = linear_select([ - dup270, - dup271, +var dup391 = linear_select([ + dup268, + dup269, ]); -var dup395 = // "Pattern{Constant('The local device '), Field(fld2,true), Constant(' in the Virtual Security Device group '), Field(group,true), Constant(' '), Field(info,false)}" -match("MESSAGE#716:00074", "nwparser.payload", "The local device %{fld2->} in the Virtual Security Device group %{group->} %{info}", processor_chain([ +var dup392 = match("MESSAGE#716:00074", "nwparser.payload", "The local device %{fld2->} in the Virtual Security Device group %{group->} %{info}", processor_chain([ dup1, dup2, dup3, @@ -1365,18 +1106,17 @@ match("MESSAGE#716:00074", "nwparser.payload", "The local device %{fld2->} in th dup5, ])); -var dup396 = linear_select([ - dup286, - dup287, +var dup393 = linear_select([ + dup284, + dup285, ]); -var dup397 = linear_select([ - dup289, - dup290, +var dup394 = linear_select([ + dup287, + dup288, ]); -var dup398 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#799:00435", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ +var dup395 = match("MESSAGE#799:00435", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ dup58, dup2, dup59, @@ -1386,8 +1126,7 @@ match("MESSAGE#799:00435", "nwparser.payload", "%{signame->} From %{saddr->} to dup60, ])); -var dup399 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to zone '), Field(zone,false), Constant(', proto '), Field(protocol,true), Constant(' (int '), Field(interface,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#814:00442", "nwparser.payload", "%{signame->} From %{saddr->} to zone %{zone}, proto %{protocol->} (int %{interface}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var dup396 = match("MESSAGE#814:00442", "nwparser.payload", "%{signame->} From %{saddr->} to zone %{zone}, proto %{protocol->} (int %{interface}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup4, dup59, @@ -1398,116 +1137,112 @@ match("MESSAGE#814:00442", "nwparser.payload", "%{signame->} From %{saddr->} to dup60, ])); -var dup400 = linear_select([ - dup302, +var dup397 = linear_select([ + dup300, dup26, ]); -var dup401 = linear_select([ +var dup398 = linear_select([ dup115, - dup305, + dup303, ]); -var dup402 = linear_select([ +var dup399 = linear_select([ dup125, dup96, ]); -var dup403 = linear_select([ - dup191, - dup310, - dup311, +var dup400 = linear_select([ + dup189, + dup308, + dup309, ]); -var dup404 = linear_select([ - dup312, +var dup401 = linear_select([ + dup310, dup16, ]); -var dup405 = linear_select([ - dup319, - dup320, +var dup402 = linear_select([ + dup317, + dup318, ]); -var dup406 = linear_select([ - dup321, - dup317, +var dup403 = linear_select([ + dup319, + dup315, ]); -var dup407 = linear_select([ - dup324, - dup252, +var dup404 = linear_select([ + dup322, + dup250, ]); -var dup408 = linear_select([ +var dup405 = linear_select([ + dup327, dup329, - dup331, ]); -var dup409 = linear_select([ - dup332, +var dup406 = linear_select([ + dup330, dup129, ]); -var dup410 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1196:01269:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup283, +var dup407 = match("MESSAGE#1196:01269:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, + dup275, dup60, - dup284, + dup282, ])); -var dup411 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1197:01269:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup187, +var dup408 = match("MESSAGE#1197:01269:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, + dup274, dup3, + dup275, + dup276, dup277, - dup278, - dup279, dup60, ])); -var dup412 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1198:01269:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup283, +var dup409 = match("MESSAGE#1198:01269:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, + dup275, dup60, - dup284, + dup282, ])); -var dup413 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' ('), Field(fld3,false), Constant(') proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1203:23184", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup187, +var dup410 = match("MESSAGE#1203:23184", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, + dup274, dup3, + dup275, + dup276, dup277, - dup278, - dup279, dup61, ])); -var dup414 = all_match({ +var dup411 = all_match({ processors: [ - dup265, - dup393, - dup268, + dup263, + dup390, + dup266, ], on_success: processor_chain([ dup1, @@ -1518,11 +1253,11 @@ var dup414 = all_match({ ]), }); -var dup415 = all_match({ +var dup412 = all_match({ processors: [ - dup269, - dup394, - dup272, + dup267, + dup391, + dup270, ], on_success: processor_chain([ dup1, @@ -1533,11 +1268,11 @@ var dup415 = all_match({ ]), }); -var dup416 = all_match({ +var dup413 = all_match({ processors: [ dup80, - dup345, - dup295, + dup343, + dup293, ], on_success: processor_chain([ dup58, @@ -1550,14 +1285,14 @@ var dup416 = all_match({ ]), }); -var dup417 = all_match({ +var dup414 = all_match({ processors: [ - dup298, - dup345, + dup296, + dup343, dup131, ], on_success: processor_chain([ - dup299, + dup297, dup2, dup3, dup9, @@ -1568,14 +1303,14 @@ var dup417 = all_match({ ]), }); -var dup418 = all_match({ +var dup415 = all_match({ processors: [ - dup300, - dup345, + dup298, + dup343, dup131, ], on_success: processor_chain([ - dup299, + dup297, dup2, dup3, dup9, @@ -1586,32 +1321,25 @@ var dup418 = all_match({ ]), }); -var hdr1 = // "Pattern{Field(hfld1,false), Constant(': NetScreen device_id='), Field(hfld2,true), Constant(' [No Name]system-'), Field(hseverity,false), Constant('-'), Field(messageid,false), Constant('('), Field(hfld3,false), Constant('): '), Field(payload,false)}" -match("HEADER#0:0001", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} [No Name]system-%{hseverity}-%{messageid}(%{hfld3}): %{payload}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} [No Name]system-%{hseverity}-%{messageid}(%{hfld3}): %{payload}", processor_chain([ setc("header_id","0001"), ])); -var hdr2 = // "Pattern{Field(hfld1,false), Constant(': NetScreen device_id='), Field(hfld2,true), Constant(' ['), Field(hvsys,false), Constant(']system-'), Field(hseverity,false), Constant('-'), Field(messageid,false), Constant('('), Field(hfld3,false), Constant('): '), Field(payload,false)}" -match("HEADER#1:0003", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} [%{hvsys}]system-%{hseverity}-%{messageid}(%{hfld3}): %{payload}", processor_chain([ +var hdr2 = match("HEADER#1:0003", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} [%{hvsys}]system-%{hseverity}-%{messageid}(%{hfld3}): %{payload}", processor_chain([ setc("header_id","0003"), ])); -var hdr3 = // "Pattern{Field(hfld1,false), Constant(': NetScreen device_id='), Field(hfld2,true), Constant(' system-'), Field(hseverity,false), Constant('-'), Field(messageid,false), Constant('('), Field(hfld3,false), Constant('): '), Field(payload,false)}" -match("HEADER#2:0004", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} system-%{hseverity}-%{messageid}(%{hfld3}): %{payload}", processor_chain([ +var hdr3 = match("HEADER#2:0004", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} system-%{hseverity}-%{messageid}(%{hfld3}): %{payload}", processor_chain([ setc("header_id","0004"), ])); -var hdr4 = // "Pattern{Field(hfld1,false), Constant(': NetScreen device_id='), Field(hfld2,true), Constant(' '), Field(p0,false)}" -match("HEADER#3:0002/0", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} %{p0}"); +var hdr4 = match("HEADER#3:0002/0", "message", "%{hfld1}: NetScreen device_id=%{hfld2->} %{p0}"); -var part1 = // "Pattern{Constant('[No Name]system'), Field(p0,false)}" -match("HEADER#3:0002/1_0", "nwparser.p0", "[No Name]system%{p0}"); +var part1 = match("HEADER#3:0002/1_0", "nwparser.p0", "[No Name]system%{p0}"); -var part2 = // "Pattern{Constant('['), Field(hvsys,false), Constant(']system'), Field(p0,false)}" -match("HEADER#3:0002/1_1", "nwparser.p0", "[%{hvsys}]system%{p0}"); +var part2 = match("HEADER#3:0002/1_1", "nwparser.p0", "[%{hvsys}]system%{p0}"); -var part3 = // "Pattern{Constant('system'), Field(p0,false)}" -match("HEADER#3:0002/1_2", "nwparser.p0", "system%{p0}"); +var part3 = match("HEADER#3:0002/1_2", "nwparser.p0", "system%{p0}"); var select1 = linear_select([ part1, @@ -1619,8 +1347,7 @@ var select1 = linear_select([ part3, ]); -var part4 = // "Pattern{Constant('-'), Field(hseverity,false), Constant('-'), Field(messageid,false), Constant(': '), Field(payload,false)}" -match("HEADER#3:0002/2", "nwparser.p0", "-%{hseverity}-%{messageid}: %{payload}"); +var part4 = match("HEADER#3:0002/2", "nwparser.p0", "-%{hseverity}-%{messageid}: %{payload}"); var all1 = all_match({ processors: [ @@ -1640,8 +1367,7 @@ var select2 = linear_select([ all1, ]); -var part5 = // "Pattern{Field(zone,true), Constant(' address '), Field(interface,true), Constant(' with ip address '), Field(hostip,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#0:00001", "nwparser.payload", "%{zone->} address %{interface->} with ip address %{hostip->} has been %{disposition}", processor_chain([ +var part5 = match("MESSAGE#0:00001", "nwparser.payload", "%{zone->} address %{interface->} with ip address %{hostip->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1651,8 +1377,7 @@ match("MESSAGE#0:00001", "nwparser.payload", "%{zone->} address %{interface->} w var msg1 = msg("00001", part5); -var part6 = // "Pattern{Field(zone,true), Constant(' address '), Field(interface,true), Constant(' with domain name '), Field(domain,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#1:00001:01", "nwparser.payload", "%{zone->} address %{interface->} with domain name %{domain->} has been %{disposition}", processor_chain([ +var part6 = match("MESSAGE#1:00001:01", "nwparser.payload", "%{zone->} address %{interface->} with domain name %{domain->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1662,16 +1387,14 @@ match("MESSAGE#1:00001:01", "nwparser.payload", "%{zone->} address %{interface-> var msg2 = msg("00001:01", part6); -var part7 = // "Pattern{Constant('ip address '), Field(hostip,true), Constant(' in zone '), Field(p0,false)}" -match("MESSAGE#2:00001:02/1_0", "nwparser.p0", "ip address %{hostip->} in zone %{p0}"); +var part7 = match("MESSAGE#2:00001:02/1_0", "nwparser.p0", "ip address %{hostip->} in zone %{p0}"); var select3 = linear_select([ part7, dup7, ]); -var part8 = // "Pattern{Field(zone,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#2:00001:02/2", "nwparser.p0", "%{zone->} has been %{disposition}"); +var part8 = match("MESSAGE#2:00001:02/2", "nwparser.p0", "%{zone->} has been %{disposition}"); var all2 = all_match({ processors: [ @@ -1690,8 +1413,7 @@ var all2 = all_match({ var msg3 = msg("00001:02", all2); -var part9 = // "Pattern{Constant('arp entry '), Field(hostip,true), Constant(' interface changed!')}" -match("MESSAGE#3:00001:03", "nwparser.payload", "arp entry %{hostip->} interface changed!", processor_chain([ +var part9 = match("MESSAGE#3:00001:03", "nwparser.payload", "arp entry %{hostip->} interface changed!", processor_chain([ dup1, dup2, dup3, @@ -1701,19 +1423,16 @@ match("MESSAGE#3:00001:03", "nwparser.payload", "arp entry %{hostip->} interface var msg4 = msg("00001:03", part9); -var part10 = // "Pattern{Constant('IP address '), Field(hostip,true), Constant(' in zone '), Field(p0,false)}" -match("MESSAGE#4:00001:04/1_0", "nwparser.p0", "IP address %{hostip->} in zone %{p0}"); +var part10 = match("MESSAGE#4:00001:04/1_0", "nwparser.p0", "IP address %{hostip->} in zone %{p0}"); var select4 = linear_select([ part10, dup7, ]); -var part11 = // "Pattern{Field(zone,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' session'), Field(p0,false)}" -match("MESSAGE#4:00001:04/2", "nwparser.p0", "%{zone->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} session%{p0}"); +var part11 = match("MESSAGE#4:00001:04/2", "nwparser.p0", "%{zone->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} session%{p0}"); -var part12 = // "Pattern{Constant('.'), Field(fld1,false)}" -match("MESSAGE#4:00001:04/3_1", "nwparser.p0", ".%{fld1}"); +var part12 = match("MESSAGE#4:00001:04/3_1", "nwparser.p0", ".%{fld1}"); var select5 = linear_select([ dup8, @@ -1739,13 +1458,12 @@ var all3 = all_match({ var msg5 = msg("00001:04", all3); -var part13 = // "Pattern{Field(fld2,false), Constant(': Address '), Field(group_object,true), Constant(' for ip address '), Field(hostip,true), Constant(' in zone '), Field(zone,true), Constant(' has been '), Field(disposition,true), Constant(' from host '), Field(saddr,true), Constant(' session '), Field(p0,false)}" -match("MESSAGE#5:00001:05/0", "nwparser.payload", "%{fld2}: Address %{group_object->} for ip address %{hostip->} in zone %{zone->} has been %{disposition->} from host %{saddr->} session %{p0}"); +var part13 = match("MESSAGE#5:00001:05/0", "nwparser.payload", "%{fld2}: Address %{group_object->} for ip address %{hostip->} in zone %{zone->} has been %{disposition->} from host %{saddr->} session %{p0}"); var all4 = all_match({ processors: [ part13, - dup335, + dup333, ], on_success: processor_chain([ dup1, @@ -1759,8 +1477,7 @@ var all4 = all_match({ var msg6 = msg("00001:05", all4); -var part14 = // "Pattern{Constant('Address group '), Field(group_object,true), Constant(' '), Field(info,false)}" -match("MESSAGE#6:00001:06", "nwparser.payload", "Address group %{group_object->} %{info}", processor_chain([ +var part14 = match("MESSAGE#6:00001:06", "nwparser.payload", "Address group %{group_object->} %{info}", processor_chain([ dup1, dup2, dup3, @@ -1770,20 +1487,18 @@ match("MESSAGE#6:00001:06", "nwparser.payload", "Address group %{group_object->} var msg7 = msg("00001:06", part14); -var msg8 = msg("00001:07", dup336); +var msg8 = msg("00001:07", dup334); -var part15 = // "Pattern{Constant('for IP address '), Field(hostip,false), Constant('/'), Field(mask,true), Constant(' in zone '), Field(zone,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(p0,false)}" -match("MESSAGE#8:00001:08/2", "nwparser.p0", "for IP address %{hostip}/%{mask->} in zone %{zone->} has been %{disposition->} by %{p0}"); +var part15 = match("MESSAGE#8:00001:08/2", "nwparser.p0", "for IP address %{hostip}/%{mask->} in zone %{zone->} has been %{disposition->} by %{p0}"); -var part16 = // "Pattern{Field(,true), Constant(' '), Field(username,false), Constant('via NSRP Peer session. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#8:00001:08/4", "nwparser.p0", "%{} %{username}via NSRP Peer session. (%{fld1})"); +var part16 = match("MESSAGE#8:00001:08/4", "nwparser.p0", "%{} %{username}via NSRP Peer session. (%{fld1})"); var all5 = all_match({ processors: [ dup12, - dup337, + dup335, part15, - dup338, + dup336, part16, ], on_success: processor_chain([ @@ -1798,13 +1513,12 @@ var all5 = all_match({ var msg9 = msg("00001:08", all5); -var part17 = // "Pattern{Constant('for IP address '), Field(hostip,false), Constant('/'), Field(mask,true), Constant(' in zone '), Field(zone,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' session. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#9:00001:09/2", "nwparser.p0", "for IP address %{hostip}/%{mask->} in zone %{zone->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr}:%{sport->} session. (%{fld1})"); +var part17 = match("MESSAGE#9:00001:09/2", "nwparser.p0", "for IP address %{hostip}/%{mask->} in zone %{zone->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr}:%{sport->} session. (%{fld1})"); var all6 = all_match({ processors: [ dup12, - dup337, + dup335, part17, ], on_success: processor_chain([ @@ -1832,8 +1546,7 @@ var select6 = linear_select([ msg10, ]); -var part18 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#10:00002:03", "nwparser.payload", "Admin user %{administrator->} has been %{disposition}", processor_chain([ +var part18 = match("MESSAGE#10:00002:03", "nwparser.payload", "Admin user %{administrator->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1843,8 +1556,7 @@ match("MESSAGE#10:00002:03", "nwparser.payload", "Admin user %{administrator->} var msg11 = msg("00002:03", part18); -var part19 = // "Pattern{Constant('E-mail address '), Field(user_address,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#11:00002:04", "nwparser.payload", "E-mail address %{user_address->} has been %{disposition}", processor_chain([ +var part19 = match("MESSAGE#11:00002:04", "nwparser.payload", "E-mail address %{user_address->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1854,8 +1566,7 @@ match("MESSAGE#11:00002:04", "nwparser.payload", "E-mail address %{user_address- var msg12 = msg("00002:04", part19); -var part20 = // "Pattern{Constant('E-mail notification has been '), Field(disposition,false)}" -match("MESSAGE#12:00002:05", "nwparser.payload", "E-mail notification has been %{disposition}", processor_chain([ +var part20 = match("MESSAGE#12:00002:05", "nwparser.payload", "E-mail notification has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1865,8 +1576,7 @@ match("MESSAGE#12:00002:05", "nwparser.payload", "E-mail notification has been % var msg13 = msg("00002:05", part20); -var part21 = // "Pattern{Constant('Inclusion of traffic logs with e-mail notification of event alarms has been '), Field(disposition,false)}" -match("MESSAGE#13:00002:06", "nwparser.payload", "Inclusion of traffic logs with e-mail notification of event alarms has been %{disposition}", processor_chain([ +var part21 = match("MESSAGE#13:00002:06", "nwparser.payload", "Inclusion of traffic logs with e-mail notification of event alarms has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1876,8 +1586,7 @@ match("MESSAGE#13:00002:06", "nwparser.payload", "Inclusion of traffic logs with var msg14 = msg("00002:06", part21); -var part22 = // "Pattern{Constant('LCD display has been '), Field(action,true), Constant(' and the LCD control keys have been '), Field(disposition,false)}" -match("MESSAGE#14:00002:07", "nwparser.payload", "LCD display has been %{action->} and the LCD control keys have been %{disposition}", processor_chain([ +var part22 = match("MESSAGE#14:00002:07", "nwparser.payload", "LCD display has been %{action->} and the LCD control keys have been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1887,8 +1596,7 @@ match("MESSAGE#14:00002:07", "nwparser.payload", "LCD display has been %{action- var msg15 = msg("00002:07", part22); -var part23 = // "Pattern{Constant('HTTP component blocking for '), Field(fld2,true), Constant(' is '), Field(disposition,true), Constant(' on zone '), Field(zone,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#15:00002:55", "nwparser.payload", "HTTP component blocking for %{fld2->} is %{disposition->} on zone %{zone->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ +var part23 = match("MESSAGE#15:00002:55", "nwparser.payload", "HTTP component blocking for %{fld2->} is %{disposition->} on zone %{zone->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ dup1, dup2, dup4, @@ -1898,8 +1606,7 @@ match("MESSAGE#15:00002:55", "nwparser.payload", "HTTP component blocking for %{ var msg16 = msg("00002:55", part23); -var part24 = // "Pattern{Constant('LCD display has been '), Field(disposition,false)}" -match("MESSAGE#16:00002:08", "nwparser.payload", "LCD display has been %{disposition}", processor_chain([ +var part24 = match("MESSAGE#16:00002:08", "nwparser.payload", "LCD display has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1909,8 +1616,7 @@ match("MESSAGE#16:00002:08", "nwparser.payload", "LCD display has been %{disposi var msg17 = msg("00002:08", part24); -var part25 = // "Pattern{Constant('LCD control keys have been '), Field(disposition,false)}" -match("MESSAGE#17:00002:09", "nwparser.payload", "LCD control keys have been %{disposition}", processor_chain([ +var part25 = match("MESSAGE#17:00002:09", "nwparser.payload", "LCD control keys have been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1920,8 +1626,7 @@ match("MESSAGE#17:00002:09", "nwparser.payload", "LCD control keys have been %{d var msg18 = msg("00002:09", part25); -var part26 = // "Pattern{Constant('Mail server '), Field(hostip,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#18:00002:10", "nwparser.payload", "Mail server %{hostip->} has been %{disposition}", processor_chain([ +var part26 = match("MESSAGE#18:00002:10", "nwparser.payload", "Mail server %{hostip->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -1931,8 +1636,7 @@ match("MESSAGE#18:00002:10", "nwparser.payload", "Mail server %{hostip->} has be var msg19 = msg("00002:10", part26); -var part27 = // "Pattern{Constant('Management restriction for '), Field(hostip,true), Constant(' '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#19:00002:11", "nwparser.payload", "Management restriction for %{hostip->} %{fld2->} has been %{disposition}", processor_chain([ +var part27 = match("MESSAGE#19:00002:11", "nwparser.payload", "Management restriction for %{hostip->} %{fld2->} has been %{disposition}", processor_chain([ dup17, dup2, dup3, @@ -1942,8 +1646,7 @@ match("MESSAGE#19:00002:11", "nwparser.payload", "Management restriction for %{h var msg20 = msg("00002:11", part27); -var part28 = // "Pattern{Field(change_attribute,true), Constant(' has been restored from '), Field(change_old,true), Constant(' to default port '), Field(change_new,false)}" -match("MESSAGE#20:00002:12", "nwparser.payload", "%{change_attribute->} has been restored from %{change_old->} to default port %{change_new}", processor_chain([ +var part28 = match("MESSAGE#20:00002:12", "nwparser.payload", "%{change_attribute->} has been restored from %{change_old->} to default port %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -1953,8 +1656,7 @@ match("MESSAGE#20:00002:12", "nwparser.payload", "%{change_attribute->} has been var msg21 = msg("00002:12", part28); -var part29 = // "Pattern{Constant('System configuration has been '), Field(disposition,false)}" -match("MESSAGE#21:00002:15", "nwparser.payload", "System configuration has been %{disposition}", processor_chain([ +var part29 = match("MESSAGE#21:00002:15", "nwparser.payload", "System configuration has been %{disposition}", processor_chain([ dup18, dup2, dup3, @@ -1964,24 +1666,20 @@ match("MESSAGE#21:00002:15", "nwparser.payload", "System configuration has been var msg22 = msg("00002:15", part29); -var msg23 = msg("00002:17", dup336); +var msg23 = msg("00002:17", dup334); -var part30 = // "Pattern{Constant('Unexpected error from e'), Field(p0,false)}" -match("MESSAGE#23:00002:18/0", "nwparser.payload", "Unexpected error from e%{p0}"); +var part30 = match("MESSAGE#23:00002:18/0", "nwparser.payload", "Unexpected error from e%{p0}"); -var part31 = // "Pattern{Constant('-mail '), Field(p0,false)}" -match("MESSAGE#23:00002:18/1_0", "nwparser.p0", "-mail %{p0}"); +var part31 = match("MESSAGE#23:00002:18/1_0", "nwparser.p0", "-mail %{p0}"); -var part32 = // "Pattern{Constant('mail '), Field(p0,false)}" -match("MESSAGE#23:00002:18/1_1", "nwparser.p0", "mail %{p0}"); +var part32 = match("MESSAGE#23:00002:18/1_1", "nwparser.p0", "mail %{p0}"); var select7 = linear_select([ part31, part32, ]); -var part33 = // "Pattern{Constant('server('), Field(fld2,false), Constant('):')}" -match("MESSAGE#23:00002:18/2", "nwparser.p0", "server(%{fld2}):"); +var part33 = match("MESSAGE#23:00002:18/2", "nwparser.p0", "server(%{fld2}):"); var all7 = all_match({ processors: [ @@ -2000,8 +1698,7 @@ var all7 = all_match({ var msg24 = msg("00002:18", all7); -var part34 = // "Pattern{Constant('Web Admin '), Field(change_attribute,true), Constant(' value has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#24:00002:19", "nwparser.payload", "Web Admin %{change_attribute->} value has been changed from %{change_old->} to %{change_new}", processor_chain([ +var part34 = match("MESSAGE#24:00002:19", "nwparser.payload", "Web Admin %{change_attribute->} value has been changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -2011,11 +1708,9 @@ match("MESSAGE#24:00002:19", "nwparser.payload", "Web Admin %{change_attribute-> var msg25 = msg("00002:19", part34); -var part35 = // "Pattern{Constant('Root admin password restriction of minimum '), Field(fld2,true), Constant(' characters has been '), Field(disposition,true), Constant(' by admin '), Field(administrator,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#25:00002:20/0", "nwparser.payload", "Root admin password restriction of minimum %{fld2->} characters has been %{disposition->} by admin %{administrator->} %{p0}"); +var part35 = match("MESSAGE#25:00002:20/0", "nwparser.payload", "Root admin password restriction of minimum %{fld2->} characters has been %{disposition->} by admin %{administrator->} %{p0}"); -var part36 = // "Pattern{Constant('from Console '), Field(,false)}" -match("MESSAGE#25:00002:20/1_0", "nwparser.p0", "from Console %{}"); +var part36 = match("MESSAGE#25:00002:20/1_0", "nwparser.p0", "from Console %{}"); var select8 = linear_select([ part36, @@ -2039,11 +1734,9 @@ var all8 = all_match({ var msg26 = msg("00002:20", all8); -var part37 = // "Pattern{Constant('Root admin '), Field(p0,false)}" -match("MESSAGE#26:00002:21/0_0", "nwparser.payload", "Root admin %{p0}"); +var part37 = match("MESSAGE#26:00002:21/0_0", "nwparser.payload", "Root admin %{p0}"); -var part38 = // "Pattern{Field(fld2,true), Constant(' admin '), Field(p0,false)}" -match("MESSAGE#26:00002:21/0_1", "nwparser.payload", "%{fld2->} admin %{p0}"); +var part38 = match("MESSAGE#26:00002:21/0_1", "nwparser.payload", "%{fld2->} admin %{p0}"); var select9 = linear_select([ part37, @@ -2055,8 +1748,7 @@ var select10 = linear_select([ dup25, ]); -var part39 = // "Pattern{Constant('has been changed by admin '), Field(administrator,false)}" -match("MESSAGE#26:00002:21/3", "nwparser.p0", "has been changed by admin %{administrator}"); +var part39 = match("MESSAGE#26:00002:21/3", "nwparser.p0", "has been changed by admin %{administrator}"); var all9 = all_match({ processors: [ @@ -2076,14 +1768,11 @@ var all9 = all_match({ var msg27 = msg("00002:21", all9); -var part40 = // "Pattern{Field(change_attribute,true), Constant(' from '), Field(protocol,true), Constant(' before administrative session disconnects has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,true), Constant(' by admin '), Field(p0,false)}" -match("MESSAGE#27:00002:22/0", "nwparser.payload", "%{change_attribute->} from %{protocol->} before administrative session disconnects has been changed from %{change_old->} to %{change_new->} by admin %{p0}"); +var part40 = match("MESSAGE#27:00002:22/0", "nwparser.payload", "%{change_attribute->} from %{protocol->} before administrative session disconnects has been changed from %{change_old->} to %{change_new->} by admin %{p0}"); -var part41 = // "Pattern{Field(administrator,true), Constant(' from Console')}" -match("MESSAGE#27:00002:22/1_0", "nwparser.p0", "%{administrator->} from Console"); +var part41 = match("MESSAGE#27:00002:22/1_0", "nwparser.p0", "%{administrator->} from Console"); -var part42 = // "Pattern{Field(administrator,true), Constant(' from host '), Field(saddr,false)}" -match("MESSAGE#27:00002:22/1_1", "nwparser.p0", "%{administrator->} from host %{saddr}"); +var part42 = match("MESSAGE#27:00002:22/1_1", "nwparser.p0", "%{administrator->} from host %{saddr}"); var select11 = linear_select([ part41, @@ -2107,11 +1796,9 @@ var all10 = all_match({ var msg28 = msg("00002:22", all10); -var part43 = // "Pattern{Constant('Root admin access restriction through console only has been '), Field(disposition,true), Constant(' by admin '), Field(administrator,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#28:00002:23/0", "nwparser.payload", "Root admin access restriction through console only has been %{disposition->} by admin %{administrator->} %{p0}"); +var part43 = match("MESSAGE#28:00002:23/0", "nwparser.payload", "Root admin access restriction through console only has been %{disposition->} by admin %{administrator->} %{p0}"); -var part44 = // "Pattern{Constant('from Console'), Field(,false)}" -match("MESSAGE#28:00002:23/1_1", "nwparser.p0", "from Console%{}"); +var part44 = match("MESSAGE#28:00002:23/1_1", "nwparser.p0", "from Console%{}"); var select12 = linear_select([ dup20, @@ -2135,14 +1822,11 @@ var all11 = all_match({ var msg29 = msg("00002:23", all11); -var part45 = // "Pattern{Constant('Admin access restriction of '), Field(protocol,true), Constant(' administration through tunnel only has been '), Field(disposition,true), Constant(' by admin '), Field(administrator,true), Constant(' from '), Field(p0,false)}" -match("MESSAGE#29:00002:24/0", "nwparser.payload", "Admin access restriction of %{protocol->} administration through tunnel only has been %{disposition->} by admin %{administrator->} from %{p0}"); +var part45 = match("MESSAGE#29:00002:24/0", "nwparser.payload", "Admin access restriction of %{protocol->} administration through tunnel only has been %{disposition->} by admin %{administrator->} from %{p0}"); -var part46 = // "Pattern{Constant('host '), Field(saddr,false)}" -match("MESSAGE#29:00002:24/1_0", "nwparser.p0", "host %{saddr}"); +var part46 = match("MESSAGE#29:00002:24/1_0", "nwparser.p0", "host %{saddr}"); -var part47 = // "Pattern{Constant('Console'), Field(,false)}" -match("MESSAGE#29:00002:24/1_1", "nwparser.p0", "Console%{}"); +var part47 = match("MESSAGE#29:00002:24/1_1", "nwparser.p0", "Console%{}"); var select13 = linear_select([ part46, @@ -2165,8 +1849,7 @@ var all12 = all_match({ var msg30 = msg("00002:24", all12); -var part48 = // "Pattern{Constant('Admin AUTH: Local instance of an '), Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#30:00002:25", "nwparser.payload", "Admin AUTH: Local instance of an %{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ +var part48 = match("MESSAGE#30:00002:25", "nwparser.payload", "Admin AUTH: Local instance of an %{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ setc("eventcategory","1402000000"), dup2, dup3, @@ -2176,8 +1859,7 @@ match("MESSAGE#30:00002:25", "nwparser.payload", "Admin AUTH: Local instance of var msg31 = msg("00002:25", part48); -var part49 = // "Pattern{Constant('Cannot connect to e-mail server '), Field(hostip,false), Constant('.')}" -match("MESSAGE#31:00002:26", "nwparser.payload", "Cannot connect to e-mail server %{hostip}.", processor_chain([ +var part49 = match("MESSAGE#31:00002:26", "nwparser.payload", "Cannot connect to e-mail server %{hostip}.", processor_chain([ dup27, dup2, dup3, @@ -2187,8 +1869,7 @@ match("MESSAGE#31:00002:26", "nwparser.payload", "Cannot connect to e-mail serve var msg32 = msg("00002:26", part49); -var part50 = // "Pattern{Constant('Mail server is not configured.'), Field(,false)}" -match("MESSAGE#32:00002:27", "nwparser.payload", "Mail server is not configured.%{}", processor_chain([ +var part50 = match("MESSAGE#32:00002:27", "nwparser.payload", "Mail server is not configured.%{}", processor_chain([ dup18, dup2, dup3, @@ -2198,8 +1879,7 @@ match("MESSAGE#32:00002:27", "nwparser.payload", "Mail server is not configured. var msg33 = msg("00002:27", part50); -var part51 = // "Pattern{Constant('Mail recipients were not configured.'), Field(,false)}" -match("MESSAGE#33:00002:28", "nwparser.payload", "Mail recipients were not configured.%{}", processor_chain([ +var part51 = match("MESSAGE#33:00002:28", "nwparser.payload", "Mail recipients were not configured.%{}", processor_chain([ dup18, dup2, dup3, @@ -2209,8 +1889,7 @@ match("MESSAGE#33:00002:28", "nwparser.payload", "Mail recipients were not confi var msg34 = msg("00002:28", part51); -var part52 = // "Pattern{Constant('Single use password restriction for read-write administrators has been '), Field(disposition,true), Constant(' by admin '), Field(administrator,false)}" -match("MESSAGE#34:00002:29", "nwparser.payload", "Single use password restriction for read-write administrators has been %{disposition->} by admin %{administrator}", processor_chain([ +var part52 = match("MESSAGE#34:00002:29", "nwparser.payload", "Single use password restriction for read-write administrators has been %{disposition->} by admin %{administrator}", processor_chain([ dup1, dup2, dup3, @@ -2220,8 +1899,7 @@ match("MESSAGE#34:00002:29", "nwparser.payload", "Single use password restrictio var msg35 = msg("00002:29", part52); -var part53 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" logged in for '), Field(logon_type,false), Constant('('), Field(network_service,false), Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#35:00002:30", "nwparser.payload", "Admin user \"%{administrator}\" logged in for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport}", processor_chain([ +var part53 = match("MESSAGE#35:00002:30", "nwparser.payload", "Admin user \"%{administrator}\" logged in for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport}", processor_chain([ dup28, dup29, dup30, @@ -2235,8 +1913,7 @@ match("MESSAGE#35:00002:30", "nwparser.payload", "Admin user \"%{administrator}\ var msg36 = msg("00002:30", part53); -var part54 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" logged out for '), Field(logon_type,false), Constant('('), Field(network_service,false), Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#36:00002:41", "nwparser.payload", "Admin user \"%{administrator}\" logged out for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport}", processor_chain([ +var part54 = match("MESSAGE#36:00002:41", "nwparser.payload", "Admin user \"%{administrator}\" logged out for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport}", processor_chain([ dup33, dup29, dup34, @@ -2248,8 +1925,7 @@ match("MESSAGE#36:00002:41", "nwparser.payload", "Admin user \"%{administrator}\ var msg37 = msg("00002:41", part54); -var part55 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" login attempt for '), Field(logon_type,true), Constant(' '), Field(space,true), Constant(' ('), Field(network_service,false), Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' '), Field(disposition,false)}" -match("MESSAGE#37:00002:31", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type->} %{space->} (%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}", processor_chain([ +var part55 = match("MESSAGE#37:00002:31", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type->} %{space->} (%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}", processor_chain([ dup35, dup29, dup30, @@ -2262,19 +1938,16 @@ match("MESSAGE#37:00002:31", "nwparser.payload", "Admin user \"%{administrator}\ var msg38 = msg("00002:31", part55); -var part56 = // "Pattern{Constant('E-mail notification '), Field(p0,false)}" -match("MESSAGE#38:00002:32/0_0", "nwparser.payload", "E-mail notification %{p0}"); +var part56 = match("MESSAGE#38:00002:32/0_0", "nwparser.payload", "E-mail notification %{p0}"); -var part57 = // "Pattern{Constant('Transparent virutal '), Field(p0,false)}" -match("MESSAGE#38:00002:32/0_1", "nwparser.payload", "Transparent virutal %{p0}"); +var part57 = match("MESSAGE#38:00002:32/0_1", "nwparser.payload", "Transparent virutal %{p0}"); var select14 = linear_select([ part56, part57, ]); -var part58 = // "Pattern{Constant('wire mode has been '), Field(disposition,false)}" -match("MESSAGE#38:00002:32/1", "nwparser.p0", "wire mode has been %{disposition}"); +var part58 = match("MESSAGE#38:00002:32/1", "nwparser.p0", "wire mode has been %{disposition}"); var all13 = all_match({ processors: [ @@ -2292,8 +1965,7 @@ var all13 = all_match({ var msg39 = msg("00002:32", all13); -var part59 = // "Pattern{Constant('Malicious URL '), Field(url,true), Constant(' has been '), Field(disposition,true), Constant(' for zone '), Field(zone,false)}" -match("MESSAGE#39:00002:35", "nwparser.payload", "Malicious URL %{url->} has been %{disposition->} for zone %{zone}", processor_chain([ +var part59 = match("MESSAGE#39:00002:35", "nwparser.payload", "Malicious URL %{url->} has been %{disposition->} for zone %{zone}", processor_chain([ dup1, dup2, dup3, @@ -2303,22 +1975,18 @@ match("MESSAGE#39:00002:35", "nwparser.payload", "Malicious URL %{url->} has bee var msg40 = msg("00002:35", part59); -var part60 = // "Pattern{Constant('Bypass'), Field(p0,false)}" -match("MESSAGE#40:00002:36/0", "nwparser.payload", "Bypass%{p0}"); +var part60 = match("MESSAGE#40:00002:36/0", "nwparser.payload", "Bypass%{p0}"); -var part61 = // "Pattern{Constant('-others-IPSec '), Field(p0,false)}" -match("MESSAGE#40:00002:36/1_0", "nwparser.p0", "-others-IPSec %{p0}"); +var part61 = match("MESSAGE#40:00002:36/1_0", "nwparser.p0", "-others-IPSec %{p0}"); -var part62 = // "Pattern{Constant(' non-IP traffic '), Field(p0,false)}" -match("MESSAGE#40:00002:36/1_1", "nwparser.p0", " non-IP traffic %{p0}"); +var part62 = match("MESSAGE#40:00002:36/1_1", "nwparser.p0", " non-IP traffic %{p0}"); var select15 = linear_select([ part61, part62, ]); -var part63 = // "Pattern{Constant('option has been '), Field(disposition,false)}" -match("MESSAGE#40:00002:36/2", "nwparser.p0", "option has been %{disposition}"); +var part63 = match("MESSAGE#40:00002:36/2", "nwparser.p0", "option has been %{disposition}"); var all14 = all_match({ processors: [ @@ -2337,20 +2005,15 @@ var all14 = all_match({ var msg41 = msg("00002:36", all14); -var part64 = // "Pattern{Constant('Logging of '), Field(p0,false)}" -match("MESSAGE#41:00002:37/0", "nwparser.payload", "Logging of %{p0}"); +var part64 = match("MESSAGE#41:00002:37/0", "nwparser.payload", "Logging of %{p0}"); -var part65 = // "Pattern{Constant('dropped '), Field(p0,false)}" -match("MESSAGE#41:00002:37/1_0", "nwparser.p0", "dropped %{p0}"); +var part65 = match("MESSAGE#41:00002:37/1_0", "nwparser.p0", "dropped %{p0}"); -var part66 = // "Pattern{Constant('IKE '), Field(p0,false)}" -match("MESSAGE#41:00002:37/1_1", "nwparser.p0", "IKE %{p0}"); +var part66 = match("MESSAGE#41:00002:37/1_1", "nwparser.p0", "IKE %{p0}"); -var part67 = // "Pattern{Constant('SNMP '), Field(p0,false)}" -match("MESSAGE#41:00002:37/1_2", "nwparser.p0", "SNMP %{p0}"); +var part67 = match("MESSAGE#41:00002:37/1_2", "nwparser.p0", "SNMP %{p0}"); -var part68 = // "Pattern{Constant('ICMP '), Field(p0,false)}" -match("MESSAGE#41:00002:37/1_3", "nwparser.p0", "ICMP %{p0}"); +var part68 = match("MESSAGE#41:00002:37/1_3", "nwparser.p0", "ICMP %{p0}"); var select16 = linear_select([ part65, @@ -2359,8 +2022,7 @@ var select16 = linear_select([ part68, ]); -var part69 = // "Pattern{Constant('traffic to self has been '), Field(disposition,false)}" -match("MESSAGE#41:00002:37/2", "nwparser.p0", "traffic to self has been %{disposition}"); +var part69 = match("MESSAGE#41:00002:37/2", "nwparser.p0", "traffic to self has been %{disposition}"); var all15 = all_match({ processors: [ @@ -2379,11 +2041,9 @@ var all15 = all_match({ var msg42 = msg("00002:37", all15); -var part70 = // "Pattern{Constant('Logging of dropped traffic to self (excluding multicast) has been '), Field(p0,false)}" -match("MESSAGE#42:00002:38/0", "nwparser.payload", "Logging of dropped traffic to self (excluding multicast) has been %{p0}"); +var part70 = match("MESSAGE#42:00002:38/0", "nwparser.payload", "Logging of dropped traffic to self (excluding multicast) has been %{p0}"); -var part71 = // "Pattern{Field(disposition,true), Constant(' on '), Field(zone,false)}" -match("MESSAGE#42:00002:38/1_0", "nwparser.p0", "%{disposition->} on %{zone}"); +var part71 = match("MESSAGE#42:00002:38/1_0", "nwparser.p0", "%{disposition->} on %{zone}"); var select17 = linear_select([ part71, @@ -2406,8 +2066,7 @@ var all16 = all_match({ var msg43 = msg("00002:38", all16); -var part72 = // "Pattern{Constant('Traffic shaping is '), Field(disposition,false)}" -match("MESSAGE#43:00002:39", "nwparser.payload", "Traffic shaping is %{disposition}", processor_chain([ +var part72 = match("MESSAGE#43:00002:39", "nwparser.payload", "Traffic shaping is %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -2417,8 +2076,7 @@ match("MESSAGE#43:00002:39", "nwparser.payload", "Traffic shaping is %{dispositi var msg44 = msg("00002:39", part72); -var part73 = // "Pattern{Constant('Admin account created for ''), Field(username,false), Constant('' by '), Field(administrator,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#44:00002:40", "nwparser.payload", "Admin account created for '%{username}' by %{administrator->} via %{logon_type->} from host %{saddr->} (%{fld1})", processor_chain([ +var part73 = match("MESSAGE#44:00002:40", "nwparser.payload", "Admin account created for '%{username}' by %{administrator->} via %{logon_type->} from host %{saddr->} (%{fld1})", processor_chain([ dup37, dup29, setc("ec_activity","Create"), @@ -2432,8 +2090,7 @@ match("MESSAGE#44:00002:40", "nwparser.payload", "Admin account created for '%{u var msg45 = msg("00002:40", part73); -var part74 = // "Pattern{Constant('ADMIN AUTH: Privilege requested for unknown user '), Field(username,false), Constant('. Possible HA syncronization problem.')}" -match("MESSAGE#45:00002:44", "nwparser.payload", "ADMIN AUTH: Privilege requested for unknown user %{username}. Possible HA syncronization problem.", processor_chain([ +var part74 = match("MESSAGE#45:00002:44", "nwparser.payload", "ADMIN AUTH: Privilege requested for unknown user %{username}. Possible HA syncronization problem.", processor_chain([ dup35, dup31, dup39, @@ -2445,25 +2102,20 @@ match("MESSAGE#45:00002:44", "nwparser.payload", "ADMIN AUTH: Privilege requeste var msg46 = msg("00002:44", part74); -var part75 = // "Pattern{Field(change_attribute,true), Constant(' for account ''), Field(change_old,false), Constant('' has been '), Field(disposition,true), Constant(' to ''), Field(change_new,false), Constant('' '), Field(p0,false)}" -match("MESSAGE#46:00002:42/0", "nwparser.payload", "%{change_attribute->} for account '%{change_old}' has been %{disposition->} to '%{change_new}' %{p0}"); +var part75 = match("MESSAGE#46:00002:42/0", "nwparser.payload", "%{change_attribute->} for account '%{change_old}' has been %{disposition->} to '%{change_new}' %{p0}"); -var part76 = // "Pattern{Constant('by '), Field(administrator,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#46:00002:42/1_0", "nwparser.p0", "by %{administrator->} via %{p0}"); +var part76 = match("MESSAGE#46:00002:42/1_0", "nwparser.p0", "by %{administrator->} via %{p0}"); var select18 = linear_select([ part76, dup40, ]); -var part77 = // "Pattern{Constant(''), Field(logon_type,true), Constant(' from host '), Field(p0,false)}" -match("MESSAGE#46:00002:42/2", "nwparser.p0", "%{logon_type->} from host %{p0}"); +var part77 = match("MESSAGE#46:00002:42/2", "nwparser.p0", "%{logon_type->} from host %{p0}"); -var part78 = // "Pattern{Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#46:00002:42/3_0", "nwparser.p0", "%{saddr->} to %{daddr}:%{dport->} (%{p0}"); +var part78 = match("MESSAGE#46:00002:42/3_0", "nwparser.p0", "%{saddr->} to %{daddr}:%{dport->} (%{p0}"); -var part79 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#46:00002:42/3_1", "nwparser.p0", "%{saddr}:%{sport->} (%{p0}"); +var part79 = match("MESSAGE#46:00002:42/3_1", "nwparser.p0", "%{saddr}:%{sport->} (%{p0}"); var select19 = linear_select([ part78, @@ -2492,22 +2144,18 @@ var all17 = all_match({ var msg47 = msg("00002:42", all17); -var part80 = // "Pattern{Constant('Admin account '), Field(disposition,true), Constant(' for '), Field(p0,false)}" -match("MESSAGE#47:00002:43/0", "nwparser.payload", "Admin account %{disposition->} for %{p0}"); +var part80 = match("MESSAGE#47:00002:43/0", "nwparser.payload", "Admin account %{disposition->} for %{p0}"); -var part81 = // "Pattern{Constant('''), Field(username,false), Constant('''), Field(p0,false)}" -match("MESSAGE#47:00002:43/1_0", "nwparser.p0", "'%{username}'%{p0}"); +var part81 = match("MESSAGE#47:00002:43/1_0", "nwparser.p0", "'%{username}'%{p0}"); -var part82 = // "Pattern{Constant('"'), Field(username,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#47:00002:43/1_1", "nwparser.p0", "\"%{username}\"%{p0}"); +var part82 = match("MESSAGE#47:00002:43/1_1", "nwparser.p0", "\"%{username}\"%{p0}"); var select20 = linear_select([ part81, part82, ]); -var part83 = // "Pattern{Field(,false), Constant('by '), Field(administrator,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#47:00002:43/2", "nwparser.p0", "%{}by %{administrator->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})"); +var part83 = match("MESSAGE#47:00002:43/2", "nwparser.p0", "%{}by %{administrator->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})"); var all18 = all_match({ processors: [ @@ -2530,8 +2178,7 @@ var all18 = all_match({ var msg48 = msg("00002:43", all18); -var part84 = // "Pattern{Constant('Admin account '), Field(disposition,true), Constant(' for "'), Field(username,false), Constant('" by '), Field(administrator,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#48:00002:50", "nwparser.payload", "Admin account %{disposition->} for \"%{username}\" by %{administrator->} via %{logon_type->} from host %{saddr}:%{sport->} (%{fld1})", processor_chain([ +var part84 = match("MESSAGE#48:00002:50", "nwparser.payload", "Admin account %{disposition->} for \"%{username}\" by %{administrator->} via %{logon_type->} from host %{saddr}:%{sport->} (%{fld1})", processor_chain([ dup42, dup29, dup43, @@ -2545,8 +2192,7 @@ match("MESSAGE#48:00002:50", "nwparser.payload", "Admin account %{disposition->} var msg49 = msg("00002:50", part84); -var part85 = // "Pattern{Constant('Admin account '), Field(disposition,true), Constant(' for "'), Field(username,false), Constant('" by '), Field(administrator,true), Constant(' '), Field(fld2,true), Constant(' via '), Field(logon_type,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#49:00002:51", "nwparser.payload", "Admin account %{disposition->} for \"%{username}\" by %{administrator->} %{fld2->} via %{logon_type->} (%{fld1})", processor_chain([ +var part85 = match("MESSAGE#49:00002:51", "nwparser.payload", "Admin account %{disposition->} for \"%{username}\" by %{administrator->} %{fld2->} via %{logon_type->} (%{fld1})", processor_chain([ dup42, dup29, dup43, @@ -2560,8 +2206,7 @@ match("MESSAGE#49:00002:51", "nwparser.payload", "Admin account %{disposition->} var msg50 = msg("00002:51", part85); -var part86 = // "Pattern{Constant('Extraneous exit is issued by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#50:00002:45", "nwparser.payload", "Extraneous exit is issued by %{username->} via %{logon_type->} from host %{saddr}:%{sport->} (%{fld1})", processor_chain([ +var part86 = match("MESSAGE#50:00002:45", "nwparser.payload", "Extraneous exit is issued by %{username->} via %{logon_type->} from host %{saddr}:%{sport->} (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -2572,20 +2217,15 @@ match("MESSAGE#50:00002:45", "nwparser.payload", "Extraneous exit is issued by % var msg51 = msg("00002:45", part86); -var part87 = // "Pattern{Constant('Ping of Death attack protection '), Field(p0,false)}" -match("MESSAGE#51:00002:47/0_0", "nwparser.payload", "Ping of Death attack protection %{p0}"); +var part87 = match("MESSAGE#51:00002:47/0_0", "nwparser.payload", "Ping of Death attack protection %{p0}"); -var part88 = // "Pattern{Constant('Src Route IP option filtering '), Field(p0,false)}" -match("MESSAGE#51:00002:47/0_1", "nwparser.payload", "Src Route IP option filtering %{p0}"); +var part88 = match("MESSAGE#51:00002:47/0_1", "nwparser.payload", "Src Route IP option filtering %{p0}"); -var part89 = // "Pattern{Constant('Teardrop attack protection '), Field(p0,false)}" -match("MESSAGE#51:00002:47/0_2", "nwparser.payload", "Teardrop attack protection %{p0}"); +var part89 = match("MESSAGE#51:00002:47/0_2", "nwparser.payload", "Teardrop attack protection %{p0}"); -var part90 = // "Pattern{Constant('Land attack protection '), Field(p0,false)}" -match("MESSAGE#51:00002:47/0_3", "nwparser.payload", "Land attack protection %{p0}"); +var part90 = match("MESSAGE#51:00002:47/0_3", "nwparser.payload", "Land attack protection %{p0}"); -var part91 = // "Pattern{Constant('SYN flood protection '), Field(p0,false)}" -match("MESSAGE#51:00002:47/0_4", "nwparser.payload", "SYN flood protection %{p0}"); +var part91 = match("MESSAGE#51:00002:47/0_4", "nwparser.payload", "SYN flood protection %{p0}"); var select21 = linear_select([ part87, @@ -2595,8 +2235,7 @@ var select21 = linear_select([ part91, ]); -var part92 = // "Pattern{Constant('is '), Field(disposition,true), Constant(' on zone '), Field(zone,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#51:00002:47/1", "nwparser.p0", "is %{disposition->} on zone %{zone->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})"); +var part92 = match("MESSAGE#51:00002:47/1", "nwparser.p0", "is %{disposition->} on zone %{zone->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})"); var all19 = all_match({ processors: [ @@ -2615,25 +2254,20 @@ var all19 = all_match({ var msg52 = msg("00002:47", all19); -var part93 = // "Pattern{Constant('Dropping pkts if not '), Field(p0,false)}" -match("MESSAGE#52:00002:48/0", "nwparser.payload", "Dropping pkts if not %{p0}"); +var part93 = match("MESSAGE#52:00002:48/0", "nwparser.payload", "Dropping pkts if not %{p0}"); -var part94 = // "Pattern{Constant('exactly same with incoming if '), Field(p0,false)}" -match("MESSAGE#52:00002:48/1_0", "nwparser.p0", "exactly same with incoming if %{p0}"); +var part94 = match("MESSAGE#52:00002:48/1_0", "nwparser.p0", "exactly same with incoming if %{p0}"); -var part95 = // "Pattern{Constant('in route table '), Field(p0,false)}" -match("MESSAGE#52:00002:48/1_1", "nwparser.p0", "in route table %{p0}"); +var part95 = match("MESSAGE#52:00002:48/1_1", "nwparser.p0", "in route table %{p0}"); var select22 = linear_select([ part94, part95, ]); -var part96 = // "Pattern{Constant('(IP spoof protection) is '), Field(disposition,true), Constant(' on zone '), Field(zone,true), Constant(' by '), Field(username,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#52:00002:48/2", "nwparser.p0", "(IP spoof protection) is %{disposition->} on zone %{zone->} by %{username->} via %{p0}"); +var part96 = match("MESSAGE#52:00002:48/2", "nwparser.p0", "(IP spoof protection) is %{disposition->} on zone %{zone->} by %{username->} via %{p0}"); -var part97 = // "Pattern{Constant('NSRP Peer. ('), Field(p0,false)}" -match("MESSAGE#52:00002:48/3_0", "nwparser.p0", "NSRP Peer. (%{p0}"); +var part97 = match("MESSAGE#52:00002:48/3_0", "nwparser.p0", "NSRP Peer. (%{p0}"); var select23 = linear_select([ part97, @@ -2660,20 +2294,15 @@ var all20 = all_match({ var msg53 = msg("00002:48", all20); -var part98 = // "Pattern{Field(signame,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#53:00002:52/0", "nwparser.payload", "%{signame->} %{p0}"); +var part98 = match("MESSAGE#53:00002:52/0", "nwparser.payload", "%{signame->} %{p0}"); -var part99 = // "Pattern{Constant('protection'), Field(p0,false)}" -match("MESSAGE#53:00002:52/1_0", "nwparser.p0", "protection%{p0}"); +var part99 = match("MESSAGE#53:00002:52/1_0", "nwparser.p0", "protection%{p0}"); -var part100 = // "Pattern{Constant('limiting'), Field(p0,false)}" -match("MESSAGE#53:00002:52/1_1", "nwparser.p0", "limiting%{p0}"); +var part100 = match("MESSAGE#53:00002:52/1_1", "nwparser.p0", "limiting%{p0}"); -var part101 = // "Pattern{Constant('detection'), Field(p0,false)}" -match("MESSAGE#53:00002:52/1_2", "nwparser.p0", "detection%{p0}"); +var part101 = match("MESSAGE#53:00002:52/1_2", "nwparser.p0", "detection%{p0}"); -var part102 = // "Pattern{Constant('filtering '), Field(p0,false)}" -match("MESSAGE#53:00002:52/1_3", "nwparser.p0", "filtering %{p0}"); +var part102 = match("MESSAGE#53:00002:52/1_3", "nwparser.p0", "filtering %{p0}"); var select24 = linear_select([ part99, @@ -2682,11 +2311,9 @@ var select24 = linear_select([ part102, ]); -var part103 = // "Pattern{Field(,false), Constant('is '), Field(disposition,true), Constant(' on zone '), Field(zone,true), Constant(' by '), Field(p0,false)}" -match("MESSAGE#53:00002:52/2", "nwparser.p0", "%{}is %{disposition->} on zone %{zone->} by %{p0}"); +var part103 = match("MESSAGE#53:00002:52/2", "nwparser.p0", "%{}is %{disposition->} on zone %{zone->} by %{p0}"); -var part104 = // "Pattern{Constant('admin via '), Field(p0,false)}" -match("MESSAGE#53:00002:52/3_1", "nwparser.p0", "admin via %{p0}"); +var part104 = match("MESSAGE#53:00002:52/3_1", "nwparser.p0", "admin via %{p0}"); var select25 = linear_select([ dup46, @@ -2720,8 +2347,7 @@ var all21 = all_match({ var msg54 = msg("00002:52", all21); -var part105 = // "Pattern{Constant('Admin password for account "'), Field(username,false), Constant('" has been '), Field(disposition,true), Constant(' by '), Field(administrator,true), Constant(' via '), Field(logon_type,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#54:00002:53", "nwparser.payload", "Admin password for account \"%{username}\" has been %{disposition->} by %{administrator->} via %{logon_type->} (%{fld1})", processor_chain([ +var part105 = match("MESSAGE#54:00002:53", "nwparser.payload", "Admin password for account \"%{username}\" has been %{disposition->} by %{administrator->} via %{logon_type->} (%{fld1})", processor_chain([ dup42, dup43, dup38, @@ -2734,14 +2360,11 @@ match("MESSAGE#54:00002:53", "nwparser.payload", "Admin password for account \"% var msg55 = msg("00002:53", part105); -var part106 = // "Pattern{Constant('Traffic shaping clearing DSCP selector is turned O'), Field(p0,false)}" -match("MESSAGE#55:00002:54/0", "nwparser.payload", "Traffic shaping clearing DSCP selector is turned O%{p0}"); +var part106 = match("MESSAGE#55:00002:54/0", "nwparser.payload", "Traffic shaping clearing DSCP selector is turned O%{p0}"); -var part107 = // "Pattern{Constant('FF'), Field(p0,false)}" -match("MESSAGE#55:00002:54/1_0", "nwparser.p0", "FF%{p0}"); +var part107 = match("MESSAGE#55:00002:54/1_0", "nwparser.p0", "FF%{p0}"); -var part108 = // "Pattern{Constant('N'), Field(p0,false)}" -match("MESSAGE#55:00002:54/1_1", "nwparser.p0", "N%{p0}"); +var part108 = match("MESSAGE#55:00002:54/1_1", "nwparser.p0", "N%{p0}"); var select27 = linear_select([ part107, @@ -2768,19 +2391,16 @@ var all22 = all_match({ var msg56 = msg("00002:54", all22); -var part109 = // "Pattern{Field(change_attribute,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#56:00002/0", "nwparser.payload", "%{change_attribute->} %{p0}"); +var part109 = match("MESSAGE#56:00002/0", "nwparser.payload", "%{change_attribute->} %{p0}"); -var part110 = // "Pattern{Constant('has been changed'), Field(p0,false)}" -match("MESSAGE#56:00002/1_0", "nwparser.p0", "has been changed%{p0}"); +var part110 = match("MESSAGE#56:00002/1_0", "nwparser.p0", "has been changed%{p0}"); var select28 = linear_select([ part110, dup52, ]); -var part111 = // "Pattern{Field(,false), Constant('from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#56:00002/2", "nwparser.p0", "%{}from %{change_old->} to %{change_new}"); +var part111 = match("MESSAGE#56:00002/2", "nwparser.p0", "%{}from %{change_old->} to %{change_new}"); var all23 = all_match({ processors: [ @@ -2799,8 +2419,7 @@ var all23 = all_match({ var msg57 = msg("00002", all23); -var part112 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" login attempt for '), Field(logon_type,false), Constant('('), Field(network_service,false), Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' failed. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1215:00002:56", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} failed. (%{fld1})", processor_chain([ +var part112 = match("MESSAGE#1215:00002:56", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} failed. (%{fld1})", processor_chain([ dup53, dup9, dup2, @@ -2862,8 +2481,7 @@ var select29 = linear_select([ msg58, ]); -var part113 = // "Pattern{Constant('Multiple authentication failures have been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false)}" -match("MESSAGE#57:00003", "nwparser.payload", "Multiple authentication failures have been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}", processor_chain([ +var part113 = match("MESSAGE#57:00003", "nwparser.payload", "Multiple authentication failures have been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}", processor_chain([ dup53, dup31, dup54, @@ -2875,8 +2493,7 @@ match("MESSAGE#57:00003", "nwparser.payload", "Multiple authentication failures var msg59 = msg("00003", part113); -var part114 = // "Pattern{Constant('Multiple authentication failures have been detected!'), Field(,false)}" -match("MESSAGE#58:00003:01", "nwparser.payload", "Multiple authentication failures have been detected!%{}", processor_chain([ +var part114 = match("MESSAGE#58:00003:01", "nwparser.payload", "Multiple authentication failures have been detected!%{}", processor_chain([ dup53, dup31, dup54, @@ -2888,8 +2505,7 @@ match("MESSAGE#58:00003:01", "nwparser.payload", "Multiple authentication failur var msg60 = msg("00003:01", part114); -var part115 = // "Pattern{Constant('The console debug buffer has been '), Field(disposition,false)}" -match("MESSAGE#59:00003:02", "nwparser.payload", "The console debug buffer has been %{disposition}", processor_chain([ +var part115 = match("MESSAGE#59:00003:02", "nwparser.payload", "The console debug buffer has been %{disposition}", processor_chain([ dup44, dup2, dup3, @@ -2899,8 +2515,7 @@ match("MESSAGE#59:00003:02", "nwparser.payload", "The console debug buffer has b var msg61 = msg("00003:02", part115); -var part116 = // "Pattern{Field(change_attribute,true), Constant(' changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false), Constant('.')}" -match("MESSAGE#60:00003:03", "nwparser.payload", "%{change_attribute->} changed from %{change_old->} to %{change_new}.", processor_chain([ +var part116 = match("MESSAGE#60:00003:03", "nwparser.payload", "%{change_attribute->} changed from %{change_old->} to %{change_new}.", processor_chain([ dup44, dup2, dup3, @@ -2910,19 +2525,16 @@ match("MESSAGE#60:00003:03", "nwparser.payload", "%{change_attribute->} changed var msg62 = msg("00003:03", part116); -var part117 = // "Pattern{Constant('serial'), Field(p0,false)}" -match("MESSAGE#61:00003:05/1_0", "nwparser.p0", "serial%{p0}"); +var part117 = match("MESSAGE#61:00003:05/1_0", "nwparser.p0", "serial%{p0}"); -var part118 = // "Pattern{Constant('local'), Field(p0,false)}" -match("MESSAGE#61:00003:05/1_1", "nwparser.p0", "local%{p0}"); +var part118 = match("MESSAGE#61:00003:05/1_1", "nwparser.p0", "local%{p0}"); var select30 = linear_select([ part117, part118, ]); -var part119 = // "Pattern{Field(,false), Constant('console has been '), Field(disposition,true), Constant(' by admin '), Field(administrator,false), Constant('.')}" -match("MESSAGE#61:00003:05/2", "nwparser.p0", "%{}console has been %{disposition->} by admin %{administrator}."); +var part119 = match("MESSAGE#61:00003:05/2", "nwparser.p0", "%{}console has been %{disposition->} by admin %{administrator}."); var all24 = all_match({ processors: [ @@ -2949,8 +2561,7 @@ var select31 = linear_select([ msg63, ]); -var part120 = // "Pattern{Field(info,false), Constant('DNS server IP has been changed')}" -match("MESSAGE#62:00004", "nwparser.payload", "%{info}DNS server IP has been changed", processor_chain([ +var part120 = match("MESSAGE#62:00004", "nwparser.payload", "%{info}DNS server IP has been changed", processor_chain([ dup44, dup2, dup3, @@ -2960,8 +2571,7 @@ match("MESSAGE#62:00004", "nwparser.payload", "%{info}DNS server IP has been cha var msg64 = msg("00004", part120); -var part121 = // "Pattern{Constant('DNS cache table has been '), Field(disposition,false)}" -match("MESSAGE#63:00004:01", "nwparser.payload", "DNS cache table has been %{disposition}", processor_chain([ +var part121 = match("MESSAGE#63:00004:01", "nwparser.payload", "DNS cache table has been %{disposition}", processor_chain([ dup44, dup2, dup3, @@ -2971,8 +2581,7 @@ match("MESSAGE#63:00004:01", "nwparser.payload", "DNS cache table has been %{dis var msg65 = msg("00004:01", part121); -var part122 = // "Pattern{Constant('Daily DNS lookup has been '), Field(disposition,false)}" -match("MESSAGE#64:00004:02", "nwparser.payload", "Daily DNS lookup has been %{disposition}", processor_chain([ +var part122 = match("MESSAGE#64:00004:02", "nwparser.payload", "Daily DNS lookup has been %{disposition}", processor_chain([ dup44, dup2, dup3, @@ -2982,8 +2591,7 @@ match("MESSAGE#64:00004:02", "nwparser.payload", "Daily DNS lookup has been %{di var msg66 = msg("00004:02", part122); -var part123 = // "Pattern{Constant('Daily DNS lookup time has been '), Field(disposition,false)}" -match("MESSAGE#65:00004:03", "nwparser.payload", "Daily DNS lookup time has been %{disposition}", processor_chain([ +var part123 = match("MESSAGE#65:00004:03", "nwparser.payload", "Daily DNS lookup time has been %{disposition}", processor_chain([ dup44, dup2, dup3, @@ -2993,16 +2601,14 @@ match("MESSAGE#65:00004:03", "nwparser.payload", "Daily DNS lookup time has been var msg67 = msg("00004:03", part123); -var part124 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,true), Constant(' to '), Field(daddr,true), Constant(' using protocol '), Field(protocol,true), Constant(' on '), Field(p0,false)}" -match("MESSAGE#66:00004:04/0", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr->} using protocol %{protocol->} on %{p0}"); +var part124 = match("MESSAGE#66:00004:04/0", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr->} using protocol %{protocol->} on %{p0}"); -var part125 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' '), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#66:00004:04/2", "nwparser.p0", "%{} %{interface->} %{space}The attack occurred %{dclass_counter1->} times"); +var part125 = match("MESSAGE#66:00004:04/2", "nwparser.p0", "%{} %{interface->} %{space}The attack occurred %{dclass_counter1->} times"); var all25 = all_match({ processors: [ part124, - dup339, + dup337, part125, ], on_success: processor_chain([ @@ -3018,8 +2624,7 @@ var all25 = all_match({ var msg68 = msg("00004:04", all25); -var part126 = // "Pattern{Field(signame,true), Constant(' from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' protocol '), Field(protocol,false)}" -match("MESSAGE#67:00004:05", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol}", processor_chain([ +var part126 = match("MESSAGE#67:00004:05", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol}", processor_chain([ dup58, dup2, dup4, @@ -3030,8 +2635,7 @@ match("MESSAGE#67:00004:05", "nwparser.payload", "%{signame->} from %{saddr}/%{s var msg69 = msg("00004:05", part126); -var part127 = // "Pattern{Constant('DNS lookup time has been changed to start at '), Field(fld2,false), Constant(':'), Field(fld3,true), Constant(' with an interval of '), Field(fld4,false)}" -match("MESSAGE#68:00004:06", "nwparser.payload", "DNS lookup time has been changed to start at %{fld2}:%{fld3->} with an interval of %{fld4}", processor_chain([ +var part127 = match("MESSAGE#68:00004:06", "nwparser.payload", "DNS lookup time has been changed to start at %{fld2}:%{fld3->} with an interval of %{fld4}", processor_chain([ dup1, dup2, dup3, @@ -3041,8 +2645,7 @@ match("MESSAGE#68:00004:06", "nwparser.payload", "DNS lookup time has been chang var msg70 = msg("00004:06", part127); -var part128 = // "Pattern{Constant('DNS cache table entries have been refreshed as result of external event.'), Field(,false)}" -match("MESSAGE#69:00004:07", "nwparser.payload", "DNS cache table entries have been refreshed as result of external event.%{}", processor_chain([ +var part128 = match("MESSAGE#69:00004:07", "nwparser.payload", "DNS cache table entries have been refreshed as result of external event.%{}", processor_chain([ dup44, dup2, dup3, @@ -3052,8 +2655,7 @@ match("MESSAGE#69:00004:07", "nwparser.payload", "DNS cache table entries have b var msg71 = msg("00004:07", part128); -var part129 = // "Pattern{Constant('DNS Proxy module has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#70:00004:08", "nwparser.payload", "DNS Proxy module has been %{disposition}.", processor_chain([ +var part129 = match("MESSAGE#70:00004:08", "nwparser.payload", "DNS Proxy module has been %{disposition}.", processor_chain([ dup1, dup2, dup3, @@ -3063,8 +2665,7 @@ match("MESSAGE#70:00004:08", "nwparser.payload", "DNS Proxy module has been %{di var msg72 = msg("00004:08", part129); -var part130 = // "Pattern{Constant('DNS Proxy module has more concurrent client requests than allowed.'), Field(,false)}" -match("MESSAGE#71:00004:09", "nwparser.payload", "DNS Proxy module has more concurrent client requests than allowed.%{}", processor_chain([ +var part130 = match("MESSAGE#71:00004:09", "nwparser.payload", "DNS Proxy module has more concurrent client requests than allowed.%{}", processor_chain([ dup62, dup2, dup3, @@ -3074,8 +2675,7 @@ match("MESSAGE#71:00004:09", "nwparser.payload", "DNS Proxy module has more conc var msg73 = msg("00004:09", part130); -var part131 = // "Pattern{Constant('DNS Proxy server select table entries exceeded maximum limit.'), Field(,false)}" -match("MESSAGE#72:00004:10", "nwparser.payload", "DNS Proxy server select table entries exceeded maximum limit.%{}", processor_chain([ +var part131 = match("MESSAGE#72:00004:10", "nwparser.payload", "DNS Proxy server select table entries exceeded maximum limit.%{}", processor_chain([ dup62, dup2, dup3, @@ -3085,8 +2685,7 @@ match("MESSAGE#72:00004:10", "nwparser.payload", "DNS Proxy server select table var msg74 = msg("00004:10", part131); -var part132 = // "Pattern{Constant('Proxy server select table added with domain '), Field(domain,false), Constant(', interface '), Field(interface,false), Constant(', primary-ip '), Field(fld2,false), Constant(', secondary-ip '), Field(fld3,false), Constant(', tertiary-ip '), Field(fld4,false), Constant(', failover '), Field(disposition,false)}" -match("MESSAGE#73:00004:11", "nwparser.payload", "Proxy server select table added with domain %{domain}, interface %{interface}, primary-ip %{fld2}, secondary-ip %{fld3}, tertiary-ip %{fld4}, failover %{disposition}", processor_chain([ +var part132 = match("MESSAGE#73:00004:11", "nwparser.payload", "Proxy server select table added with domain %{domain}, interface %{interface}, primary-ip %{fld2}, secondary-ip %{fld3}, tertiary-ip %{fld4}, failover %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -3096,8 +2695,7 @@ match("MESSAGE#73:00004:11", "nwparser.payload", "Proxy server select table adde var msg75 = msg("00004:11", part132); -var part133 = // "Pattern{Constant('DNS Proxy server select table entry '), Field(disposition,true), Constant(' with domain '), Field(domain,false)}" -match("MESSAGE#74:00004:12", "nwparser.payload", "DNS Proxy server select table entry %{disposition->} with domain %{domain}", processor_chain([ +var part133 = match("MESSAGE#74:00004:12", "nwparser.payload", "DNS Proxy server select table entry %{disposition->} with domain %{domain}", processor_chain([ dup1, dup2, dup3, @@ -3107,8 +2705,7 @@ match("MESSAGE#74:00004:12", "nwparser.payload", "DNS Proxy server select table var msg76 = msg("00004:12", part133); -var part134 = // "Pattern{Constant('DDNS server '), Field(domain,true), Constant(' returned incorrect ip '), Field(fld2,false), Constant(', local-ip should be '), Field(fld3,false)}" -match("MESSAGE#75:00004:13", "nwparser.payload", "DDNS server %{domain->} returned incorrect ip %{fld2}, local-ip should be %{fld3}", processor_chain([ +var part134 = match("MESSAGE#75:00004:13", "nwparser.payload", "DDNS server %{domain->} returned incorrect ip %{fld2}, local-ip should be %{fld3}", processor_chain([ dup19, dup2, dup3, @@ -3118,11 +2715,9 @@ match("MESSAGE#75:00004:13", "nwparser.payload", "DDNS server %{domain->} return var msg77 = msg("00004:13", part134); -var part135 = // "Pattern{Constant('automatically refreshed '), Field(p0,false)}" -match("MESSAGE#76:00004:14/1_0", "nwparser.p0", "automatically refreshed %{p0}"); +var part135 = match("MESSAGE#76:00004:14/1_0", "nwparser.p0", "automatically refreshed %{p0}"); -var part136 = // "Pattern{Constant('refreshed by HA '), Field(p0,false)}" -match("MESSAGE#76:00004:14/1_1", "nwparser.p0", "refreshed by HA %{p0}"); +var part136 = match("MESSAGE#76:00004:14/1_1", "nwparser.p0", "refreshed by HA %{p0}"); var select32 = linear_select([ part135, @@ -3147,8 +2742,7 @@ var all26 = all_match({ var msg78 = msg("00004:14", all26); -var part137 = // "Pattern{Constant('DNS entries have been refreshed as result of DNS server address change. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#77:00004:15", "nwparser.payload", "DNS entries have been refreshed as result of DNS server address change. (%{fld1})", processor_chain([ +var part137 = match("MESSAGE#77:00004:15", "nwparser.payload", "DNS entries have been refreshed as result of DNS server address change. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -3159,8 +2753,7 @@ match("MESSAGE#77:00004:15", "nwparser.payload", "DNS entries have been refreshe var msg79 = msg("00004:15", part137); -var part138 = // "Pattern{Constant('DNS entries have been manually refreshed. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#78:00004:16", "nwparser.payload", "DNS entries have been manually refreshed. (%{fld1})", processor_chain([ +var part138 = match("MESSAGE#78:00004:16", "nwparser.payload", "DNS entries have been manually refreshed. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -3174,7 +2767,7 @@ var msg80 = msg("00004:16", part138); var all27 = all_match({ processors: [ dup64, - dup340, + dup338, dup67, ], on_success: processor_chain([ @@ -3212,8 +2805,7 @@ var select33 = linear_select([ msg81, ]); -var part139 = // "Pattern{Field(signame,true), Constant(' alarm threshold from the same source has been changed to '), Field(trigger_val,false)}" -match("MESSAGE#80:00005", "nwparser.payload", "%{signame->} alarm threshold from the same source has been changed to %{trigger_val}", processor_chain([ +var part139 = match("MESSAGE#80:00005", "nwparser.payload", "%{signame->} alarm threshold from the same source has been changed to %{trigger_val}", processor_chain([ dup1, dup2, dup3, @@ -3223,8 +2815,7 @@ match("MESSAGE#80:00005", "nwparser.payload", "%{signame->} alarm threshold from var msg82 = msg("00005", part139); -var part140 = // "Pattern{Constant('Logging of '), Field(fld2,true), Constant(' traffic to self has been '), Field(disposition,false)}" -match("MESSAGE#81:00005:01", "nwparser.payload", "Logging of %{fld2->} traffic to self has been %{disposition}", processor_chain([ +var part140 = match("MESSAGE#81:00005:01", "nwparser.payload", "Logging of %{fld2->} traffic to self has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -3234,8 +2825,7 @@ match("MESSAGE#81:00005:01", "nwparser.payload", "Logging of %{fld2->} traffic t var msg83 = msg("00005:01", part140); -var part141 = // "Pattern{Constant('SYN flood '), Field(fld2,true), Constant(' has been changed to '), Field(fld3,false)}" -match("MESSAGE#82:00005:02", "nwparser.payload", "SYN flood %{fld2->} has been changed to %{fld3}", processor_chain([ +var part141 = match("MESSAGE#82:00005:02", "nwparser.payload", "SYN flood %{fld2->} has been changed to %{fld3}", processor_chain([ dup1, dup2, dup3, @@ -3245,29 +2835,25 @@ match("MESSAGE#82:00005:02", "nwparser.payload", "SYN flood %{fld2->} has been c var msg84 = msg("00005:02", part141); -var part142 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(p0,false)}" -match("MESSAGE#83:00005:03/0", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{p0}"); +var part142 = match("MESSAGE#83:00005:03/0", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{p0}"); -var part143 = // "Pattern{Field(fld99,false), Constant('interface '), Field(interface,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#83:00005:03/4", "nwparser.p0", "%{fld99}interface %{interface->} %{p0}"); +var part143 = match("MESSAGE#83:00005:03/4", "nwparser.p0", "%{fld99}interface %{interface->} %{p0}"); -var part144 = // "Pattern{Constant('in zone '), Field(zone,false), Constant('. '), Field(p0,false)}" -match("MESSAGE#83:00005:03/5_0", "nwparser.p0", "in zone %{zone}. %{p0}"); +var part144 = match("MESSAGE#83:00005:03/5_0", "nwparser.p0", "in zone %{zone}. %{p0}"); var select34 = linear_select([ part144, dup73, ]); -var part145 = // "Pattern{Constant(''), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#83:00005:03/6", "nwparser.p0", "%{space}The attack occurred %{dclass_counter1->} times"); +var part145 = match("MESSAGE#83:00005:03/6", "nwparser.p0", "%{space}The attack occurred %{dclass_counter1->} times"); var all28 = all_match({ processors: [ part142, - dup341, + dup339, dup70, - dup342, + dup340, part143, select34, part145, @@ -3285,10 +2871,9 @@ var all28 = all_match({ var msg85 = msg("00005:03", all28); -var msg86 = msg("00005:04", dup343); +var msg86 = msg("00005:04", dup341); -var part146 = // "Pattern{Constant('SYN flood drop pak in '), Field(fld2,true), Constant(' mode when receiving unknown dst mac has been '), Field(disposition,true), Constant(' on '), Field(zone,false), Constant('.')}" -match("MESSAGE#85:00005:05", "nwparser.payload", "SYN flood drop pak in %{fld2->} mode when receiving unknown dst mac has been %{disposition->} on %{zone}.", processor_chain([ +var part146 = match("MESSAGE#85:00005:05", "nwparser.payload", "SYN flood drop pak in %{fld2->} mode when receiving unknown dst mac has been %{disposition->} on %{zone}.", processor_chain([ setc("eventcategory","1001020100"), dup2, dup3, @@ -3298,12 +2883,11 @@ match("MESSAGE#85:00005:05", "nwparser.payload", "SYN flood drop pak in %{fld2-> var msg87 = msg("00005:05", part146); -var part147 = // "Pattern{Constant('flood timeout has been set to '), Field(trigger_val,true), Constant(' on '), Field(zone,false), Constant('.')}" -match("MESSAGE#86:00005:06/1", "nwparser.p0", "flood timeout has been set to %{trigger_val->} on %{zone}."); +var part147 = match("MESSAGE#86:00005:06/1", "nwparser.p0", "flood timeout has been set to %{trigger_val->} on %{zone}."); var all29 = all_match({ processors: [ - dup344, + dup342, part147, ], on_success: processor_chain([ @@ -3317,20 +2901,15 @@ var all29 = all_match({ var msg88 = msg("00005:06", all29); -var part148 = // "Pattern{Constant('SYN flood '), Field(p0,false)}" -match("MESSAGE#87:00005:07/0", "nwparser.payload", "SYN flood %{p0}"); +var part148 = match("MESSAGE#87:00005:07/0", "nwparser.payload", "SYN flood %{p0}"); -var part149 = // "Pattern{Constant('alarm threshold '), Field(p0,false)}" -match("MESSAGE#87:00005:07/1_0", "nwparser.p0", "alarm threshold %{p0}"); +var part149 = match("MESSAGE#87:00005:07/1_0", "nwparser.p0", "alarm threshold %{p0}"); -var part150 = // "Pattern{Constant('packet queue size '), Field(p0,false)}" -match("MESSAGE#87:00005:07/1_1", "nwparser.p0", "packet queue size %{p0}"); +var part150 = match("MESSAGE#87:00005:07/1_1", "nwparser.p0", "packet queue size %{p0}"); -var part151 = // "Pattern{Constant('attack threshold '), Field(p0,false)}" -match("MESSAGE#87:00005:07/1_3", "nwparser.p0", "attack threshold %{p0}"); +var part151 = match("MESSAGE#87:00005:07/1_3", "nwparser.p0", "attack threshold %{p0}"); -var part152 = // "Pattern{Constant('same source IP threshold '), Field(p0,false)}" -match("MESSAGE#87:00005:07/1_4", "nwparser.p0", "same source IP threshold %{p0}"); +var part152 = match("MESSAGE#87:00005:07/1_4", "nwparser.p0", "same source IP threshold %{p0}"); var select35 = linear_select([ part149, @@ -3340,8 +2919,7 @@ var select35 = linear_select([ part152, ]); -var part153 = // "Pattern{Constant('is set to '), Field(trigger_val,false), Constant('.')}" -match("MESSAGE#87:00005:07/2", "nwparser.p0", "is set to %{trigger_val}."); +var part153 = match("MESSAGE#87:00005:07/2", "nwparser.p0", "is set to %{trigger_val}."); var all30 = all_match({ processors: [ @@ -3360,20 +2938,18 @@ var all30 = all_match({ var msg89 = msg("00005:07", all30); -var part154 = // "Pattern{Constant('flood same '), Field(p0,false)}" -match("MESSAGE#88:00005:08/1", "nwparser.p0", "flood same %{p0}"); +var part154 = match("MESSAGE#88:00005:08/1", "nwparser.p0", "flood same %{p0}"); var select36 = linear_select([ dup77, dup78, ]); -var part155 = // "Pattern{Constant('ip threshold has been set to '), Field(trigger_val,true), Constant(' on '), Field(zone,false), Constant('.')}" -match("MESSAGE#88:00005:08/3", "nwparser.p0", "ip threshold has been set to %{trigger_val->} on %{zone}."); +var part155 = match("MESSAGE#88:00005:08/3", "nwparser.p0", "ip threshold has been set to %{trigger_val->} on %{zone}."); var all31 = all_match({ processors: [ - dup344, + dup342, part154, select36, part155, @@ -3389,8 +2965,7 @@ var all31 = all_match({ var msg90 = msg("00005:08", all31); -var part156 = // "Pattern{Constant('Screen service '), Field(service,true), Constant(' is '), Field(disposition,true), Constant(' on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#89:00005:09", "nwparser.payload", "Screen service %{service->} is %{disposition->} on interface %{interface}.", processor_chain([ +var part156 = match("MESSAGE#89:00005:09", "nwparser.payload", "Screen service %{service->} is %{disposition->} on interface %{interface}.", processor_chain([ dup1, dup2, dup3, @@ -3400,8 +2975,7 @@ match("MESSAGE#89:00005:09", "nwparser.payload", "Screen service %{service->} is var msg91 = msg("00005:09", part156); -var part157 = // "Pattern{Constant('Screen service '), Field(service,true), Constant(' is '), Field(disposition,true), Constant(' on '), Field(zone,false)}" -match("MESSAGE#90:00005:10", "nwparser.payload", "Screen service %{service->} is %{disposition->} on %{zone}", processor_chain([ +var part157 = match("MESSAGE#90:00005:10", "nwparser.payload", "Screen service %{service->} is %{disposition->} on %{zone}", processor_chain([ dup1, dup2, dup3, @@ -3411,23 +2985,17 @@ match("MESSAGE#90:00005:10", "nwparser.payload", "Screen service %{service->} is var msg92 = msg("00005:10", part157); -var part158 = // "Pattern{Constant('The SYN flood '), Field(p0,false)}" -match("MESSAGE#91:00005:11/0", "nwparser.payload", "The SYN flood %{p0}"); +var part158 = match("MESSAGE#91:00005:11/0", "nwparser.payload", "The SYN flood %{p0}"); -var part159 = // "Pattern{Constant('alarm threshold'), Field(,false)}" -match("MESSAGE#91:00005:11/1_0", "nwparser.p0", "alarm threshold%{}"); +var part159 = match("MESSAGE#91:00005:11/1_0", "nwparser.p0", "alarm threshold%{}"); -var part160 = // "Pattern{Constant('packet queue size'), Field(,false)}" -match("MESSAGE#91:00005:11/1_1", "nwparser.p0", "packet queue size%{}"); +var part160 = match("MESSAGE#91:00005:11/1_1", "nwparser.p0", "packet queue size%{}"); -var part161 = // "Pattern{Constant('timeout value'), Field(,false)}" -match("MESSAGE#91:00005:11/1_2", "nwparser.p0", "timeout value%{}"); +var part161 = match("MESSAGE#91:00005:11/1_2", "nwparser.p0", "timeout value%{}"); -var part162 = // "Pattern{Constant('attack threshold'), Field(,false)}" -match("MESSAGE#91:00005:11/1_3", "nwparser.p0", "attack threshold%{}"); +var part162 = match("MESSAGE#91:00005:11/1_3", "nwparser.p0", "attack threshold%{}"); -var part163 = // "Pattern{Constant('same source IP'), Field(,false)}" -match("MESSAGE#91:00005:11/1_4", "nwparser.p0", "same source IP%{}"); +var part163 = match("MESSAGE#91:00005:11/1_4", "nwparser.p0", "same source IP%{}"); var select37 = linear_select([ part159, @@ -3453,8 +3021,7 @@ var all32 = all_match({ var msg93 = msg("00005:11", all32); -var part164 = // "Pattern{Constant('The SYN-ACK-ACK proxy threshold value has been set to '), Field(trigger_val,true), Constant(' on '), Field(interface,false), Constant('.')}" -match("MESSAGE#92:00005:12", "nwparser.payload", "The SYN-ACK-ACK proxy threshold value has been set to %{trigger_val->} on %{interface}.", processor_chain([ +var part164 = match("MESSAGE#92:00005:12", "nwparser.payload", "The SYN-ACK-ACK proxy threshold value has been set to %{trigger_val->} on %{interface}.", processor_chain([ dup1, dup2, dup3, @@ -3464,8 +3031,7 @@ match("MESSAGE#92:00005:12", "nwparser.payload", "The SYN-ACK-ACK proxy threshol var msg94 = msg("00005:12", part164); -var part165 = // "Pattern{Constant('The session limit threshold has been set to '), Field(trigger_val,true), Constant(' on '), Field(zone,false), Constant('.')}" -match("MESSAGE#93:00005:13", "nwparser.payload", "The session limit threshold has been set to %{trigger_val->} on %{zone}.", processor_chain([ +var part165 = match("MESSAGE#93:00005:13", "nwparser.payload", "The session limit threshold has been set to %{trigger_val->} on %{zone}.", processor_chain([ dup1, dup2, dup3, @@ -3475,8 +3041,7 @@ match("MESSAGE#93:00005:13", "nwparser.payload", "The session limit threshold ha var msg95 = msg("00005:13", part165); -var part166 = // "Pattern{Constant('syn proxy drop packet with unknown mac!'), Field(,false)}" -match("MESSAGE#94:00005:14", "nwparser.payload", "syn proxy drop packet with unknown mac!%{}", processor_chain([ +var part166 = match("MESSAGE#94:00005:14", "nwparser.payload", "syn proxy drop packet with unknown mac!%{}", processor_chain([ dup19, dup2, dup3, @@ -3486,8 +3051,7 @@ match("MESSAGE#94:00005:14", "nwparser.payload", "syn proxy drop packet with unk var msg96 = msg("00005:14", part166); -var part167 = // "Pattern{Field(signame,true), Constant(' alarm threshold has been changed to '), Field(trigger_val,false)}" -match("MESSAGE#95:00005:15", "nwparser.payload", "%{signame->} alarm threshold has been changed to %{trigger_val}", processor_chain([ +var part167 = match("MESSAGE#95:00005:15", "nwparser.payload", "%{signame->} alarm threshold has been changed to %{trigger_val}", processor_chain([ dup1, dup2, dup3, @@ -3497,8 +3061,7 @@ match("MESSAGE#95:00005:15", "nwparser.payload", "%{signame->} alarm threshold h var msg97 = msg("00005:15", part167); -var part168 = // "Pattern{Field(signame,true), Constant(' threshold has been set to '), Field(trigger_val,true), Constant(' on '), Field(zone,false), Constant('.')}" -match("MESSAGE#96:00005:16", "nwparser.payload", "%{signame->} threshold has been set to %{trigger_val->} on %{zone}.", processor_chain([ +var part168 = match("MESSAGE#96:00005:16", "nwparser.payload", "%{signame->} threshold has been set to %{trigger_val->} on %{zone}.", processor_chain([ dup1, dup2, dup3, @@ -3508,19 +3071,16 @@ match("MESSAGE#96:00005:16", "nwparser.payload", "%{signame->} threshold has bee var msg98 = msg("00005:16", part168); -var part169 = // "Pattern{Constant('destination-based '), Field(p0,false)}" -match("MESSAGE#97:00005:17/1_0", "nwparser.p0", "destination-based %{p0}"); +var part169 = match("MESSAGE#97:00005:17/1_0", "nwparser.p0", "destination-based %{p0}"); -var part170 = // "Pattern{Constant('source-based '), Field(p0,false)}" -match("MESSAGE#97:00005:17/1_1", "nwparser.p0", "source-based %{p0}"); +var part170 = match("MESSAGE#97:00005:17/1_1", "nwparser.p0", "source-based %{p0}"); var select38 = linear_select([ part169, part170, ]); -var part171 = // "Pattern{Constant('session-limit threshold has been set at '), Field(trigger_val,true), Constant(' in zone '), Field(zone,false), Constant('.')}" -match("MESSAGE#97:00005:17/2", "nwparser.p0", "session-limit threshold has been set at %{trigger_val->} in zone %{zone}."); +var part171 = match("MESSAGE#97:00005:17/2", "nwparser.p0", "session-limit threshold has been set at %{trigger_val->} in zone %{zone}."); var all33 = all_match({ processors: [ @@ -3542,7 +3102,7 @@ var msg99 = msg("00005:17", all33); var all34 = all_match({ processors: [ dup80, - dup345, + dup343, dup83, ], on_success: processor_chain([ @@ -3559,8 +3119,7 @@ var all34 = all_match({ var msg100 = msg("00005:18", all34); -var part172 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.The attack occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#99:00005:19", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.The attack occurred %{dclass_counter1->} times.", processor_chain([ +var part172 = match("MESSAGE#99:00005:19", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.The attack occurred %{dclass_counter1->} times.", processor_chain([ dup84, dup2, dup3, @@ -3572,8 +3131,7 @@ match("MESSAGE#99:00005:19", "nwparser.payload", "%{signame->} From %{saddr}:%{s var msg101 = msg("00005:19", part172); -var part173 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' int '), Field(interface,false), Constant(').'), Field(space,true), Constant(' Occurred '), Field(fld2,true), Constant(' times. ('), Field(fld1,false), Constant(')<<'), Field(fld6,false), Constant('>')}" -match("MESSAGE#100:00005:20", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} int %{interface}).%{space->} Occurred %{fld2->} times. (%{fld1})\u003c\u003c%{fld6}>", processor_chain([ +var part173 = match("MESSAGE#100:00005:20", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} int %{interface}).%{space->} Occurred %{fld2->} times. (%{fld1})\u003c\u003c%{fld6}>", processor_chain([ dup84, dup9, dup2, @@ -3608,8 +3166,7 @@ var select39 = linear_select([ msg102, ]); -var part174 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#101:00006", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part174 = match("MESSAGE#101:00006", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup85, dup2, dup3, @@ -3621,8 +3178,7 @@ match("MESSAGE#101:00006", "nwparser.payload", "%{signame->} has been detected! var msg103 = msg("00006", part174); -var part175 = // "Pattern{Constant('Hostname set to "'), Field(hostname,false), Constant('"')}" -match("MESSAGE#102:00006:01", "nwparser.payload", "Hostname set to \"%{hostname}\"", processor_chain([ +var part175 = match("MESSAGE#102:00006:01", "nwparser.payload", "Hostname set to \"%{hostname}\"", processor_chain([ dup1, dup2, dup3, @@ -3632,8 +3188,7 @@ match("MESSAGE#102:00006:01", "nwparser.payload", "Hostname set to \"%{hostname} var msg104 = msg("00006:01", part175); -var part176 = // "Pattern{Constant('Domain set to '), Field(domain,false)}" -match("MESSAGE#103:00006:02", "nwparser.payload", "Domain set to %{domain}", processor_chain([ +var part176 = match("MESSAGE#103:00006:02", "nwparser.payload", "Domain set to %{domain}", processor_chain([ dup1, dup2, dup3, @@ -3643,8 +3198,7 @@ match("MESSAGE#103:00006:02", "nwparser.payload", "Domain set to %{domain}", pro var msg105 = msg("00006:02", part176); -var part177 = // "Pattern{Constant('An optional ScreenOS feature has been activated via a software key.'), Field(,false)}" -match("MESSAGE#104:00006:03", "nwparser.payload", "An optional ScreenOS feature has been activated via a software key.%{}", processor_chain([ +var part177 = match("MESSAGE#104:00006:03", "nwparser.payload", "An optional ScreenOS feature has been activated via a software key.%{}", processor_chain([ dup1, dup2, dup3, @@ -3654,13 +3208,12 @@ match("MESSAGE#104:00006:03", "nwparser.payload", "An optional ScreenOS feature var msg106 = msg("00006:03", part177); -var part178 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(p0,false)}" -match("MESSAGE#105:00006:04/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{p0}"); +var part178 = match("MESSAGE#105:00006:04/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{p0}"); var all35 = all_match({ processors: [ part178, - dup340, + dup338, dup67, ], on_success: processor_chain([ @@ -3680,7 +3233,7 @@ var msg107 = msg("00006:04", all35); var all36 = all_match({ processors: [ dup64, - dup340, + dup338, dup67, ], on_success: processor_chain([ @@ -3706,8 +3259,7 @@ var select40 = linear_select([ msg108, ]); -var part179 = // "Pattern{Constant('HA cluster ID has been changed to '), Field(fld2,false)}" -match("MESSAGE#107:00007", "nwparser.payload", "HA cluster ID has been changed to %{fld2}", processor_chain([ +var part179 = match("MESSAGE#107:00007", "nwparser.payload", "HA cluster ID has been changed to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -3717,8 +3269,7 @@ match("MESSAGE#107:00007", "nwparser.payload", "HA cluster ID has been changed t var msg109 = msg("00007", part179); -var part180 = // "Pattern{Field(change_attribute,true), Constant(' of the local NetScreen device has changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#108:00007:01", "nwparser.payload", "%{change_attribute->} of the local NetScreen device has changed from %{change_old->} to %{change_new}", processor_chain([ +var part180 = match("MESSAGE#108:00007:01", "nwparser.payload", "%{change_attribute->} of the local NetScreen device has changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -3728,14 +3279,11 @@ match("MESSAGE#108:00007:01", "nwparser.payload", "%{change_attribute->} of the var msg110 = msg("00007:01", part180); -var part181 = // "Pattern{Constant('HA state of the local device has changed to backup because a device with a '), Field(p0,false)}" -match("MESSAGE#109:00007:02/0", "nwparser.payload", "HA state of the local device has changed to backup because a device with a %{p0}"); +var part181 = match("MESSAGE#109:00007:02/0", "nwparser.payload", "HA state of the local device has changed to backup because a device with a %{p0}"); -var part182 = // "Pattern{Constant('higher priority has been detected'), Field(,false)}" -match("MESSAGE#109:00007:02/1_0", "nwparser.p0", "higher priority has been detected%{}"); +var part182 = match("MESSAGE#109:00007:02/1_0", "nwparser.p0", "higher priority has been detected%{}"); -var part183 = // "Pattern{Constant('lower MAC value has been detected'), Field(,false)}" -match("MESSAGE#109:00007:02/1_1", "nwparser.p0", "lower MAC value has been detected%{}"); +var part183 = match("MESSAGE#109:00007:02/1_1", "nwparser.p0", "lower MAC value has been detected%{}"); var select41 = linear_select([ part182, @@ -3758,8 +3306,7 @@ var all37 = all_match({ var msg111 = msg("00007:02", all37); -var part184 = // "Pattern{Constant('HA state of the local device has changed to init because IP tracking has failed'), Field(,false)}" -match("MESSAGE#110:00007:03", "nwparser.payload", "HA state of the local device has changed to init because IP tracking has failed%{}", processor_chain([ +var part184 = match("MESSAGE#110:00007:03", "nwparser.payload", "HA state of the local device has changed to init because IP tracking has failed%{}", processor_chain([ dup86, dup2, dup3, @@ -3774,15 +3321,14 @@ var select42 = linear_select([ dup89, ]); -var part185 = // "Pattern{Constant('has been changed'), Field(,false)}" -match("MESSAGE#111:00007:04/4", "nwparser.p0", "has been changed%{}"); +var part185 = match("MESSAGE#111:00007:04/4", "nwparser.p0", "has been changed%{}"); var all38 = all_match({ processors: [ dup87, select42, dup23, - dup346, + dup344, part185, ], on_success: processor_chain([ @@ -3796,8 +3342,7 @@ var all38 = all_match({ var msg113 = msg("00007:04", all38); -var part186 = // "Pattern{Constant('HA: Local NetScreen device has been elected backup because a master already exists'), Field(,false)}" -match("MESSAGE#112:00007:05", "nwparser.payload", "HA: Local NetScreen device has been elected backup because a master already exists%{}", processor_chain([ +var part186 = match("MESSAGE#112:00007:05", "nwparser.payload", "HA: Local NetScreen device has been elected backup because a master already exists%{}", processor_chain([ dup1, dup2, dup3, @@ -3807,8 +3352,7 @@ match("MESSAGE#112:00007:05", "nwparser.payload", "HA: Local NetScreen device ha var msg114 = msg("00007:05", part186); -var part187 = // "Pattern{Constant('HA: Local NetScreen device has been elected backup because its MAC value is higher than those of other devices in the cluster'), Field(,false)}" -match("MESSAGE#113:00007:06", "nwparser.payload", "HA: Local NetScreen device has been elected backup because its MAC value is higher than those of other devices in the cluster%{}", processor_chain([ +var part187 = match("MESSAGE#113:00007:06", "nwparser.payload", "HA: Local NetScreen device has been elected backup because its MAC value is higher than those of other devices in the cluster%{}", processor_chain([ dup1, dup2, dup3, @@ -3818,8 +3362,7 @@ match("MESSAGE#113:00007:06", "nwparser.payload", "HA: Local NetScreen device ha var msg115 = msg("00007:06", part187); -var part188 = // "Pattern{Constant('HA: Local NetScreen device has been elected backup because its priority value is higher than those of other devices in the cluster'), Field(,false)}" -match("MESSAGE#114:00007:07", "nwparser.payload", "HA: Local NetScreen device has been elected backup because its priority value is higher than those of other devices in the cluster%{}", processor_chain([ +var part188 = match("MESSAGE#114:00007:07", "nwparser.payload", "HA: Local NetScreen device has been elected backup because its priority value is higher than those of other devices in the cluster%{}", processor_chain([ dup1, dup2, dup3, @@ -3829,8 +3372,7 @@ match("MESSAGE#114:00007:07", "nwparser.payload", "HA: Local NetScreen device ha var msg116 = msg("00007:07", part188); -var part189 = // "Pattern{Constant('HA: Local device has been elected master because no other master exists'), Field(,false)}" -match("MESSAGE#115:00007:08", "nwparser.payload", "HA: Local device has been elected master because no other master exists%{}", processor_chain([ +var part189 = match("MESSAGE#115:00007:08", "nwparser.payload", "HA: Local device has been elected master because no other master exists%{}", processor_chain([ dup1, dup2, dup3, @@ -3840,8 +3382,7 @@ match("MESSAGE#115:00007:08", "nwparser.payload", "HA: Local device has been ele var msg117 = msg("00007:08", part189); -var part190 = // "Pattern{Constant('HA: Local device priority has been changed to '), Field(fld2,false)}" -match("MESSAGE#116:00007:09", "nwparser.payload", "HA: Local device priority has been changed to %{fld2}", processor_chain([ +var part190 = match("MESSAGE#116:00007:09", "nwparser.payload", "HA: Local device priority has been changed to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -3851,8 +3392,7 @@ match("MESSAGE#116:00007:09", "nwparser.payload", "HA: Local device priority has var msg118 = msg("00007:09", part190); -var part191 = // "Pattern{Constant('HA: Previous master has promoted the local NetScreen device to master'), Field(,false)}" -match("MESSAGE#117:00007:10", "nwparser.payload", "HA: Previous master has promoted the local NetScreen device to master%{}", processor_chain([ +var part191 = match("MESSAGE#117:00007:10", "nwparser.payload", "HA: Previous master has promoted the local NetScreen device to master%{}", processor_chain([ dup1, dup2, dup3, @@ -3862,8 +3402,7 @@ match("MESSAGE#117:00007:10", "nwparser.payload", "HA: Previous master has promo var msg119 = msg("00007:10", part191); -var part192 = // "Pattern{Constant('IP tracking device failover threshold has been '), Field(p0,false)}" -match("MESSAGE#118:00007:11/0", "nwparser.payload", "IP tracking device failover threshold has been %{p0}"); +var part192 = match("MESSAGE#118:00007:11/0", "nwparser.payload", "IP tracking device failover threshold has been %{p0}"); var select43 = linear_select([ dup92, @@ -3886,8 +3425,7 @@ var all39 = all_match({ var msg120 = msg("00007:11", all39); -var part193 = // "Pattern{Constant('IP tracking has been '), Field(disposition,false)}" -match("MESSAGE#119:00007:12", "nwparser.payload", "IP tracking has been %{disposition}", processor_chain([ +var part193 = match("MESSAGE#119:00007:12", "nwparser.payload", "IP tracking has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -3897,8 +3435,7 @@ match("MESSAGE#119:00007:12", "nwparser.payload", "IP tracking has been %{dispos var msg121 = msg("00007:12", part193); -var part194 = // "Pattern{Constant('IP tracking to '), Field(hostip,true), Constant(' with interval '), Field(fld2,true), Constant(' threshold '), Field(trigger_val,true), Constant(' weight '), Field(fld4,true), Constant(' interface '), Field(interface,true), Constant(' method '), Field(fld5,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#120:00007:13", "nwparser.payload", "IP tracking to %{hostip->} with interval %{fld2->} threshold %{trigger_val->} weight %{fld4->} interface %{interface->} method %{fld5->} has been %{disposition}", processor_chain([ +var part194 = match("MESSAGE#120:00007:13", "nwparser.payload", "IP tracking to %{hostip->} with interval %{fld2->} threshold %{trigger_val->} weight %{fld4->} interface %{interface->} method %{fld5->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -3908,8 +3445,7 @@ match("MESSAGE#120:00007:13", "nwparser.payload", "IP tracking to %{hostip->} wi var msg122 = msg("00007:13", part194); -var part195 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,true), Constant(' using protocol '), Field(protocol,true), Constant(' on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#121:00007:14", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr->} using protocol %{protocol->} on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part195 = match("MESSAGE#121:00007:14", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr->} using protocol %{protocol->} on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup85, dup2, dup3, @@ -3921,8 +3457,7 @@ match("MESSAGE#121:00007:14", "nwparser.payload", "%{signame->} From %{saddr->} var msg123 = msg("00007:14", part195); -var part196 = // "Pattern{Constant('Primary HA interface has been changed to '), Field(interface,false)}" -match("MESSAGE#122:00007:15", "nwparser.payload", "Primary HA interface has been changed to %{interface}", processor_chain([ +var part196 = match("MESSAGE#122:00007:15", "nwparser.payload", "Primary HA interface has been changed to %{interface}", processor_chain([ dup1, dup2, dup3, @@ -3932,8 +3467,7 @@ match("MESSAGE#122:00007:15", "nwparser.payload", "Primary HA interface has been var msg124 = msg("00007:15", part196); -var part197 = // "Pattern{Constant('Reporting of HA configuration and status changes to NetScreen-Global Manager has been '), Field(disposition,false)}" -match("MESSAGE#123:00007:16", "nwparser.payload", "Reporting of HA configuration and status changes to NetScreen-Global Manager has been %{disposition}", processor_chain([ +var part197 = match("MESSAGE#123:00007:16", "nwparser.payload", "Reporting of HA configuration and status changes to NetScreen-Global Manager has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -3943,8 +3477,7 @@ match("MESSAGE#123:00007:16", "nwparser.payload", "Reporting of HA configuration var msg125 = msg("00007:16", part197); -var part198 = // "Pattern{Constant('Tracked IP '), Field(hostip,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#124:00007:17", "nwparser.payload", "Tracked IP %{hostip->} has been %{disposition}", processor_chain([ +var part198 = match("MESSAGE#124:00007:17", "nwparser.payload", "Tracked IP %{hostip->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -3954,28 +3487,22 @@ match("MESSAGE#124:00007:17", "nwparser.payload", "Tracked IP %{hostip->} has be var msg126 = msg("00007:17", part198); -var part199 = // "Pattern{Constant('Tracked IP '), Field(hostip,true), Constant(' options have been changed from int '), Field(fld2,true), Constant(' thr '), Field(fld3,true), Constant(' wgt '), Field(fld4,true), Constant(' inf '), Field(fld5,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#125:00007:18/0", "nwparser.payload", "Tracked IP %{hostip->} options have been changed from int %{fld2->} thr %{fld3->} wgt %{fld4->} inf %{fld5->} %{p0}"); +var part199 = match("MESSAGE#125:00007:18/0", "nwparser.payload", "Tracked IP %{hostip->} options have been changed from int %{fld2->} thr %{fld3->} wgt %{fld4->} inf %{fld5->} %{p0}"); -var part200 = // "Pattern{Constant('ping '), Field(p0,false)}" -match("MESSAGE#125:00007:18/1_0", "nwparser.p0", "ping %{p0}"); +var part200 = match("MESSAGE#125:00007:18/1_0", "nwparser.p0", "ping %{p0}"); -var part201 = // "Pattern{Constant('ARP '), Field(p0,false)}" -match("MESSAGE#125:00007:18/1_1", "nwparser.p0", "ARP %{p0}"); +var part201 = match("MESSAGE#125:00007:18/1_1", "nwparser.p0", "ARP %{p0}"); var select44 = linear_select([ part200, part201, ]); -var part202 = // "Pattern{Constant('to '), Field(fld6,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#125:00007:18/2", "nwparser.p0", "to %{fld6->} %{p0}"); +var part202 = match("MESSAGE#125:00007:18/2", "nwparser.p0", "to %{fld6->} %{p0}"); -var part203 = // "Pattern{Constant('ping'), Field(,false)}" -match("MESSAGE#125:00007:18/3_0", "nwparser.p0", "ping%{}"); +var part203 = match("MESSAGE#125:00007:18/3_0", "nwparser.p0", "ping%{}"); -var part204 = // "Pattern{Constant('ARP'), Field(,false)}" -match("MESSAGE#125:00007:18/3_1", "nwparser.p0", "ARP%{}"); +var part204 = match("MESSAGE#125:00007:18/3_1", "nwparser.p0", "ARP%{}"); var select45 = linear_select([ part203, @@ -4000,8 +3527,7 @@ var all40 = all_match({ var msg127 = msg("00007:18", all40); -var part205 = // "Pattern{Constant('Change '), Field(change_attribute,true), Constant(' path from '), Field(change_old,true), Constant(' to '), Field(change_new,false), Constant('.')}" -match("MESSAGE#126:00007:20", "nwparser.payload", "Change %{change_attribute->} path from %{change_old->} to %{change_new}.", processor_chain([ +var part205 = match("MESSAGE#126:00007:20", "nwparser.payload", "Change %{change_attribute->} path from %{change_old->} to %{change_new}.", processor_chain([ dup1, dup2, dup3, @@ -4011,13 +3537,12 @@ match("MESSAGE#126:00007:20", "nwparser.payload", "Change %{change_attribute->} var msg128 = msg("00007:20", part205); -var part206 = // "Pattern{Constant('HA Slave is '), Field(p0,false)}" -match("MESSAGE#127:00007:21/0", "nwparser.payload", "HA Slave is %{p0}"); +var part206 = match("MESSAGE#127:00007:21/0", "nwparser.payload", "HA Slave is %{p0}"); var all41 = all_match({ processors: [ part206, - dup347, + dup345, ], on_success: processor_chain([ dup44, @@ -4030,8 +3555,7 @@ var all41 = all_match({ var msg129 = msg("00007:21", all41); -var part207 = // "Pattern{Constant('HA change group id to '), Field(groupid,false)}" -match("MESSAGE#128:00007:22", "nwparser.payload", "HA change group id to %{groupid}", processor_chain([ +var part207 = match("MESSAGE#128:00007:22", "nwparser.payload", "HA change group id to %{groupid}", processor_chain([ dup1, dup2, dup3, @@ -4041,8 +3565,7 @@ match("MESSAGE#128:00007:22", "nwparser.payload", "HA change group id to %{group var msg130 = msg("00007:22", part207); -var part208 = // "Pattern{Constant('HA change priority to '), Field(fld2,false)}" -match("MESSAGE#129:00007:23", "nwparser.payload", "HA change priority to %{fld2}", processor_chain([ +var part208 = match("MESSAGE#129:00007:23", "nwparser.payload", "HA change priority to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -4052,8 +3575,7 @@ match("MESSAGE#129:00007:23", "nwparser.payload", "HA change priority to %{fld2} var msg131 = msg("00007:23", part208); -var part209 = // "Pattern{Constant('HA change state to init'), Field(,false)}" -match("MESSAGE#130:00007:24", "nwparser.payload", "HA change state to init%{}", processor_chain([ +var part209 = match("MESSAGE#130:00007:24", "nwparser.payload", "HA change state to init%{}", processor_chain([ dup1, dup2, dup3, @@ -4063,8 +3585,7 @@ match("MESSAGE#130:00007:24", "nwparser.payload", "HA change state to init%{}", var msg132 = msg("00007:24", part209); -var part210 = // "Pattern{Constant('HA: Change state to initial state.'), Field(,false)}" -match("MESSAGE#131:00007:25", "nwparser.payload", "HA: Change state to initial state.%{}", processor_chain([ +var part210 = match("MESSAGE#131:00007:25", "nwparser.payload", "HA: Change state to initial state.%{}", processor_chain([ dup1, dup2, dup3, @@ -4074,14 +3595,11 @@ match("MESSAGE#131:00007:25", "nwparser.payload", "HA: Change state to initial s var msg133 = msg("00007:25", part210); -var part211 = // "Pattern{Constant('HA: Change state to slave for '), Field(p0,false)}" -match("MESSAGE#132:00007:26/0", "nwparser.payload", "HA: Change state to slave for %{p0}"); +var part211 = match("MESSAGE#132:00007:26/0", "nwparser.payload", "HA: Change state to slave for %{p0}"); -var part212 = // "Pattern{Constant('tracking ip failed'), Field(,false)}" -match("MESSAGE#132:00007:26/1_0", "nwparser.p0", "tracking ip failed%{}"); +var part212 = match("MESSAGE#132:00007:26/1_0", "nwparser.p0", "tracking ip failed%{}"); -var part213 = // "Pattern{Constant('linkdown'), Field(,false)}" -match("MESSAGE#132:00007:26/1_1", "nwparser.p0", "linkdown%{}"); +var part213 = match("MESSAGE#132:00007:26/1_1", "nwparser.p0", "linkdown%{}"); var select46 = linear_select([ part212, @@ -4104,8 +3622,7 @@ var all42 = all_match({ var msg134 = msg("00007:26", all42); -var part214 = // "Pattern{Constant('HA: Change to master command issued from original master to change state'), Field(,false)}" -match("MESSAGE#133:00007:27", "nwparser.payload", "HA: Change to master command issued from original master to change state%{}", processor_chain([ +var part214 = match("MESSAGE#133:00007:27", "nwparser.payload", "HA: Change to master command issued from original master to change state%{}", processor_chain([ dup1, dup2, dup3, @@ -4115,8 +3632,7 @@ match("MESSAGE#133:00007:27", "nwparser.payload", "HA: Change to master command var msg135 = msg("00007:27", part214); -var part215 = // "Pattern{Constant('HA: Elected master no other master'), Field(,false)}" -match("MESSAGE#134:00007:28", "nwparser.payload", "HA: Elected master no other master%{}", processor_chain([ +var part215 = match("MESSAGE#134:00007:28", "nwparser.payload", "HA: Elected master no other master%{}", processor_chain([ dup1, dup2, dup3, @@ -4126,23 +3642,17 @@ match("MESSAGE#134:00007:28", "nwparser.payload", "HA: Elected master no other m var msg136 = msg("00007:28", part215); -var part216 = // "Pattern{Constant('HA: Elected slave '), Field(p0,false)}" -match("MESSAGE#135:00007:29/0", "nwparser.payload", "HA: Elected slave %{p0}"); +var part216 = match("MESSAGE#135:00007:29/0", "nwparser.payload", "HA: Elected slave %{p0}"); -var part217 = // "Pattern{Constant('lower priority'), Field(,false)}" -match("MESSAGE#135:00007:29/1_0", "nwparser.p0", "lower priority%{}"); +var part217 = match("MESSAGE#135:00007:29/1_0", "nwparser.p0", "lower priority%{}"); -var part218 = // "Pattern{Constant('MAC value is larger'), Field(,false)}" -match("MESSAGE#135:00007:29/1_1", "nwparser.p0", "MAC value is larger%{}"); +var part218 = match("MESSAGE#135:00007:29/1_1", "nwparser.p0", "MAC value is larger%{}"); -var part219 = // "Pattern{Constant('master already exists'), Field(,false)}" -match("MESSAGE#135:00007:29/1_2", "nwparser.p0", "master already exists%{}"); +var part219 = match("MESSAGE#135:00007:29/1_2", "nwparser.p0", "master already exists%{}"); -var part220 = // "Pattern{Constant('detect new master with higher priority'), Field(,false)}" -match("MESSAGE#135:00007:29/1_3", "nwparser.p0", "detect new master with higher priority%{}"); +var part220 = match("MESSAGE#135:00007:29/1_3", "nwparser.p0", "detect new master with higher priority%{}"); -var part221 = // "Pattern{Constant('detect new master with smaller MAC value'), Field(,false)}" -match("MESSAGE#135:00007:29/1_4", "nwparser.p0", "detect new master with smaller MAC value%{}"); +var part221 = match("MESSAGE#135:00007:29/1_4", "nwparser.p0", "detect new master with smaller MAC value%{}"); var select47 = linear_select([ part217, @@ -4168,8 +3678,7 @@ var all43 = all_match({ var msg137 = msg("00007:29", all43); -var part222 = // "Pattern{Constant('HA: Promoted master command issued from original master to change state'), Field(,false)}" -match("MESSAGE#136:00007:30", "nwparser.payload", "HA: Promoted master command issued from original master to change state%{}", processor_chain([ +var part222 = match("MESSAGE#136:00007:30", "nwparser.payload", "HA: Promoted master command issued from original master to change state%{}", processor_chain([ dup1, dup2, dup3, @@ -4179,13 +3688,12 @@ match("MESSAGE#136:00007:30", "nwparser.payload", "HA: Promoted master command i var msg138 = msg("00007:30", part222); -var part223 = // "Pattern{Constant('HA: ha link '), Field(p0,false)}" -match("MESSAGE#137:00007:31/0", "nwparser.payload", "HA: ha link %{p0}"); +var part223 = match("MESSAGE#137:00007:31/0", "nwparser.payload", "HA: ha link %{p0}"); var all44 = all_match({ processors: [ part223, - dup347, + dup345, ], on_success: processor_chain([ dup44, @@ -4198,23 +3706,21 @@ var all44 = all_match({ var msg139 = msg("00007:31", all44); -var part224 = // "Pattern{Constant('NSRP '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#138:00007:32/0", "nwparser.payload", "NSRP %{fld2->} %{p0}"); +var part224 = match("MESSAGE#138:00007:32/0", "nwparser.payload", "NSRP %{fld2->} %{p0}"); var select48 = linear_select([ dup89, dup88, ]); -var part225 = // "Pattern{Constant('changed.'), Field(,false)}" -match("MESSAGE#138:00007:32/4", "nwparser.p0", "changed.%{}"); +var part225 = match("MESSAGE#138:00007:32/4", "nwparser.p0", "changed.%{}"); var all45 = all_match({ processors: [ part224, select48, dup23, - dup346, + dup344, part225, ], on_success: processor_chain([ @@ -4228,30 +3734,25 @@ var all45 = all_match({ var msg140 = msg("00007:32", all45); -var part226 = // "Pattern{Constant('NSRP: VSD '), Field(p0,false)}" -match("MESSAGE#139:00007:33/0_0", "nwparser.payload", "NSRP: VSD %{p0}"); +var part226 = match("MESSAGE#139:00007:33/0_0", "nwparser.payload", "NSRP: VSD %{p0}"); -var part227 = // "Pattern{Constant('Virtual Security Device group '), Field(p0,false)}" -match("MESSAGE#139:00007:33/0_1", "nwparser.payload", "Virtual Security Device group %{p0}"); +var part227 = match("MESSAGE#139:00007:33/0_1", "nwparser.payload", "Virtual Security Device group %{p0}"); var select49 = linear_select([ part226, part227, ]); -var part228 = // "Pattern{Constant(''), Field(fld2,true), Constant(' change'), Field(p0,false)}" -match("MESSAGE#139:00007:33/1", "nwparser.p0", "%{fld2->} change%{p0}"); +var part228 = match("MESSAGE#139:00007:33/1", "nwparser.p0", "%{fld2->} change%{p0}"); -var part229 = // "Pattern{Constant('d '), Field(p0,false)}" -match("MESSAGE#139:00007:33/2_0", "nwparser.p0", "d %{p0}"); +var part229 = match("MESSAGE#139:00007:33/2_0", "nwparser.p0", "d %{p0}"); var select50 = linear_select([ part229, dup96, ]); -var part230 = // "Pattern{Constant('to '), Field(fld3,true), Constant(' mode.')}" -match("MESSAGE#139:00007:33/3", "nwparser.p0", "to %{fld3->} mode."); +var part230 = match("MESSAGE#139:00007:33/3", "nwparser.p0", "to %{fld3->} mode."); var all46 = all_match({ processors: [ @@ -4271,8 +3772,7 @@ var all46 = all_match({ var msg141 = msg("00007:33", all46); -var part231 = // "Pattern{Constant('NSRP: message '), Field(fld2,true), Constant(' dropped: invalid encryption password.')}" -match("MESSAGE#140:00007:34", "nwparser.payload", "NSRP: message %{fld2->} dropped: invalid encryption password.", processor_chain([ +var part231 = match("MESSAGE#140:00007:34", "nwparser.payload", "NSRP: message %{fld2->} dropped: invalid encryption password.", processor_chain([ dup97, dup2, dup3, @@ -4282,8 +3782,7 @@ match("MESSAGE#140:00007:34", "nwparser.payload", "NSRP: message %{fld2->} dropp var msg142 = msg("00007:34", part231); -var part232 = // "Pattern{Constant('NSRP: nsrp interface change to '), Field(interface,false), Constant('.')}" -match("MESSAGE#141:00007:35", "nwparser.payload", "NSRP: nsrp interface change to %{interface}.", processor_chain([ +var part232 = match("MESSAGE#141:00007:35", "nwparser.payload", "NSRP: nsrp interface change to %{interface}.", processor_chain([ dup44, dup2, dup3, @@ -4293,8 +3792,7 @@ match("MESSAGE#141:00007:35", "nwparser.payload", "NSRP: nsrp interface change t var msg143 = msg("00007:35", part232); -var part233 = // "Pattern{Constant('RTO mirror group id='), Field(groupid,true), Constant(' direction= '), Field(direction,true), Constant(' local unit='), Field(fld3,true), Constant(' duplicate from unit='), Field(fld4,false)}" -match("MESSAGE#142:00007:36", "nwparser.payload", "RTO mirror group id=%{groupid->} direction= %{direction->} local unit=%{fld3->} duplicate from unit=%{fld4}", processor_chain([ +var part233 = match("MESSAGE#142:00007:36", "nwparser.payload", "RTO mirror group id=%{groupid->} direction= %{direction->} local unit=%{fld3->} duplicate from unit=%{fld4}", processor_chain([ dup44, dup2, dup3, @@ -4304,13 +3802,12 @@ match("MESSAGE#142:00007:36", "nwparser.payload", "RTO mirror group id=%{groupid var msg144 = msg("00007:36", part233); -var part234 = // "Pattern{Constant('RTO mirror group id='), Field(groupid,true), Constant(' direction= '), Field(direction,true), Constant(' is '), Field(p0,false)}" -match("MESSAGE#143:00007:37/0", "nwparser.payload", "RTO mirror group id=%{groupid->} direction= %{direction->} is %{p0}"); +var part234 = match("MESSAGE#143:00007:37/0", "nwparser.payload", "RTO mirror group id=%{groupid->} direction= %{direction->} is %{p0}"); var all47 = all_match({ processors: [ part234, - dup348, + dup346, ], on_success: processor_chain([ dup44, @@ -4323,17 +3820,13 @@ var all47 = all_match({ var msg145 = msg("00007:37", all47); -var part235 = // "Pattern{Constant('RTO mirror group id='), Field(groupid,true), Constant(' direction= '), Field(direction,true), Constant(' peer='), Field(fld3,true), Constant(' from '), Field(p0,false)}" -match("MESSAGE#144:00007:38/0", "nwparser.payload", "RTO mirror group id=%{groupid->} direction= %{direction->} peer=%{fld3->} from %{p0}"); +var part235 = match("MESSAGE#144:00007:38/0", "nwparser.payload", "RTO mirror group id=%{groupid->} direction= %{direction->} peer=%{fld3->} from %{p0}"); -var part236 = // "Pattern{Constant('state '), Field(p0,false)}" -match("MESSAGE#144:00007:38/4", "nwparser.p0", "state %{p0}"); +var part236 = match("MESSAGE#144:00007:38/4", "nwparser.p0", "state %{p0}"); -var part237 = // "Pattern{Constant('missed heartbeat'), Field(,false)}" -match("MESSAGE#144:00007:38/5_0", "nwparser.p0", "missed heartbeat%{}"); +var part237 = match("MESSAGE#144:00007:38/5_0", "nwparser.p0", "missed heartbeat%{}"); -var part238 = // "Pattern{Constant('group detached'), Field(,false)}" -match("MESSAGE#144:00007:38/5_1", "nwparser.p0", "group detached%{}"); +var part238 = match("MESSAGE#144:00007:38/5_1", "nwparser.p0", "group detached%{}"); var select51 = linear_select([ part237, @@ -4343,9 +3836,9 @@ var select51 = linear_select([ var all48 = all_match({ processors: [ part235, - dup349, + dup347, dup103, - dup349, + dup347, part236, select51, ], @@ -4360,13 +3853,12 @@ var all48 = all_match({ var msg146 = msg("00007:38", all48); -var part239 = // "Pattern{Constant('RTO mirror group id='), Field(groupid,true), Constant(' is '), Field(p0,false)}" -match("MESSAGE#145:00007:39/0", "nwparser.payload", "RTO mirror group id=%{groupid->} is %{p0}"); +var part239 = match("MESSAGE#145:00007:39/0", "nwparser.payload", "RTO mirror group id=%{groupid->} is %{p0}"); var all49 = all_match({ processors: [ part239, - dup348, + dup346, ], on_success: processor_chain([ dup44, @@ -4379,8 +3871,7 @@ var all49 = all_match({ var msg147 = msg("00007:39", all49); -var part240 = // "Pattern{Constant('Remove pathname '), Field(fld2,true), Constant(' (ifnum='), Field(fld3,false), Constant(') as secondary HA path')}" -match("MESSAGE#146:00007:40", "nwparser.payload", "Remove pathname %{fld2->} (ifnum=%{fld3}) as secondary HA path", processor_chain([ +var part240 = match("MESSAGE#146:00007:40", "nwparser.payload", "Remove pathname %{fld2->} (ifnum=%{fld3}) as secondary HA path", processor_chain([ dup44, dup2, dup3, @@ -4390,8 +3881,7 @@ match("MESSAGE#146:00007:40", "nwparser.payload", "Remove pathname %{fld2->} (if var msg148 = msg("00007:40", part240); -var part241 = // "Pattern{Constant('Session sync ended by unit='), Field(fld2,false)}" -match("MESSAGE#147:00007:41", "nwparser.payload", "Session sync ended by unit=%{fld2}", processor_chain([ +var part241 = match("MESSAGE#147:00007:41", "nwparser.payload", "Session sync ended by unit=%{fld2}", processor_chain([ dup44, dup2, dup3, @@ -4401,8 +3891,7 @@ match("MESSAGE#147:00007:41", "nwparser.payload", "Session sync ended by unit=%{ var msg149 = msg("00007:41", part241); -var part242 = // "Pattern{Constant('Set secondary HA path to '), Field(fld2,true), Constant(' (ifnum='), Field(fld3,false), Constant(')')}" -match("MESSAGE#148:00007:42", "nwparser.payload", "Set secondary HA path to %{fld2->} (ifnum=%{fld3})", processor_chain([ +var part242 = match("MESSAGE#148:00007:42", "nwparser.payload", "Set secondary HA path to %{fld2->} (ifnum=%{fld3})", processor_chain([ dup1, dup2, dup3, @@ -4412,8 +3901,7 @@ match("MESSAGE#148:00007:42", "nwparser.payload", "Set secondary HA path to %{fl var msg150 = msg("00007:42", part242); -var part243 = // "Pattern{Constant('VSD '), Field(change_attribute,true), Constant(' changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#149:00007:43", "nwparser.payload", "VSD %{change_attribute->} changed from %{change_old->} to %{change_new}", processor_chain([ +var part243 = match("MESSAGE#149:00007:43", "nwparser.payload", "VSD %{change_attribute->} changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -4423,8 +3911,7 @@ match("MESSAGE#149:00007:43", "nwparser.payload", "VSD %{change_attribute->} cha var msg151 = msg("00007:43", part243); -var part244 = // "Pattern{Constant('vsd group id='), Field(groupid,true), Constant(' is '), Field(disposition,true), Constant(' total number='), Field(fld3,false)}" -match("MESSAGE#150:00007:44", "nwparser.payload", "vsd group id=%{groupid->} is %{disposition->} total number=%{fld3}", processor_chain([ +var part244 = match("MESSAGE#150:00007:44", "nwparser.payload", "vsd group id=%{groupid->} is %{disposition->} total number=%{fld3}", processor_chain([ dup1, dup2, dup3, @@ -4434,8 +3921,7 @@ match("MESSAGE#150:00007:44", "nwparser.payload", "vsd group id=%{groupid->} is var msg152 = msg("00007:44", part244); -var part245 = // "Pattern{Constant('vsd group '), Field(group,true), Constant(' local unit '), Field(change_attribute,true), Constant(' changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#151:00007:45", "nwparser.payload", "vsd group %{group->} local unit %{change_attribute->} changed from %{change_old->} to %{change_new}", processor_chain([ +var part245 = match("MESSAGE#151:00007:45", "nwparser.payload", "vsd group %{group->} local unit %{change_attribute->} changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -4445,8 +3931,7 @@ match("MESSAGE#151:00007:45", "nwparser.payload", "vsd group %{group->} local un var msg153 = msg("00007:45", part245); -var part246 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,true), Constant(' to '), Field(daddr,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#152:00007:46", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part246 = match("MESSAGE#152:00007:46", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup85, dup2, dup3, @@ -4458,8 +3943,7 @@ match("MESSAGE#152:00007:46", "nwparser.payload", "%{signame->} has been detecte var msg154 = msg("00007:46", part246); -var part247 = // "Pattern{Constant('The HA channel changed to interface '), Field(interface,false)}" -match("MESSAGE#153:00007:47", "nwparser.payload", "The HA channel changed to interface %{interface}", processor_chain([ +var part247 = match("MESSAGE#153:00007:47", "nwparser.payload", "The HA channel changed to interface %{interface}", processor_chain([ dup1, dup2, dup3, @@ -4469,8 +3953,7 @@ match("MESSAGE#153:00007:47", "nwparser.payload", "The HA channel changed to int var msg155 = msg("00007:47", part247); -var part248 = // "Pattern{Constant('Message '), Field(fld2,true), Constant(' was dropped because it contained an invalid encryption password.')}" -match("MESSAGE#154:00007:48", "nwparser.payload", "Message %{fld2->} was dropped because it contained an invalid encryption password.", processor_chain([ +var part248 = match("MESSAGE#154:00007:48", "nwparser.payload", "Message %{fld2->} was dropped because it contained an invalid encryption password.", processor_chain([ dup97, dup2, dup3, @@ -4481,8 +3964,7 @@ match("MESSAGE#154:00007:48", "nwparser.payload", "Message %{fld2->} was dropped var msg156 = msg("00007:48", part248); -var part249 = // "Pattern{Constant('The '), Field(change_attribute,true), Constant(' of all Virtual Security Device groups changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#155:00007:49", "nwparser.payload", "The %{change_attribute->} of all Virtual Security Device groups changed from %{change_old->} to %{change_new}", processor_chain([ +var part249 = match("MESSAGE#155:00007:49", "nwparser.payload", "The %{change_attribute->} of all Virtual Security Device groups changed from %{change_old->} to %{change_new}", processor_chain([ setc("eventcategory","1604000000"), dup2, dup3, @@ -4492,22 +3974,18 @@ match("MESSAGE#155:00007:49", "nwparser.payload", "The %{change_attribute->} of var msg157 = msg("00007:49", part249); -var part250 = // "Pattern{Constant('Device '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#156:00007:50/0", "nwparser.payload", "Device %{fld2->} %{p0}"); +var part250 = match("MESSAGE#156:00007:50/0", "nwparser.payload", "Device %{fld2->} %{p0}"); -var part251 = // "Pattern{Constant('has joined '), Field(p0,false)}" -match("MESSAGE#156:00007:50/1_0", "nwparser.p0", "has joined %{p0}"); +var part251 = match("MESSAGE#156:00007:50/1_0", "nwparser.p0", "has joined %{p0}"); -var part252 = // "Pattern{Constant('quit current '), Field(p0,false)}" -match("MESSAGE#156:00007:50/1_1", "nwparser.p0", "quit current %{p0}"); +var part252 = match("MESSAGE#156:00007:50/1_1", "nwparser.p0", "quit current %{p0}"); var select52 = linear_select([ part251, part252, ]); -var part253 = // "Pattern{Constant('NSRP cluster '), Field(fld3,false)}" -match("MESSAGE#156:00007:50/2", "nwparser.p0", "NSRP cluster %{fld3}"); +var part253 = match("MESSAGE#156:00007:50/2", "nwparser.p0", "NSRP cluster %{fld3}"); var all50 = all_match({ processors: [ @@ -4526,11 +4004,9 @@ var all50 = all_match({ var msg158 = msg("00007:50", all50); -var part254 = // "Pattern{Constant('Virtual Security Device group '), Field(group,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#157:00007:51/0", "nwparser.payload", "Virtual Security Device group %{group->} was %{p0}"); +var part254 = match("MESSAGE#157:00007:51/0", "nwparser.payload", "Virtual Security Device group %{group->} was %{p0}"); -var part255 = // "Pattern{Constant('deleted '), Field(p0,false)}" -match("MESSAGE#157:00007:51/1_1", "nwparser.p0", "deleted %{p0}"); +var part255 = match("MESSAGE#157:00007:51/1_1", "nwparser.p0", "deleted %{p0}"); var select53 = linear_select([ dup104, @@ -4542,8 +4018,7 @@ var select54 = linear_select([ dup73, ]); -var part256 = // "Pattern{Constant('The total number of members in the group '), Field(p0,false)}" -match("MESSAGE#157:00007:51/4", "nwparser.p0", "The total number of members in the group %{p0}"); +var part256 = match("MESSAGE#157:00007:51/4", "nwparser.p0", "The total number of members in the group %{p0}"); var select55 = linear_select([ dup106, @@ -4571,8 +4046,7 @@ var all51 = all_match({ var msg159 = msg("00007:51", all51); -var part257 = // "Pattern{Constant('Virtual Security Device group '), Field(group,true), Constant(' '), Field(change_attribute,true), Constant(' changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#158:00007:52", "nwparser.payload", "Virtual Security Device group %{group->} %{change_attribute->} changed from %{change_old->} to %{change_new}", processor_chain([ +var part257 = match("MESSAGE#158:00007:52", "nwparser.payload", "Virtual Security Device group %{group->} %{change_attribute->} changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -4582,8 +4056,7 @@ match("MESSAGE#158:00007:52", "nwparser.payload", "Virtual Security Device group var msg160 = msg("00007:52", part257); -var part258 = // "Pattern{Constant('The secondary HA path of the devices was set to interface '), Field(interface,true), Constant(' with ifnum '), Field(fld2,false)}" -match("MESSAGE#159:00007:53", "nwparser.payload", "The secondary HA path of the devices was set to interface %{interface->} with ifnum %{fld2}", processor_chain([ +var part258 = match("MESSAGE#159:00007:53", "nwparser.payload", "The secondary HA path of the devices was set to interface %{interface->} with ifnum %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -4593,8 +4066,7 @@ match("MESSAGE#159:00007:53", "nwparser.payload", "The secondary HA path of the var msg161 = msg("00007:53", part258); -var part259 = // "Pattern{Constant('The '), Field(change_attribute,true), Constant(' of the devices changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#160:00007:54", "nwparser.payload", "The %{change_attribute->} of the devices changed from %{change_old->} to %{change_new}", processor_chain([ +var part259 = match("MESSAGE#160:00007:54", "nwparser.payload", "The %{change_attribute->} of the devices changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -4604,8 +4076,7 @@ match("MESSAGE#160:00007:54", "nwparser.payload", "The %{change_attribute->} of var msg162 = msg("00007:54", part259); -var part260 = // "Pattern{Constant('The interface '), Field(interface,true), Constant(' with ifnum '), Field(fld2,true), Constant(' was removed from the secondary HA path of the devices.')}" -match("MESSAGE#161:00007:55", "nwparser.payload", "The interface %{interface->} with ifnum %{fld2->} was removed from the secondary HA path of the devices.", processor_chain([ +var part260 = match("MESSAGE#161:00007:55", "nwparser.payload", "The interface %{interface->} with ifnum %{fld2->} was removed from the secondary HA path of the devices.", processor_chain([ dup1, dup2, dup3, @@ -4615,8 +4086,7 @@ match("MESSAGE#161:00007:55", "nwparser.payload", "The interface %{interface->} var msg163 = msg("00007:55", part260); -var part261 = // "Pattern{Constant('The probe that detects the status of High Availability link '), Field(fld2,true), Constant(' was '), Field(disposition,false)}" -match("MESSAGE#162:00007:56", "nwparser.payload", "The probe that detects the status of High Availability link %{fld2->} was %{disposition}", processor_chain([ +var part261 = match("MESSAGE#162:00007:56", "nwparser.payload", "The probe that detects the status of High Availability link %{fld2->} was %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -4636,8 +4106,7 @@ var select57 = linear_select([ dup112, ]); -var part262 = // "Pattern{Constant('the probe detecting the status of High Availability link '), Field(fld2,true), Constant(' was set to '), Field(fld3,false)}" -match("MESSAGE#163:00007:57/4", "nwparser.p0", "the probe detecting the status of High Availability link %{fld2->} was set to %{fld3}"); +var part262 = match("MESSAGE#163:00007:57/4", "nwparser.p0", "the probe detecting the status of High Availability link %{fld2->} was set to %{fld3}"); var all52 = all_match({ processors: [ @@ -4658,8 +4127,7 @@ var all52 = all_match({ var msg165 = msg("00007:57", all52); -var part263 = // "Pattern{Constant('A request by device '), Field(fld2,true), Constant(' for session synchronization(s) was accepted.')}" -match("MESSAGE#164:00007:58", "nwparser.payload", "A request by device %{fld2->} for session synchronization(s) was accepted.", processor_chain([ +var part263 = match("MESSAGE#164:00007:58", "nwparser.payload", "A request by device %{fld2->} for session synchronization(s) was accepted.", processor_chain([ dup44, dup2, dup3, @@ -4669,8 +4137,7 @@ match("MESSAGE#164:00007:58", "nwparser.payload", "A request by device %{fld2->} var msg166 = msg("00007:58", part263); -var part264 = // "Pattern{Constant('The current session synchronization by device '), Field(fld2,true), Constant(' completed.')}" -match("MESSAGE#165:00007:59", "nwparser.payload", "The current session synchronization by device %{fld2->} completed.", processor_chain([ +var part264 = match("MESSAGE#165:00007:59", "nwparser.payload", "The current session synchronization by device %{fld2->} completed.", processor_chain([ dup1, dup2, dup3, @@ -4680,8 +4147,7 @@ match("MESSAGE#165:00007:59", "nwparser.payload", "The current session synchroni var msg167 = msg("00007:59", part264); -var part265 = // "Pattern{Constant('Run Time Object mirror group '), Field(group,true), Constant(' direction was set to '), Field(direction,false)}" -match("MESSAGE#166:00007:60", "nwparser.payload", "Run Time Object mirror group %{group->} direction was set to %{direction}", processor_chain([ +var part265 = match("MESSAGE#166:00007:60", "nwparser.payload", "Run Time Object mirror group %{group->} direction was set to %{direction}", processor_chain([ dup1, dup2, dup3, @@ -4691,8 +4157,7 @@ match("MESSAGE#166:00007:60", "nwparser.payload", "Run Time Object mirror group var msg168 = msg("00007:60", part265); -var part266 = // "Pattern{Constant('Run Time Object mirror group '), Field(group,true), Constant(' was set.')}" -match("MESSAGE#167:00007:61", "nwparser.payload", "Run Time Object mirror group %{group->} was set.", processor_chain([ +var part266 = match("MESSAGE#167:00007:61", "nwparser.payload", "Run Time Object mirror group %{group->} was set.", processor_chain([ dup1, dup2, dup3, @@ -4702,8 +4167,7 @@ match("MESSAGE#167:00007:61", "nwparser.payload", "Run Time Object mirror group var msg169 = msg("00007:61", part266); -var part267 = // "Pattern{Constant('Run Time Object mirror group '), Field(group,true), Constant(' with direction '), Field(direction,true), Constant(' was unset.')}" -match("MESSAGE#168:00007:62", "nwparser.payload", "Run Time Object mirror group %{group->} with direction %{direction->} was unset.", processor_chain([ +var part267 = match("MESSAGE#168:00007:62", "nwparser.payload", "Run Time Object mirror group %{group->} with direction %{direction->} was unset.", processor_chain([ dup1, dup2, dup3, @@ -4713,8 +4177,7 @@ match("MESSAGE#168:00007:62", "nwparser.payload", "Run Time Object mirror group var msg170 = msg("00007:62", part267); -var part268 = // "Pattern{Constant('RTO mirror group '), Field(group,true), Constant(' was unset.')}" -match("MESSAGE#169:00007:63", "nwparser.payload", "RTO mirror group %{group->} was unset.", processor_chain([ +var part268 = match("MESSAGE#169:00007:63", "nwparser.payload", "RTO mirror group %{group->} was unset.", processor_chain([ dup1, dup2, dup3, @@ -4724,17 +4187,15 @@ match("MESSAGE#169:00007:63", "nwparser.payload", "RTO mirror group %{group->} w var msg171 = msg("00007:63", part268); -var part269 = // "Pattern{Constant(''), Field(fld2,true), Constant(' was removed from the monitoring list '), Field(p0,false)}" -match("MESSAGE#170:00007:64/1", "nwparser.p0", "%{fld2->} was removed from the monitoring list %{p0}"); +var part269 = match("MESSAGE#170:00007:64/1", "nwparser.p0", "%{fld2->} was removed from the monitoring list %{p0}"); -var part270 = // "Pattern{Constant(''), Field(fld3,false)}" -match("MESSAGE#170:00007:64/3", "nwparser.p0", "%{fld3}"); +var part270 = match("MESSAGE#170:00007:64/3", "nwparser.p0", "%{fld3}"); var all53 = all_match({ processors: [ - dup350, + dup348, part269, - dup351, + dup349, part270, ], on_success: processor_chain([ @@ -4748,33 +4209,28 @@ var all53 = all_match({ var msg172 = msg("00007:64", all53); -var part271 = // "Pattern{Constant(''), Field(fld2,true), Constant(' with weight '), Field(fld3,true), Constant(' was added'), Field(p0,false)}" -match("MESSAGE#171:00007:65/1", "nwparser.p0", "%{fld2->} with weight %{fld3->} was added%{p0}"); +var part271 = match("MESSAGE#171:00007:65/1", "nwparser.p0", "%{fld2->} with weight %{fld3->} was added%{p0}"); -var part272 = // "Pattern{Constant(' to or updated on '), Field(p0,false)}" -match("MESSAGE#171:00007:65/2_0", "nwparser.p0", " to or updated on %{p0}"); +var part272 = match("MESSAGE#171:00007:65/2_0", "nwparser.p0", " to or updated on %{p0}"); -var part273 = // "Pattern{Constant('/updated to '), Field(p0,false)}" -match("MESSAGE#171:00007:65/2_1", "nwparser.p0", "/updated to %{p0}"); +var part273 = match("MESSAGE#171:00007:65/2_1", "nwparser.p0", "/updated to %{p0}"); var select58 = linear_select([ part272, part273, ]); -var part274 = // "Pattern{Constant('the monitoring list '), Field(p0,false)}" -match("MESSAGE#171:00007:65/3", "nwparser.p0", "the monitoring list %{p0}"); +var part274 = match("MESSAGE#171:00007:65/3", "nwparser.p0", "the monitoring list %{p0}"); -var part275 = // "Pattern{Constant(''), Field(fld4,false)}" -match("MESSAGE#171:00007:65/5", "nwparser.p0", "%{fld4}"); +var part275 = match("MESSAGE#171:00007:65/5", "nwparser.p0", "%{fld4}"); var all54 = all_match({ processors: [ - dup350, + dup348, part271, select58, part274, - dup351, + dup349, part275, ], on_success: processor_chain([ @@ -4788,22 +4244,18 @@ var all54 = all_match({ var msg173 = msg("00007:65", all54); -var part276 = // "Pattern{Constant('The monitoring '), Field(p0,false)}" -match("MESSAGE#172:00007:66/0_0", "nwparser.payload", "The monitoring %{p0}"); +var part276 = match("MESSAGE#172:00007:66/0_0", "nwparser.payload", "The monitoring %{p0}"); -var part277 = // "Pattern{Constant('Monitoring '), Field(p0,false)}" -match("MESSAGE#172:00007:66/0_1", "nwparser.payload", "Monitoring %{p0}"); +var part277 = match("MESSAGE#172:00007:66/0_1", "nwparser.payload", "Monitoring %{p0}"); var select59 = linear_select([ part276, part277, ]); -var part278 = // "Pattern{Constant('threshold was modified to '), Field(trigger_val,true), Constant(' o'), Field(p0,false)}" -match("MESSAGE#172:00007:66/1", "nwparser.p0", "threshold was modified to %{trigger_val->} o%{p0}"); +var part278 = match("MESSAGE#172:00007:66/1", "nwparser.p0", "threshold was modified to %{trigger_val->} o%{p0}"); -var part279 = // "Pattern{Constant('f '), Field(p0,false)}" -match("MESSAGE#172:00007:66/2_0", "nwparser.p0", "f %{p0}"); +var part279 = match("MESSAGE#172:00007:66/2_0", "nwparser.p0", "f %{p0}"); var select60 = linear_select([ part279, @@ -4828,8 +4280,7 @@ var all55 = all_match({ var msg174 = msg("00007:66", all55); -var part280 = // "Pattern{Constant('NSRP data forwarding '), Field(disposition,false), Constant('.')}" -match("MESSAGE#173:00007:67", "nwparser.payload", "NSRP data forwarding %{disposition}.", processor_chain([ +var part280 = match("MESSAGE#173:00007:67", "nwparser.payload", "NSRP data forwarding %{disposition}.", processor_chain([ dup1, dup2, dup3, @@ -4839,28 +4290,22 @@ match("MESSAGE#173:00007:67", "nwparser.payload", "NSRP data forwarding %{dispos var msg175 = msg("00007:67", part280); -var part281 = // "Pattern{Constant('NSRP b'), Field(p0,false)}" -match("MESSAGE#174:00007:68/0", "nwparser.payload", "NSRP b%{p0}"); +var part281 = match("MESSAGE#174:00007:68/0", "nwparser.payload", "NSRP b%{p0}"); -var part282 = // "Pattern{Constant('lack '), Field(p0,false)}" -match("MESSAGE#174:00007:68/1_0", "nwparser.p0", "lack %{p0}"); +var part282 = match("MESSAGE#174:00007:68/1_0", "nwparser.p0", "lack %{p0}"); -var part283 = // "Pattern{Constant('ack '), Field(p0,false)}" -match("MESSAGE#174:00007:68/1_1", "nwparser.p0", "ack %{p0}"); +var part283 = match("MESSAGE#174:00007:68/1_1", "nwparser.p0", "ack %{p0}"); var select61 = linear_select([ part282, part283, ]); -var part284 = // "Pattern{Constant('hole prevention '), Field(disposition,false), Constant('. Master(s) of Virtual Security Device groups '), Field(p0,false)}" -match("MESSAGE#174:00007:68/2", "nwparser.p0", "hole prevention %{disposition}. Master(s) of Virtual Security Device groups %{p0}"); +var part284 = match("MESSAGE#174:00007:68/2", "nwparser.p0", "hole prevention %{disposition}. Master(s) of Virtual Security Device groups %{p0}"); -var part285 = // "Pattern{Constant('may not exist '), Field(p0,false)}" -match("MESSAGE#174:00007:68/3_0", "nwparser.p0", "may not exist %{p0}"); +var part285 = match("MESSAGE#174:00007:68/3_0", "nwparser.p0", "may not exist %{p0}"); -var part286 = // "Pattern{Constant('always exists '), Field(p0,false)}" -match("MESSAGE#174:00007:68/3_1", "nwparser.p0", "always exists %{p0}"); +var part286 = match("MESSAGE#174:00007:68/3_1", "nwparser.p0", "always exists %{p0}"); var select62 = linear_select([ part285, @@ -4886,8 +4331,7 @@ var all56 = all_match({ var msg176 = msg("00007:68", all56); -var part287 = // "Pattern{Constant('NSRP Run Time Object synchronization between devices was '), Field(disposition,false)}" -match("MESSAGE#175:00007:69", "nwparser.payload", "NSRP Run Time Object synchronization between devices was %{disposition}", processor_chain([ +var part287 = match("MESSAGE#175:00007:69", "nwparser.payload", "NSRP Run Time Object synchronization between devices was %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -4897,8 +4341,7 @@ match("MESSAGE#175:00007:69", "nwparser.payload", "NSRP Run Time Object synchron var msg177 = msg("00007:69", part287); -var part288 = // "Pattern{Constant('The NSRP encryption key was changed.'), Field(,false)}" -match("MESSAGE#176:00007:70", "nwparser.payload", "The NSRP encryption key was changed.%{}", processor_chain([ +var part288 = match("MESSAGE#176:00007:70", "nwparser.payload", "The NSRP encryption key was changed.%{}", processor_chain([ dup1, dup2, dup3, @@ -4908,8 +4351,7 @@ match("MESSAGE#176:00007:70", "nwparser.payload", "The NSRP encryption key was c var msg178 = msg("00007:70", part288); -var part289 = // "Pattern{Constant('NSRP transparent Active-Active mode was '), Field(disposition,false), Constant('.')}" -match("MESSAGE#177:00007:71", "nwparser.payload", "NSRP transparent Active-Active mode was %{disposition}.", processor_chain([ +var part289 = match("MESSAGE#177:00007:71", "nwparser.payload", "NSRP transparent Active-Active mode was %{disposition}.", processor_chain([ dup1, dup2, dup3, @@ -4919,8 +4361,7 @@ match("MESSAGE#177:00007:71", "nwparser.payload", "NSRP transparent Active-Activ var msg179 = msg("00007:71", part289); -var part290 = // "Pattern{Constant('NSRP: nsrp link probe enable on '), Field(interface,false)}" -match("MESSAGE#178:00007:72", "nwparser.payload", "NSRP: nsrp link probe enable on %{interface}", processor_chain([ +var part290 = match("MESSAGE#178:00007:72", "nwparser.payload", "NSRP: nsrp link probe enable on %{interface}", processor_chain([ dup1, dup2, dup3, @@ -5005,8 +4446,7 @@ var select63 = linear_select([ msg180, ]); -var part291 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#179:00008", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part291 = match("MESSAGE#179:00008", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -5018,10 +4458,9 @@ match("MESSAGE#179:00008", "nwparser.payload", "%{signame->} has been detected! var msg181 = msg("00008", part291); -var msg182 = msg("00008:01", dup343); +var msg182 = msg("00008:01", dup341); -var part292 = // "Pattern{Constant('NTP settings have been changed'), Field(,false)}" -match("MESSAGE#181:00008:02", "nwparser.payload", "NTP settings have been changed%{}", processor_chain([ +var part292 = match("MESSAGE#181:00008:02", "nwparser.payload", "NTP settings have been changed%{}", processor_chain([ dup1, dup2, dup3, @@ -5031,8 +4470,7 @@ match("MESSAGE#181:00008:02", "nwparser.payload", "NTP settings have been change var msg183 = msg("00008:02", part292); -var part293 = // "Pattern{Constant('The system clock has been updated through NTP'), Field(,false)}" -match("MESSAGE#182:00008:03", "nwparser.payload", "The system clock has been updated through NTP%{}", processor_chain([ +var part293 = match("MESSAGE#182:00008:03", "nwparser.payload", "The system clock has been updated through NTP%{}", processor_chain([ dup1, dup2, dup3, @@ -5042,17 +4480,13 @@ match("MESSAGE#182:00008:03", "nwparser.payload", "The system clock has been upd var msg184 = msg("00008:03", part293); -var part294 = // "Pattern{Constant('System clock '), Field(p0,false)}" -match("MESSAGE#183:00008:04/0", "nwparser.payload", "System clock %{p0}"); +var part294 = match("MESSAGE#183:00008:04/0", "nwparser.payload", "System clock %{p0}"); -var part295 = // "Pattern{Constant('configurations have been'), Field(p0,false)}" -match("MESSAGE#183:00008:04/1_0", "nwparser.p0", "configurations have been%{p0}"); +var part295 = match("MESSAGE#183:00008:04/1_0", "nwparser.p0", "configurations have been%{p0}"); -var part296 = // "Pattern{Constant('was'), Field(p0,false)}" -match("MESSAGE#183:00008:04/1_1", "nwparser.p0", "was%{p0}"); +var part296 = match("MESSAGE#183:00008:04/1_1", "nwparser.p0", "was%{p0}"); -var part297 = // "Pattern{Constant('is'), Field(p0,false)}" -match("MESSAGE#183:00008:04/1_2", "nwparser.p0", "is%{p0}"); +var part297 = match("MESSAGE#183:00008:04/1_2", "nwparser.p0", "is%{p0}"); var select64 = linear_select([ part295, @@ -5060,23 +4494,17 @@ var select64 = linear_select([ part297, ]); -var part298 = // "Pattern{Field(,false), Constant('changed'), Field(p0,false)}" -match("MESSAGE#183:00008:04/2", "nwparser.p0", "%{}changed%{p0}"); +var part298 = match("MESSAGE#183:00008:04/2", "nwparser.p0", "%{}changed%{p0}"); -var part299 = // "Pattern{Constant(' by admin '), Field(administrator,false)}" -match("MESSAGE#183:00008:04/3_0", "nwparser.p0", " by admin %{administrator}"); +var part299 = match("MESSAGE#183:00008:04/3_0", "nwparser.p0", " by admin %{administrator}"); -var part300 = // "Pattern{Constant(' by '), Field(username,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#183:00008:04/3_1", "nwparser.p0", " by %{username->} (%{fld1})"); +var part300 = match("MESSAGE#183:00008:04/3_1", "nwparser.p0", " by %{username->} (%{fld1})"); -var part301 = // "Pattern{Constant(' by '), Field(username,false)}" -match("MESSAGE#183:00008:04/3_2", "nwparser.p0", " by %{username}"); +var part301 = match("MESSAGE#183:00008:04/3_2", "nwparser.p0", " by %{username}"); -var part302 = // "Pattern{Constant(' manually.'), Field(,false)}" -match("MESSAGE#183:00008:04/3_3", "nwparser.p0", " manually.%{}"); +var part302 = match("MESSAGE#183:00008:04/3_3", "nwparser.p0", " manually.%{}"); -var part303 = // "Pattern{Constant(' manually'), Field(,false)}" -match("MESSAGE#183:00008:04/3_4", "nwparser.p0", " manually%{}"); +var part303 = match("MESSAGE#183:00008:04/3_4", "nwparser.p0", " manually%{}"); var select65 = linear_select([ part299, @@ -5106,8 +4534,7 @@ var all57 = all_match({ var msg185 = msg("00008:04", all57); -var part304 = // "Pattern{Constant('failed to get clock through NTP'), Field(,false)}" -match("MESSAGE#184:00008:05", "nwparser.payload", "failed to get clock through NTP%{}", processor_chain([ +var part304 = match("MESSAGE#184:00008:05", "nwparser.payload", "failed to get clock through NTP%{}", processor_chain([ dup117, dup2, dup3, @@ -5117,8 +4544,7 @@ match("MESSAGE#184:00008:05", "nwparser.payload", "failed to get clock through N var msg186 = msg("00008:05", part304); -var part305 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#185:00008:06", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part305 = match("MESSAGE#185:00008:06", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -5130,8 +4556,7 @@ match("MESSAGE#185:00008:06", "nwparser.payload", "%{signame->} has been detecte var msg187 = msg("00008:06", part305); -var part306 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#186:00008:07", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part306 = match("MESSAGE#186:00008:07", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -5143,8 +4568,7 @@ match("MESSAGE#186:00008:07", "nwparser.payload", "%{signame->} has been detecte var msg188 = msg("00008:07", part306); -var part307 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#187:00008:08", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ +var part307 = match("MESSAGE#187:00008:08", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ dup58, dup2, dup3, @@ -5156,8 +4580,7 @@ match("MESSAGE#187:00008:08", "nwparser.payload", "%{signame->} From %{saddr->} var msg189 = msg("00008:08", part307); -var part308 = // "Pattern{Constant('system clock is changed manually'), Field(,false)}" -match("MESSAGE#188:00008:09", "nwparser.payload", "system clock is changed manually%{}", processor_chain([ +var part308 = match("MESSAGE#188:00008:09", "nwparser.payload", "system clock is changed manually%{}", processor_chain([ dup1, dup2, dup3, @@ -5167,13 +4590,12 @@ match("MESSAGE#188:00008:09", "nwparser.payload", "system clock is changed manua var msg190 = msg("00008:09", part308); -var part309 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,false), Constant('(zone '), Field(p0,false)}" -match("MESSAGE#189:00008:10/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol}(zone %{p0}"); +var part309 = match("MESSAGE#189:00008:10/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol}(zone %{p0}"); var all58 = all_match({ processors: [ part309, - dup340, + dup338, dup67, ], on_success: processor_chain([ @@ -5204,8 +4626,7 @@ var select66 = linear_select([ msg191, ]); -var part310 = // "Pattern{Constant('802.1Q VLAN trunking for the interface '), Field(interface,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#190:00009", "nwparser.payload", "802.1Q VLAN trunking for the interface %{interface->} has been %{disposition}", processor_chain([ +var part310 = match("MESSAGE#190:00009", "nwparser.payload", "802.1Q VLAN trunking for the interface %{interface->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5215,8 +4636,7 @@ match("MESSAGE#190:00009", "nwparser.payload", "802.1Q VLAN trunking for the int var msg192 = msg("00009", part310); -var part311 = // "Pattern{Constant('802.1Q VLAN tag '), Field(fld1,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#191:00009:01", "nwparser.payload", "802.1Q VLAN tag %{fld1->} has been %{disposition}", processor_chain([ +var part311 = match("MESSAGE#191:00009:01", "nwparser.payload", "802.1Q VLAN tag %{fld1->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5226,8 +4646,7 @@ match("MESSAGE#191:00009:01", "nwparser.payload", "802.1Q VLAN tag %{fld1->} has var msg193 = msg("00009:01", part311); -var part312 = // "Pattern{Constant('DHCP on the interface '), Field(interface,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#192:00009:02", "nwparser.payload", "DHCP on the interface %{interface->} has been %{disposition}", processor_chain([ +var part312 = match("MESSAGE#192:00009:02", "nwparser.payload", "DHCP on the interface %{interface->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5237,8 +4656,7 @@ match("MESSAGE#192:00009:02", "nwparser.payload", "DHCP on the interface %{inter var msg194 = msg("00009:02", part312); -var part313 = // "Pattern{Field(change_attribute,true), Constant(' for interface '), Field(interface,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#193:00009:03", "nwparser.payload", "%{change_attribute->} for interface %{interface->} has been changed from %{change_old->} to %{change_new}", processor_chain([ +var part313 = match("MESSAGE#193:00009:03", "nwparser.payload", "%{change_attribute->} for interface %{interface->} has been changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -5248,8 +4666,7 @@ match("MESSAGE#193:00009:03", "nwparser.payload", "%{change_attribute->} for int var msg195 = msg("00009:03", part313); -var part314 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#194:00009:05", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part314 = match("MESSAGE#194:00009:05", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -5261,11 +4678,9 @@ match("MESSAGE#194:00009:05", "nwparser.payload", "%{signame->} has been detecte var msg196 = msg("00009:05", part314); -var part315 = // "Pattern{Field(fld2,false), Constant(': The 802.1Q tag '), Field(p0,false)}" -match("MESSAGE#195:00009:06/0_0", "nwparser.payload", "%{fld2}: The 802.1Q tag %{p0}"); +var part315 = match("MESSAGE#195:00009:06/0_0", "nwparser.payload", "%{fld2}: The 802.1Q tag %{p0}"); -var part316 = // "Pattern{Constant('The 802.1Q tag '), Field(p0,false)}" -match("MESSAGE#195:00009:06/0_1", "nwparser.payload", "The 802.1Q tag %{p0}"); +var part316 = match("MESSAGE#195:00009:06/0_1", "nwparser.payload", "The 802.1Q tag %{p0}"); var select67 = linear_select([ part315, @@ -5277,22 +4692,18 @@ var select68 = linear_select([ dup16, ]); -var part317 = // "Pattern{Constant('interface '), Field(interface,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#195:00009:06/3", "nwparser.p0", "interface %{interface->} has been %{p0}"); +var part317 = match("MESSAGE#195:00009:06/3", "nwparser.p0", "interface %{interface->} has been %{p0}"); -var part318 = // "Pattern{Constant('changed to '), Field(p0,false)}" -match("MESSAGE#195:00009:06/4_1", "nwparser.p0", "changed to %{p0}"); +var part318 = match("MESSAGE#195:00009:06/4_1", "nwparser.p0", "changed to %{p0}"); var select69 = linear_select([ dup120, part318, ]); -var part319 = // "Pattern{Field(info,true), Constant(' from host '), Field(saddr,false)}" -match("MESSAGE#195:00009:06/6_0", "nwparser.p0", "%{info->} from host %{saddr}"); +var part319 = match("MESSAGE#195:00009:06/6_0", "nwparser.p0", "%{info->} from host %{saddr}"); -var part320 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#195:00009:06/6_1", "nwparser.p0", "info"); +var part320 = match_copy("MESSAGE#195:00009:06/6_1", "nwparser.p0", "info"); var select70 = linear_select([ part319, @@ -5320,30 +4731,25 @@ var all59 = all_match({ var msg197 = msg("00009:06", all59); -var part321 = // "Pattern{Constant('Maximum bandwidth '), Field(fld2,true), Constant(' on '), Field(p0,false)}" -match("MESSAGE#196:00009:07/0", "nwparser.payload", "Maximum bandwidth %{fld2->} on %{p0}"); +var part321 = match("MESSAGE#196:00009:07/0", "nwparser.payload", "Maximum bandwidth %{fld2->} on %{p0}"); -var part322 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' is less than t'), Field(p0,false)}" -match("MESSAGE#196:00009:07/2", "nwparser.p0", "%{} %{interface->} is less than t%{p0}"); +var part322 = match("MESSAGE#196:00009:07/2", "nwparser.p0", "%{} %{interface->} is less than t%{p0}"); -var part323 = // "Pattern{Constant('he total '), Field(p0,false)}" -match("MESSAGE#196:00009:07/3_0", "nwparser.p0", "he total %{p0}"); +var part323 = match("MESSAGE#196:00009:07/3_0", "nwparser.p0", "he total %{p0}"); -var part324 = // "Pattern{Constant('otal '), Field(p0,false)}" -match("MESSAGE#196:00009:07/3_1", "nwparser.p0", "otal %{p0}"); +var part324 = match("MESSAGE#196:00009:07/3_1", "nwparser.p0", "otal %{p0}"); var select71 = linear_select([ part323, part324, ]); -var part325 = // "Pattern{Constant('guaranteed bandwidth '), Field(fld3,false)}" -match("MESSAGE#196:00009:07/4", "nwparser.p0", "guaranteed bandwidth %{fld3}"); +var part325 = match("MESSAGE#196:00009:07/4", "nwparser.p0", "guaranteed bandwidth %{fld3}"); var all60 = all_match({ processors: [ part321, - dup339, + dup337, part322, select71, part325, @@ -5359,8 +4765,7 @@ var all60 = all_match({ var msg198 = msg("00009:07", all60); -var part326 = // "Pattern{Constant('The configured bandwidth setting on the interface '), Field(interface,true), Constant(' has been changed to '), Field(fld2,false)}" -match("MESSAGE#197:00009:09", "nwparser.payload", "The configured bandwidth setting on the interface %{interface->} has been changed to %{fld2}", processor_chain([ +var part326 = match("MESSAGE#197:00009:09", "nwparser.payload", "The configured bandwidth setting on the interface %{interface->} has been changed to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -5370,14 +4775,11 @@ match("MESSAGE#197:00009:09", "nwparser.payload", "The configured bandwidth sett var msg199 = msg("00009:09", part326); -var part327 = // "Pattern{Constant('The operational mode for the interface '), Field(interface,true), Constant(' has been changed to '), Field(p0,false)}" -match("MESSAGE#198:00009:10/0", "nwparser.payload", "The operational mode for the interface %{interface->} has been changed to %{p0}"); +var part327 = match("MESSAGE#198:00009:10/0", "nwparser.payload", "The operational mode for the interface %{interface->} has been changed to %{p0}"); -var part328 = // "Pattern{Constant('Route'), Field(,false)}" -match("MESSAGE#198:00009:10/1_0", "nwparser.p0", "Route%{}"); +var part328 = match("MESSAGE#198:00009:10/1_0", "nwparser.p0", "Route%{}"); -var part329 = // "Pattern{Constant('NAT'), Field(,false)}" -match("MESSAGE#198:00009:10/1_1", "nwparser.p0", "NAT%{}"); +var part329 = match("MESSAGE#198:00009:10/1_1", "nwparser.p0", "NAT%{}"); var select72 = linear_select([ part328, @@ -5400,19 +4802,16 @@ var all61 = all_match({ var msg200 = msg("00009:10", all61); -var part330 = // "Pattern{Field(fld1,false), Constant(': VLAN '), Field(p0,false)}" -match("MESSAGE#199:00009:11/0_0", "nwparser.payload", "%{fld1}: VLAN %{p0}"); +var part330 = match("MESSAGE#199:00009:11/0_0", "nwparser.payload", "%{fld1}: VLAN %{p0}"); -var part331 = // "Pattern{Constant('VLAN '), Field(p0,false)}" -match("MESSAGE#199:00009:11/0_1", "nwparser.payload", "VLAN %{p0}"); +var part331 = match("MESSAGE#199:00009:11/0_1", "nwparser.payload", "VLAN %{p0}"); var select73 = linear_select([ part330, part331, ]); -var part332 = // "Pattern{Constant('tag '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#199:00009:11/1", "nwparser.p0", "tag %{fld2->} has been %{disposition}"); +var part332 = match("MESSAGE#199:00009:11/1", "nwparser.p0", "tag %{fld2->} has been %{disposition}"); var all62 = all_match({ processors: [ @@ -5430,8 +4829,7 @@ var all62 = all_match({ var msg201 = msg("00009:11", all62); -var part333 = // "Pattern{Constant('DHCP client has been '), Field(disposition,true), Constant(' on interface '), Field(interface,false)}" -match("MESSAGE#200:00009:12", "nwparser.payload", "DHCP client has been %{disposition->} on interface %{interface}", processor_chain([ +var part333 = match("MESSAGE#200:00009:12", "nwparser.payload", "DHCP client has been %{disposition->} on interface %{interface}", processor_chain([ dup1, dup2, dup3, @@ -5441,8 +4839,7 @@ match("MESSAGE#200:00009:12", "nwparser.payload", "DHCP client has been %{dispos var msg202 = msg("00009:12", part333); -var part334 = // "Pattern{Constant('DHCP relay agent settings on '), Field(interface,true), Constant(' have been '), Field(disposition,false)}" -match("MESSAGE#201:00009:13", "nwparser.payload", "DHCP relay agent settings on %{interface->} have been %{disposition}", processor_chain([ +var part334 = match("MESSAGE#201:00009:13", "nwparser.payload", "DHCP relay agent settings on %{interface->} have been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5452,14 +4849,11 @@ match("MESSAGE#201:00009:13", "nwparser.payload", "DHCP relay agent settings on var msg203 = msg("00009:13", part334); -var part335 = // "Pattern{Constant('Global-PRO has been '), Field(p0,false)}" -match("MESSAGE#202:00009:14/0_0", "nwparser.payload", "Global-PRO has been %{p0}"); +var part335 = match("MESSAGE#202:00009:14/0_0", "nwparser.payload", "Global-PRO has been %{p0}"); -var part336 = // "Pattern{Constant('Global PRO has been '), Field(p0,false)}" -match("MESSAGE#202:00009:14/0_1", "nwparser.payload", "Global PRO has been %{p0}"); +var part336 = match("MESSAGE#202:00009:14/0_1", "nwparser.payload", "Global PRO has been %{p0}"); -var part337 = // "Pattern{Constant('DNS proxy was '), Field(p0,false)}" -match("MESSAGE#202:00009:14/0_2", "nwparser.payload", "DNS proxy was %{p0}"); +var part337 = match("MESSAGE#202:00009:14/0_2", "nwparser.payload", "DNS proxy was %{p0}"); var select74 = linear_select([ part335, @@ -5467,16 +4861,14 @@ var select74 = linear_select([ part337, ]); -var part338 = // "Pattern{Constant(''), Field(disposition,true), Constant(' on '), Field(p0,false)}" -match("MESSAGE#202:00009:14/1", "nwparser.p0", "%{disposition->} on %{p0}"); +var part338 = match("MESSAGE#202:00009:14/1", "nwparser.p0", "%{disposition->} on %{p0}"); var select75 = linear_select([ dup122, dup123, ]); -var part339 = // "Pattern{Field(interface,true), Constant(' ('), Field(fld2,false), Constant(')')}" -match("MESSAGE#202:00009:14/4_0", "nwparser.p0", "%{interface->} (%{fld2})"); +var part339 = match("MESSAGE#202:00009:14/4_0", "nwparser.p0", "%{interface->} (%{fld2})"); var select76 = linear_select([ part339, @@ -5502,11 +4894,9 @@ var all63 = all_match({ var msg204 = msg("00009:14", all63); -var part340 = // "Pattern{Constant('Route between secondary IP'), Field(p0,false)}" -match("MESSAGE#203:00009:15/0", "nwparser.payload", "Route between secondary IP%{p0}"); +var part340 = match("MESSAGE#203:00009:15/0", "nwparser.payload", "Route between secondary IP%{p0}"); -var part341 = // "Pattern{Constant(' addresses '), Field(p0,false)}" -match("MESSAGE#203:00009:15/1_0", "nwparser.p0", " addresses %{p0}"); +var part341 = match("MESSAGE#203:00009:15/1_0", "nwparser.p0", " addresses %{p0}"); var select77 = linear_select([ part341, @@ -5518,7 +4908,7 @@ var all64 = all_match({ part340, select77, dup126, - dup352, + dup350, dup128, ], on_success: processor_chain([ @@ -5532,11 +4922,9 @@ var all64 = all_match({ var msg205 = msg("00009:15", all64); -var part342 = // "Pattern{Constant('Secondary IP address '), Field(hostip,false), Constant('/'), Field(mask,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#204:00009:16/0", "nwparser.payload", "Secondary IP address %{hostip}/%{mask->} %{p0}"); +var part342 = match("MESSAGE#204:00009:16/0", "nwparser.payload", "Secondary IP address %{hostip}/%{mask->} %{p0}"); -var part343 = // "Pattern{Constant('deleted from '), Field(p0,false)}" -match("MESSAGE#204:00009:16/3_2", "nwparser.p0", "deleted from %{p0}"); +var part343 = match("MESSAGE#204:00009:16/3_2", "nwparser.p0", "deleted from %{p0}"); var select78 = linear_select([ dup129, @@ -5544,13 +4932,12 @@ var select78 = linear_select([ part343, ]); -var part344 = // "Pattern{Constant('interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#204:00009:16/4", "nwparser.p0", "interface %{interface}."); +var part344 = match("MESSAGE#204:00009:16/4", "nwparser.p0", "interface %{interface}."); var all65 = all_match({ processors: [ part342, - dup352, + dup350, dup23, select78, part344, @@ -5566,22 +4953,18 @@ var all65 = all_match({ var msg206 = msg("00009:16", all65); -var part345 = // "Pattern{Constant('Secondary IP address '), Field(p0,false)}" -match("MESSAGE#205:00009:17/0", "nwparser.payload", "Secondary IP address %{p0}"); +var part345 = match("MESSAGE#205:00009:17/0", "nwparser.payload", "Secondary IP address %{p0}"); -var part346 = // "Pattern{Field(hostip,false), Constant('/'), Field(mask,true), Constant(' was added to interface '), Field(p0,false)}" -match("MESSAGE#205:00009:17/1_0", "nwparser.p0", "%{hostip}/%{mask->} was added to interface %{p0}"); +var part346 = match("MESSAGE#205:00009:17/1_0", "nwparser.p0", "%{hostip}/%{mask->} was added to interface %{p0}"); -var part347 = // "Pattern{Field(hostip,true), Constant(' was added to interface '), Field(p0,false)}" -match("MESSAGE#205:00009:17/1_1", "nwparser.p0", "%{hostip->} was added to interface %{p0}"); +var part347 = match("MESSAGE#205:00009:17/1_1", "nwparser.p0", "%{hostip->} was added to interface %{p0}"); var select79 = linear_select([ part346, part347, ]); -var part348 = // "Pattern{Field(interface,false), Constant('.')}" -match("MESSAGE#205:00009:17/2", "nwparser.p0", "%{interface}."); +var part348 = match("MESSAGE#205:00009:17/2", "nwparser.p0", "%{interface}."); var all66 = all_match({ processors: [ @@ -5600,8 +4983,7 @@ var all66 = all_match({ var msg207 = msg("00009:17", all66); -var part349 = // "Pattern{Constant('The configured bandwidth on the interface '), Field(interface,true), Constant(' has been changed to '), Field(fld2,false)}" -match("MESSAGE#206:00009:18", "nwparser.payload", "The configured bandwidth on the interface %{interface->} has been changed to %{fld2}", processor_chain([ +var part349 = match("MESSAGE#206:00009:18", "nwparser.payload", "The configured bandwidth on the interface %{interface->} has been changed to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -5611,8 +4993,7 @@ match("MESSAGE#206:00009:18", "nwparser.payload", "The configured bandwidth on t var msg208 = msg("00009:18", part349); -var part350 = // "Pattern{Constant('interface '), Field(interface,true), Constant(' with IP '), Field(hostip,true), Constant(' '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#207:00009:19", "nwparser.payload", "interface %{interface->} with IP %{hostip->} %{fld2->} has been %{disposition}", processor_chain([ +var part350 = match("MESSAGE#207:00009:19", "nwparser.payload", "interface %{interface->} with IP %{hostip->} %{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5622,8 +5003,7 @@ match("MESSAGE#207:00009:19", "nwparser.payload", "interface %{interface->} with var msg209 = msg("00009:19", part350); -var part351 = // "Pattern{Constant('interface '), Field(interface,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#208:00009:27", "nwparser.payload", "interface %{interface->} has been %{disposition}", processor_chain([ +var part351 = match("MESSAGE#208:00009:27", "nwparser.payload", "interface %{interface->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5633,31 +5013,24 @@ match("MESSAGE#208:00009:27", "nwparser.payload", "interface %{interface->} has var msg210 = msg("00009:27", part351); -var part352 = // "Pattern{Field(fld2,false), Constant(': '), Field(service,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#209:00009:20/0_0", "nwparser.payload", "%{fld2}: %{service->} has been %{p0}"); +var part352 = match("MESSAGE#209:00009:20/0_0", "nwparser.payload", "%{fld2}: %{service->} has been %{p0}"); -var part353 = // "Pattern{Field(service,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#209:00009:20/0_1", "nwparser.payload", "%{service->} has been %{p0}"); +var part353 = match("MESSAGE#209:00009:20/0_1", "nwparser.payload", "%{service->} has been %{p0}"); var select80 = linear_select([ part352, part353, ]); -var part354 = // "Pattern{Field(disposition,true), Constant(' on interface '), Field(interface,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#209:00009:20/1", "nwparser.p0", "%{disposition->} on interface %{interface->} %{p0}"); +var part354 = match("MESSAGE#209:00009:20/1", "nwparser.p0", "%{disposition->} on interface %{interface->} %{p0}"); -var part355 = // "Pattern{Constant('by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false)}" -match("MESSAGE#209:00009:20/2_0", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}"); +var part355 = match("MESSAGE#209:00009:20/2_0", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}"); -var part356 = // "Pattern{Constant('by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#209:00009:20/2_1", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr}:%{sport}"); +var part356 = match("MESSAGE#209:00009:20/2_1", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr}:%{sport}"); -var part357 = // "Pattern{Constant('by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false)}" -match("MESSAGE#209:00009:20/2_2", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr}"); +var part357 = match("MESSAGE#209:00009:20/2_2", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr}"); -var part358 = // "Pattern{Constant('from host '), Field(saddr,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#209:00009:20/2_3", "nwparser.p0", "from host %{saddr->} (%{fld1})"); +var part358 = match("MESSAGE#209:00009:20/2_3", "nwparser.p0", "from host %{saddr->} (%{fld1})"); var select81 = linear_select([ part355, @@ -5684,13 +5057,12 @@ var all67 = all_match({ var msg211 = msg("00009:20", all67); -var part359 = // "Pattern{Constant('Source Route IP option! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#210:00009:21/0", "nwparser.payload", "Source Route IP option! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); +var part359 = match("MESSAGE#210:00009:21/0", "nwparser.payload", "Source Route IP option! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); var all68 = all_match({ processors: [ part359, - dup345, + dup343, dup131, ], on_success: processor_chain([ @@ -5707,8 +5079,7 @@ var all68 = all_match({ var msg212 = msg("00009:21", all68); -var part360 = // "Pattern{Constant('MTU for interface '), Field(interface,true), Constant(' has been changed to '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#211:00009:22", "nwparser.payload", "MTU for interface %{interface->} has been changed to %{fld2->} (%{fld1})", processor_chain([ +var part360 = match("MESSAGE#211:00009:22", "nwparser.payload", "MTU for interface %{interface->} has been changed to %{fld2->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -5719,8 +5090,7 @@ match("MESSAGE#211:00009:22", "nwparser.payload", "MTU for interface %{interface var msg213 = msg("00009:22", part360); -var part361 = // "Pattern{Constant('Secondary IP address '), Field(hostip,true), Constant(' has been added to interface '), Field(interface,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#212:00009:23", "nwparser.payload", "Secondary IP address %{hostip->} has been added to interface %{interface->} (%{fld1})", processor_chain([ +var part361 = match("MESSAGE#212:00009:23", "nwparser.payload", "Secondary IP address %{hostip->} has been added to interface %{interface->} (%{fld1})", processor_chain([ dup44, dup2, dup9, @@ -5731,22 +5101,18 @@ match("MESSAGE#212:00009:23", "nwparser.payload", "Secondary IP address %{hostip var msg214 = msg("00009:23", part361); -var part362 = // "Pattern{Constant('Web has been enabled on interface '), Field(interface,true), Constant(' by admin '), Field(administrator,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#213:00009:24/0", "nwparser.payload", "Web has been enabled on interface %{interface->} by admin %{administrator->} via %{p0}"); +var part362 = match("MESSAGE#213:00009:24/0", "nwparser.payload", "Web has been enabled on interface %{interface->} by admin %{administrator->} via %{p0}"); -var part363 = // "Pattern{Field(logon_type,true), Constant(' '), Field(space,false), Constant('('), Field(p0,false)}" -match("MESSAGE#213:00009:24/1_0", "nwparser.p0", "%{logon_type->} %{space}(%{p0}"); +var part363 = match("MESSAGE#213:00009:24/1_0", "nwparser.p0", "%{logon_type->} %{space}(%{p0}"); -var part364 = // "Pattern{Field(logon_type,false), Constant('. ('), Field(p0,false)}" -match("MESSAGE#213:00009:24/1_1", "nwparser.p0", "%{logon_type}. (%{p0}"); +var part364 = match("MESSAGE#213:00009:24/1_1", "nwparser.p0", "%{logon_type}. (%{p0}"); var select82 = linear_select([ part363, part364, ]); -var part365 = // "Pattern{Constant(')'), Field(fld1,false)}" -match("MESSAGE#213:00009:24/2", "nwparser.p0", ")%{fld1}"); +var part365 = match("MESSAGE#213:00009:24/2", "nwparser.p0", ")%{fld1}"); var all69 = all_match({ processors: [ @@ -5766,8 +5132,7 @@ var all69 = all_match({ var msg215 = msg("00009:24", all69); -var part366 = // "Pattern{Constant('Web has been enabled on interface '), Field(interface,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#214:00009:25", "nwparser.payload", "Web has been enabled on interface %{interface->} by %{username->} via %{logon_type}. (%{fld1})", processor_chain([ +var part366 = match("MESSAGE#214:00009:25", "nwparser.payload", "Web has been enabled on interface %{interface->} by %{username->} via %{logon_type}. (%{fld1})", processor_chain([ dup1, dup2, dup9, @@ -5778,13 +5143,12 @@ match("MESSAGE#214:00009:25", "nwparser.payload", "Web has been enabled on inter var msg216 = msg("00009:25", part366); -var part367 = // "Pattern{Field(protocol,true), Constant(' has been '), Field(disposition,true), Constant(' on interface '), Field(interface,true), Constant(' by '), Field(username,true), Constant(' via NSRP Peer . '), Field(p0,false)}" -match("MESSAGE#215:00009:26/0", "nwparser.payload", "%{protocol->} has been %{disposition->} on interface %{interface->} by %{username->} via NSRP Peer . %{p0}"); +var part367 = match("MESSAGE#215:00009:26/0", "nwparser.payload", "%{protocol->} has been %{disposition->} on interface %{interface->} by %{username->} via NSRP Peer . %{p0}"); var all70 = all_match({ processors: [ part367, - dup335, + dup333, ], on_success: processor_chain([ dup1, @@ -5827,28 +5191,22 @@ var select83 = linear_select([ msg217, ]); -var part368 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#216:00010/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} %{p0}"); +var part368 = match("MESSAGE#216:00010/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} %{p0}"); -var part369 = // "Pattern{Constant('using protocol '), Field(p0,false)}" -match("MESSAGE#216:00010/1_0", "nwparser.p0", "using protocol %{p0}"); +var part369 = match("MESSAGE#216:00010/1_0", "nwparser.p0", "using protocol %{p0}"); -var part370 = // "Pattern{Constant('proto '), Field(p0,false)}" -match("MESSAGE#216:00010/1_1", "nwparser.p0", "proto %{p0}"); +var part370 = match("MESSAGE#216:00010/1_1", "nwparser.p0", "proto %{p0}"); var select84 = linear_select([ part369, part370, ]); -var part371 = // "Pattern{Constant(''), Field(protocol,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#216:00010/2", "nwparser.p0", "%{protocol->} %{p0}"); +var part371 = match("MESSAGE#216:00010/2", "nwparser.p0", "%{protocol->} %{p0}"); -var part372 = // "Pattern{Constant('( zone '), Field(zone,false), Constant(', int '), Field(interface,false), Constant(') '), Field(p0,false)}" -match("MESSAGE#216:00010/3_0", "nwparser.p0", "( zone %{zone}, int %{interface}) %{p0}"); +var part372 = match("MESSAGE#216:00010/3_0", "nwparser.p0", "( zone %{zone}, int %{interface}) %{p0}"); -var part373 = // "Pattern{Constant('zone '), Field(zone,true), Constant(' int '), Field(interface,false), Constant(') '), Field(p0,false)}" -match("MESSAGE#216:00010/3_1", "nwparser.p0", "zone %{zone->} int %{interface}) %{p0}"); +var part373 = match("MESSAGE#216:00010/3_1", "nwparser.p0", "zone %{zone->} int %{interface}) %{p0}"); var select85 = linear_select([ part372, @@ -5856,8 +5214,7 @@ var select85 = linear_select([ dup126, ]); -var part374 = // "Pattern{Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times'), Field(p0,false)}" -match("MESSAGE#216:00010/4", "nwparser.p0", ".%{space}The attack occurred %{dclass_counter1->} times%{p0}"); +var part374 = match("MESSAGE#216:00010/4", "nwparser.p0", ".%{space}The attack occurred %{dclass_counter1->} times%{p0}"); var all71 = all_match({ processors: [ @@ -5866,7 +5223,7 @@ var all71 = all_match({ part371, select85, part374, - dup353, + dup351, ], on_success: processor_chain([ dup58, @@ -5882,8 +5239,7 @@ var all71 = all_match({ var msg218 = msg("00010", all71); -var part375 = // "Pattern{Constant('MIP '), Field(hostip,false), Constant('/'), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#217:00010:01", "nwparser.payload", "MIP %{hostip}/%{fld2->} has been %{disposition}", processor_chain([ +var part375 = match("MESSAGE#217:00010:01", "nwparser.payload", "MIP %{hostip}/%{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5893,8 +5249,7 @@ match("MESSAGE#217:00010:01", "nwparser.payload", "MIP %{hostip}/%{fld2->} has b var msg219 = msg("00010:01", part375); -var part376 = // "Pattern{Constant('Mapped IP '), Field(hostip,true), Constant(' '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#218:00010:02", "nwparser.payload", "Mapped IP %{hostip->} %{fld2->} has been %{disposition}", processor_chain([ +var part376 = match("MESSAGE#218:00010:02", "nwparser.payload", "Mapped IP %{hostip->} %{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -5907,7 +5262,7 @@ var msg220 = msg("00010:02", part376); var all72 = all_match({ processors: [ dup132, - dup345, + dup343, dup83, ], on_success: processor_chain([ @@ -5931,8 +5286,7 @@ var select86 = linear_select([ msg221, ]); -var part377 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#220:00011", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part377 = match("MESSAGE#220:00011", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -5944,16 +5298,14 @@ match("MESSAGE#220:00011", "nwparser.payload", "%{signame->} From %{saddr}:%{spo var msg222 = msg("00011", part377); -var part378 = // "Pattern{Constant('Route to '), Field(daddr,false), Constant('/'), Field(fld2,true), Constant(' [ '), Field(p0,false)}" -match("MESSAGE#221:00011:01/0", "nwparser.payload", "Route to %{daddr}/%{fld2->} [ %{p0}"); +var part378 = match("MESSAGE#221:00011:01/0", "nwparser.payload", "Route to %{daddr}/%{fld2->} [ %{p0}"); var select87 = linear_select([ dup57, dup56, ]); -var part379 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' gateway '), Field(fld3,true), Constant(' ] has been '), Field(disposition,false)}" -match("MESSAGE#221:00011:01/2", "nwparser.p0", "%{} %{interface->} gateway %{fld3->} ] has been %{disposition}"); +var part379 = match("MESSAGE#221:00011:01/2", "nwparser.p0", "%{} %{interface->} gateway %{fld3->} ] has been %{disposition}"); var all73 = all_match({ processors: [ @@ -5972,8 +5324,7 @@ var all73 = all_match({ var msg223 = msg("00011:01", all73); -var part380 = // "Pattern{Field(signame,true), Constant(' from '), Field(saddr,true), Constant(' to '), Field(daddr,true), Constant(' protocol '), Field(protocol,true), Constant(' ('), Field(fld2,false), Constant(')')}" -match("MESSAGE#222:00011:02", "nwparser.payload", "%{signame->} from %{saddr->} to %{daddr->} protocol %{protocol->} (%{fld2})", processor_chain([ +var part380 = match("MESSAGE#222:00011:02", "nwparser.payload", "%{signame->} from %{saddr->} to %{daddr->} protocol %{protocol->} (%{fld2})", processor_chain([ dup58, dup2, dup3, @@ -5983,28 +5334,22 @@ match("MESSAGE#222:00011:02", "nwparser.payload", "%{signame->} from %{saddr->} var msg224 = msg("00011:02", part380); -var part381 = // "Pattern{Constant('An '), Field(p0,false)}" -match("MESSAGE#223:00011:03/0", "nwparser.payload", "An %{p0}"); +var part381 = match("MESSAGE#223:00011:03/0", "nwparser.payload", "An %{p0}"); -var part382 = // "Pattern{Constant('import '), Field(p0,false)}" -match("MESSAGE#223:00011:03/1_0", "nwparser.p0", "import %{p0}"); +var part382 = match("MESSAGE#223:00011:03/1_0", "nwparser.p0", "import %{p0}"); -var part383 = // "Pattern{Constant('export '), Field(p0,false)}" -match("MESSAGE#223:00011:03/1_1", "nwparser.p0", "export %{p0}"); +var part383 = match("MESSAGE#223:00011:03/1_1", "nwparser.p0", "export %{p0}"); var select88 = linear_select([ part382, part383, ]); -var part384 = // "Pattern{Constant('rule in virtual router '), Field(node,true), Constant(' to virtual router '), Field(fld4,true), Constant(' with '), Field(p0,false)}" -match("MESSAGE#223:00011:03/2", "nwparser.p0", "rule in virtual router %{node->} to virtual router %{fld4->} with %{p0}"); +var part384 = match("MESSAGE#223:00011:03/2", "nwparser.p0", "rule in virtual router %{node->} to virtual router %{fld4->} with %{p0}"); -var part385 = // "Pattern{Constant('route-map '), Field(fld3,true), Constant(' and protocol '), Field(protocol,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#223:00011:03/3_0", "nwparser.p0", "route-map %{fld3->} and protocol %{protocol->} has been %{p0}"); +var part385 = match("MESSAGE#223:00011:03/3_0", "nwparser.p0", "route-map %{fld3->} and protocol %{protocol->} has been %{p0}"); -var part386 = // "Pattern{Constant('IP-prefix '), Field(hostip,false), Constant('/'), Field(interface,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#223:00011:03/3_1", "nwparser.p0", "IP-prefix %{hostip}/%{interface->} has been %{p0}"); +var part386 = match("MESSAGE#223:00011:03/3_1", "nwparser.p0", "IP-prefix %{hostip}/%{interface->} has been %{p0}"); var select89 = linear_select([ part385, @@ -6030,16 +5375,14 @@ var all74 = all_match({ var msg225 = msg("00011:03", all74); -var part387 = // "Pattern{Constant('A route in virtual router '), Field(node,true), Constant(' that has IP address '), Field(hostip,false), Constant('/'), Field(fld2,true), Constant(' through '), Field(p0,false)}" -match("MESSAGE#224:00011:04/0", "nwparser.payload", "A route in virtual router %{node->} that has IP address %{hostip}/%{fld2->} through %{p0}"); +var part387 = match("MESSAGE#224:00011:04/0", "nwparser.payload", "A route in virtual router %{node->} that has IP address %{hostip}/%{fld2->} through %{p0}"); -var part388 = // "Pattern{Constant(''), Field(interface,true), Constant(' and gateway '), Field(fld3,true), Constant(' with metric '), Field(fld4,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#224:00011:04/2", "nwparser.p0", "%{interface->} and gateway %{fld3->} with metric %{fld4->} has been %{disposition}"); +var part388 = match("MESSAGE#224:00011:04/2", "nwparser.p0", "%{interface->} and gateway %{fld3->} with metric %{fld4->} has been %{disposition}"); var all75 = all_match({ processors: [ part387, - dup354, + dup352, part388, ], on_success: processor_chain([ @@ -6053,19 +5396,16 @@ var all75 = all_match({ var msg226 = msg("00011:04", all75); -var part389 = // "Pattern{Constant('sharable virtual router using name'), Field(p0,false)}" -match("MESSAGE#225:00011:05/1_0", "nwparser.p0", "sharable virtual router using name%{p0}"); +var part389 = match("MESSAGE#225:00011:05/1_0", "nwparser.p0", "sharable virtual router using name%{p0}"); -var part390 = // "Pattern{Constant('virtual router with name'), Field(p0,false)}" -match("MESSAGE#225:00011:05/1_1", "nwparser.p0", "virtual router with name%{p0}"); +var part390 = match("MESSAGE#225:00011:05/1_1", "nwparser.p0", "virtual router with name%{p0}"); var select90 = linear_select([ part389, part390, ]); -var part391 = // "Pattern{Field(,true), Constant(' '), Field(node,true), Constant(' and id '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#225:00011:05/2", "nwparser.p0", "%{} %{node->} and id %{fld2->} has been %{disposition}"); +var part391 = match("MESSAGE#225:00011:05/2", "nwparser.p0", "%{} %{node->} and id %{fld2->} has been %{disposition}"); var all76 = all_match({ processors: [ @@ -6084,8 +5424,7 @@ var all76 = all_match({ var msg227 = msg("00011:05", all76); -var part392 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#226:00011:07", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part392 = match("MESSAGE#226:00011:07", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup4, @@ -6097,8 +5436,7 @@ match("MESSAGE#226:00011:07", "nwparser.payload", "%{signame->} From %{saddr->} var msg228 = msg("00011:07", part392); -var part393 = // "Pattern{Constant('Route(s) in virtual router '), Field(node,true), Constant(' with an IP address '), Field(hostip,true), Constant(' and gateway '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#227:00011:08", "nwparser.payload", "Route(s) in virtual router %{node->} with an IP address %{hostip->} and gateway %{fld2->} has been %{disposition}", processor_chain([ +var part393 = match("MESSAGE#227:00011:08", "nwparser.payload", "Route(s) in virtual router %{node->} with an IP address %{hostip->} and gateway %{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6108,8 +5446,7 @@ match("MESSAGE#227:00011:08", "nwparser.payload", "Route(s) in virtual router %{ var msg229 = msg("00011:08", part393); -var part394 = // "Pattern{Constant('The auto-route-export feature in virtual router '), Field(node,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#228:00011:09", "nwparser.payload", "The auto-route-export feature in virtual router %{node->} has been %{disposition}", processor_chain([ +var part394 = match("MESSAGE#228:00011:09", "nwparser.payload", "The auto-route-export feature in virtual router %{node->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6119,8 +5456,7 @@ match("MESSAGE#228:00011:09", "nwparser.payload", "The auto-route-export feature var msg230 = msg("00011:09", part394); -var part395 = // "Pattern{Constant('The maximum number of routes that can be created in virtual router '), Field(node,true), Constant(' is '), Field(fld2,false)}" -match("MESSAGE#229:00011:10", "nwparser.payload", "The maximum number of routes that can be created in virtual router %{node->} is %{fld2}", processor_chain([ +var part395 = match("MESSAGE#229:00011:10", "nwparser.payload", "The maximum number of routes that can be created in virtual router %{node->} is %{fld2}", processor_chain([ dup44, dup2, dup3, @@ -6130,8 +5466,7 @@ match("MESSAGE#229:00011:10", "nwparser.payload", "The maximum number of routes var msg231 = msg("00011:10", part395); -var part396 = // "Pattern{Constant('The maximum routes limit in virtual router '), Field(node,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#230:00011:11", "nwparser.payload", "The maximum routes limit in virtual router %{node->} has been %{disposition}", processor_chain([ +var part396 = match("MESSAGE#230:00011:11", "nwparser.payload", "The maximum routes limit in virtual router %{node->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6141,8 +5476,7 @@ match("MESSAGE#230:00011:11", "nwparser.payload", "The maximum routes limit in v var msg232 = msg("00011:11", part396); -var part397 = // "Pattern{Constant('The router-id of virtual router '), Field(node,true), Constant(' used by OSPF BGP routing instances id has been uninitialized')}" -match("MESSAGE#231:00011:12", "nwparser.payload", "The router-id of virtual router %{node->} used by OSPF BGP routing instances id has been uninitialized", processor_chain([ +var part397 = match("MESSAGE#231:00011:12", "nwparser.payload", "The router-id of virtual router %{node->} used by OSPF BGP routing instances id has been uninitialized", processor_chain([ dup1, dup2, dup3, @@ -6152,8 +5486,7 @@ match("MESSAGE#231:00011:12", "nwparser.payload", "The router-id of virtual rout var msg233 = msg("00011:12", part397); -var part398 = // "Pattern{Constant('The router-id that can be used by OSPF BGP routing instances in virtual router '), Field(node,true), Constant(' has been set to '), Field(fld2,false)}" -match("MESSAGE#232:00011:13", "nwparser.payload", "The router-id that can be used by OSPF BGP routing instances in virtual router %{node->} has been set to %{fld2}", processor_chain([ +var part398 = match("MESSAGE#232:00011:13", "nwparser.payload", "The router-id that can be used by OSPF BGP routing instances in virtual router %{node->} has been set to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -6163,11 +5496,9 @@ match("MESSAGE#232:00011:13", "nwparser.payload", "The router-id that can be use var msg234 = msg("00011:13", part398); -var part399 = // "Pattern{Constant('The routing preference for protocol '), Field(protocol,true), Constant(' in virtual router '), Field(node,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#233:00011:14/0", "nwparser.payload", "The routing preference for protocol %{protocol->} in virtual router %{node->} has been %{p0}"); +var part399 = match("MESSAGE#233:00011:14/0", "nwparser.payload", "The routing preference for protocol %{protocol->} in virtual router %{node->} has been %{p0}"); -var part400 = // "Pattern{Constant('reset'), Field(,false)}" -match("MESSAGE#233:00011:14/1_1", "nwparser.p0", "reset%{}"); +var part400 = match("MESSAGE#233:00011:14/1_1", "nwparser.p0", "reset%{}"); var select91 = linear_select([ dup134, @@ -6190,8 +5521,7 @@ var all77 = all_match({ var msg235 = msg("00011:14", all77); -var part401 = // "Pattern{Constant('The system default-route in virtual router '), Field(node,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#234:00011:15", "nwparser.payload", "The system default-route in virtual router %{node->} has been %{disposition}", processor_chain([ +var part401 = match("MESSAGE#234:00011:15", "nwparser.payload", "The system default-route in virtual router %{node->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6201,8 +5531,7 @@ match("MESSAGE#234:00011:15", "nwparser.payload", "The system default-route in v var msg236 = msg("00011:15", part401); -var part402 = // "Pattern{Constant('The system default-route through virtual router '), Field(node,true), Constant(' has been added in virtual router '), Field(fld2,false)}" -match("MESSAGE#235:00011:16", "nwparser.payload", "The system default-route through virtual router %{node->} has been added in virtual router %{fld2}", processor_chain([ +var part402 = match("MESSAGE#235:00011:16", "nwparser.payload", "The system default-route through virtual router %{node->} has been added in virtual router %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -6212,17 +5541,13 @@ match("MESSAGE#235:00011:16", "nwparser.payload", "The system default-route thro var msg237 = msg("00011:16", part402); -var part403 = // "Pattern{Constant('The virtual router '), Field(node,true), Constant(' has been made '), Field(p0,false)}" -match("MESSAGE#236:00011:17/0", "nwparser.payload", "The virtual router %{node->} has been made %{p0}"); +var part403 = match("MESSAGE#236:00011:17/0", "nwparser.payload", "The virtual router %{node->} has been made %{p0}"); -var part404 = // "Pattern{Constant('sharable'), Field(,false)}" -match("MESSAGE#236:00011:17/1_0", "nwparser.p0", "sharable%{}"); +var part404 = match("MESSAGE#236:00011:17/1_0", "nwparser.p0", "sharable%{}"); -var part405 = // "Pattern{Constant('unsharable'), Field(,false)}" -match("MESSAGE#236:00011:17/1_1", "nwparser.p0", "unsharable%{}"); +var part405 = match("MESSAGE#236:00011:17/1_1", "nwparser.p0", "unsharable%{}"); -var part406 = // "Pattern{Constant('default virtual router for virtual system '), Field(fld2,false)}" -match("MESSAGE#236:00011:17/1_2", "nwparser.p0", "default virtual router for virtual system %{fld2}"); +var part406 = match("MESSAGE#236:00011:17/1_2", "nwparser.p0", "default virtual router for virtual system %{fld2}"); var select92 = linear_select([ part404, @@ -6246,44 +5571,36 @@ var all78 = all_match({ var msg238 = msg("00011:17", all78); -var part407 = // "Pattern{Constant('Source route(s) '), Field(p0,false)}" -match("MESSAGE#237:00011:18/0_0", "nwparser.payload", "Source route(s) %{p0}"); +var part407 = match("MESSAGE#237:00011:18/0_0", "nwparser.payload", "Source route(s) %{p0}"); -var part408 = // "Pattern{Constant('A source route '), Field(p0,false)}" -match("MESSAGE#237:00011:18/0_1", "nwparser.payload", "A source route %{p0}"); +var part408 = match("MESSAGE#237:00011:18/0_1", "nwparser.payload", "A source route %{p0}"); var select93 = linear_select([ part407, part408, ]); -var part409 = // "Pattern{Constant('in virtual router '), Field(node,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#237:00011:18/1", "nwparser.p0", "in virtual router %{node->} %{p0}"); +var part409 = match("MESSAGE#237:00011:18/1", "nwparser.p0", "in virtual router %{node->} %{p0}"); -var part410 = // "Pattern{Constant('with route addresses of '), Field(p0,false)}" -match("MESSAGE#237:00011:18/2_0", "nwparser.p0", "with route addresses of %{p0}"); +var part410 = match("MESSAGE#237:00011:18/2_0", "nwparser.p0", "with route addresses of %{p0}"); -var part411 = // "Pattern{Constant('that has IP address '), Field(p0,false)}" -match("MESSAGE#237:00011:18/2_1", "nwparser.p0", "that has IP address %{p0}"); +var part411 = match("MESSAGE#237:00011:18/2_1", "nwparser.p0", "that has IP address %{p0}"); var select94 = linear_select([ part410, part411, ]); -var part412 = // "Pattern{Constant(''), Field(hostip,false), Constant('/'), Field(fld2,true), Constant(' through interface '), Field(interface,true), Constant(' and '), Field(p0,false)}" -match("MESSAGE#237:00011:18/3", "nwparser.p0", "%{hostip}/%{fld2->} through interface %{interface->} and %{p0}"); +var part412 = match("MESSAGE#237:00011:18/3", "nwparser.p0", "%{hostip}/%{fld2->} through interface %{interface->} and %{p0}"); -var part413 = // "Pattern{Constant('a default gateway address '), Field(p0,false)}" -match("MESSAGE#237:00011:18/4_0", "nwparser.p0", "a default gateway address %{p0}"); +var part413 = match("MESSAGE#237:00011:18/4_0", "nwparser.p0", "a default gateway address %{p0}"); var select95 = linear_select([ part413, dup135, ]); -var part414 = // "Pattern{Constant(''), Field(fld3,true), Constant(' with metric '), Field(fld4,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#237:00011:18/5", "nwparser.p0", "%{fld3->} with metric %{fld4->} %{p0}"); +var part414 = match("MESSAGE#237:00011:18/5", "nwparser.p0", "%{fld3->} with metric %{fld4->} %{p0}"); var all79 = all_match({ processors: [ @@ -6293,7 +5610,7 @@ var all79 = all_match({ part412, select95, part414, - dup352, + dup350, dup128, ], on_success: processor_chain([ @@ -6307,36 +5624,29 @@ var all79 = all_match({ var msg239 = msg("00011:18", all79); -var part415 = // "Pattern{Constant('Source Route(s) in virtual router '), Field(node,true), Constant(' with '), Field(p0,false)}" -match("MESSAGE#238:00011:19/0", "nwparser.payload", "Source Route(s) in virtual router %{node->} with %{p0}"); +var part415 = match("MESSAGE#238:00011:19/0", "nwparser.payload", "Source Route(s) in virtual router %{node->} with %{p0}"); -var part416 = // "Pattern{Constant('route addresses of '), Field(p0,false)}" -match("MESSAGE#238:00011:19/1_0", "nwparser.p0", "route addresses of %{p0}"); +var part416 = match("MESSAGE#238:00011:19/1_0", "nwparser.p0", "route addresses of %{p0}"); -var part417 = // "Pattern{Constant('an IP address '), Field(p0,false)}" -match("MESSAGE#238:00011:19/1_1", "nwparser.p0", "an IP address %{p0}"); +var part417 = match("MESSAGE#238:00011:19/1_1", "nwparser.p0", "an IP address %{p0}"); var select96 = linear_select([ part416, part417, ]); -var part418 = // "Pattern{Constant(''), Field(hostip,false), Constant('/'), Field(fld3,true), Constant(' and '), Field(p0,false)}" -match("MESSAGE#238:00011:19/2", "nwparser.p0", "%{hostip}/%{fld3->} and %{p0}"); +var part418 = match("MESSAGE#238:00011:19/2", "nwparser.p0", "%{hostip}/%{fld3->} and %{p0}"); -var part419 = // "Pattern{Constant('a default gateway address of '), Field(p0,false)}" -match("MESSAGE#238:00011:19/3_0", "nwparser.p0", "a default gateway address of %{p0}"); +var part419 = match("MESSAGE#238:00011:19/3_0", "nwparser.p0", "a default gateway address of %{p0}"); var select97 = linear_select([ part419, dup135, ]); -var part420 = // "Pattern{Constant(''), Field(fld4,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#238:00011:19/4", "nwparser.p0", "%{fld4->} %{p0}"); +var part420 = match("MESSAGE#238:00011:19/4", "nwparser.p0", "%{fld4->} %{p0}"); -var part421 = // "Pattern{Constant('has been'), Field(p0,false)}" -match("MESSAGE#238:00011:19/5_1", "nwparser.p0", "has been%{p0}"); +var part421 = match("MESSAGE#238:00011:19/5_1", "nwparser.p0", "has been%{p0}"); var select98 = linear_select([ dup107, @@ -6364,16 +5674,14 @@ var all80 = all_match({ var msg240 = msg("00011:19", all80); -var part422 = // "Pattern{Field(fld2,false), Constant(': A '), Field(p0,false)}" -match("MESSAGE#239:00011:20/0_0", "nwparser.payload", "%{fld2}: A %{p0}"); +var part422 = match("MESSAGE#239:00011:20/0_0", "nwparser.payload", "%{fld2}: A %{p0}"); var select99 = linear_select([ part422, dup79, ]); -var part423 = // "Pattern{Constant('route has been created in virtual router "'), Field(node,false), Constant('"'), Field(space,false), Constant('with an IP address '), Field(hostip,true), Constant(' and next-hop as virtual router "'), Field(fld3,false), Constant('"')}" -match("MESSAGE#239:00011:20/1", "nwparser.p0", "route has been created in virtual router \"%{node}\"%{space}with an IP address %{hostip->} and next-hop as virtual router \"%{fld3}\""); +var part423 = match("MESSAGE#239:00011:20/1", "nwparser.p0", "route has been created in virtual router \"%{node}\"%{space}with an IP address %{hostip->} and next-hop as virtual router \"%{fld3}\""); var all81 = all_match({ processors: [ @@ -6391,8 +5699,7 @@ var all81 = all_match({ var msg241 = msg("00011:20", all81); -var part424 = // "Pattern{Constant('SIBR route(s) in virtual router '), Field(node,true), Constant(' for interface '), Field(interface,true), Constant(' with an IP address '), Field(hostip,true), Constant(' and gateway '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#240:00011:21", "nwparser.payload", "SIBR route(s) in virtual router %{node->} for interface %{interface->} with an IP address %{hostip->} and gateway %{fld2->} has been %{disposition}", processor_chain([ +var part424 = match("MESSAGE#240:00011:21", "nwparser.payload", "SIBR route(s) in virtual router %{node->} for interface %{interface->} with an IP address %{hostip->} and gateway %{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6402,8 +5709,7 @@ match("MESSAGE#240:00011:21", "nwparser.payload", "SIBR route(s) in virtual rout var msg242 = msg("00011:21", part424); -var part425 = // "Pattern{Constant('SIBR route in virtual router '), Field(node,true), Constant(' for interface '), Field(interface,true), Constant(' that has IP address '), Field(hostip,true), Constant(' through interface '), Field(fld3,true), Constant(' and gateway '), Field(fld4,true), Constant(' with metric '), Field(fld5,true), Constant(' was '), Field(disposition,false)}" -match("MESSAGE#241:00011:22", "nwparser.payload", "SIBR route in virtual router %{node->} for interface %{interface->} that has IP address %{hostip->} through interface %{fld3->} and gateway %{fld4->} with metric %{fld5->} was %{disposition}", processor_chain([ +var part425 = match("MESSAGE#241:00011:22", "nwparser.payload", "SIBR route in virtual router %{node->} for interface %{interface->} that has IP address %{hostip->} through interface %{fld3->} and gateway %{fld4->} with metric %{fld5->} was %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6416,7 +5722,7 @@ var msg243 = msg("00011:22", part425); var all82 = all_match({ processors: [ dup132, - dup345, + dup343, dup131, ], on_success: processor_chain([ @@ -6441,8 +5747,7 @@ var all82 = all_match({ var msg244 = msg("00011:23", all82); -var part426 = // "Pattern{Constant('Route in virtual router "'), Field(node,false), Constant('" that has IP address '), Field(hostip,true), Constant(' through interface '), Field(interface,true), Constant(' and gateway '), Field(fld2,true), Constant(' with metric '), Field(fld3,true), Constant(' '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#243:00011:24", "nwparser.payload", "Route in virtual router \"%{node}\" that has IP address %{hostip->} through interface %{interface->} and gateway %{fld2->} with metric %{fld3->} %{disposition}. (%{fld1})", processor_chain([ +var part426 = match("MESSAGE#243:00011:24", "nwparser.payload", "Route in virtual router \"%{node}\" that has IP address %{hostip->} through interface %{interface->} and gateway %{fld2->} with metric %{fld3->} %{disposition}. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -6453,8 +5758,7 @@ match("MESSAGE#243:00011:24", "nwparser.payload", "Route in virtual router \"%{n var msg245 = msg("00011:24", part426); -var part427 = // "Pattern{Constant('Route(s) in virtual router "'), Field(node,false), Constant('" with an IP address '), Field(hostip,false), Constant('/'), Field(fld2,true), Constant(' and gateway '), Field(fld3,true), Constant(' '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#244:00011:25", "nwparser.payload", "Route(s) in virtual router \"%{node}\" with an IP address %{hostip}/%{fld2->} and gateway %{fld3->} %{disposition}. (%{fld1})", processor_chain([ +var part427 = match("MESSAGE#244:00011:25", "nwparser.payload", "Route(s) in virtual router \"%{node}\" with an IP address %{hostip}/%{fld2->} and gateway %{fld3->} %{disposition}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -6465,8 +5769,7 @@ match("MESSAGE#244:00011:25", "nwparser.payload", "Route(s) in virtual router \" var msg246 = msg("00011:25", part427); -var part428 = // "Pattern{Constant('Route in virtual router "'), Field(node,false), Constant('" with IP address '), Field(hostip,false), Constant('/'), Field(fld2,true), Constant(' and next-hop as virtual router "'), Field(fld3,false), Constant('" created. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#245:00011:26", "nwparser.payload", "Route in virtual router \"%{node}\" with IP address %{hostip}/%{fld2->} and next-hop as virtual router \"%{fld3}\" created. (%{fld1})", processor_chain([ +var part428 = match("MESSAGE#245:00011:26", "nwparser.payload", "Route in virtual router \"%{node}\" with IP address %{hostip}/%{fld2->} and next-hop as virtual router \"%{fld3}\" created. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -6506,8 +5809,7 @@ var select100 = linear_select([ msg247, ]); -var part429 = // "Pattern{Constant('Service group '), Field(group,true), Constant(' comments have been '), Field(disposition,false)}" -match("MESSAGE#246:00012:02", "nwparser.payload", "Service group %{group->} comments have been %{disposition}", processor_chain([ +var part429 = match("MESSAGE#246:00012:02", "nwparser.payload", "Service group %{group->} comments have been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6517,8 +5819,7 @@ match("MESSAGE#246:00012:02", "nwparser.payload", "Service group %{group->} comm var msg248 = msg("00012:02", part429); -var part430 = // "Pattern{Constant('Service group '), Field(change_old,true), Constant(' '), Field(change_attribute,true), Constant(' has been changed to '), Field(change_new,false)}" -match("MESSAGE#247:00012:03", "nwparser.payload", "Service group %{change_old->} %{change_attribute->} has been changed to %{change_new}", processor_chain([ +var part430 = match("MESSAGE#247:00012:03", "nwparser.payload", "Service group %{change_old->} %{change_attribute->} has been changed to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -6528,8 +5829,7 @@ match("MESSAGE#247:00012:03", "nwparser.payload", "Service group %{change_old->} var msg249 = msg("00012:03", part430); -var part431 = // "Pattern{Field(fld2,true), Constant(' Service group '), Field(group,true), Constant(' has '), Field(disposition,true), Constant(' member '), Field(username,true), Constant(' from host '), Field(saddr,false)}" -match("MESSAGE#248:00012:04", "nwparser.payload", "%{fld2->} Service group %{group->} has %{disposition->} member %{username->} from host %{saddr}", processor_chain([ +var part431 = match("MESSAGE#248:00012:04", "nwparser.payload", "%{fld2->} Service group %{group->} has %{disposition->} member %{username->} from host %{saddr}", processor_chain([ dup1, dup2, dup3, @@ -6539,8 +5839,7 @@ match("MESSAGE#248:00012:04", "nwparser.payload", "%{fld2->} Service group %{gro var msg250 = msg("00012:04", part431); -var part432 = // "Pattern{Field(signame,true), Constant(' from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' protocol '), Field(protocol,true), Constant(' ('), Field(fld2,false), Constant(') ('), Field(fld3,false), Constant(')')}" -match("MESSAGE#249:00012:05", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{fld2}) (%{fld3})", processor_chain([ +var part432 = match("MESSAGE#249:00012:05", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{fld2}) (%{fld3})", processor_chain([ dup58, dup2, dup3, @@ -6551,8 +5850,7 @@ match("MESSAGE#249:00012:05", "nwparser.payload", "%{signame->} from %{saddr}/%{ var msg251 = msg("00012:05", part432); -var part433 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#250:00012:06", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part433 = match("MESSAGE#250:00012:06", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -6564,8 +5862,7 @@ match("MESSAGE#250:00012:06", "nwparser.payload", "%{signame->} has been detecte var msg252 = msg("00012:06", part433); -var part434 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#251:00012:07", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part434 = match("MESSAGE#251:00012:07", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -6577,8 +5874,7 @@ match("MESSAGE#251:00012:07", "nwparser.payload", "%{signame->} has been detecte var msg253 = msg("00012:07", part434); -var part435 = // "Pattern{Field(fld2,false), Constant(': Service '), Field(service,true), Constant(' has been '), Field(disposition,true), Constant(' from host '), Field(saddr,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#252:00012:08", "nwparser.payload", "%{fld2}: Service %{service->} has been %{disposition->} from host %{saddr->} (%{fld1})", processor_chain([ +var part435 = match("MESSAGE#252:00012:08", "nwparser.payload", "%{fld2}: Service %{service->} has been %{disposition->} from host %{saddr->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -6592,7 +5888,7 @@ var msg254 = msg("00012:08", part435); var all83 = all_match({ processors: [ dup80, - dup345, + dup343, dup83, ], on_success: processor_chain([ @@ -6612,7 +5908,7 @@ var msg255 = msg("00012:09", all83); var all84 = all_match({ processors: [ dup132, - dup345, + dup343, dup83, ], on_success: processor_chain([ @@ -6629,8 +5925,7 @@ var all84 = all_match({ var msg256 = msg("00012:10", all84); -var part436 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.The attack occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#255:00012:11", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part436 = match("MESSAGE#255:00012:11", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup3, @@ -6643,8 +5938,7 @@ match("MESSAGE#255:00012:11", "nwparser.payload", "%{signame->} From %{saddr}:%{ var msg257 = msg("00012:11", part436); -var part437 = // "Pattern{Field(signame,true), Constant(' from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' protocol '), Field(protocol,true), Constant(' ('), Field(zone,false), Constant(') '), Field(info,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#256:00012:12", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{zone}) %{info->} (%{fld1})", processor_chain([ +var part437 = match("MESSAGE#256:00012:12", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{zone}) %{info->} (%{fld1})", processor_chain([ dup58, dup2, dup3, @@ -6655,8 +5949,7 @@ match("MESSAGE#256:00012:12", "nwparser.payload", "%{signame->} from %{saddr}/%{ var msg258 = msg("00012:12", part437); -var part438 = // "Pattern{Constant('Service group '), Field(group,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#257:00012", "nwparser.payload", "Service group %{group->} has been %{disposition}", processor_chain([ +var part438 = match("MESSAGE#257:00012", "nwparser.payload", "Service group %{group->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6666,8 +5959,7 @@ match("MESSAGE#257:00012", "nwparser.payload", "Service group %{group->} has bee var msg259 = msg("00012", part438); -var part439 = // "Pattern{Constant('Service '), Field(service,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#258:00012:01", "nwparser.payload", "Service %{service->} has been %{disposition}", processor_chain([ +var part439 = match("MESSAGE#258:00012:01", "nwparser.payload", "Service %{service->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -6693,8 +5985,7 @@ var select101 = linear_select([ msg260, ]); -var part440 = // "Pattern{Constant('Global Manager error in decoding bytes has been detected'), Field(,false)}" -match("MESSAGE#259:00013", "nwparser.payload", "Global Manager error in decoding bytes has been detected%{}", processor_chain([ +var part440 = match("MESSAGE#259:00013", "nwparser.payload", "Global Manager error in decoding bytes has been detected%{}", processor_chain([ dup86, dup2, dup3, @@ -6704,8 +5995,7 @@ match("MESSAGE#259:00013", "nwparser.payload", "Global Manager error in decoding var msg261 = msg("00013", part440); -var part441 = // "Pattern{Constant('Intruder has attempted to connect to the NetScreen-Global Manager port! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' at interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#260:00013:01", "nwparser.payload", "Intruder has attempted to connect to the NetScreen-Global Manager port! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part441 = match("MESSAGE#260:00013:01", "nwparser.payload", "Intruder has attempted to connect to the NetScreen-Global Manager port! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -6718,8 +6008,7 @@ match("MESSAGE#260:00013:01", "nwparser.payload", "Intruder has attempted to con var msg262 = msg("00013:01", part441); -var part442 = // "Pattern{Constant('URL Filtering '), Field(fld2,true), Constant(' has been changed to '), Field(fld3,false)}" -match("MESSAGE#261:00013:02", "nwparser.payload", "URL Filtering %{fld2->} has been changed to %{fld3}", processor_chain([ +var part442 = match("MESSAGE#261:00013:02", "nwparser.payload", "URL Filtering %{fld2->} has been changed to %{fld3}", processor_chain([ dup1, dup2, dup3, @@ -6729,8 +6018,7 @@ match("MESSAGE#261:00013:02", "nwparser.payload", "URL Filtering %{fld2->} has b var msg263 = msg("00013:02", part442); -var part443 = // "Pattern{Constant('Web Filtering has been '), Field(disposition,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#262:00013:03", "nwparser.payload", "Web Filtering has been %{disposition->} (%{fld1})", processor_chain([ +var part443 = match("MESSAGE#262:00013:03", "nwparser.payload", "Web Filtering has been %{disposition->} (%{fld1})", processor_chain([ dup50, dup43, dup51, @@ -6749,8 +6037,7 @@ var select102 = linear_select([ msg264, ]); -var part444 = // "Pattern{Field(change_attribute,true), Constant(' in minutes has changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#263:00014", "nwparser.payload", "%{change_attribute->} in minutes has changed from %{change_old->} to %{change_new}", processor_chain([ +var part444 = match("MESSAGE#263:00014", "nwparser.payload", "%{change_attribute->} in minutes has changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -6760,14 +6047,11 @@ match("MESSAGE#263:00014", "nwparser.payload", "%{change_attribute->} in minutes var msg265 = msg("00014", part444); -var part445 = // "Pattern{Constant('The group member '), Field(username,true), Constant(' has been '), Field(disposition,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#264:00014:01/0", "nwparser.payload", "The group member %{username->} has been %{disposition->} %{p0}"); +var part445 = match("MESSAGE#264:00014:01/0", "nwparser.payload", "The group member %{username->} has been %{disposition->} %{p0}"); -var part446 = // "Pattern{Constant('to a group'), Field(,false)}" -match("MESSAGE#264:00014:01/1_0", "nwparser.p0", "to a group%{}"); +var part446 = match("MESSAGE#264:00014:01/1_0", "nwparser.p0", "to a group%{}"); -var part447 = // "Pattern{Constant('from a group'), Field(,false)}" -match("MESSAGE#264:00014:01/1_1", "nwparser.p0", "from a group%{}"); +var part447 = match("MESSAGE#264:00014:01/1_1", "nwparser.p0", "from a group%{}"); var select103 = linear_select([ part446, @@ -6790,8 +6074,7 @@ var all85 = all_match({ var msg266 = msg("00014:01", all85); -var part448 = // "Pattern{Constant('The user group '), Field(group,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(username,false)}" -match("MESSAGE#265:00014:02", "nwparser.payload", "The user group %{group->} has been %{disposition->} by %{username}", processor_chain([ +var part448 = match("MESSAGE#265:00014:02", "nwparser.payload", "The user group %{group->} has been %{disposition->} by %{username}", processor_chain([ dup1, dup2, dup3, @@ -6801,8 +6084,7 @@ match("MESSAGE#265:00014:02", "nwparser.payload", "The user group %{group->} has var msg267 = msg("00014:02", part448); -var part449 = // "Pattern{Constant('The user '), Field(username,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(administrator,false)}" -match("MESSAGE#266:00014:03", "nwparser.payload", "The user %{username->} has been %{disposition->} by %{administrator}", processor_chain([ +var part449 = match("MESSAGE#266:00014:03", "nwparser.payload", "The user %{username->} has been %{disposition->} by %{administrator}", processor_chain([ dup1, dup2, dup3, @@ -6812,8 +6094,7 @@ match("MESSAGE#266:00014:03", "nwparser.payload", "The user %{username->} has be var msg268 = msg("00014:03", part449); -var part450 = // "Pattern{Constant('Communication error with '), Field(hostname,true), Constant(' server { '), Field(hostip,true), Constant(' }: SrvErr ('), Field(fld2,false), Constant('), SockErr ('), Field(fld3,false), Constant('), Valid ('), Field(fld4,false), Constant('),Connected ('), Field(fld5,false), Constant(')')}" -match("MESSAGE#267:00014:04", "nwparser.payload", "Communication error with %{hostname->} server { %{hostip->} }: SrvErr (%{fld2}), SockErr (%{fld3}), Valid (%{fld4}),Connected (%{fld5})", processor_chain([ +var part450 = match("MESSAGE#267:00014:04", "nwparser.payload", "Communication error with %{hostname->} server { %{hostip->} }: SrvErr (%{fld2}), SockErr (%{fld3}), Valid (%{fld4}),Connected (%{fld5})", processor_chain([ dup19, dup2, dup3, @@ -6823,8 +6104,7 @@ match("MESSAGE#267:00014:04", "nwparser.payload", "Communication error with %{ho var msg269 = msg("00014:04", part450); -var part451 = // "Pattern{Constant('System clock configurations have been '), Field(disposition,true), Constant(' by admin '), Field(administrator,false)}" -match("MESSAGE#268:00014:05", "nwparser.payload", "System clock configurations have been %{disposition->} by admin %{administrator}", processor_chain([ +var part451 = match("MESSAGE#268:00014:05", "nwparser.payload", "System clock configurations have been %{disposition->} by admin %{administrator}", processor_chain([ dup1, dup2, dup3, @@ -6834,8 +6114,7 @@ match("MESSAGE#268:00014:05", "nwparser.payload", "System clock configurations h var msg270 = msg("00014:05", part451); -var part452 = // "Pattern{Constant('System clock is '), Field(disposition,true), Constant(' manually.')}" -match("MESSAGE#269:00014:06", "nwparser.payload", "System clock is %{disposition->} manually.", processor_chain([ +var part452 = match("MESSAGE#269:00014:06", "nwparser.payload", "System clock is %{disposition->} manually.", processor_chain([ dup1, dup2, dup3, @@ -6845,8 +6124,7 @@ match("MESSAGE#269:00014:06", "nwparser.payload", "System clock is %{disposition var msg271 = msg("00014:06", part452); -var part453 = // "Pattern{Constant('System up time is '), Field(disposition,true), Constant(' by '), Field(fld2,false)}" -match("MESSAGE#270:00014:07", "nwparser.payload", "System up time is %{disposition->} by %{fld2}", processor_chain([ +var part453 = match("MESSAGE#270:00014:07", "nwparser.payload", "System up time is %{disposition->} by %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -6856,8 +6134,7 @@ match("MESSAGE#270:00014:07", "nwparser.payload", "System up time is %{dispositi var msg272 = msg("00014:07", part453); -var part454 = // "Pattern{Constant('Communication error with '), Field(hostname,true), Constant(' server['), Field(hostip,false), Constant(']: SrvErr('), Field(fld2,false), Constant('),SockErr('), Field(fld3,false), Constant('),Valid('), Field(fld4,false), Constant('),Connected('), Field(fld5,false), Constant(') ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#271:00014:08", "nwparser.payload", "Communication error with %{hostname->} server[%{hostip}]: SrvErr(%{fld2}),SockErr(%{fld3}),Valid(%{fld4}),Connected(%{fld5}) (%{fld1})", processor_chain([ +var part454 = match("MESSAGE#271:00014:08", "nwparser.payload", "Communication error with %{hostname->} server[%{hostip}]: SrvErr(%{fld2}),SockErr(%{fld3}),Valid(%{fld4}),Connected(%{fld5}) (%{fld1})", processor_chain([ dup27, dup2, dup3, @@ -6880,8 +6157,7 @@ var select104 = linear_select([ msg273, ]); -var part455 = // "Pattern{Constant('Authentication type has been changed to '), Field(authmethod,false)}" -match("MESSAGE#272:00015", "nwparser.payload", "Authentication type has been changed to %{authmethod}", processor_chain([ +var part455 = match("MESSAGE#272:00015", "nwparser.payload", "Authentication type has been changed to %{authmethod}", processor_chain([ dup1, dup2, dup3, @@ -6891,8 +6167,7 @@ match("MESSAGE#272:00015", "nwparser.payload", "Authentication type has been cha var msg274 = msg("00015", part455); -var part456 = // "Pattern{Constant('IP tracking to '), Field(daddr,true), Constant(' has '), Field(disposition,false)}" -match("MESSAGE#273:00015:01", "nwparser.payload", "IP tracking to %{daddr->} has %{disposition}", processor_chain([ +var part456 = match("MESSAGE#273:00015:01", "nwparser.payload", "IP tracking to %{daddr->} has %{disposition}", processor_chain([ dup86, dup2, dup3, @@ -6902,17 +6177,13 @@ match("MESSAGE#273:00015:01", "nwparser.payload", "IP tracking to %{daddr->} has var msg275 = msg("00015:01", part456); -var part457 = // "Pattern{Constant('LDAP '), Field(p0,false)}" -match("MESSAGE#274:00015:02/0", "nwparser.payload", "LDAP %{p0}"); +var part457 = match("MESSAGE#274:00015:02/0", "nwparser.payload", "LDAP %{p0}"); -var part458 = // "Pattern{Constant('server name '), Field(p0,false)}" -match("MESSAGE#274:00015:02/1_0", "nwparser.p0", "server name %{p0}"); +var part458 = match("MESSAGE#274:00015:02/1_0", "nwparser.p0", "server name %{p0}"); -var part459 = // "Pattern{Constant('distinguished name '), Field(p0,false)}" -match("MESSAGE#274:00015:02/1_2", "nwparser.p0", "distinguished name %{p0}"); +var part459 = match("MESSAGE#274:00015:02/1_2", "nwparser.p0", "distinguished name %{p0}"); -var part460 = // "Pattern{Constant('common name '), Field(p0,false)}" -match("MESSAGE#274:00015:02/1_3", "nwparser.p0", "common name %{p0}"); +var part460 = match("MESSAGE#274:00015:02/1_3", "nwparser.p0", "common name %{p0}"); var select105 = linear_select([ part458, @@ -6938,8 +6209,7 @@ var all86 = all_match({ var msg276 = msg("00015:02", all86); -var part461 = // "Pattern{Constant('Primary HA link has gone down. Local NetScreen device has begun using the secondary HA link'), Field(,false)}" -match("MESSAGE#275:00015:03", "nwparser.payload", "Primary HA link has gone down. Local NetScreen device has begun using the secondary HA link%{}", processor_chain([ +var part461 = match("MESSAGE#275:00015:03", "nwparser.payload", "Primary HA link has gone down. Local NetScreen device has begun using the secondary HA link%{}", processor_chain([ dup44, dup2, dup3, @@ -6949,11 +6219,9 @@ match("MESSAGE#275:00015:03", "nwparser.payload", "Primary HA link has gone down var msg277 = msg("00015:03", part461); -var part462 = // "Pattern{Constant('RADIUS server '), Field(p0,false)}" -match("MESSAGE#276:00015:04/0", "nwparser.payload", "RADIUS server %{p0}"); +var part462 = match("MESSAGE#276:00015:04/0", "nwparser.payload", "RADIUS server %{p0}"); -var part463 = // "Pattern{Constant('secret '), Field(p0,false)}" -match("MESSAGE#276:00015:04/1_2", "nwparser.p0", "secret %{p0}"); +var part463 = match("MESSAGE#276:00015:04/1_2", "nwparser.p0", "secret %{p0}"); var select106 = linear_select([ dup139, @@ -6978,17 +6246,13 @@ var all87 = all_match({ var msg278 = msg("00015:04", all87); -var part464 = // "Pattern{Constant('SecurID '), Field(p0,false)}" -match("MESSAGE#277:00015:05/0", "nwparser.payload", "SecurID %{p0}"); +var part464 = match("MESSAGE#277:00015:05/0", "nwparser.payload", "SecurID %{p0}"); -var part465 = // "Pattern{Constant('authentication port '), Field(p0,false)}" -match("MESSAGE#277:00015:05/1_0", "nwparser.p0", "authentication port %{p0}"); +var part465 = match("MESSAGE#277:00015:05/1_0", "nwparser.p0", "authentication port %{p0}"); -var part466 = // "Pattern{Constant('duress mode '), Field(p0,false)}" -match("MESSAGE#277:00015:05/1_1", "nwparser.p0", "duress mode %{p0}"); +var part466 = match("MESSAGE#277:00015:05/1_1", "nwparser.p0", "duress mode %{p0}"); -var part467 = // "Pattern{Constant('number of retries value '), Field(p0,false)}" -match("MESSAGE#277:00015:05/1_3", "nwparser.p0", "number of retries value %{p0}"); +var part467 = match("MESSAGE#277:00015:05/1_3", "nwparser.p0", "number of retries value %{p0}"); var select107 = linear_select([ part465, @@ -7014,19 +6278,16 @@ var all88 = all_match({ var msg279 = msg("00015:05", all88); -var part468 = // "Pattern{Constant('Master '), Field(p0,false)}" -match("MESSAGE#278:00015:06/0_0", "nwparser.payload", "Master %{p0}"); +var part468 = match("MESSAGE#278:00015:06/0_0", "nwparser.payload", "Master %{p0}"); -var part469 = // "Pattern{Constant('Backup '), Field(p0,false)}" -match("MESSAGE#278:00015:06/0_1", "nwparser.payload", "Backup %{p0}"); +var part469 = match("MESSAGE#278:00015:06/0_1", "nwparser.payload", "Backup %{p0}"); var select108 = linear_select([ part468, part469, ]); -var part470 = // "Pattern{Constant('SecurID server IP address has been '), Field(disposition,false)}" -match("MESSAGE#278:00015:06/1", "nwparser.p0", "SecurID server IP address has been %{disposition}"); +var part470 = match("MESSAGE#278:00015:06/1", "nwparser.p0", "SecurID server IP address has been %{disposition}"); var all89 = all_match({ processors: [ @@ -7044,8 +6305,7 @@ var all89 = all_match({ var msg280 = msg("00015:06", all89); -var part471 = // "Pattern{Constant('HA change from slave to master'), Field(,false)}" -match("MESSAGE#279:00015:07", "nwparser.payload", "HA change from slave to master%{}", processor_chain([ +var part471 = match("MESSAGE#279:00015:07", "nwparser.payload", "HA change from slave to master%{}", processor_chain([ dup1, dup2, dup3, @@ -7055,8 +6315,7 @@ match("MESSAGE#279:00015:07", "nwparser.payload", "HA change from slave to maste var msg281 = msg("00015:07", part471); -var part472 = // "Pattern{Constant('inconsistent configuration between master and slave'), Field(,false)}" -match("MESSAGE#280:00015:08", "nwparser.payload", "inconsistent configuration between master and slave%{}", processor_chain([ +var part472 = match("MESSAGE#280:00015:08", "nwparser.payload", "inconsistent configuration between master and slave%{}", processor_chain([ dup141, dup2, dup3, @@ -7066,19 +6325,16 @@ match("MESSAGE#280:00015:08", "nwparser.payload", "inconsistent configuration be var msg282 = msg("00015:08", part472); -var part473 = // "Pattern{Constant('configuration '), Field(p0,false)}" -match("MESSAGE#281:00015:09/0_0", "nwparser.payload", "configuration %{p0}"); +var part473 = match("MESSAGE#281:00015:09/0_0", "nwparser.payload", "configuration %{p0}"); -var part474 = // "Pattern{Constant('Configuration '), Field(p0,false)}" -match("MESSAGE#281:00015:09/0_1", "nwparser.payload", "Configuration %{p0}"); +var part474 = match("MESSAGE#281:00015:09/0_1", "nwparser.payload", "Configuration %{p0}"); var select109 = linear_select([ part473, part474, ]); -var part475 = // "Pattern{Constant('out of sync between local unit and remote unit'), Field(,false)}" -match("MESSAGE#281:00015:09/1", "nwparser.p0", "out of sync between local unit and remote unit%{}"); +var part475 = match("MESSAGE#281:00015:09/1", "nwparser.p0", "out of sync between local unit and remote unit%{}"); var all90 = all_match({ processors: [ @@ -7096,8 +6352,7 @@ var all90 = all_match({ var msg283 = msg("00015:09", all90); -var part476 = // "Pattern{Constant('HA control channel change to '), Field(interface,false)}" -match("MESSAGE#282:00015:10", "nwparser.payload", "HA control channel change to %{interface}", processor_chain([ +var part476 = match("MESSAGE#282:00015:10", "nwparser.payload", "HA control channel change to %{interface}", processor_chain([ dup1, dup2, dup3, @@ -7107,8 +6362,7 @@ match("MESSAGE#282:00015:10", "nwparser.payload", "HA control channel change to var msg284 = msg("00015:10", part476); -var part477 = // "Pattern{Constant('HA data channel change to '), Field(interface,false)}" -match("MESSAGE#283:00015:11", "nwparser.payload", "HA data channel change to %{interface}", processor_chain([ +var part477 = match("MESSAGE#283:00015:11", "nwparser.payload", "HA data channel change to %{interface}", processor_chain([ dup1, dup2, dup3, @@ -7118,31 +6372,27 @@ match("MESSAGE#283:00015:11", "nwparser.payload", "HA data channel change to %{i var msg285 = msg("00015:11", part477); -var part478 = // "Pattern{Constant('control '), Field(p0,false)}" -match("MESSAGE#284:00015:12/1_0", "nwparser.p0", "control %{p0}"); +var part478 = match("MESSAGE#284:00015:12/1_0", "nwparser.p0", "control %{p0}"); -var part479 = // "Pattern{Constant('data '), Field(p0,false)}" -match("MESSAGE#284:00015:12/1_1", "nwparser.p0", "data %{p0}"); +var part479 = match("MESSAGE#284:00015:12/1_1", "nwparser.p0", "data %{p0}"); var select110 = linear_select([ part478, part479, ]); -var part480 = // "Pattern{Constant('channel moved from link '), Field(p0,false)}" -match("MESSAGE#284:00015:12/2", "nwparser.p0", "channel moved from link %{p0}"); +var part480 = match("MESSAGE#284:00015:12/2", "nwparser.p0", "channel moved from link %{p0}"); -var part481 = // "Pattern{Constant('('), Field(interface,false), Constant(')')}" -match("MESSAGE#284:00015:12/6", "nwparser.p0", "(%{interface})"); +var part481 = match("MESSAGE#284:00015:12/6", "nwparser.p0", "(%{interface})"); var all91 = all_match({ processors: [ dup87, select110, part480, - dup355, + dup353, dup103, - dup355, + dup353, part481, ], on_success: processor_chain([ @@ -7156,8 +6406,7 @@ var all91 = all_match({ var msg286 = msg("00015:12", all91); -var part482 = // "Pattern{Constant('HA: Slave is down'), Field(,false)}" -match("MESSAGE#285:00015:13", "nwparser.payload", "HA: Slave is down%{}", processor_chain([ +var part482 = match("MESSAGE#285:00015:13", "nwparser.payload", "HA: Slave is down%{}", processor_chain([ dup144, dup2, dup3, @@ -7167,13 +6416,12 @@ match("MESSAGE#285:00015:13", "nwparser.payload", "HA: Slave is down%{}", proces var msg287 = msg("00015:13", part482); -var part483 = // "Pattern{Constant('NSRP link '), Field(p0,false)}" -match("MESSAGE#286:00015:14/0", "nwparser.payload", "NSRP link %{p0}"); +var part483 = match("MESSAGE#286:00015:14/0", "nwparser.payload", "NSRP link %{p0}"); var all92 = all_match({ processors: [ part483, - dup355, + dup353, dup116, ], on_success: processor_chain([ @@ -7187,8 +6435,7 @@ var all92 = all_match({ var msg288 = msg("00015:14", all92); -var part484 = // "Pattern{Constant('no HA '), Field(fld2,true), Constant(' channel available ('), Field(fld3,true), Constant(' used by other channel)')}" -match("MESSAGE#287:00015:15", "nwparser.payload", "no HA %{fld2->} channel available (%{fld3->} used by other channel)", processor_chain([ +var part484 = match("MESSAGE#287:00015:15", "nwparser.payload", "no HA %{fld2->} channel available (%{fld3->} used by other channel)", processor_chain([ dup117, dup2, dup3, @@ -7198,8 +6445,7 @@ match("MESSAGE#287:00015:15", "nwparser.payload", "no HA %{fld2->} channel avail var msg289 = msg("00015:15", part484); -var part485 = // "Pattern{Constant('The NSRP configuration is out of synchronization between the local device and the peer device.'), Field(,false)}" -match("MESSAGE#288:00015:16", "nwparser.payload", "The NSRP configuration is out of synchronization between the local device and the peer device.%{}", processor_chain([ +var part485 = match("MESSAGE#288:00015:16", "nwparser.payload", "The NSRP configuration is out of synchronization between the local device and the peer device.%{}", processor_chain([ dup18, dup2, dup3, @@ -7209,8 +6455,7 @@ match("MESSAGE#288:00015:16", "nwparser.payload", "The NSRP configuration is out var msg290 = msg("00015:16", part485); -var part486 = // "Pattern{Constant('NSRP '), Field(change_attribute,true), Constant(' '), Field(change_old,true), Constant(' changed to link channel '), Field(change_new,false)}" -match("MESSAGE#289:00015:17", "nwparser.payload", "NSRP %{change_attribute->} %{change_old->} changed to link channel %{change_new}", processor_chain([ +var part486 = match("MESSAGE#289:00015:17", "nwparser.payload", "NSRP %{change_attribute->} %{change_old->} changed to link channel %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -7220,8 +6465,7 @@ match("MESSAGE#289:00015:17", "nwparser.payload", "NSRP %{change_attribute->} %{ var msg291 = msg("00015:17", part486); -var part487 = // "Pattern{Constant('RTO mirror group '), Field(group,true), Constant(' with direction '), Field(direction,true), Constant(' on peer device '), Field(fld2,true), Constant(' changed from '), Field(fld3,true), Constant(' to '), Field(fld4,true), Constant(' state.')}" -match("MESSAGE#290:00015:18", "nwparser.payload", "RTO mirror group %{group->} with direction %{direction->} on peer device %{fld2->} changed from %{fld3->} to %{fld4->} state.", processor_chain([ +var part487 = match("MESSAGE#290:00015:18", "nwparser.payload", "RTO mirror group %{group->} with direction %{direction->} on peer device %{fld2->} changed from %{fld3->} to %{fld4->} state.", processor_chain([ dup121, dup2, dup3, @@ -7232,8 +6476,7 @@ match("MESSAGE#290:00015:18", "nwparser.payload", "RTO mirror group %{group->} w var msg292 = msg("00015:18", part487); -var part488 = // "Pattern{Constant('RTO mirror group '), Field(group,true), Constant(' with direction '), Field(direction,true), Constant(' on local device '), Field(fld2,false), Constant(', detected a duplicate direction on the peer device '), Field(fld3,false)}" -match("MESSAGE#291:00015:19", "nwparser.payload", "RTO mirror group %{group->} with direction %{direction->} on local device %{fld2}, detected a duplicate direction on the peer device %{fld3}", processor_chain([ +var part488 = match("MESSAGE#291:00015:19", "nwparser.payload", "RTO mirror group %{group->} with direction %{direction->} on local device %{fld2}, detected a duplicate direction on the peer device %{fld3}", processor_chain([ dup18, dup2, dup3, @@ -7243,8 +6486,7 @@ match("MESSAGE#291:00015:19", "nwparser.payload", "RTO mirror group %{group->} w var msg293 = msg("00015:19", part488); -var part489 = // "Pattern{Constant('RTO mirror group '), Field(group,true), Constant(' with direction '), Field(direction,true), Constant(' changed on the local device from '), Field(fld2,true), Constant(' to up state, it had peer device '), Field(fld3,false)}" -match("MESSAGE#292:00015:20", "nwparser.payload", "RTO mirror group %{group->} with direction %{direction->} changed on the local device from %{fld2->} to up state, it had peer device %{fld3}", processor_chain([ +var part489 = match("MESSAGE#292:00015:20", "nwparser.payload", "RTO mirror group %{group->} with direction %{direction->} changed on the local device from %{fld2->} to up state, it had peer device %{fld3}", processor_chain([ dup44, dup2, dup3, @@ -7254,14 +6496,11 @@ match("MESSAGE#292:00015:20", "nwparser.payload", "RTO mirror group %{group->} w var msg294 = msg("00015:20", part489); -var part490 = // "Pattern{Constant('Peer device '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#293:00015:21/0", "nwparser.payload", "Peer device %{fld2->} %{p0}"); +var part490 = match("MESSAGE#293:00015:21/0", "nwparser.payload", "Peer device %{fld2->} %{p0}"); -var part491 = // "Pattern{Constant('disappeared '), Field(p0,false)}" -match("MESSAGE#293:00015:21/1_0", "nwparser.p0", "disappeared %{p0}"); +var part491 = match("MESSAGE#293:00015:21/1_0", "nwparser.p0", "disappeared %{p0}"); -var part492 = // "Pattern{Constant('was discovered '), Field(p0,false)}" -match("MESSAGE#293:00015:21/1_1", "nwparser.p0", "was discovered %{p0}"); +var part492 = match("MESSAGE#293:00015:21/1_1", "nwparser.p0", "was discovered %{p0}"); var select111 = linear_select([ part491, @@ -7285,14 +6524,11 @@ var all93 = all_match({ var msg295 = msg("00015:21", all93); -var part493 = // "Pattern{Constant('The local '), Field(p0,false)}" -match("MESSAGE#294:00015:22/0_0", "nwparser.payload", "The local %{p0}"); +var part493 = match("MESSAGE#294:00015:22/0_0", "nwparser.payload", "The local %{p0}"); -var part494 = // "Pattern{Constant('The peer '), Field(p0,false)}" -match("MESSAGE#294:00015:22/0_1", "nwparser.payload", "The peer %{p0}"); +var part494 = match("MESSAGE#294:00015:22/0_1", "nwparser.payload", "The peer %{p0}"); -var part495 = // "Pattern{Constant('Peer '), Field(p0,false)}" -match("MESSAGE#294:00015:22/0_2", "nwparser.payload", "Peer %{p0}"); +var part495 = match("MESSAGE#294:00015:22/0_2", "nwparser.payload", "Peer %{p0}"); var select112 = linear_select([ part493, @@ -7300,14 +6536,13 @@ var select112 = linear_select([ part495, ]); -var part496 = // "Pattern{Constant('device '), Field(fld2,true), Constant(' in the Virtual Security Device group '), Field(group,true), Constant(' changed '), Field(change_attribute,true), Constant(' from '), Field(change_old,true), Constant(' to '), Field(change_new,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#294:00015:22/1", "nwparser.p0", "device %{fld2->} in the Virtual Security Device group %{group->} changed %{change_attribute->} from %{change_old->} to %{change_new->} %{p0}"); +var part496 = match("MESSAGE#294:00015:22/1", "nwparser.p0", "device %{fld2->} in the Virtual Security Device group %{group->} changed %{change_attribute->} from %{change_old->} to %{change_new->} %{p0}"); var all94 = all_match({ processors: [ select112, part496, - dup356, + dup354, ], on_success: processor_chain([ dup44, @@ -7321,8 +6556,7 @@ var all94 = all_match({ var msg296 = msg("00015:22", all94); -var part497 = // "Pattern{Constant('WebAuth is set to '), Field(fld2,false)}" -match("MESSAGE#295:00015:23", "nwparser.payload", "WebAuth is set to %{fld2}", processor_chain([ +var part497 = match("MESSAGE#295:00015:23", "nwparser.payload", "WebAuth is set to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -7332,8 +6566,7 @@ match("MESSAGE#295:00015:23", "nwparser.payload", "WebAuth is set to %{fld2}", p var msg297 = msg("00015:23", part497); -var part498 = // "Pattern{Constant('Default firewall authentication server has been changed to '), Field(hostname,false)}" -match("MESSAGE#296:00015:24", "nwparser.payload", "Default firewall authentication server has been changed to %{hostname}", processor_chain([ +var part498 = match("MESSAGE#296:00015:24", "nwparser.payload", "Default firewall authentication server has been changed to %{hostname}", processor_chain([ dup1, dup2, dup3, @@ -7343,8 +6576,7 @@ match("MESSAGE#296:00015:24", "nwparser.payload", "Default firewall authenticati var msg298 = msg("00015:24", part498); -var part499 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' attempted to verify the encrypted password '), Field(fld2,false), Constant('. Verification was successful')}" -match("MESSAGE#297:00015:25", "nwparser.payload", "Admin user %{administrator->} attempted to verify the encrypted password %{fld2}. Verification was successful", processor_chain([ +var part499 = match("MESSAGE#297:00015:25", "nwparser.payload", "Admin user %{administrator->} attempted to verify the encrypted password %{fld2}. Verification was successful", processor_chain([ setc("eventcategory","1613050100"), dup2, dup3, @@ -7354,8 +6586,7 @@ match("MESSAGE#297:00015:25", "nwparser.payload", "Admin user %{administrator->} var msg299 = msg("00015:25", part499); -var part500 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' attempted to verify the encrypted password '), Field(fld2,false), Constant('. Verification failed')}" -match("MESSAGE#298:00015:29", "nwparser.payload", "Admin user %{administrator->} attempted to verify the encrypted password %{fld2}. Verification failed", processor_chain([ +var part500 = match("MESSAGE#298:00015:29", "nwparser.payload", "Admin user %{administrator->} attempted to verify the encrypted password %{fld2}. Verification failed", processor_chain([ dup97, dup2, dup3, @@ -7365,14 +6596,11 @@ match("MESSAGE#298:00015:29", "nwparser.payload", "Admin user %{administrator->} var msg300 = msg("00015:29", part500); -var part501 = // "Pattern{Constant('unit '), Field(fld2,true), Constant(' just dis'), Field(p0,false)}" -match("MESSAGE#299:00015:26/0", "nwparser.payload", "unit %{fld2->} just dis%{p0}"); +var part501 = match("MESSAGE#299:00015:26/0", "nwparser.payload", "unit %{fld2->} just dis%{p0}"); -var part502 = // "Pattern{Constant('appeared'), Field(,false)}" -match("MESSAGE#299:00015:26/1_0", "nwparser.p0", "appeared%{}"); +var part502 = match("MESSAGE#299:00015:26/1_0", "nwparser.p0", "appeared%{}"); -var part503 = // "Pattern{Constant('covered'), Field(,false)}" -match("MESSAGE#299:00015:26/1_1", "nwparser.p0", "covered%{}"); +var part503 = match("MESSAGE#299:00015:26/1_1", "nwparser.p0", "covered%{}"); var select113 = linear_select([ part502, @@ -7395,8 +6623,7 @@ var all95 = all_match({ var msg301 = msg("00015:26", all95); -var part504 = // "Pattern{Constant('NSRP: HA data channel change to '), Field(interface,false), Constant('. ('), Field(fld2,false), Constant(')')}" -match("MESSAGE#300:00015:33", "nwparser.payload", "NSRP: HA data channel change to %{interface}. (%{fld2})", processor_chain([ +var part504 = match("MESSAGE#300:00015:33", "nwparser.payload", "NSRP: HA data channel change to %{interface}. (%{fld2})", processor_chain([ dup44, dup2, dup3, @@ -7407,8 +6634,7 @@ match("MESSAGE#300:00015:33", "nwparser.payload", "NSRP: HA data channel change var msg302 = msg("00015:33", part504); -var part505 = // "Pattern{Constant('NSRP: '), Field(fld2,false)}" -match("MESSAGE#301:00015:27", "nwparser.payload", "NSRP: %{fld2}", processor_chain([ +var part505 = match("MESSAGE#301:00015:27", "nwparser.payload", "NSRP: %{fld2}", processor_chain([ dup44, dup2, dup3, @@ -7418,8 +6644,7 @@ match("MESSAGE#301:00015:27", "nwparser.payload", "NSRP: %{fld2}", processor_cha var msg303 = msg("00015:27", part505); -var part506 = // "Pattern{Constant('Auth server '), Field(hostname,true), Constant(' RADIUS retry timeout has been set to default of '), Field(fld2,false)}" -match("MESSAGE#302:00015:28", "nwparser.payload", "Auth server %{hostname->} RADIUS retry timeout has been set to default of %{fld2}", processor_chain([ +var part506 = match("MESSAGE#302:00015:28", "nwparser.payload", "Auth server %{hostname->} RADIUS retry timeout has been set to default of %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -7429,16 +6654,14 @@ match("MESSAGE#302:00015:28", "nwparser.payload", "Auth server %{hostname->} RAD var msg304 = msg("00015:28", part506); -var part507 = // "Pattern{Constant('Number of RADIUS retries for auth server '), Field(hostname,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#303:00015:30/0", "nwparser.payload", "Number of RADIUS retries for auth server %{hostname->} %{p0}"); +var part507 = match("MESSAGE#303:00015:30/0", "nwparser.payload", "Number of RADIUS retries for auth server %{hostname->} %{p0}"); -var part508 = // "Pattern{Constant('set to '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#303:00015:30/2", "nwparser.p0", "set to %{fld2->} (%{fld1})"); +var part508 = match("MESSAGE#303:00015:30/2", "nwparser.p0", "set to %{fld2->} (%{fld1})"); var all96 = all_match({ processors: [ part507, - dup357, + dup355, part508, ], on_success: processor_chain([ @@ -7453,8 +6676,7 @@ var all96 = all_match({ var msg305 = msg("00015:30", all96); -var part509 = // "Pattern{Constant('Forced timeout for Auth server '), Field(hostname,true), Constant(' is unset to its default value, '), Field(info,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#304:00015:31", "nwparser.payload", "Forced timeout for Auth server %{hostname->} is unset to its default value, %{info->} (%{fld1})", processor_chain([ +var part509 = match("MESSAGE#304:00015:31", "nwparser.payload", "Forced timeout for Auth server %{hostname->} is unset to its default value, %{info->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -7465,8 +6687,7 @@ match("MESSAGE#304:00015:31", "nwparser.payload", "Forced timeout for Auth serve var msg306 = msg("00015:31", part509); -var part510 = // "Pattern{Constant('Accounting port of server RADIUS is set to '), Field(network_port,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#305:00015:32", "nwparser.payload", "Accounting port of server RADIUS is set to %{network_port}. (%{fld1})", processor_chain([ +var part510 = match("MESSAGE#305:00015:32", "nwparser.payload", "Accounting port of server RADIUS is set to %{network_port}. (%{fld1})", processor_chain([ dup50, dup43, dup51, @@ -7515,8 +6736,7 @@ var select114 = linear_select([ msg307, ]); -var part511 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#306:00016", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part511 = match("MESSAGE#306:00016", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup147, dup148, dup149, @@ -7531,8 +6751,7 @@ match("MESSAGE#306:00016", "nwparser.payload", "%{signame->} From %{saddr}:%{spo var msg308 = msg("00016", part511); -var part512 = // "Pattern{Constant('Address VIP ('), Field(fld2,false), Constant(') for '), Field(fld3,true), Constant(' has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#307:00016:01", "nwparser.payload", "Address VIP (%{fld2}) for %{fld3->} has been %{disposition}.", processor_chain([ +var part512 = match("MESSAGE#307:00016:01", "nwparser.payload", "Address VIP (%{fld2}) for %{fld3->} has been %{disposition}.", processor_chain([ dup1, dup148, dup149, @@ -7545,8 +6764,7 @@ match("MESSAGE#307:00016:01", "nwparser.payload", "Address VIP (%{fld2}) for %{f var msg309 = msg("00016:01", part512); -var part513 = // "Pattern{Constant('VIP ('), Field(fld2,false), Constant(') has been '), Field(disposition,false)}" -match("MESSAGE#308:00016:02", "nwparser.payload", "VIP (%{fld2}) has been %{disposition}", processor_chain([ +var part513 = match("MESSAGE#308:00016:02", "nwparser.payload", "VIP (%{fld2}) has been %{disposition}", processor_chain([ dup1, dup148, dup149, @@ -7559,8 +6777,7 @@ match("MESSAGE#308:00016:02", "nwparser.payload", "VIP (%{fld2}) has been %{disp var msg310 = msg("00016:02", part513); -var part514 = // "Pattern{Field(signame,true), Constant(' from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' protocol '), Field(protocol,true), Constant(' ('), Field(fld2,false), Constant(')')}" -match("MESSAGE#309:00016:03", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{fld2})", processor_chain([ +var part514 = match("MESSAGE#309:00016:03", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{fld2})", processor_chain([ dup147, dup148, dup149, @@ -7573,8 +6790,7 @@ match("MESSAGE#309:00016:03", "nwparser.payload", "%{signame->} from %{saddr}/%{ var msg311 = msg("00016:03", part514); -var part515 = // "Pattern{Constant('VIP multi-port was '), Field(disposition,false)}" -match("MESSAGE#310:00016:05", "nwparser.payload", "VIP multi-port was %{disposition}", processor_chain([ +var part515 = match("MESSAGE#310:00016:05", "nwparser.payload", "VIP multi-port was %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -7584,8 +6800,7 @@ match("MESSAGE#310:00016:05", "nwparser.payload", "VIP multi-port was %{disposit var msg312 = msg("00016:05", part515); -var part516 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#311:00016:06", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part516 = match("MESSAGE#311:00016:06", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup147, dup148, dup149, @@ -7600,13 +6815,12 @@ match("MESSAGE#311:00016:06", "nwparser.payload", "%{signame->} has been detecte var msg313 = msg("00016:06", part516); -var part517 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' ( zone '), Field(p0,false)}" -match("MESSAGE#312:00016:07/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} ( zone %{p0}"); +var part517 = match("MESSAGE#312:00016:07/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} ( zone %{p0}"); var all97 = all_match({ processors: [ part517, - dup340, + dup338, dup67, ], on_success: processor_chain([ @@ -7626,8 +6840,7 @@ var all97 = all_match({ var msg314 = msg("00016:07", all97); -var part518 = // "Pattern{Constant('VIP ('), Field(fld2,false), Constant(':'), Field(fld3,true), Constant(' HTTP '), Field(fld4,false), Constant(') Modify by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#313:00016:08", "nwparser.payload", "VIP (%{fld2}:%{fld3->} HTTP %{fld4}) Modify by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part518 = match("MESSAGE#313:00016:08", "nwparser.payload", "VIP (%{fld2}:%{fld3->} HTTP %{fld4}) Modify by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ setc("eventcategory","1001020305"), dup2, dup3, @@ -7638,8 +6851,7 @@ match("MESSAGE#313:00016:08", "nwparser.payload", "VIP (%{fld2}:%{fld3->} HTTP % var msg315 = msg("00016:08", part518); -var part519 = // "Pattern{Constant('VIP ('), Field(fld2,false), Constant(':'), Field(fld3,true), Constant(' HTTP '), Field(fld4,false), Constant(') New by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#314:00016:09", "nwparser.payload", "VIP (%{fld2}:%{fld3->} HTTP %{fld4}) New by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part519 = match("MESSAGE#314:00016:09", "nwparser.payload", "VIP (%{fld2}:%{fld3->} HTTP %{fld4}) New by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ setc("eventcategory","1001030305"), dup2, dup3, @@ -7662,8 +6874,7 @@ var select115 = linear_select([ msg316, ]); -var part520 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#315:00017", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part520 = match("MESSAGE#315:00017", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup151, dup2, dup3, @@ -7674,22 +6885,18 @@ match("MESSAGE#315:00017", "nwparser.payload", "%{signame->} From %{saddr}:%{spo var msg317 = msg("00017", part520); -var part521 = // "Pattern{Constant('Gateway '), Field(fld2,true), Constant(' at '), Field(fld3,true), Constant(' in '), Field(fld5,true), Constant(' mode with ID '), Field(p0,false)}" -match("MESSAGE#316:00017:23/0", "nwparser.payload", "Gateway %{fld2->} at %{fld3->} in %{fld5->} mode with ID %{p0}"); +var part521 = match("MESSAGE#316:00017:23/0", "nwparser.payload", "Gateway %{fld2->} at %{fld3->} in %{fld5->} mode with ID %{p0}"); -var part522 = // "Pattern{Constant('['), Field(fld4,false), Constant('] '), Field(p0,false)}" -match("MESSAGE#316:00017:23/1_0", "nwparser.p0", "[%{fld4}] %{p0}"); +var part522 = match("MESSAGE#316:00017:23/1_0", "nwparser.p0", "[%{fld4}] %{p0}"); -var part523 = // "Pattern{Field(fld4,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#316:00017:23/1_1", "nwparser.p0", "%{fld4->} %{p0}"); +var part523 = match("MESSAGE#316:00017:23/1_1", "nwparser.p0", "%{fld4->} %{p0}"); var select116 = linear_select([ part522, part523, ]); -var part524 = // "Pattern{Constant('has been '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' '), Field(fld,false)}" -match("MESSAGE#316:00017:23/2", "nwparser.p0", "has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} %{fld}"); +var part524 = match("MESSAGE#316:00017:23/2", "nwparser.p0", "has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} %{fld}"); var all98 = all_match({ processors: [ @@ -7708,28 +6915,24 @@ var all98 = all_match({ var msg318 = msg("00017:23", all98); -var part525 = // "Pattern{Field(fld1,false), Constant(': Gateway '), Field(p0,false)}" -match("MESSAGE#317:00017:01/0_0", "nwparser.payload", "%{fld1}: Gateway %{p0}"); +var part525 = match("MESSAGE#317:00017:01/0_0", "nwparser.payload", "%{fld1}: Gateway %{p0}"); -var part526 = // "Pattern{Constant('Gateway '), Field(p0,false)}" -match("MESSAGE#317:00017:01/0_1", "nwparser.payload", "Gateway %{p0}"); +var part526 = match("MESSAGE#317:00017:01/0_1", "nwparser.payload", "Gateway %{p0}"); var select117 = linear_select([ part525, part526, ]); -var part527 = // "Pattern{Constant(''), Field(fld2,true), Constant(' at '), Field(fld3,true), Constant(' in '), Field(fld5,true), Constant(' mode with ID'), Field(p0,false)}" -match("MESSAGE#317:00017:01/1", "nwparser.p0", "%{fld2->} at %{fld3->} in %{fld5->} mode with ID%{p0}"); +var part527 = match("MESSAGE#317:00017:01/1", "nwparser.p0", "%{fld2->} at %{fld3->} in %{fld5->} mode with ID%{p0}"); -var part528 = // "Pattern{Constant(''), Field(fld4,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#317:00017:01/3", "nwparser.p0", "%{fld4->} has been %{disposition}"); +var part528 = match("MESSAGE#317:00017:01/3", "nwparser.p0", "%{fld4->} has been %{disposition}"); var all99 = all_match({ processors: [ select117, part527, - dup358, + dup356, part528, ], on_success: processor_chain([ @@ -7743,8 +6946,7 @@ var all99 = all_match({ var msg319 = msg("00017:01", all99); -var part529 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Gateway settings have been '), Field(disposition,false)}" -match("MESSAGE#318:00017:02", "nwparser.payload", "IKE %{hostip}: Gateway settings have been %{disposition}", processor_chain([ +var part529 = match("MESSAGE#318:00017:02", "nwparser.payload", "IKE %{hostip}: Gateway settings have been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -7754,8 +6956,7 @@ match("MESSAGE#318:00017:02", "nwparser.payload", "IKE %{hostip}: Gateway settin var msg320 = msg("00017:02", part529); -var part530 = // "Pattern{Constant('IKE key '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#319:00017:03", "nwparser.payload", "IKE key %{fld2->} has been %{disposition}", processor_chain([ +var part530 = match("MESSAGE#319:00017:03", "nwparser.payload", "IKE key %{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -7765,13 +6966,12 @@ match("MESSAGE#319:00017:03", "nwparser.payload", "IKE key %{fld2->} has been %{ var msg321 = msg("00017:03", part530); -var part531 = // "Pattern{Constant(''), Field(group_object,true), Constant(' with range '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#320:00017:04/2", "nwparser.p0", "%{group_object->} with range %{fld2->} has been %{disposition}"); +var part531 = match("MESSAGE#320:00017:04/2", "nwparser.p0", "%{group_object->} with range %{fld2->} has been %{disposition}"); var all100 = all_match({ processors: [ dup153, - dup359, + dup357, part531, ], on_success: processor_chain([ @@ -7785,8 +6985,7 @@ var all100 = all_match({ var msg322 = msg("00017:04", all100); -var part532 = // "Pattern{Constant('IPSec NAT-T for VPN '), Field(group,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#321:00017:05", "nwparser.payload", "IPSec NAT-T for VPN %{group->} has been %{disposition}", processor_chain([ +var part532 = match("MESSAGE#321:00017:05", "nwparser.payload", "IPSec NAT-T for VPN %{group->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -7796,14 +6995,11 @@ match("MESSAGE#321:00017:05", "nwparser.payload", "IPSec NAT-T for VPN %{group-> var msg323 = msg("00017:05", part532); -var part533 = // "Pattern{Constant('The DF-BIT for VPN '), Field(group,true), Constant(' has been set to '), Field(p0,false)}" -match("MESSAGE#322:00017:06/0", "nwparser.payload", "The DF-BIT for VPN %{group->} has been set to %{p0}"); +var part533 = match("MESSAGE#322:00017:06/0", "nwparser.payload", "The DF-BIT for VPN %{group->} has been set to %{p0}"); -var part534 = // "Pattern{Constant('clear '), Field(p0,false)}" -match("MESSAGE#322:00017:06/1_0", "nwparser.p0", "clear %{p0}"); +var part534 = match("MESSAGE#322:00017:06/1_0", "nwparser.p0", "clear %{p0}"); -var part535 = // "Pattern{Constant('copy '), Field(p0,false)}" -match("MESSAGE#322:00017:06/1_2", "nwparser.p0", "copy %{p0}"); +var part535 = match("MESSAGE#322:00017:06/1_2", "nwparser.p0", "copy %{p0}"); var select118 = linear_select([ part534, @@ -7828,20 +7024,15 @@ var all101 = all_match({ var msg324 = msg("00017:06", all101); -var part536 = // "Pattern{Constant('The DF-BIT for VPN '), Field(group,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#323:00017:07/0", "nwparser.payload", "The DF-BIT for VPN %{group->} has been %{p0}"); +var part536 = match("MESSAGE#323:00017:07/0", "nwparser.payload", "The DF-BIT for VPN %{group->} has been %{p0}"); -var part537 = // "Pattern{Constant('clear'), Field(,false)}" -match("MESSAGE#323:00017:07/1_0", "nwparser.p0", "clear%{}"); +var part537 = match("MESSAGE#323:00017:07/1_0", "nwparser.p0", "clear%{}"); -var part538 = // "Pattern{Constant('cleared'), Field(,false)}" -match("MESSAGE#323:00017:07/1_1", "nwparser.p0", "cleared%{}"); +var part538 = match("MESSAGE#323:00017:07/1_1", "nwparser.p0", "cleared%{}"); -var part539 = // "Pattern{Constant('copy'), Field(,false)}" -match("MESSAGE#323:00017:07/1_3", "nwparser.p0", "copy%{}"); +var part539 = match("MESSAGE#323:00017:07/1_3", "nwparser.p0", "copy%{}"); -var part540 = // "Pattern{Constant('copied'), Field(,false)}" -match("MESSAGE#323:00017:07/1_4", "nwparser.p0", "copied%{}"); +var part540 = match("MESSAGE#323:00017:07/1_4", "nwparser.p0", "copied%{}"); var select119 = linear_select([ part537, @@ -7867,8 +7058,7 @@ var all102 = all_match({ var msg325 = msg("00017:07", all102); -var part541 = // "Pattern{Constant('VPN '), Field(group,true), Constant(' with gateway '), Field(fld2,true), Constant(' and SPI '), Field(fld3,false), Constant('/'), Field(fld4,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#324:00017:08", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and SPI %{fld3}/%{fld4->} has been %{disposition}", processor_chain([ +var part541 = match("MESSAGE#324:00017:08", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and SPI %{fld3}/%{fld4->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -7878,28 +7068,22 @@ match("MESSAGE#324:00017:08", "nwparser.payload", "VPN %{group->} with gateway % var msg326 = msg("00017:08", part541); -var part542 = // "Pattern{Field(fld1,false), Constant(': VPN '), Field(p0,false)}" -match("MESSAGE#325:00017:09/0_0", "nwparser.payload", "%{fld1}: VPN %{p0}"); +var part542 = match("MESSAGE#325:00017:09/0_0", "nwparser.payload", "%{fld1}: VPN %{p0}"); -var part543 = // "Pattern{Constant('VPN '), Field(p0,false)}" -match("MESSAGE#325:00017:09/0_1", "nwparser.payload", "VPN %{p0}"); +var part543 = match("MESSAGE#325:00017:09/0_1", "nwparser.payload", "VPN %{p0}"); var select120 = linear_select([ part542, part543, ]); -var part544 = // "Pattern{Constant(''), Field(group,true), Constant(' with gateway '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#325:00017:09/1", "nwparser.p0", "%{group->} with gateway %{fld2->} %{p0}"); +var part544 = match("MESSAGE#325:00017:09/1", "nwparser.p0", "%{group->} with gateway %{fld2->} %{p0}"); -var part545 = // "Pattern{Constant('no-rekey '), Field(p0,false)}" -match("MESSAGE#325:00017:09/2_0", "nwparser.p0", "no-rekey %{p0}"); +var part545 = match("MESSAGE#325:00017:09/2_0", "nwparser.p0", "no-rekey %{p0}"); -var part546 = // "Pattern{Constant('rekey, '), Field(p0,false)}" -match("MESSAGE#325:00017:09/2_1", "nwparser.p0", "rekey, %{p0}"); +var part546 = match("MESSAGE#325:00017:09/2_1", "nwparser.p0", "rekey, %{p0}"); -var part547 = // "Pattern{Constant('rekey '), Field(p0,false)}" -match("MESSAGE#325:00017:09/2_2", "nwparser.p0", "rekey %{p0}"); +var part547 = match("MESSAGE#325:00017:09/2_2", "nwparser.p0", "rekey %{p0}"); var select121 = linear_select([ part545, @@ -7907,14 +7091,11 @@ var select121 = linear_select([ part547, ]); -var part548 = // "Pattern{Constant('and p2-proposal '), Field(fld3,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#325:00017:09/3", "nwparser.p0", "and p2-proposal %{fld3->} has been %{p0}"); +var part548 = match("MESSAGE#325:00017:09/3", "nwparser.p0", "and p2-proposal %{fld3->} has been %{p0}"); -var part549 = // "Pattern{Field(disposition,true), Constant(' from peer unit')}" -match("MESSAGE#325:00017:09/4_0", "nwparser.p0", "%{disposition->} from peer unit"); +var part549 = match("MESSAGE#325:00017:09/4_0", "nwparser.p0", "%{disposition->} from peer unit"); -var part550 = // "Pattern{Field(disposition,true), Constant(' from host '), Field(saddr,false)}" -match("MESSAGE#325:00017:09/4_1", "nwparser.p0", "%{disposition->} from host %{saddr}"); +var part550 = match("MESSAGE#325:00017:09/4_1", "nwparser.p0", "%{disposition->} from host %{saddr}"); var select122 = linear_select([ part549, @@ -7941,13 +7122,12 @@ var all103 = all_match({ var msg327 = msg("00017:09", all103); -var part551 = // "Pattern{Constant('VPN monitoring for VPN '), Field(group,true), Constant(' has been '), Field(disposition,false), Constant('. Src IF '), Field(sinterface,true), Constant(' dst IP '), Field(daddr,true), Constant(' with rekeying '), Field(p0,false)}" -match("MESSAGE#326:00017:10/0", "nwparser.payload", "VPN monitoring for VPN %{group->} has been %{disposition}. Src IF %{sinterface->} dst IP %{daddr->} with rekeying %{p0}"); +var part551 = match("MESSAGE#326:00017:10/0", "nwparser.payload", "VPN monitoring for VPN %{group->} has been %{disposition}. Src IF %{sinterface->} dst IP %{daddr->} with rekeying %{p0}"); var all104 = all_match({ processors: [ part551, - dup360, + dup358, dup116, ], on_success: processor_chain([ @@ -7961,8 +7141,7 @@ var all104 = all_match({ var msg328 = msg("00017:10", all104); -var part552 = // "Pattern{Constant('VPN monitoring for VPN '), Field(group,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#327:00017:11", "nwparser.payload", "VPN monitoring for VPN %{group->} has been %{disposition}", processor_chain([ +var part552 = match("MESSAGE#327:00017:11", "nwparser.payload", "VPN monitoring for VPN %{group->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -7972,11 +7151,9 @@ match("MESSAGE#327:00017:11", "nwparser.payload", "VPN monitoring for VPN %{grou var msg329 = msg("00017:11", part552); -var part553 = // "Pattern{Constant('VPN monitoring '), Field(p0,false)}" -match("MESSAGE#328:00017:12/0", "nwparser.payload", "VPN monitoring %{p0}"); +var part553 = match("MESSAGE#328:00017:12/0", "nwparser.payload", "VPN monitoring %{p0}"); -var part554 = // "Pattern{Constant('frequency '), Field(p0,false)}" -match("MESSAGE#328:00017:12/1_2", "nwparser.p0", "frequency %{p0}"); +var part554 = match("MESSAGE#328:00017:12/1_2", "nwparser.p0", "frequency %{p0}"); var select123 = linear_select([ dup109, @@ -7989,7 +7166,7 @@ var all105 = all_match({ part553, select123, dup127, - dup361, + dup359, ], on_success: processor_chain([ dup1, @@ -8002,8 +7179,7 @@ var all105 = all_match({ var msg330 = msg("00017:12", all105); -var part555 = // "Pattern{Constant('VPN '), Field(group,true), Constant(' with gateway '), Field(fld2,true), Constant(' and P2 proposal '), Field(fld3,true), Constant(' has been added by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#329:00017:26", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and P2 proposal %{fld3->} has been added by %{username->} via %{logon_type->} from host %{saddr}:%{sport}. (%{fld1})", processor_chain([ +var part555 = match("MESSAGE#329:00017:26", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and P2 proposal %{fld3->} has been added by %{username->} via %{logon_type->} from host %{saddr}:%{sport}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -8014,8 +7190,7 @@ match("MESSAGE#329:00017:26", "nwparser.payload", "VPN %{group->} with gateway % var msg331 = msg("00017:26", part555); -var part556 = // "Pattern{Constant('No IP pool has been assigned. You cannot allocate an IP address.'), Field(,false)}" -match("MESSAGE#330:00017:13", "nwparser.payload", "No IP pool has been assigned. You cannot allocate an IP address.%{}", processor_chain([ +var part556 = match("MESSAGE#330:00017:13", "nwparser.payload", "No IP pool has been assigned. You cannot allocate an IP address.%{}", processor_chain([ dup18, dup2, dup3, @@ -8025,8 +7200,7 @@ match("MESSAGE#330:00017:13", "nwparser.payload", "No IP pool has been assigned. var msg332 = msg("00017:13", part556); -var part557 = // "Pattern{Constant('P1 proposal '), Field(fld2,true), Constant(' with '), Field(protocol_detail,false), Constant(', DH group '), Field(group,false), Constant(', ESP '), Field(encryption_type,false), Constant(', auth '), Field(authmethod,false), Constant(', and lifetime '), Field(fld3,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#331:00017:14", "nwparser.payload", "P1 proposal %{fld2->} with %{protocol_detail}, DH group %{group}, ESP %{encryption_type}, auth %{authmethod}, and lifetime %{fld3->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ +var part557 = match("MESSAGE#331:00017:14", "nwparser.payload", "P1 proposal %{fld2->} with %{protocol_detail}, DH group %{group}, ESP %{encryption_type}, auth %{authmethod}, and lifetime %{fld3->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -8037,16 +7211,14 @@ match("MESSAGE#331:00017:14", "nwparser.payload", "P1 proposal %{fld2->} with %{ var msg333 = msg("00017:14", part557); -var part558 = // "Pattern{Constant('P2 proposal '), Field(fld2,true), Constant(' with DH group '), Field(group,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#332:00017:15/0", "nwparser.payload", "P2 proposal %{fld2->} with DH group %{group->} %{p0}"); +var part558 = match("MESSAGE#332:00017:15/0", "nwparser.payload", "P2 proposal %{fld2->} with DH group %{group->} %{p0}"); -var part559 = // "Pattern{Constant(''), Field(encryption_type,true), Constant(' auth '), Field(authmethod,true), Constant(' and lifetime ('), Field(fld3,false), Constant(') ('), Field(fld4,false), Constant(') has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#332:00017:15/2", "nwparser.p0", "%{encryption_type->} auth %{authmethod->} and lifetime (%{fld3}) (%{fld4}) has been %{disposition}."); +var part559 = match("MESSAGE#332:00017:15/2", "nwparser.p0", "%{encryption_type->} auth %{authmethod->} and lifetime (%{fld3}) (%{fld4}) has been %{disposition}."); var all106 = all_match({ processors: [ part558, - dup362, + dup360, part559, ], on_success: processor_chain([ @@ -8060,16 +7232,14 @@ var all106 = all_match({ var msg334 = msg("00017:15", all106); -var part560 = // "Pattern{Constant('P1 proposal '), Field(fld2,true), Constant(' with '), Field(protocol_detail,true), Constant(' DH group '), Field(group,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#333:00017:31/0", "nwparser.payload", "P1 proposal %{fld2->} with %{protocol_detail->} DH group %{group->} %{p0}"); +var part560 = match("MESSAGE#333:00017:31/0", "nwparser.payload", "P1 proposal %{fld2->} with %{protocol_detail->} DH group %{group->} %{p0}"); -var part561 = // "Pattern{Constant(''), Field(encryption_type,true), Constant(' auth '), Field(authmethod,true), Constant(' and lifetime '), Field(fld3,true), Constant(' has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#333:00017:31/2", "nwparser.p0", "%{encryption_type->} auth %{authmethod->} and lifetime %{fld3->} has been %{disposition}."); +var part561 = match("MESSAGE#333:00017:31/2", "nwparser.p0", "%{encryption_type->} auth %{authmethod->} and lifetime %{fld3->} has been %{disposition}."); var all107 = all_match({ processors: [ part560, - dup362, + dup360, part561, ], on_success: processor_chain([ @@ -8083,13 +7253,12 @@ var all107 = all_match({ var msg335 = msg("00017:31", all107); -var part562 = // "Pattern{Constant('vpnmonitor interval is '), Field(p0,false)}" -match("MESSAGE#334:00017:16/0", "nwparser.payload", "vpnmonitor interval is %{p0}"); +var part562 = match("MESSAGE#334:00017:16/0", "nwparser.payload", "vpnmonitor interval is %{p0}"); var all108 = all_match({ processors: [ part562, - dup361, + dup359, ], on_success: processor_chain([ dup1, @@ -8102,8 +7271,7 @@ var all108 = all_match({ var msg336 = msg("00017:16", all108); -var part563 = // "Pattern{Constant('vpnmonitor threshold is '), Field(p0,false)}" -match("MESSAGE#335:00017:17/0", "nwparser.payload", "vpnmonitor threshold is %{p0}"); +var part563 = match("MESSAGE#335:00017:17/0", "nwparser.payload", "vpnmonitor threshold is %{p0}"); var select124 = linear_select([ dup99, @@ -8126,13 +7294,12 @@ var all109 = all_match({ var msg337 = msg("00017:17", all109); -var part564 = // "Pattern{Constant(''), Field(group_object,true), Constant(' with range '), Field(fld2,true), Constant(' was '), Field(disposition,false)}" -match("MESSAGE#336:00017:18/2", "nwparser.p0", "%{group_object->} with range %{fld2->} was %{disposition}"); +var part564 = match("MESSAGE#336:00017:18/2", "nwparser.p0", "%{group_object->} with range %{fld2->} was %{disposition}"); var all110 = all_match({ processors: [ dup153, - dup359, + dup357, part564, ], on_success: processor_chain([ @@ -8148,16 +7315,14 @@ var all110 = all_match({ var msg338 = msg("00017:18", all110); -var part565 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at '), Field(p0,false)}" -match("MESSAGE#337:00017:19/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at %{p0}"); +var part565 = match("MESSAGE#337:00017:19/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at %{p0}"); -var part566 = // "Pattern{Field(,true), Constant(' '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#337:00017:19/2", "nwparser.p0", "%{} %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times"); +var part566 = match("MESSAGE#337:00017:19/2", "nwparser.p0", "%{} %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times"); var all111 = all_match({ processors: [ part565, - dup339, + dup337, part566, ], on_success: processor_chain([ @@ -8175,7 +7340,7 @@ var msg339 = msg("00017:19", all111); var all112 = all_match({ processors: [ dup64, - dup340, + dup338, dup67, ], on_success: processor_chain([ @@ -8191,8 +7356,7 @@ var all112 = all_match({ var msg340 = msg("00017:20", all112); -var part567 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#339:00017:21", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part567 = match("MESSAGE#339:00017:21", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup151, dup2, dup3, @@ -8203,8 +7367,7 @@ match("MESSAGE#339:00017:21", "nwparser.payload", "%{signame->} From %{saddr->} var msg341 = msg("00017:21", part567); -var part568 = // "Pattern{Constant('VPN '), Field(group,true), Constant(' with gateway '), Field(fld2,true), Constant(' and P2 proposal '), Field(fld3,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#340:00017:22", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and P2 proposal %{fld3->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part568 = match("MESSAGE#340:00017:22", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and P2 proposal %{fld3->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -8215,8 +7378,7 @@ match("MESSAGE#340:00017:22", "nwparser.payload", "VPN %{group->} with gateway % var msg342 = msg("00017:22", part568); -var part569 = // "Pattern{Constant('VPN "'), Field(group,false), Constant('" has been bound to tunnel interface '), Field(interface,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#341:00017:24", "nwparser.payload", "VPN \"%{group}\" has been bound to tunnel interface %{interface}. (%{fld1})", processor_chain([ +var part569 = match("MESSAGE#341:00017:24", "nwparser.payload", "VPN \"%{group}\" has been bound to tunnel interface %{interface}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -8227,8 +7389,7 @@ match("MESSAGE#341:00017:24", "nwparser.payload", "VPN \"%{group}\" has been bou var msg343 = msg("00017:24", part569); -var part570 = // "Pattern{Constant('VPN '), Field(group,true), Constant(' with gateway '), Field(fld2,true), Constant(' and P2 proposal standard has been added by admin '), Field(administrator,true), Constant(' via NSRP Peer ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#342:00017:25", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and P2 proposal standard has been added by admin %{administrator->} via NSRP Peer (%{fld1})", processor_chain([ +var part570 = match("MESSAGE#342:00017:25", "nwparser.payload", "VPN %{group->} with gateway %{fld2->} and P2 proposal standard has been added by admin %{administrator->} via NSRP Peer (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -8239,8 +7400,7 @@ match("MESSAGE#342:00017:25", "nwparser.payload", "VPN %{group->} with gateway % var msg344 = msg("00017:25", part570); -var part571 = // "Pattern{Constant('P2 proposal '), Field(fld2,true), Constant(' with DH group '), Field(group,false), Constant(', ESP, enc '), Field(encryption_type,false), Constant(', auth '), Field(authmethod,false), Constant(', and lifetime '), Field(fld3,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#343:00017:28", "nwparser.payload", "P2 proposal %{fld2->} with DH group %{group}, ESP, enc %{encryption_type}, auth %{authmethod}, and lifetime %{fld3->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ +var part571 = match("MESSAGE#343:00017:28", "nwparser.payload", "P2 proposal %{fld2->} with DH group %{group}, ESP, enc %{encryption_type}, auth %{authmethod}, and lifetime %{fld3->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -8251,8 +7411,7 @@ match("MESSAGE#343:00017:28", "nwparser.payload", "P2 proposal %{fld2->} with DH var msg345 = msg("00017:28", part571); -var part572 = // "Pattern{Constant('L2TP "'), Field(fld2,false), Constant('", all-L2TP-users secret "'), Field(fld3,false), Constant('" keepalive '), Field(fld4,true), Constant(' has been '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#344:00017:29", "nwparser.payload", "L2TP \"%{fld2}\", all-L2TP-users secret \"%{fld3}\" keepalive %{fld4->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ +var part572 = match("MESSAGE#344:00017:29", "nwparser.payload", "L2TP \"%{fld2}\", all-L2TP-users secret \"%{fld3}\" keepalive %{fld4->} has been %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ dup1, dup2, dup4, @@ -8295,8 +7454,7 @@ var select125 = linear_select([ msg346, ]); -var part573 = // "Pattern{Constant('Positions of policies '), Field(fld2,true), Constant(' and '), Field(fld3,true), Constant(' have been exchanged')}" -match("MESSAGE#345:00018", "nwparser.payload", "Positions of policies %{fld2->} and %{fld3->} have been exchanged", processor_chain([ +var part573 = match("MESSAGE#345:00018", "nwparser.payload", "Positions of policies %{fld2->} and %{fld3->} have been exchanged", processor_chain([ dup1, dup2, dup3, @@ -8306,8 +7464,7 @@ match("MESSAGE#345:00018", "nwparser.payload", "Positions of policies %{fld2->} var msg347 = msg("00018", part573); -var part574 = // "Pattern{Constant('Deny Policy Alarm'), Field(,false)}" -match("MESSAGE#346:00018:01", "nwparser.payload", "Deny Policy Alarm%{}", processor_chain([ +var part574 = match("MESSAGE#346:00018:01", "nwparser.payload", "Deny Policy Alarm%{}", processor_chain([ setc("eventcategory","1502010000"), dup2, dup4, @@ -8317,31 +7474,17 @@ match("MESSAGE#346:00018:01", "nwparser.payload", "Deny Policy Alarm%{}", proces var msg348 = msg("00018:01", part574); -var part575 = // "Pattern{Constant('Device'), Field(p0,false)}" -match("MESSAGE#347:00018:02/0", "nwparser.payload", "Device%{p0}"); - -var part576 = // "Pattern{Constant('s '), Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,true), Constant(' by admin '), Field(administrator,false)}" -match("MESSAGE#347:00018:02/2", "nwparser.p0", "s %{change_attribute->} has been changed from %{change_old->} to %{change_new->} by admin %{administrator}"); - -var all113 = all_match({ - processors: [ - part575, - dup363, - part576, - ], - on_success: processor_chain([ - dup1, - dup2, - dup3, - dup4, - dup5, - ]), -}); +var part575 = match("MESSAGE#347:00018:02", "nwparser.payload", "Device%{quote}s %{change_attribute->} has been changed from %{change_old->} to %{change_new->} by admin %{administrator}", processor_chain([ + dup1, + dup2, + dup3, + dup4, + dup5, +])); -var msg349 = msg("00018:02", all113); +var msg349 = msg("00018:02", part575); -var part577 = // "Pattern{Field(fld2,true), Constant(' Policy ('), Field(policy_id,false), Constant(', '), Field(info,true), Constant(' ) was '), Field(disposition,true), Constant(' from host '), Field(saddr,true), Constant(' by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#348:00018:04", "nwparser.payload", "%{fld2->} Policy (%{policy_id}, %{info->} ) was %{disposition->} from host %{saddr->} by admin %{administrator->} (%{fld1})", processor_chain([ +var part576 = match("MESSAGE#348:00018:04", "nwparser.payload", "%{fld2->} Policy (%{policy_id}, %{info->} ) was %{disposition->} from host %{saddr->} by admin %{administrator->} (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8350,10 +7493,9 @@ match("MESSAGE#348:00018:04", "nwparser.payload", "%{fld2->} Policy (%{policy_id dup5, ])); -var msg350 = msg("00018:04", part577); +var msg350 = msg("00018:04", part576); -var part578 = // "Pattern{Field(fld2,true), Constant(' Policy ('), Field(policy_id,false), Constant(', '), Field(info,true), Constant(' ) was '), Field(disposition,true), Constant(' by admin '), Field(administrator,true), Constant(' via NSRP Peer')}" -match("MESSAGE#349:00018:16", "nwparser.payload", "%{fld2->} Policy (%{policy_id}, %{info->} ) was %{disposition->} by admin %{administrator->} via NSRP Peer", processor_chain([ +var part577 = match("MESSAGE#349:00018:16", "nwparser.payload", "%{fld2->} Policy (%{policy_id}, %{info->} ) was %{disposition->} by admin %{administrator->} via NSRP Peer", processor_chain([ dup17, dup2, dup3, @@ -8361,30 +7503,26 @@ match("MESSAGE#349:00018:16", "nwparser.payload", "%{fld2->} Policy (%{policy_id dup5, ])); -var msg351 = msg("00018:16", part578); +var msg351 = msg("00018:16", part577); -var part579 = // "Pattern{Field(fld2,true), Constant(' Policy '), Field(policy_id,true), Constant(' has been moved '), Field(p0,false)}" -match("MESSAGE#350:00018:06/0", "nwparser.payload", "%{fld2->} Policy %{policy_id->} has been moved %{p0}"); +var part578 = match("MESSAGE#350:00018:06/0", "nwparser.payload", "%{fld2->} Policy %{policy_id->} has been moved %{p0}"); -var part580 = // "Pattern{Constant('before '), Field(p0,false)}" -match("MESSAGE#350:00018:06/1_0", "nwparser.p0", "before %{p0}"); +var part579 = match("MESSAGE#350:00018:06/1_0", "nwparser.p0", "before %{p0}"); -var part581 = // "Pattern{Constant('after '), Field(p0,false)}" -match("MESSAGE#350:00018:06/1_1", "nwparser.p0", "after %{p0}"); +var part580 = match("MESSAGE#350:00018:06/1_1", "nwparser.p0", "after %{p0}"); var select126 = linear_select([ + part579, part580, - part581, ]); -var part582 = // "Pattern{Constant(''), Field(fld3,true), Constant(' by admin '), Field(administrator,false)}" -match("MESSAGE#350:00018:06/2", "nwparser.p0", "%{fld3->} by admin %{administrator}"); +var part581 = match("MESSAGE#350:00018:06/2", "nwparser.p0", "%{fld3->} by admin %{administrator}"); -var all114 = all_match({ +var all113 = all_match({ processors: [ - part579, + part578, select126, - part582, + part581, ], on_success: processor_chain([ dup17, @@ -8395,10 +7533,9 @@ var all114 = all_match({ ]), }); -var msg352 = msg("00018:06", all114); +var msg352 = msg("00018:06", all113); -var part583 = // "Pattern{Constant('Policy '), Field(policy_id,true), Constant(' application was modified to '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#351:00018:08", "nwparser.payload", "Policy %{policy_id->} application was modified to %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part582 = match("MESSAGE#351:00018:08", "nwparser.payload", "Policy %{policy_id->} application was modified to %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8407,10 +7544,9 @@ match("MESSAGE#351:00018:08", "nwparser.payload", "Policy %{policy_id->} applica dup5, ])); -var msg353 = msg("00018:08", part583); +var msg353 = msg("00018:08", part582); -var part584 = // "Pattern{Constant('Policy ('), Field(policy_id,false), Constant(', '), Field(info,false), Constant(') was '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#352:00018:09", "nwparser.payload", "Policy (%{policy_id}, %{info}) was %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part583 = match("MESSAGE#352:00018:09", "nwparser.payload", "Policy (%{policy_id}, %{info}) was %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ dup17, dup3, dup2, @@ -8419,30 +7555,26 @@ match("MESSAGE#352:00018:09", "nwparser.payload", "Policy (%{policy_id}, %{info} dup5, ])); -var msg354 = msg("00018:09", part584); +var msg354 = msg("00018:09", part583); -var part585 = // "Pattern{Constant('Policy ('), Field(policy_id,false), Constant(', '), Field(info,false), Constant(') was '), Field(p0,false)}" -match("MESSAGE#353:00018:10/0", "nwparser.payload", "Policy (%{policy_id}, %{info}) was %{p0}"); +var part584 = match("MESSAGE#353:00018:10/0", "nwparser.payload", "Policy (%{policy_id}, %{info}) was %{p0}"); -var part586 = // "Pattern{Field(disposition,true), Constant(' from peer unit by '), Field(p0,false)}" -match("MESSAGE#353:00018:10/1_0", "nwparser.p0", "%{disposition->} from peer unit by %{p0}"); +var part585 = match("MESSAGE#353:00018:10/1_0", "nwparser.p0", "%{disposition->} from peer unit by %{p0}"); -var part587 = // "Pattern{Field(disposition,true), Constant(' by '), Field(p0,false)}" -match("MESSAGE#353:00018:10/1_1", "nwparser.p0", "%{disposition->} by %{p0}"); +var part586 = match("MESSAGE#353:00018:10/1_1", "nwparser.p0", "%{disposition->} by %{p0}"); var select127 = linear_select([ + part585, part586, - part587, ]); -var part588 = // "Pattern{Field(username,true), Constant(' via '), Field(interface,true), Constant(' from host '), Field(saddr,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#353:00018:10/2", "nwparser.p0", "%{username->} via %{interface->} from host %{saddr->} (%{fld1})"); +var part587 = match("MESSAGE#353:00018:10/2", "nwparser.p0", "%{username->} via %{interface->} from host %{saddr->} (%{fld1})"); -var all115 = all_match({ +var all114 = all_match({ processors: [ - part585, + part584, select127, - part588, + part587, ], on_success: processor_chain([ dup17, @@ -8454,35 +7586,31 @@ var all115 = all_match({ ]), }); -var msg355 = msg("00018:10", all115); +var msg355 = msg("00018:10", all114); -var part589 = // "Pattern{Constant('Service '), Field(service,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#354:00018:11/1_0", "nwparser.p0", "Service %{service->} was %{p0}"); +var part588 = match("MESSAGE#354:00018:11/1_0", "nwparser.p0", "Service %{service->} was %{p0}"); -var part590 = // "Pattern{Constant('Attack group '), Field(signame,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#354:00018:11/1_1", "nwparser.p0", "Attack group %{signame->} was %{p0}"); +var part589 = match("MESSAGE#354:00018:11/1_1", "nwparser.p0", "Attack group %{signame->} was %{p0}"); var select128 = linear_select([ + part588, part589, - part590, ]); -var part591 = // "Pattern{Field(disposition,true), Constant(' to policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#354:00018:11/2", "nwparser.p0", "%{disposition->} to policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr->} %{p0}"); +var part590 = match("MESSAGE#354:00018:11/2", "nwparser.p0", "%{disposition->} to policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr->} %{p0}"); -var part592 = // "Pattern{Constant('to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. '), Field(p0,false)}" -match("MESSAGE#354:00018:11/3_0", "nwparser.p0", "to %{daddr}:%{dport}. %{p0}"); +var part591 = match("MESSAGE#354:00018:11/3_0", "nwparser.p0", "to %{daddr}:%{dport}. %{p0}"); var select129 = linear_select([ - part592, + part591, dup16, ]); -var all116 = all_match({ +var all115 = all_match({ processors: [ - dup162, + dup160, select128, - part591, + part590, select129, dup10, ], @@ -8496,34 +7624,29 @@ var all116 = all_match({ ]), }); -var msg356 = msg("00018:11", all116); +var msg356 = msg("00018:11", all115); -var part593 = // "Pattern{Constant('In policy '), Field(policy_id,false), Constant(', the '), Field(p0,false)}" -match("MESSAGE#355:00018:12/0", "nwparser.payload", "In policy %{policy_id}, the %{p0}"); +var part592 = match("MESSAGE#355:00018:12/0", "nwparser.payload", "In policy %{policy_id}, the %{p0}"); -var part594 = // "Pattern{Constant('application '), Field(p0,false)}" -match("MESSAGE#355:00018:12/1_0", "nwparser.p0", "application %{p0}"); +var part593 = match("MESSAGE#355:00018:12/1_0", "nwparser.p0", "application %{p0}"); -var part595 = // "Pattern{Constant('attack severity '), Field(p0,false)}" -match("MESSAGE#355:00018:12/1_1", "nwparser.p0", "attack severity %{p0}"); +var part594 = match("MESSAGE#355:00018:12/1_1", "nwparser.p0", "attack severity %{p0}"); -var part596 = // "Pattern{Constant('DI attack component '), Field(p0,false)}" -match("MESSAGE#355:00018:12/1_2", "nwparser.p0", "DI attack component %{p0}"); +var part595 = match("MESSAGE#355:00018:12/1_2", "nwparser.p0", "DI attack component %{p0}"); var select130 = linear_select([ + part593, part594, part595, - part596, ]); -var part597 = // "Pattern{Constant('was modified by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#355:00018:12/2", "nwparser.p0", "was modified by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})"); +var part596 = match("MESSAGE#355:00018:12/2", "nwparser.p0", "was modified by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})"); -var all117 = all_match({ +var all116 = all_match({ processors: [ - part593, + part592, select130, - part597, + part596, ], on_success: processor_chain([ dup17, @@ -8535,17 +7658,16 @@ var all117 = all_match({ ]), }); -var msg357 = msg("00018:12", all117); +var msg357 = msg("00018:12", all116); -var part598 = // "Pattern{Field(,false), Constant('address '), Field(dhost,false), Constant('('), Field(daddr,false), Constant(') was '), Field(disposition,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#356:00018:32/1", "nwparser.p0", "%{}address %{dhost}(%{daddr}) was %{disposition->} %{p0}"); +var part597 = match("MESSAGE#356:00018:32/1", "nwparser.p0", "%{}address %{dhost}(%{daddr}) was %{disposition->} %{p0}"); -var all118 = all_match({ +var all117 = all_match({ processors: [ - dup364, - part598, - dup365, - dup166, + dup361, + part597, + dup362, + dup164, ], on_success: processor_chain([ dup17, @@ -8557,17 +7679,16 @@ var all118 = all_match({ ]), }); -var msg358 = msg("00018:32", all118); +var msg358 = msg("00018:32", all117); -var part599 = // "Pattern{Field(,false), Constant('address '), Field(dhost,true), Constant(' was '), Field(disposition,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#357:00018:22/1", "nwparser.p0", "%{}address %{dhost->} was %{disposition->} %{p0}"); +var part598 = match("MESSAGE#357:00018:22/1", "nwparser.p0", "%{}address %{dhost->} was %{disposition->} %{p0}"); -var all119 = all_match({ +var all118 = all_match({ processors: [ - dup364, - part599, - dup365, - dup166, + dup361, + part598, + dup362, + dup164, ], on_success: processor_chain([ dup17, @@ -8579,24 +7700,22 @@ var all119 = all_match({ ]), }); -var msg359 = msg("00018:22", all119); +var msg359 = msg("00018:22", all118); -var part600 = // "Pattern{Field(agent,true), Constant(' was '), Field(disposition,true), Constant(' from policy '), Field(policy_id,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#358:00018:15/0", "nwparser.payload", "%{agent->} was %{disposition->} from policy %{policy_id->} %{p0}"); +var part599 = match("MESSAGE#358:00018:15/0", "nwparser.payload", "%{agent->} was %{disposition->} from policy %{policy_id->} %{p0}"); var select131 = linear_select([ dup78, dup77, ]); -var part601 = // "Pattern{Constant('address by admin '), Field(administrator,true), Constant(' via NSRP Peer')}" -match("MESSAGE#358:00018:15/2", "nwparser.p0", "address by admin %{administrator->} via NSRP Peer"); +var part600 = match("MESSAGE#358:00018:15/2", "nwparser.p0", "address by admin %{administrator->} via NSRP Peer"); -var all120 = all_match({ +var all119 = all_match({ processors: [ - part600, + part599, select131, - part601, + part600, ], on_success: processor_chain([ dup17, @@ -8607,50 +7726,42 @@ var all120 = all_match({ ]), }); -var msg360 = msg("00018:15", all120); +var msg360 = msg("00018:15", all119); -var part602 = // "Pattern{Field(agent,true), Constant(' was '), Field(disposition,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#359:00018:14/0", "nwparser.payload", "%{agent->} was %{disposition->} %{p0}"); +var part601 = match("MESSAGE#359:00018:14/0", "nwparser.payload", "%{agent->} was %{disposition->} %{p0}"); -var part603 = // "Pattern{Constant('to'), Field(p0,false)}" -match("MESSAGE#359:00018:14/1_0", "nwparser.p0", "to%{p0}"); +var part602 = match("MESSAGE#359:00018:14/1_0", "nwparser.p0", "to%{p0}"); -var part604 = // "Pattern{Constant('from'), Field(p0,false)}" -match("MESSAGE#359:00018:14/1_1", "nwparser.p0", "from%{p0}"); +var part603 = match("MESSAGE#359:00018:14/1_1", "nwparser.p0", "from%{p0}"); var select132 = linear_select([ + part602, part603, - part604, ]); -var part605 = // "Pattern{Field(,false), Constant('policy '), Field(policy_id,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#359:00018:14/2", "nwparser.p0", "%{}policy %{policy_id->} %{p0}"); +var part604 = match("MESSAGE#359:00018:14/2", "nwparser.p0", "%{}policy %{policy_id->} %{p0}"); -var part606 = // "Pattern{Constant('service '), Field(p0,false)}" -match("MESSAGE#359:00018:14/3_0", "nwparser.p0", "service %{p0}"); +var part605 = match("MESSAGE#359:00018:14/3_0", "nwparser.p0", "service %{p0}"); -var part607 = // "Pattern{Constant('source address '), Field(p0,false)}" -match("MESSAGE#359:00018:14/3_1", "nwparser.p0", "source address %{p0}"); +var part606 = match("MESSAGE#359:00018:14/3_1", "nwparser.p0", "source address %{p0}"); -var part608 = // "Pattern{Constant('destination address '), Field(p0,false)}" -match("MESSAGE#359:00018:14/3_2", "nwparser.p0", "destination address %{p0}"); +var part607 = match("MESSAGE#359:00018:14/3_2", "nwparser.p0", "destination address %{p0}"); var select133 = linear_select([ + part605, part606, part607, - part608, ]); -var part609 = // "Pattern{Constant('by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#359:00018:14/4", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})"); +var part608 = match("MESSAGE#359:00018:14/4", "nwparser.p0", "by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})"); -var all121 = all_match({ +var all120 = all_match({ processors: [ - part602, + part601, select132, - part605, + part604, select133, - part609, + part608, ], on_success: processor_chain([ dup17, @@ -8662,10 +7773,9 @@ var all121 = all_match({ ]), }); -var msg361 = msg("00018:14", all121); +var msg361 = msg("00018:14", all120); -var part610 = // "Pattern{Constant('Service '), Field(service,true), Constant(' was '), Field(disposition,true), Constant(' to policy ID '), Field(policy_id,true), Constant(' by admin '), Field(administrator,true), Constant(' via NSRP Peer . ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#360:00018:29", "nwparser.payload", "Service %{service->} was %{disposition->} to policy ID %{policy_id->} by admin %{administrator->} via NSRP Peer . (%{fld1})", processor_chain([ +var part609 = match("MESSAGE#360:00018:29", "nwparser.payload", "Service %{service->} was %{disposition->} to policy ID %{policy_id->} by admin %{administrator->} via NSRP Peer . (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8674,10 +7784,9 @@ match("MESSAGE#360:00018:29", "nwparser.payload", "Service %{service->} was %{di dup5, ])); -var msg362 = msg("00018:29", part610); +var msg362 = msg("00018:29", part609); -var part611 = // "Pattern{Field(agent,true), Constant(' was added to policy '), Field(policy_id,true), Constant(' '), Field(rule_group,true), Constant(' by admin '), Field(administrator,true), Constant(' via NSRP Peer '), Field(space,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#361:00018:07", "nwparser.payload", "%{agent->} was added to policy %{policy_id->} %{rule_group->} by admin %{administrator->} via NSRP Peer %{space->} (%{fld1})", processor_chain([ +var part610 = match("MESSAGE#361:00018:07", "nwparser.payload", "%{agent->} was added to policy %{policy_id->} %{rule_group->} by admin %{administrator->} via NSRP Peer %{space->} (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8686,10 +7795,9 @@ match("MESSAGE#361:00018:07", "nwparser.payload", "%{agent->} was added to polic dup5, ])); -var msg363 = msg("00018:07", part611); +var msg363 = msg("00018:07", part610); -var part612 = // "Pattern{Constant('Service '), Field(service,true), Constant(' was '), Field(disposition,true), Constant(' to policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#362:00018:18", "nwparser.payload", "Service %{service->} was %{disposition->} to policy ID %{policy_id->} by %{username->} via %{logon_type->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part611 = match("MESSAGE#362:00018:18", "nwparser.payload", "Service %{service->} was %{disposition->} to policy ID %{policy_id->} by %{username->} via %{logon_type->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8698,10 +7806,9 @@ match("MESSAGE#362:00018:18", "nwparser.payload", "Service %{service->} was %{di dup5, ])); -var msg364 = msg("00018:18", part612); +var msg364 = msg("00018:18", part611); -var part613 = // "Pattern{Constant('AntiSpam ns-profile was '), Field(disposition,true), Constant(' from policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#363:00018:17", "nwparser.payload", "AntiSpam ns-profile was %{disposition->} from policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ +var part612 = match("MESSAGE#363:00018:17", "nwparser.payload", "AntiSpam ns-profile was %{disposition->} from policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8710,10 +7817,9 @@ match("MESSAGE#363:00018:17", "nwparser.payload", "AntiSpam ns-profile was %{dis dup5, ])); -var msg365 = msg("00018:17", part613); +var msg365 = msg("00018:17", part612); -var part614 = // "Pattern{Constant('Source address Info '), Field(info,true), Constant(' was '), Field(disposition,true), Constant(' to policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#364:00018:19", "nwparser.payload", "Source address Info %{info->} was %{disposition->} to policy ID %{policy_id->} by %{username->} via %{logon_type->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part613 = match("MESSAGE#364:00018:19", "nwparser.payload", "Source address Info %{info->} was %{disposition->} to policy ID %{policy_id->} by %{username->} via %{logon_type->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8722,52 +7828,45 @@ match("MESSAGE#364:00018:19", "nwparser.payload", "Source address Info %{info->} dup5, ])); -var msg366 = msg("00018:19", part614); +var msg366 = msg("00018:19", part613); -var part615 = // "Pattern{Constant('Destination '), Field(p0,false)}" -match("MESSAGE#365:00018:23/0_0", "nwparser.payload", "Destination %{p0}"); +var part614 = match("MESSAGE#365:00018:23/0_0", "nwparser.payload", "Destination %{p0}"); -var part616 = // "Pattern{Constant('Source '), Field(p0,false)}" -match("MESSAGE#365:00018:23/0_1", "nwparser.payload", "Source %{p0}"); +var part615 = match("MESSAGE#365:00018:23/0_1", "nwparser.payload", "Source %{p0}"); var select134 = linear_select([ + part614, part615, - part616, ]); -var part617 = // "Pattern{Constant('address '), Field(info,true), Constant(' was added to policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#365:00018:23/1", "nwparser.p0", "address %{info->} was added to policy ID %{policy_id->} by %{username->} via %{logon_type->} %{p0}"); +var part616 = match("MESSAGE#365:00018:23/1", "nwparser.p0", "address %{info->} was added to policy ID %{policy_id->} by %{username->} via %{logon_type->} %{p0}"); -var part618 = // "Pattern{Constant('from host '), Field(p0,false)}" -match("MESSAGE#365:00018:23/2_0", "nwparser.p0", "from host %{p0}"); +var part617 = match("MESSAGE#365:00018:23/2_0", "nwparser.p0", "from host %{p0}"); var select135 = linear_select([ - part618, + part617, dup103, ]); -var part619 = // "Pattern{Field(saddr,true), Constant(' to '), Field(daddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#365:00018:23/4_0", "nwparser.p0", "%{saddr->} to %{daddr->} %{p0}"); +var part618 = match("MESSAGE#365:00018:23/4_0", "nwparser.p0", "%{saddr->} to %{daddr->} %{p0}"); -var part620 = // "Pattern{Field(daddr,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#365:00018:23/4_1", "nwparser.p0", "%{daddr->} %{p0}"); +var part619 = match("MESSAGE#365:00018:23/4_1", "nwparser.p0", "%{daddr->} %{p0}"); var select136 = linear_select([ + part618, part619, - part620, ]); -var part621 = // "Pattern{Field(dport,false), Constant(':('), Field(fld1,false), Constant(')')}" -match("MESSAGE#365:00018:23/5", "nwparser.p0", "%{dport}:(%{fld1})"); +var part620 = match("MESSAGE#365:00018:23/5", "nwparser.p0", "%{dport}:(%{fld1})"); -var all122 = all_match({ +var all121 = all_match({ processors: [ select134, - part617, + part616, select135, dup23, select136, - part621, + part620, ], on_success: processor_chain([ dup17, @@ -8779,10 +7878,9 @@ var all122 = all_match({ ]), }); -var msg367 = msg("00018:23", all122); +var msg367 = msg("00018:23", all121); -var part622 = // "Pattern{Constant('Service '), Field(service,true), Constant(' was deleted from policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#366:00018:21", "nwparser.payload", "Service %{service->} was deleted from policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr}:%{sport}. (%{fld1})", processor_chain([ +var part621 = match("MESSAGE#366:00018:21", "nwparser.payload", "Service %{service->} was deleted from policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr}:%{sport}. (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8791,10 +7889,9 @@ match("MESSAGE#366:00018:21", "nwparser.payload", "Service %{service->} was dele dup5, ])); -var msg368 = msg("00018:21", part622); +var msg368 = msg("00018:21", part621); -var part623 = // "Pattern{Constant('Policy ('), Field(policyname,false), Constant(') was '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#367:00018:24", "nwparser.payload", "Policy (%{policyname}) was %{disposition->} by %{username->} via %{logon_type->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part622 = match("MESSAGE#367:00018:24", "nwparser.payload", "Policy (%{policyname}) was %{disposition->} by %{username->} via %{logon_type->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -8803,15 +7900,14 @@ match("MESSAGE#367:00018:24", "nwparser.payload", "Policy (%{policyname}) was %{ dup5, ])); -var msg369 = msg("00018:24", part623); +var msg369 = msg("00018:24", part622); -var part624 = // "Pattern{Field(,false), Constant('address '), Field(info,true), Constant(' was added to policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#368:00018:25/1", "nwparser.p0", "%{}address %{info->} was added to policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr}. (%{fld1})"); +var part623 = match("MESSAGE#368:00018:25/1", "nwparser.p0", "%{}address %{info->} was added to policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr}. (%{fld1})"); -var all123 = all_match({ +var all122 = all_match({ processors: [ - dup366, - part624, + dup363, + part623, ], on_success: processor_chain([ dup17, @@ -8823,15 +7919,14 @@ var all123 = all_match({ ]), }); -var msg370 = msg("00018:25", all123); +var msg370 = msg("00018:25", all122); -var part625 = // "Pattern{Field(,false), Constant('address '), Field(info,true), Constant(' was deleted from policy ID '), Field(policy_id,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#369:00018:30/1", "nwparser.p0", "%{}address %{info->} was deleted from policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr}. (%{fld1})"); +var part624 = match("MESSAGE#369:00018:30/1", "nwparser.p0", "%{}address %{info->} was deleted from policy ID %{policy_id->} by %{username->} via %{logon_type->} from host %{saddr}. (%{fld1})"); -var all124 = all_match({ +var all123 = all_match({ processors: [ - dup366, - part625, + dup363, + part624, ], on_success: processor_chain([ dup17, @@ -8843,23 +7938,21 @@ var all124 = all_match({ ]), }); -var msg371 = msg("00018:30", all124); +var msg371 = msg("00018:30", all123); -var part626 = // "Pattern{Constant('In policy '), Field(policy_id,false), Constant(', the application was modified to '), Field(disposition,true), Constant(' by '), Field(p0,false)}" -match("MESSAGE#370:00018:26/0", "nwparser.payload", "In policy %{policy_id}, the application was modified to %{disposition->} by %{p0}"); +var part625 = match("MESSAGE#370:00018:26/0", "nwparser.payload", "In policy %{policy_id}, the application was modified to %{disposition->} by %{p0}"); -var part627 = // "Pattern{Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant('. ('), Field(p0,false)}" -match("MESSAGE#370:00018:26/2_1", "nwparser.p0", "%{logon_type->} from host %{saddr}. (%{p0}"); +var part626 = match("MESSAGE#370:00018:26/2_1", "nwparser.p0", "%{logon_type->} from host %{saddr}. (%{p0}"); var select137 = linear_select([ dup48, - part627, + part626, ]); -var all125 = all_match({ +var all124 = all_match({ processors: [ - part626, - dup367, + part625, + dup364, select137, dup41, ], @@ -8873,10 +7966,9 @@ var all125 = all_match({ ]), }); -var msg372 = msg("00018:26", all125); +var msg372 = msg("00018:26", all124); -var part628 = // "Pattern{Constant('In policy '), Field(policy_id,false), Constant(', the DI attack component was modified by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#371:00018:27", "nwparser.payload", "In policy %{policy_id}, the DI attack component was modified by %{username->} via %{logon_type->} from host %{saddr}:%{sport}. (%{fld1})", processor_chain([ +var part627 = match("MESSAGE#371:00018:27", "nwparser.payload", "In policy %{policy_id}, the DI attack component was modified by %{username->} via %{logon_type->} from host %{saddr}:%{sport}. (%{fld1})", processor_chain([ dup17, dup2, dup4, @@ -8884,10 +7976,9 @@ match("MESSAGE#371:00018:27", "nwparser.payload", "In policy %{policy_id}, the D dup9, ])); -var msg373 = msg("00018:27", part628); +var msg373 = msg("00018:27", part627); -var part629 = // "Pattern{Constant('In policy '), Field(policyname,false), Constant(', the DI attack component was modified by admin '), Field(administrator,true), Constant(' via '), Field(logon_type,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#372:00018:28", "nwparser.payload", "In policy %{policyname}, the DI attack component was modified by admin %{administrator->} via %{logon_type}. (%{fld1})", processor_chain([ +var part628 = match("MESSAGE#372:00018:28", "nwparser.payload", "In policy %{policyname}, the DI attack component was modified by admin %{administrator->} via %{logon_type}. (%{fld1})", processor_chain([ dup17, dup2, dup4, @@ -8896,10 +7987,9 @@ match("MESSAGE#372:00018:28", "nwparser.payload", "In policy %{policyname}, the setc("info","the DI attack component was modified"), ])); -var msg374 = msg("00018:28", part629); +var msg374 = msg("00018:28", part628); -var part630 = // "Pattern{Constant('Policy ('), Field(policy_id,false), Constant(', '), Field(info,false), Constant(') was '), Field(disposition,false)}" -match("MESSAGE#373:00018:03", "nwparser.payload", "Policy (%{policy_id}, %{info}) was %{disposition}", processor_chain([ +var part629 = match("MESSAGE#373:00018:03", "nwparser.payload", "Policy (%{policy_id}, %{info}) was %{disposition}", processor_chain([ dup17, dup2, dup3, @@ -8907,10 +7997,9 @@ match("MESSAGE#373:00018:03", "nwparser.payload", "Policy (%{policy_id}, %{info} dup5, ])); -var msg375 = msg("00018:03", part630); +var msg375 = msg("00018:03", part629); -var part631 = // "Pattern{Constant('In policy '), Field(policy_id,false), Constant(', the option '), Field(fld2,true), Constant(' was '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1213:00018:31", "nwparser.payload", "In policy %{policy_id}, the option %{fld2->} was %{disposition}. (%{fld1})", processor_chain([ +var part630 = match("MESSAGE#1213:00018:31", "nwparser.payload", "In policy %{policy_id}, the option %{fld2->} was %{disposition}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -8919,7 +8008,7 @@ match("MESSAGE#1213:00018:31", "nwparser.payload", "In policy %{policy_id}, the dup5, ])); -var msg376 = msg("00018:31", part631); +var msg376 = msg("00018:31", part630); var select138 = linear_select([ msg347, @@ -8954,8 +8043,7 @@ var select138 = linear_select([ msg376, ]); -var part632 = // "Pattern{Constant('Attempt to enable WebTrends has '), Field(disposition,true), Constant(' because WebTrends settings have not yet been configured')}" -match("MESSAGE#374:00019", "nwparser.payload", "Attempt to enable WebTrends has %{disposition->} because WebTrends settings have not yet been configured", processor_chain([ +var part631 = match("MESSAGE#374:00019", "nwparser.payload", "Attempt to enable WebTrends has %{disposition->} because WebTrends settings have not yet been configured", processor_chain([ dup18, dup2, dup3, @@ -8963,16 +8051,15 @@ match("MESSAGE#374:00019", "nwparser.payload", "Attempt to enable WebTrends has dup5, ])); -var msg377 = msg("00019", part632); +var msg377 = msg("00019", part631); -var part633 = // "Pattern{Constant('has '), Field(disposition,true), Constant(' because syslog settings have not yet been configured')}" -match("MESSAGE#375:00019:01/2", "nwparser.p0", "has %{disposition->} because syslog settings have not yet been configured"); +var part632 = match("MESSAGE#375:00019:01/2", "nwparser.p0", "has %{disposition->} because syslog settings have not yet been configured"); -var all126 = all_match({ +var all125 = all_match({ processors: [ - dup167, - dup368, - part633, + dup165, + dup365, + part632, ], on_success: processor_chain([ dup1, @@ -8983,25 +8070,22 @@ var all126 = all_match({ ]), }); -var msg378 = msg("00019:01", all126); +var msg378 = msg("00019:01", all125); -var part634 = // "Pattern{Constant('Socket cannot be assigned for '), Field(p0,false)}" -match("MESSAGE#376:00019:02/0", "nwparser.payload", "Socket cannot be assigned for %{p0}"); +var part633 = match("MESSAGE#376:00019:02/0", "nwparser.payload", "Socket cannot be assigned for %{p0}"); -var part635 = // "Pattern{Constant('WebTrends'), Field(,false)}" -match("MESSAGE#376:00019:02/1_0", "nwparser.p0", "WebTrends%{}"); +var part634 = match("MESSAGE#376:00019:02/1_0", "nwparser.p0", "WebTrends%{}"); -var part636 = // "Pattern{Constant('syslog'), Field(,false)}" -match("MESSAGE#376:00019:02/1_1", "nwparser.p0", "syslog%{}"); +var part635 = match("MESSAGE#376:00019:02/1_1", "nwparser.p0", "syslog%{}"); var select139 = linear_select([ + part634, part635, - part636, ]); -var all127 = all_match({ +var all126 = all_match({ processors: [ - part634, + part633, select139, ], on_success: processor_chain([ @@ -9013,10 +8097,9 @@ var all127 = all_match({ ]), }); -var msg379 = msg("00019:02", all127); +var msg379 = msg("00019:02", all126); -var part637 = // "Pattern{Constant('Syslog VPN encryption has been '), Field(disposition,false)}" -match("MESSAGE#377:00019:03", "nwparser.payload", "Syslog VPN encryption has been %{disposition}", processor_chain([ +var part636 = match("MESSAGE#377:00019:03", "nwparser.payload", "Syslog VPN encryption has been %{disposition}", processor_chain([ dup91, dup2, dup3, @@ -9024,27 +8107,27 @@ match("MESSAGE#377:00019:03", "nwparser.payload", "Syslog VPN encryption has bee dup5, ])); -var msg380 = msg("00019:03", part637); +var msg380 = msg("00019:03", part636); var select140 = linear_select([ - dup171, + dup169, dup78, ]); var select141 = linear_select([ dup139, - dup172, + dup170, dup137, dup122, ]); -var all128 = all_match({ +var all127 = all_match({ processors: [ - dup170, + dup168, select140, dup23, select141, - dup173, + dup171, ], on_success: processor_chain([ dup1, @@ -9055,36 +8138,28 @@ var all128 = all_match({ ]), }); -var msg381 = msg("00019:04", all128); +var msg381 = msg("00019:04", all127); -var part638 = // "Pattern{Constant('Syslog message level has been changed to '), Field(p0,false)}" -match("MESSAGE#379:00019:05/0", "nwparser.payload", "Syslog message level has been changed to %{p0}"); +var part637 = match("MESSAGE#379:00019:05/0", "nwparser.payload", "Syslog message level has been changed to %{p0}"); -var part639 = // "Pattern{Constant('debug'), Field(,false)}" -match("MESSAGE#379:00019:05/1_0", "nwparser.p0", "debug%{}"); +var part638 = match("MESSAGE#379:00019:05/1_0", "nwparser.p0", "debug%{}"); -var part640 = // "Pattern{Constant('information'), Field(,false)}" -match("MESSAGE#379:00019:05/1_1", "nwparser.p0", "information%{}"); +var part639 = match("MESSAGE#379:00019:05/1_1", "nwparser.p0", "information%{}"); -var part641 = // "Pattern{Constant('notification'), Field(,false)}" -match("MESSAGE#379:00019:05/1_2", "nwparser.p0", "notification%{}"); +var part640 = match("MESSAGE#379:00019:05/1_2", "nwparser.p0", "notification%{}"); -var part642 = // "Pattern{Constant('warning'), Field(,false)}" -match("MESSAGE#379:00019:05/1_3", "nwparser.p0", "warning%{}"); +var part641 = match("MESSAGE#379:00019:05/1_3", "nwparser.p0", "warning%{}"); -var part643 = // "Pattern{Constant('error'), Field(,false)}" -match("MESSAGE#379:00019:05/1_4", "nwparser.p0", "error%{}"); +var part642 = match("MESSAGE#379:00019:05/1_4", "nwparser.p0", "error%{}"); -var part644 = // "Pattern{Constant('critical'), Field(,false)}" -match("MESSAGE#379:00019:05/1_5", "nwparser.p0", "critical%{}"); +var part643 = match("MESSAGE#379:00019:05/1_5", "nwparser.p0", "critical%{}"); -var part645 = // "Pattern{Constant('alert'), Field(,false)}" -match("MESSAGE#379:00019:05/1_6", "nwparser.p0", "alert%{}"); +var part644 = match("MESSAGE#379:00019:05/1_6", "nwparser.p0", "alert%{}"); -var part646 = // "Pattern{Constant('emergency'), Field(,false)}" -match("MESSAGE#379:00019:05/1_7", "nwparser.p0", "emergency%{}"); +var part645 = match("MESSAGE#379:00019:05/1_7", "nwparser.p0", "emergency%{}"); var select142 = linear_select([ + part638, part639, part640, part641, @@ -9092,12 +8167,11 @@ var select142 = linear_select([ part643, part644, part645, - part646, ]); -var all129 = all_match({ +var all128 = all_match({ processors: [ - part638, + part637, select142, ], on_success: processor_chain([ @@ -9109,17 +8183,16 @@ var all129 = all_match({ ]), }); -var msg382 = msg("00019:05", all129); +var msg382 = msg("00019:05", all128); -var part647 = // "Pattern{Constant('has been changed to '), Field(p0,false)}" -match("MESSAGE#380:00019:06/2", "nwparser.p0", "has been changed to %{p0}"); +var part646 = match("MESSAGE#380:00019:06/2", "nwparser.p0", "has been changed to %{p0}"); -var all130 = all_match({ +var all129 = all_match({ processors: [ - dup170, - dup369, - part647, - dup370, + dup168, + dup366, + part646, + dup367, ], on_success: processor_chain([ dup1, @@ -9130,10 +8203,9 @@ var all130 = all_match({ ]), }); -var msg383 = msg("00019:06", all130); +var msg383 = msg("00019:06", all129); -var part648 = // "Pattern{Constant('WebTrends VPN encryption has been '), Field(disposition,false)}" -match("MESSAGE#381:00019:07", "nwparser.payload", "WebTrends VPN encryption has been %{disposition}", processor_chain([ +var part647 = match("MESSAGE#381:00019:07", "nwparser.payload", "WebTrends VPN encryption has been %{disposition}", processor_chain([ dup91, dup2, dup3, @@ -9141,10 +8213,9 @@ match("MESSAGE#381:00019:07", "nwparser.payload", "WebTrends VPN encryption has dup5, ])); -var msg384 = msg("00019:07", part648); +var msg384 = msg("00019:07", part647); -var part649 = // "Pattern{Constant('WebTrends has been '), Field(disposition,false)}" -match("MESSAGE#382:00019:08", "nwparser.payload", "WebTrends has been %{disposition}", processor_chain([ +var part648 = match("MESSAGE#382:00019:08", "nwparser.payload", "WebTrends has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -9152,22 +8223,21 @@ match("MESSAGE#382:00019:08", "nwparser.payload", "WebTrends has been %{disposit dup5, ])); -var msg385 = msg("00019:08", part649); +var msg385 = msg("00019:08", part648); -var part650 = // "Pattern{Constant('WebTrends host '), Field(p0,false)}" -match("MESSAGE#383:00019:09/0", "nwparser.payload", "WebTrends host %{p0}"); +var part649 = match("MESSAGE#383:00019:09/0", "nwparser.payload", "WebTrends host %{p0}"); var select143 = linear_select([ dup139, - dup172, + dup170, dup137, ]); -var all131 = all_match({ +var all130 = all_match({ processors: [ - part650, + part649, select143, - dup173, + dup171, ], on_success: processor_chain([ dup1, @@ -9178,22 +8248,20 @@ var all131 = all_match({ ]), }); -var msg386 = msg("00019:09", all131); +var msg386 = msg("00019:09", all130); -var part651 = // "Pattern{Constant('Traffic logging via syslog '), Field(p0,false)}" -match("MESSAGE#384:00019:10/1_0", "nwparser.p0", "Traffic logging via syslog %{p0}"); +var part650 = match("MESSAGE#384:00019:10/1_0", "nwparser.p0", "Traffic logging via syslog %{p0}"); -var part652 = // "Pattern{Constant('Syslog '), Field(p0,false)}" -match("MESSAGE#384:00019:10/1_1", "nwparser.p0", "Syslog %{p0}"); +var part651 = match("MESSAGE#384:00019:10/1_1", "nwparser.p0", "Syslog %{p0}"); var select144 = linear_select([ + part650, part651, - part652, ]); -var all132 = all_match({ +var all131 = all_match({ processors: [ - dup185, + dup183, select144, dup138, ], @@ -9206,16 +8274,15 @@ var all132 = all_match({ ]), }); -var msg387 = msg("00019:10", all132); +var msg387 = msg("00019:10", all131); -var part653 = // "Pattern{Constant('has '), Field(disposition,true), Constant(' because there is no syslog server defined')}" -match("MESSAGE#385:00019:11/2", "nwparser.p0", "has %{disposition->} because there is no syslog server defined"); +var part652 = match("MESSAGE#385:00019:11/2", "nwparser.p0", "has %{disposition->} because there is no syslog server defined"); -var all133 = all_match({ +var all132 = all_match({ processors: [ - dup167, - dup368, - part653, + dup165, + dup365, + part652, ], on_success: processor_chain([ dup18, @@ -9226,10 +8293,9 @@ var all133 = all_match({ ]), }); -var msg388 = msg("00019:11", all133); +var msg388 = msg("00019:11", all132); -var part654 = // "Pattern{Constant('Removing all syslog servers'), Field(,false)}" -match("MESSAGE#386:00019:12", "nwparser.payload", "Removing all syslog servers%{}", processor_chain([ +var part653 = match("MESSAGE#386:00019:12", "nwparser.payload", "Removing all syslog servers%{}", processor_chain([ dup1, dup2, dup3, @@ -9237,24 +8303,22 @@ match("MESSAGE#386:00019:12", "nwparser.payload", "Removing all syslog servers%{ dup5, ])); -var msg389 = msg("00019:12", part654); +var msg389 = msg("00019:12", part653); -var part655 = // "Pattern{Constant('Syslog server '), Field(hostip,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#387:00019:13/0", "nwparser.payload", "Syslog server %{hostip->} %{p0}"); +var part654 = match("MESSAGE#387:00019:13/0", "nwparser.payload", "Syslog server %{hostip->} %{p0}"); var select145 = linear_select([ dup107, dup106, ]); -var part656 = // "Pattern{Constant(''), Field(disposition,false)}" -match("MESSAGE#387:00019:13/2", "nwparser.p0", "%{disposition}"); +var part655 = match("MESSAGE#387:00019:13/2", "nwparser.p0", "%{disposition}"); -var all134 = all_match({ +var all133 = all_match({ processors: [ - part655, + part654, select145, - part656, + part655, ], on_success: processor_chain([ dup1, @@ -9265,17 +8329,16 @@ var all134 = all_match({ ]), }); -var msg390 = msg("00019:13", all134); +var msg390 = msg("00019:13", all133); -var part657 = // "Pattern{Constant('for '), Field(hostip,true), Constant(' has been changed to '), Field(p0,false)}" -match("MESSAGE#388:00019:14/2", "nwparser.p0", "for %{hostip->} has been changed to %{p0}"); +var part656 = match("MESSAGE#388:00019:14/2", "nwparser.p0", "for %{hostip->} has been changed to %{p0}"); -var all135 = all_match({ +var all134 = all_match({ processors: [ - dup170, - dup369, - part657, - dup370, + dup168, + dup366, + part656, + dup367, ], on_success: processor_chain([ dup50, @@ -9288,10 +8351,9 @@ var all135 = all_match({ ]), }); -var msg391 = msg("00019:14", all135); +var msg391 = msg("00019:14", all134); -var part658 = // "Pattern{Constant('Syslog cannot connect to the TCP server '), Field(hostip,false), Constant('; the connection is closed.')}" -match("MESSAGE#389:00019:15", "nwparser.payload", "Syslog cannot connect to the TCP server %{hostip}; the connection is closed.", processor_chain([ +var part657 = match("MESSAGE#389:00019:15", "nwparser.payload", "Syslog cannot connect to the TCP server %{hostip}; the connection is closed.", processor_chain([ dup27, dup2, dup3, @@ -9299,10 +8361,9 @@ match("MESSAGE#389:00019:15", "nwparser.payload", "Syslog cannot connect to the dup5, ])); -var msg392 = msg("00019:15", part658); +var msg392 = msg("00019:15", part657); -var part659 = // "Pattern{Constant('All syslog servers were removed.'), Field(,false)}" -match("MESSAGE#390:00019:16", "nwparser.payload", "All syslog servers were removed.%{}", processor_chain([ +var part658 = match("MESSAGE#390:00019:16", "nwparser.payload", "All syslog servers were removed.%{}", processor_chain([ setc("eventcategory","1701030000"), setc("ec_activity","Delete"), dup51, @@ -9312,10 +8373,9 @@ match("MESSAGE#390:00019:16", "nwparser.payload", "All syslog servers were remov dup5, ])); -var msg393 = msg("00019:16", part659); +var msg393 = msg("00019:16", part658); -var part660 = // "Pattern{Constant('Syslog server '), Field(hostip,true), Constant(' host port number has been changed to '), Field(network_port,true), Constant(' '), Field(fld5,false)}" -match("MESSAGE#391:00019:17", "nwparser.payload", "Syslog server %{hostip->} host port number has been changed to %{network_port->} %{fld5}", processor_chain([ +var part659 = match("MESSAGE#391:00019:17", "nwparser.payload", "Syslog server %{hostip->} host port number has been changed to %{network_port->} %{fld5}", processor_chain([ dup50, dup43, dup51, @@ -9325,25 +8385,22 @@ match("MESSAGE#391:00019:17", "nwparser.payload", "Syslog server %{hostip->} hos dup5, ])); -var msg394 = msg("00019:17", part660); +var msg394 = msg("00019:17", part659); -var part661 = // "Pattern{Constant('Traffic logging '), Field(p0,false)}" -match("MESSAGE#392:00019:18/0", "nwparser.payload", "Traffic logging %{p0}"); +var part660 = match("MESSAGE#392:00019:18/0", "nwparser.payload", "Traffic logging %{p0}"); -var part662 = // "Pattern{Constant('via syslog '), Field(p0,false)}" -match("MESSAGE#392:00019:18/1_0", "nwparser.p0", "via syslog %{p0}"); +var part661 = match("MESSAGE#392:00019:18/1_0", "nwparser.p0", "via syslog %{p0}"); -var part663 = // "Pattern{Constant('for syslog server '), Field(hostip,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#392:00019:18/1_1", "nwparser.p0", "for syslog server %{hostip->} %{p0}"); +var part662 = match("MESSAGE#392:00019:18/1_1", "nwparser.p0", "for syslog server %{hostip->} %{p0}"); var select146 = linear_select([ + part661, part662, - part663, ]); -var all136 = all_match({ +var all135 = all_match({ processors: [ - part661, + part660, select146, dup138, ], @@ -9356,10 +8413,9 @@ var all136 = all_match({ ]), }); -var msg395 = msg("00019:18", all136); +var msg395 = msg("00019:18", all135); -var part664 = // "Pattern{Constant('Transport protocol for syslog server '), Field(hostip,true), Constant(' was changed to udp')}" -match("MESSAGE#393:00019:19", "nwparser.payload", "Transport protocol for syslog server %{hostip->} was changed to udp", processor_chain([ +var part663 = match("MESSAGE#393:00019:19", "nwparser.payload", "Transport protocol for syslog server %{hostip->} was changed to udp", processor_chain([ dup50, dup43, dup51, @@ -9369,10 +8425,9 @@ match("MESSAGE#393:00019:19", "nwparser.payload", "Transport protocol for syslog dup5, ])); -var msg396 = msg("00019:19", part664); +var msg396 = msg("00019:19", part663); -var part665 = // "Pattern{Constant('The traffic/IDP syslog is enabled on backup device by netscreen via web from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#394:00019:20", "nwparser.payload", "The traffic/IDP syslog is enabled on backup device by netscreen via web from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ +var part664 = match("MESSAGE#394:00019:20", "nwparser.payload", "The traffic/IDP syslog is enabled on backup device by netscreen via web from host %{saddr->} to %{daddr}:%{dport}. (%{fld1})", processor_chain([ dup50, dup43, dup51, @@ -9382,7 +8437,7 @@ match("MESSAGE#394:00019:20", "nwparser.payload", "The traffic/IDP syslog is ena dup5, ])); -var msg397 = msg("00019:20", part665); +var msg397 = msg("00019:20", part664); var select147 = linear_select([ msg377, @@ -9408,8 +8463,7 @@ var select147 = linear_select([ msg397, ]); -var part666 = // "Pattern{Constant('Schedule '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#395:00020", "nwparser.payload", "Schedule %{fld2->} has been %{disposition}", processor_chain([ +var part665 = match("MESSAGE#395:00020", "nwparser.payload", "Schedule %{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -9417,42 +8471,37 @@ match("MESSAGE#395:00020", "nwparser.payload", "Schedule %{fld2->} has been %{di dup5, ])); -var msg398 = msg("00020", part666); +var msg398 = msg("00020", part665); -var part667 = // "Pattern{Constant('System memory is low '), Field(p0,false)}" -match("MESSAGE#396:00020:01/0", "nwparser.payload", "System memory is low %{p0}"); +var part666 = match("MESSAGE#396:00020:01/0", "nwparser.payload", "System memory is low %{p0}"); -var part668 = // "Pattern{Constant('( '), Field(p0,false)}" -match("MESSAGE#396:00020:01/1_1", "nwparser.p0", "( %{p0}"); +var part667 = match("MESSAGE#396:00020:01/1_1", "nwparser.p0", "( %{p0}"); var select148 = linear_select([ dup152, - part668, + part667, ]); -var part669 = // "Pattern{Constant(''), Field(fld2,true), Constant(' bytes allocated out of '), Field(p0,false)}" -match("MESSAGE#396:00020:01/2", "nwparser.p0", "%{fld2->} bytes allocated out of %{p0}"); +var part668 = match("MESSAGE#396:00020:01/2", "nwparser.p0", "%{fld2->} bytes allocated out of %{p0}"); -var part670 = // "Pattern{Constant('total '), Field(fld3,true), Constant(' bytes')}" -match("MESSAGE#396:00020:01/3_0", "nwparser.p0", "total %{fld3->} bytes"); +var part669 = match("MESSAGE#396:00020:01/3_0", "nwparser.p0", "total %{fld3->} bytes"); -var part671 = // "Pattern{Field(fld4,true), Constant(' bytes total')}" -match("MESSAGE#396:00020:01/3_1", "nwparser.p0", "%{fld4->} bytes total"); +var part670 = match("MESSAGE#396:00020:01/3_1", "nwparser.p0", "%{fld4->} bytes total"); var select149 = linear_select([ + part669, part670, - part671, ]); -var all137 = all_match({ +var all136 = all_match({ processors: [ - part667, + part666, select148, - part669, + part668, select149, ], on_success: processor_chain([ - dup186, + dup184, dup2, dup3, dup4, @@ -9460,18 +8509,17 @@ var all137 = all_match({ ]), }); -var msg399 = msg("00020:01", all137); +var msg399 = msg("00020:01", all136); -var part672 = // "Pattern{Constant('System memory is low ('), Field(fld2,true), Constant(' allocated out of '), Field(fld3,true), Constant(' ) '), Field(fld4,true), Constant(' times in '), Field(fld5,false)}" -match("MESSAGE#397:00020:02", "nwparser.payload", "System memory is low (%{fld2->} allocated out of %{fld3->} ) %{fld4->} times in %{fld5}", processor_chain([ - dup186, +var part671 = match("MESSAGE#397:00020:02", "nwparser.payload", "System memory is low (%{fld2->} allocated out of %{fld3->} ) %{fld4->} times in %{fld5}", processor_chain([ + dup184, dup2, dup3, dup4, dup5, ])); -var msg400 = msg("00020:02", part672); +var msg400 = msg("00020:02", part671); var select150 = linear_select([ msg398, @@ -9479,8 +8527,7 @@ var select150 = linear_select([ msg400, ]); -var part673 = // "Pattern{Constant('DIP '), Field(fld2,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#398:00021", "nwparser.payload", "DIP %{fld2->} has been %{disposition}", processor_chain([ +var part672 = match("MESSAGE#398:00021", "nwparser.payload", "DIP %{fld2->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -9488,10 +8535,9 @@ match("MESSAGE#398:00021", "nwparser.payload", "DIP %{fld2->} has been %{disposi dup5, ])); -var msg401 = msg("00021", part673); +var msg401 = msg("00021", part672); -var part674 = // "Pattern{Constant('IP pool '), Field(fld2,true), Constant(' with range '), Field(info,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#399:00021:01", "nwparser.payload", "IP pool %{fld2->} with range %{info->} has been %{disposition}", processor_chain([ +var part673 = match("MESSAGE#399:00021:01", "nwparser.payload", "IP pool %{fld2->} with range %{info->} has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -9499,10 +8545,9 @@ match("MESSAGE#399:00021:01", "nwparser.payload", "IP pool %{fld2->} with range dup5, ])); -var msg402 = msg("00021:01", part674); +var msg402 = msg("00021:01", part673); -var part675 = // "Pattern{Constant('DNS server is not configured'), Field(,false)}" -match("MESSAGE#400:00021:02", "nwparser.payload", "DNS server is not configured%{}", processor_chain([ +var part674 = match("MESSAGE#400:00021:02", "nwparser.payload", "DNS server is not configured%{}", processor_chain([ dup18, dup2, dup3, @@ -9510,21 +8555,19 @@ match("MESSAGE#400:00021:02", "nwparser.payload", "DNS server is not configured% dup5, ])); -var msg403 = msg("00021:02", part675); +var msg403 = msg("00021:02", part674); -var part676 = // "Pattern{Constant('Connection refused by the DNS server'), Field(,false)}" -match("MESSAGE#401:00021:03", "nwparser.payload", "Connection refused by the DNS server%{}", processor_chain([ - dup187, +var part675 = match("MESSAGE#401:00021:03", "nwparser.payload", "Connection refused by the DNS server%{}", processor_chain([ + dup185, dup2, dup3, dup4, dup5, ])); -var msg404 = msg("00021:03", part676); +var msg404 = msg("00021:03", part675); -var part677 = // "Pattern{Constant('Unknown DNS error'), Field(,false)}" -match("MESSAGE#402:00021:04", "nwparser.payload", "Unknown DNS error%{}", processor_chain([ +var part676 = match("MESSAGE#402:00021:04", "nwparser.payload", "Unknown DNS error%{}", processor_chain([ dup117, dup2, dup3, @@ -9532,10 +8575,9 @@ match("MESSAGE#402:00021:04", "nwparser.payload", "Unknown DNS error%{}", proces dup5, ])); -var msg405 = msg("00021:04", part677); +var msg405 = msg("00021:04", part676); -var part678 = // "Pattern{Constant('DIP port-translatation stickiness was '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#403:00021:05", "nwparser.payload", "DIP port-translatation stickiness was %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} (%{fld1})", processor_chain([ +var part677 = match("MESSAGE#403:00021:05", "nwparser.payload", "DIP port-translatation stickiness was %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -9544,10 +8586,9 @@ match("MESSAGE#403:00021:05", "nwparser.payload", "DIP port-translatation sticki dup5, ])); -var msg406 = msg("00021:05", part678); +var msg406 = msg("00021:05", part677); -var part679 = // "Pattern{Constant('DIP port-translation stickiness was '), Field(disposition,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#404:00021:06", "nwparser.payload", "DIP port-translation stickiness was %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ +var part678 = match("MESSAGE#404:00021:06", "nwparser.payload", "DIP port-translation stickiness was %{disposition->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} (%{fld1})", processor_chain([ dup1, dup2, dup4, @@ -9556,7 +8597,7 @@ match("MESSAGE#404:00021:06", "nwparser.payload", "DIP port-translation stickine setc("info","DIP port-translation stickiness was modified"), ])); -var msg407 = msg("00021:06", part679); +var msg407 = msg("00021:06", part678); var select151 = linear_select([ msg401, @@ -9568,25 +8609,22 @@ var select151 = linear_select([ msg407, ]); -var part680 = // "Pattern{Constant('power supplies '), Field(p0,false)}" -match("MESSAGE#405:00022/1_0", "nwparser.p0", "power supplies %{p0}"); +var part679 = match("MESSAGE#405:00022/1_0", "nwparser.p0", "power supplies %{p0}"); -var part681 = // "Pattern{Constant('fans '), Field(p0,false)}" -match("MESSAGE#405:00022/1_1", "nwparser.p0", "fans %{p0}"); +var part680 = match("MESSAGE#405:00022/1_1", "nwparser.p0", "fans %{p0}"); var select152 = linear_select([ + part679, part680, - part681, ]); -var part682 = // "Pattern{Constant('are '), Field(fld2,true), Constant(' functioning properly')}" -match("MESSAGE#405:00022/2", "nwparser.p0", "are %{fld2->} functioning properly"); +var part681 = match("MESSAGE#405:00022/2", "nwparser.p0", "are %{fld2->} functioning properly"); -var all138 = all_match({ +var all137 = all_match({ processors: [ - dup188, + dup186, select152, - part682, + part681, ], on_success: processor_chain([ dup44, @@ -9597,34 +8635,30 @@ var all138 = all_match({ ]), }); -var msg408 = msg("00022", all138); +var msg408 = msg("00022", all137); -var part683 = // "Pattern{Constant('At least one power supply '), Field(p0,false)}" -match("MESSAGE#406:00022:01/0_0", "nwparser.payload", "At least one power supply %{p0}"); +var part682 = match("MESSAGE#406:00022:01/0_0", "nwparser.payload", "At least one power supply %{p0}"); -var part684 = // "Pattern{Constant('The power supply '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#406:00022:01/0_1", "nwparser.payload", "The power supply %{fld2->} %{p0}"); +var part683 = match("MESSAGE#406:00022:01/0_1", "nwparser.payload", "The power supply %{fld2->} %{p0}"); -var part685 = // "Pattern{Constant('At least one fan '), Field(p0,false)}" -match("MESSAGE#406:00022:01/0_2", "nwparser.payload", "At least one fan %{p0}"); +var part684 = match("MESSAGE#406:00022:01/0_2", "nwparser.payload", "At least one fan %{p0}"); var select153 = linear_select([ + part682, part683, part684, - part685, ]); -var part686 = // "Pattern{Constant('is not functioning properly'), Field(p0,false)}" -match("MESSAGE#406:00022:01/1", "nwparser.p0", "is not functioning properly%{p0}"); +var part685 = match("MESSAGE#406:00022:01/1", "nwparser.p0", "is not functioning properly%{p0}"); -var all139 = all_match({ +var all138 = all_match({ processors: [ select153, - part686, - dup371, + part685, + dup368, ], on_success: processor_chain([ - dup189, + dup187, dup2, dup3, dup9, @@ -9633,10 +8667,9 @@ var all139 = all_match({ ]), }); -var msg409 = msg("00022:01", all139); +var msg409 = msg("00022:01", all138); -var part687 = // "Pattern{Constant('Global Manager VPN management tunnel has been '), Field(disposition,false)}" -match("MESSAGE#407:00022:02", "nwparser.payload", "Global Manager VPN management tunnel has been %{disposition}", processor_chain([ +var part686 = match("MESSAGE#407:00022:02", "nwparser.payload", "Global Manager VPN management tunnel has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -9644,10 +8677,9 @@ match("MESSAGE#407:00022:02", "nwparser.payload", "Global Manager VPN management dup5, ])); -var msg410 = msg("00022:02", part687); +var msg410 = msg("00022:02", part686); -var part688 = // "Pattern{Constant('Global Manager domain name has been defined as '), Field(domain,false)}" -match("MESSAGE#408:00022:03", "nwparser.payload", "Global Manager domain name has been defined as %{domain}", processor_chain([ +var part687 = match("MESSAGE#408:00022:03", "nwparser.payload", "Global Manager domain name has been defined as %{domain}", processor_chain([ dup1, dup2, dup3, @@ -9655,38 +8687,32 @@ match("MESSAGE#408:00022:03", "nwparser.payload", "Global Manager domain name ha dup5, ])); -var msg411 = msg("00022:03", part688); +var msg411 = msg("00022:03", part687); -var part689 = // "Pattern{Constant('Reporting of the '), Field(p0,false)}" -match("MESSAGE#409:00022:04/0", "nwparser.payload", "Reporting of the %{p0}"); +var part688 = match("MESSAGE#409:00022:04/0", "nwparser.payload", "Reporting of the %{p0}"); -var part690 = // "Pattern{Constant('network activities '), Field(p0,false)}" -match("MESSAGE#409:00022:04/1_0", "nwparser.p0", "network activities %{p0}"); +var part689 = match("MESSAGE#409:00022:04/1_0", "nwparser.p0", "network activities %{p0}"); -var part691 = // "Pattern{Constant('device resources '), Field(p0,false)}" -match("MESSAGE#409:00022:04/1_1", "nwparser.p0", "device resources %{p0}"); +var part690 = match("MESSAGE#409:00022:04/1_1", "nwparser.p0", "device resources %{p0}"); -var part692 = // "Pattern{Constant('event logs '), Field(p0,false)}" -match("MESSAGE#409:00022:04/1_2", "nwparser.p0", "event logs %{p0}"); +var part691 = match("MESSAGE#409:00022:04/1_2", "nwparser.p0", "event logs %{p0}"); -var part693 = // "Pattern{Constant('summary logs '), Field(p0,false)}" -match("MESSAGE#409:00022:04/1_3", "nwparser.p0", "summary logs %{p0}"); +var part692 = match("MESSAGE#409:00022:04/1_3", "nwparser.p0", "summary logs %{p0}"); var select154 = linear_select([ + part689, part690, part691, part692, - part693, ]); -var part694 = // "Pattern{Constant('to Global Manager has been '), Field(disposition,false)}" -match("MESSAGE#409:00022:04/2", "nwparser.p0", "to Global Manager has been %{disposition}"); +var part693 = match("MESSAGE#409:00022:04/2", "nwparser.p0", "to Global Manager has been %{disposition}"); -var all140 = all_match({ +var all139 = all_match({ processors: [ - part689, + part688, select154, - part694, + part693, ], on_success: processor_chain([ dup1, @@ -9697,10 +8723,9 @@ var all140 = all_match({ ]), }); -var msg412 = msg("00022:04", all140); +var msg412 = msg("00022:04", all139); -var part695 = // "Pattern{Constant('Global Manager has been '), Field(disposition,false)}" -match("MESSAGE#410:00022:05", "nwparser.payload", "Global Manager has been %{disposition}", processor_chain([ +var part694 = match("MESSAGE#410:00022:05", "nwparser.payload", "Global Manager has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -9708,30 +8733,26 @@ match("MESSAGE#410:00022:05", "nwparser.payload", "Global Manager has been %{dis dup5, ])); -var msg413 = msg("00022:05", part695); +var msg413 = msg("00022:05", part694); -var part696 = // "Pattern{Constant('Global Manager '), Field(p0,false)}" -match("MESSAGE#411:00022:06/0", "nwparser.payload", "Global Manager %{p0}"); +var part695 = match("MESSAGE#411:00022:06/0", "nwparser.payload", "Global Manager %{p0}"); -var part697 = // "Pattern{Constant('report '), Field(p0,false)}" -match("MESSAGE#411:00022:06/1_0", "nwparser.p0", "report %{p0}"); +var part696 = match("MESSAGE#411:00022:06/1_0", "nwparser.p0", "report %{p0}"); -var part698 = // "Pattern{Constant('listen '), Field(p0,false)}" -match("MESSAGE#411:00022:06/1_1", "nwparser.p0", "listen %{p0}"); +var part697 = match("MESSAGE#411:00022:06/1_1", "nwparser.p0", "listen %{p0}"); var select155 = linear_select([ + part696, part697, - part698, ]); -var part699 = // "Pattern{Constant('port has been set to '), Field(interface,false)}" -match("MESSAGE#411:00022:06/2", "nwparser.p0", "port has been set to %{interface}"); +var part698 = match("MESSAGE#411:00022:06/2", "nwparser.p0", "port has been set to %{interface}"); -var all141 = all_match({ +var all140 = all_match({ processors: [ - part696, + part695, select155, - part699, + part698, ], on_success: processor_chain([ dup1, @@ -9742,10 +8763,9 @@ var all141 = all_match({ ]), }); -var msg414 = msg("00022:06", all141); +var msg414 = msg("00022:06", all140); -var part700 = // "Pattern{Constant('The Global Manager keep-alive value has been changed to '), Field(fld2,false)}" -match("MESSAGE#412:00022:07", "nwparser.payload", "The Global Manager keep-alive value has been changed to %{fld2}", processor_chain([ +var part699 = match("MESSAGE#412:00022:07", "nwparser.payload", "The Global Manager keep-alive value has been changed to %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -9753,59 +8773,51 @@ match("MESSAGE#412:00022:07", "nwparser.payload", "The Global Manager keep-alive dup5, ])); -var msg415 = msg("00022:07", part700); +var msg415 = msg("00022:07", part699); -var part701 = // "Pattern{Constant('System temperature '), Field(p0,false)}" -match("MESSAGE#413:00022:08/0_0", "nwparser.payload", "System temperature %{p0}"); +var part700 = match("MESSAGE#413:00022:08/0_0", "nwparser.payload", "System temperature %{p0}"); -var part702 = // "Pattern{Constant('System's temperature: '), Field(p0,false)}" -match("MESSAGE#413:00022:08/0_1", "nwparser.payload", "System's temperature: %{p0}"); +var part701 = match("MESSAGE#413:00022:08/0_1", "nwparser.payload", "System's temperature: %{p0}"); -var part703 = // "Pattern{Constant('The system temperature '), Field(p0,false)}" -match("MESSAGE#413:00022:08/0_2", "nwparser.payload", "The system temperature %{p0}"); +var part702 = match("MESSAGE#413:00022:08/0_2", "nwparser.payload", "The system temperature %{p0}"); var select156 = linear_select([ + part700, part701, part702, - part703, ]); -var part704 = // "Pattern{Constant('('), Field(fld2,true), Constant(' C'), Field(p0,false)}" -match("MESSAGE#413:00022:08/1", "nwparser.p0", "(%{fld2->} C%{p0}"); +var part703 = match("MESSAGE#413:00022:08/1", "nwparser.p0", "(%{fld2->} C%{p0}"); -var part705 = // "Pattern{Constant('entigrade, '), Field(p0,false)}" -match("MESSAGE#413:00022:08/2_0", "nwparser.p0", "entigrade, %{p0}"); +var part704 = match("MESSAGE#413:00022:08/2_0", "nwparser.p0", "entigrade, %{p0}"); var select157 = linear_select([ - part705, + part704, dup96, ]); -var part706 = // "Pattern{Constant(''), Field(fld3,true), Constant(' F'), Field(p0,false)}" -match("MESSAGE#413:00022:08/3", "nwparser.p0", "%{fld3->} F%{p0}"); +var part705 = match("MESSAGE#413:00022:08/3", "nwparser.p0", "%{fld3->} F%{p0}"); -var part707 = // "Pattern{Constant('ahrenheit '), Field(p0,false)}" -match("MESSAGE#413:00022:08/4_0", "nwparser.p0", "ahrenheit %{p0}"); +var part706 = match("MESSAGE#413:00022:08/4_0", "nwparser.p0", "ahrenheit %{p0}"); var select158 = linear_select([ - part707, + part706, dup96, ]); -var part708 = // "Pattern{Constant(') is too high'), Field(,false)}" -match("MESSAGE#413:00022:08/5", "nwparser.p0", ") is too high%{}"); +var part707 = match("MESSAGE#413:00022:08/5", "nwparser.p0", ") is too high%{}"); -var all142 = all_match({ +var all141 = all_match({ processors: [ select156, - part704, + part703, select157, - part706, + part705, select158, - part708, + part707, ], on_success: processor_chain([ - dup190, + dup188, dup2, dup3, dup4, @@ -9813,29 +8825,27 @@ var all142 = all_match({ ]), }); -var msg416 = msg("00022:08", all142); +var msg416 = msg("00022:08", all141); -var part709 = // "Pattern{Constant('power supply is no'), Field(p0,false)}" -match("MESSAGE#414:00022:09/2", "nwparser.p0", "power supply is no%{p0}"); +var part708 = match("MESSAGE#414:00022:09/2", "nwparser.p0", "power supply is no%{p0}"); var select159 = linear_select([ - dup193, - dup194, + dup191, + dup192, ]); -var part710 = // "Pattern{Constant('functioning properly'), Field(,false)}" -match("MESSAGE#414:00022:09/4", "nwparser.p0", "functioning properly%{}"); +var part709 = match("MESSAGE#414:00022:09/4", "nwparser.p0", "functioning properly%{}"); -var all143 = all_match({ +var all142 = all_match({ processors: [ dup55, - dup372, - part709, + dup369, + part708, select159, - part710, + part709, ], on_success: processor_chain([ - dup190, + dup188, dup2, dup3, dup4, @@ -9843,25 +8853,22 @@ var all143 = all_match({ ]), }); -var msg417 = msg("00022:09", all143); +var msg417 = msg("00022:09", all142); -var part711 = // "Pattern{Constant('The NetScreen device was unable to upgrade the file system'), Field(p0,false)}" -match("MESSAGE#415:00022:10/0", "nwparser.payload", "The NetScreen device was unable to upgrade the file system%{p0}"); +var part710 = match("MESSAGE#415:00022:10/0", "nwparser.payload", "The NetScreen device was unable to upgrade the file system%{p0}"); -var part712 = // "Pattern{Constant(' due to an internal conflict'), Field(,false)}" -match("MESSAGE#415:00022:10/1_0", "nwparser.p0", " due to an internal conflict%{}"); +var part711 = match("MESSAGE#415:00022:10/1_0", "nwparser.p0", " due to an internal conflict%{}"); -var part713 = // "Pattern{Constant(', but the old file system is intact'), Field(,false)}" -match("MESSAGE#415:00022:10/1_1", "nwparser.p0", ", but the old file system is intact%{}"); +var part712 = match("MESSAGE#415:00022:10/1_1", "nwparser.p0", ", but the old file system is intact%{}"); var select160 = linear_select([ + part711, part712, - part713, ]); -var all144 = all_match({ +var all143 = all_match({ processors: [ - part711, + part710, select160, ], on_success: processor_chain([ @@ -9873,25 +8880,22 @@ var all144 = all_match({ ]), }); -var msg418 = msg("00022:10", all144); +var msg418 = msg("00022:10", all143); -var part714 = // "Pattern{Constant('The NetScreen device was unable to upgrade '), Field(p0,false)}" -match("MESSAGE#416:00022:11/0", "nwparser.payload", "The NetScreen device was unable to upgrade %{p0}"); +var part713 = match("MESSAGE#416:00022:11/0", "nwparser.payload", "The NetScreen device was unable to upgrade %{p0}"); -var part715 = // "Pattern{Constant('due to an internal conflict'), Field(,false)}" -match("MESSAGE#416:00022:11/1_0", "nwparser.p0", "due to an internal conflict%{}"); +var part714 = match("MESSAGE#416:00022:11/1_0", "nwparser.p0", "due to an internal conflict%{}"); -var part716 = // "Pattern{Constant('the loader, but the loader is intact'), Field(,false)}" -match("MESSAGE#416:00022:11/1_1", "nwparser.p0", "the loader, but the loader is intact%{}"); +var part715 = match("MESSAGE#416:00022:11/1_1", "nwparser.p0", "the loader, but the loader is intact%{}"); var select161 = linear_select([ + part714, part715, - part716, ]); -var all145 = all_match({ +var all144 = all_match({ processors: [ - part714, + part713, select161, ], on_success: processor_chain([ @@ -9903,27 +8907,25 @@ var all145 = all_match({ ]), }); -var msg419 = msg("00022:11", all145); +var msg419 = msg("00022:11", all144); -var part717 = // "Pattern{Constant('Battery is no'), Field(p0,false)}" -match("MESSAGE#417:00022:12/0", "nwparser.payload", "Battery is no%{p0}"); +var part716 = match("MESSAGE#417:00022:12/0", "nwparser.payload", "Battery is no%{p0}"); var select162 = linear_select([ - dup194, - dup193, + dup192, + dup191, ]); -var part718 = // "Pattern{Constant('functioning properly.'), Field(,false)}" -match("MESSAGE#417:00022:12/2", "nwparser.p0", "functioning properly.%{}"); +var part717 = match("MESSAGE#417:00022:12/2", "nwparser.p0", "functioning properly.%{}"); -var all146 = all_match({ +var all145 = all_match({ processors: [ - part717, + part716, select162, - part718, + part717, ], on_success: processor_chain([ - dup190, + dup188, dup2, dup3, dup4, @@ -9931,10 +8933,9 @@ var all146 = all_match({ ]), }); -var msg420 = msg("00022:12", all146); +var msg420 = msg("00022:12", all145); -var part719 = // "Pattern{Constant('System's temperature ('), Field(fld2,true), Constant(' Centigrade, '), Field(fld3,true), Constant(' Fahrenheit) is OK now.')}" -match("MESSAGE#418:00022:13", "nwparser.payload", "System's temperature (%{fld2->} Centigrade, %{fld3->} Fahrenheit) is OK now.", processor_chain([ +var part718 = match("MESSAGE#418:00022:13", "nwparser.payload", "System's temperature (%{fld2->} Centigrade, %{fld3->} Fahrenheit) is OK now.", processor_chain([ dup44, dup2, dup3, @@ -9942,10 +8943,9 @@ match("MESSAGE#418:00022:13", "nwparser.payload", "System's temperature (%{fld2- dup5, ])); -var msg421 = msg("00022:13", part719); +var msg421 = msg("00022:13", part718); -var part720 = // "Pattern{Constant('The power supply '), Field(fld2,true), Constant(' is functioning properly. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#419:00022:14", "nwparser.payload", "The power supply %{fld2->} is functioning properly. (%{fld1})", processor_chain([ +var part719 = match("MESSAGE#419:00022:14", "nwparser.payload", "The power supply %{fld2->} is functioning properly. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -9954,7 +8954,7 @@ match("MESSAGE#419:00022:14", "nwparser.payload", "The power supply %{fld2->} is dup5, ])); -var msg422 = msg("00022:14", part720); +var msg422 = msg("00022:14", part719); var select163 = linear_select([ msg408, @@ -9974,38 +8974,35 @@ var select163 = linear_select([ msg422, ]); -var part721 = // "Pattern{Constant('VIP server '), Field(hostip,true), Constant(' is not responding')}" -match("MESSAGE#420:00023", "nwparser.payload", "VIP server %{hostip->} is not responding", processor_chain([ - dup189, +var part720 = match("MESSAGE#420:00023", "nwparser.payload", "VIP server %{hostip->} is not responding", processor_chain([ + dup187, dup2, dup3, dup4, dup5, ])); -var msg423 = msg("00023", part721); +var msg423 = msg("00023", part720); -var part722 = // "Pattern{Constant('VIP/load balance server '), Field(hostip,true), Constant(' cannot be contacted')}" -match("MESSAGE#421:00023:01", "nwparser.payload", "VIP/load balance server %{hostip->} cannot be contacted", processor_chain([ - dup189, +var part721 = match("MESSAGE#421:00023:01", "nwparser.payload", "VIP/load balance server %{hostip->} cannot be contacted", processor_chain([ + dup187, dup2, dup3, dup4, dup5, ])); -var msg424 = msg("00023:01", part722); +var msg424 = msg("00023:01", part721); -var part723 = // "Pattern{Constant('VIP server '), Field(hostip,true), Constant(' cannot be contacted')}" -match("MESSAGE#422:00023:02", "nwparser.payload", "VIP server %{hostip->} cannot be contacted", processor_chain([ - dup189, +var part722 = match("MESSAGE#422:00023:02", "nwparser.payload", "VIP server %{hostip->} cannot be contacted", processor_chain([ + dup187, dup2, dup3, dup4, dup5, ])); -var msg425 = msg("00023:02", part723); +var msg425 = msg("00023:02", part722); var select164 = linear_select([ msg423, @@ -10013,35 +9010,31 @@ var select164 = linear_select([ msg425, ]); -var part724 = // "Pattern{Constant('The DHCP '), Field(p0,false)}" -match("MESSAGE#423:00024/0_0", "nwparser.payload", "The DHCP %{p0}"); +var part723 = match("MESSAGE#423:00024/0_0", "nwparser.payload", "The DHCP %{p0}"); -var part725 = // "Pattern{Constant(' DHCP '), Field(p0,false)}" -match("MESSAGE#423:00024/0_1", "nwparser.payload", " DHCP %{p0}"); +var part724 = match("MESSAGE#423:00024/0_1", "nwparser.payload", " DHCP %{p0}"); var select165 = linear_select([ + part723, part724, - part725, ]); -var part726 = // "Pattern{Constant('IP address pool has '), Field(p0,false)}" -match("MESSAGE#423:00024/2_0", "nwparser.p0", "IP address pool has %{p0}"); +var part725 = match("MESSAGE#423:00024/2_0", "nwparser.p0", "IP address pool has %{p0}"); -var part727 = // "Pattern{Constant('options have been '), Field(p0,false)}" -match("MESSAGE#423:00024/2_1", "nwparser.p0", "options have been %{p0}"); +var part726 = match("MESSAGE#423:00024/2_1", "nwparser.p0", "options have been %{p0}"); var select166 = linear_select([ + part725, part726, - part727, ]); -var all147 = all_match({ +var all146 = all_match({ processors: [ select165, - dup195, + dup193, select166, dup52, - dup371, + dup368, ], on_success: processor_chain([ dup1, @@ -10053,38 +9046,32 @@ var all147 = all_match({ ]), }); -var msg426 = msg("00024", all147); +var msg426 = msg("00024", all146); -var part728 = // "Pattern{Constant('Traffic log '), Field(p0,false)}" -match("MESSAGE#424:00024:01/0_0", "nwparser.payload", "Traffic log %{p0}"); +var part727 = match("MESSAGE#424:00024:01/0_0", "nwparser.payload", "Traffic log %{p0}"); -var part729 = // "Pattern{Constant('Alarm log '), Field(p0,false)}" -match("MESSAGE#424:00024:01/0_1", "nwparser.payload", "Alarm log %{p0}"); +var part728 = match("MESSAGE#424:00024:01/0_1", "nwparser.payload", "Alarm log %{p0}"); -var part730 = // "Pattern{Constant('Event log '), Field(p0,false)}" -match("MESSAGE#424:00024:01/0_2", "nwparser.payload", "Event log %{p0}"); +var part729 = match("MESSAGE#424:00024:01/0_2", "nwparser.payload", "Event log %{p0}"); -var part731 = // "Pattern{Constant('Self log '), Field(p0,false)}" -match("MESSAGE#424:00024:01/0_3", "nwparser.payload", "Self log %{p0}"); +var part730 = match("MESSAGE#424:00024:01/0_3", "nwparser.payload", "Self log %{p0}"); -var part732 = // "Pattern{Constant('Asset Recovery log '), Field(p0,false)}" -match("MESSAGE#424:00024:01/0_4", "nwparser.payload", "Asset Recovery log %{p0}"); +var part731 = match("MESSAGE#424:00024:01/0_4", "nwparser.payload", "Asset Recovery log %{p0}"); var select167 = linear_select([ + part727, part728, part729, part730, part731, - part732, ]); -var part733 = // "Pattern{Constant('has overflowed'), Field(,false)}" -match("MESSAGE#424:00024:01/1", "nwparser.p0", "has overflowed%{}"); +var part732 = match("MESSAGE#424:00024:01/1", "nwparser.p0", "has overflowed%{}"); -var all148 = all_match({ +var all147 = all_match({ processors: [ select167, - part733, + part732, ], on_success: processor_chain([ dup117, @@ -10095,30 +9082,26 @@ var all148 = all_match({ ]), }); -var msg427 = msg("00024:01", all148); +var msg427 = msg("00024:01", all147); -var part734 = // "Pattern{Constant('DHCP relay agent settings on '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#425:00024:02/0", "nwparser.payload", "DHCP relay agent settings on %{fld2->} %{p0}"); +var part733 = match("MESSAGE#425:00024:02/0", "nwparser.payload", "DHCP relay agent settings on %{fld2->} %{p0}"); -var part735 = // "Pattern{Constant('are '), Field(p0,false)}" -match("MESSAGE#425:00024:02/1_0", "nwparser.p0", "are %{p0}"); +var part734 = match("MESSAGE#425:00024:02/1_0", "nwparser.p0", "are %{p0}"); -var part736 = // "Pattern{Constant('have been '), Field(p0,false)}" -match("MESSAGE#425:00024:02/1_1", "nwparser.p0", "have been %{p0}"); +var part735 = match("MESSAGE#425:00024:02/1_1", "nwparser.p0", "have been %{p0}"); var select168 = linear_select([ + part734, part735, - part736, ]); -var part737 = // "Pattern{Constant(''), Field(disposition,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#425:00024:02/2", "nwparser.p0", "%{disposition->} (%{fld1})"); +var part736 = match("MESSAGE#425:00024:02/2", "nwparser.p0", "%{disposition->} (%{fld1})"); -var all149 = all_match({ +var all148 = all_match({ processors: [ - part734, + part733, select168, - part737, + part736, ], on_success: processor_chain([ dup1, @@ -10130,24 +9113,22 @@ var all149 = all_match({ ]), }); -var msg428 = msg("00024:02", all149); +var msg428 = msg("00024:02", all148); -var part738 = // "Pattern{Constant('DHCP server IP address pool '), Field(p0,false)}" -match("MESSAGE#426:00024:03/0", "nwparser.payload", "DHCP server IP address pool %{p0}"); +var part737 = match("MESSAGE#426:00024:03/0", "nwparser.payload", "DHCP server IP address pool %{p0}"); var select169 = linear_select([ - dup196, + dup194, dup106, ]); -var part739 = // "Pattern{Constant('changed. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#426:00024:03/2", "nwparser.p0", "changed. (%{fld1})"); +var part738 = match("MESSAGE#426:00024:03/2", "nwparser.p0", "changed. (%{fld1})"); -var all150 = all_match({ +var all149 = all_match({ processors: [ - part738, + part737, select169, - part739, + part738, ], on_success: processor_chain([ dup1, @@ -10159,7 +9140,7 @@ var all150 = all_match({ ]), }); -var msg429 = msg("00024:03", all150); +var msg429 = msg("00024:03", all149); var select170 = linear_select([ msg426, @@ -10168,8 +9149,7 @@ var select170 = linear_select([ msg429, ]); -var part740 = // "Pattern{Constant('The DHCP server IP address pool has changed'), Field(,false)}" -match("MESSAGE#427:00025", "nwparser.payload", "The DHCP server IP address pool has changed%{}", processor_chain([ +var part739 = match("MESSAGE#427:00025", "nwparser.payload", "The DHCP server IP address pool has changed%{}", processor_chain([ dup1, dup2, dup3, @@ -10177,10 +9157,9 @@ match("MESSAGE#427:00025", "nwparser.payload", "The DHCP server IP address pool dup5, ])); -var msg430 = msg("00025", part740); +var msg430 = msg("00025", part739); -var part741 = // "Pattern{Constant('PKI: The current device '), Field(disposition,true), Constant(' to save the certificate authority configuration.')}" -match("MESSAGE#428:00025:01", "nwparser.payload", "PKI: The current device %{disposition->} to save the certificate authority configuration.", processor_chain([ +var part740 = match("MESSAGE#428:00025:01", "nwparser.payload", "PKI: The current device %{disposition->} to save the certificate authority configuration.", processor_chain([ dup86, dup2, dup3, @@ -10188,10 +9167,9 @@ match("MESSAGE#428:00025:01", "nwparser.payload", "PKI: The current device %{dis dup5, ])); -var msg431 = msg("00025:01", part741); +var msg431 = msg("00025:01", part740); -var part742 = // "Pattern{Field(disposition,true), Constant(' to send the X509 request file via e-mail')}" -match("MESSAGE#429:00025:02", "nwparser.payload", "%{disposition->} to send the X509 request file via e-mail", processor_chain([ +var part741 = match("MESSAGE#429:00025:02", "nwparser.payload", "%{disposition->} to send the X509 request file via e-mail", processor_chain([ dup86, dup2, dup3, @@ -10199,10 +9177,9 @@ match("MESSAGE#429:00025:02", "nwparser.payload", "%{disposition->} to send the dup5, ])); -var msg432 = msg("00025:02", part742); +var msg432 = msg("00025:02", part741); -var part743 = // "Pattern{Field(disposition,true), Constant(' to save the CA configuration')}" -match("MESSAGE#430:00025:03", "nwparser.payload", "%{disposition->} to save the CA configuration", processor_chain([ +var part742 = match("MESSAGE#430:00025:03", "nwparser.payload", "%{disposition->} to save the CA configuration", processor_chain([ dup86, dup2, dup3, @@ -10210,10 +9187,9 @@ match("MESSAGE#430:00025:03", "nwparser.payload", "%{disposition->} to save the dup5, ])); -var msg433 = msg("00025:03", part743); +var msg433 = msg("00025:03", part742); -var part744 = // "Pattern{Constant('Cannot load more X509 certificates. The '), Field(result,false)}" -match("MESSAGE#431:00025:04", "nwparser.payload", "Cannot load more X509 certificates. The %{result}", processor_chain([ +var part743 = match("MESSAGE#431:00025:04", "nwparser.payload", "Cannot load more X509 certificates. The %{result}", processor_chain([ dup86, dup2, dup3, @@ -10221,7 +9197,7 @@ match("MESSAGE#431:00025:04", "nwparser.payload", "Cannot load more X509 certifi dup5, ])); -var msg434 = msg("00025:04", part744); +var msg434 = msg("00025:04", part743); var select171 = linear_select([ msg430, @@ -10231,8 +9207,7 @@ var select171 = linear_select([ msg434, ]); -var part745 = // "Pattern{Field(signame,true), Constant(' have been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#432:00026", "nwparser.payload", "%{signame->} have been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part744 = match("MESSAGE#432:00026", "nwparser.payload", "%{signame->} have been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup3, @@ -10242,10 +9217,9 @@ match("MESSAGE#432:00026", "nwparser.payload", "%{signame->} have been detected! dup61, ])); -var msg435 = msg("00026", part745); +var msg435 = msg("00026", part744); -var part746 = // "Pattern{Field(signame,true), Constant(' have been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', on interface '), Field(interface,false)}" -match("MESSAGE#433:00026:13", "nwparser.payload", "%{signame->} have been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on interface %{interface}", processor_chain([ +var part745 = match("MESSAGE#433:00026:13", "nwparser.payload", "%{signame->} have been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on interface %{interface}", processor_chain([ dup58, dup2, dup3, @@ -10254,21 +9228,19 @@ match("MESSAGE#433:00026:13", "nwparser.payload", "%{signame->} have been detect dup61, ])); -var msg436 = msg("00026:13", part746); +var msg436 = msg("00026:13", part745); -var part747 = // "Pattern{Constant('PKA key has been '), Field(p0,false)}" -match("MESSAGE#434:00026:01/2", "nwparser.p0", "PKA key has been %{p0}"); +var part746 = match("MESSAGE#434:00026:01/2", "nwparser.p0", "PKA key has been %{p0}"); -var part748 = // "Pattern{Constant('admin user '), Field(administrator,false), Constant('. (Key ID = '), Field(fld2,false), Constant(')')}" -match("MESSAGE#434:00026:01/4", "nwparser.p0", "admin user %{administrator}. (Key ID = %{fld2})"); +var part747 = match("MESSAGE#434:00026:01/4", "nwparser.p0", "admin user %{administrator}. (Key ID = %{fld2})"); -var all151 = all_match({ +var all150 = all_match({ processors: [ - dup197, - dup373, + dup195, + dup370, + part746, + dup371, part747, - dup374, - part748, ], on_success: processor_chain([ dup1, @@ -10279,35 +9251,31 @@ var all151 = all_match({ ]), }); -var msg437 = msg("00026:01", all151); +var msg437 = msg("00026:01", all150); -var part749 = // "Pattern{Constant(': SCS '), Field(p0,false)}" -match("MESSAGE#435:00026:02/1_0", "nwparser.p0", ": SCS %{p0}"); +var part748 = match("MESSAGE#435:00026:02/1_0", "nwparser.p0", ": SCS %{p0}"); var select172 = linear_select([ - part749, + part748, dup96, ]); -var part750 = // "Pattern{Constant('has been '), Field(disposition,true), Constant(' for '), Field(p0,false)}" -match("MESSAGE#435:00026:02/2", "nwparser.p0", "has been %{disposition->} for %{p0}"); +var part749 = match("MESSAGE#435:00026:02/2", "nwparser.p0", "has been %{disposition->} for %{p0}"); -var part751 = // "Pattern{Constant('root system '), Field(p0,false)}" -match("MESSAGE#435:00026:02/3_0", "nwparser.p0", "root system %{p0}"); +var part750 = match("MESSAGE#435:00026:02/3_0", "nwparser.p0", "root system %{p0}"); -var part752 = // "Pattern{Field(interface,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#435:00026:02/3_1", "nwparser.p0", "%{interface->} %{p0}"); +var part751 = match("MESSAGE#435:00026:02/3_1", "nwparser.p0", "%{interface->} %{p0}"); var select173 = linear_select([ + part750, part751, - part752, ]); -var all152 = all_match({ +var all151 = all_match({ processors: [ - dup197, + dup195, select172, - part750, + part749, select173, dup116, ], @@ -10320,16 +9288,15 @@ var all152 = all_match({ ]), }); -var msg438 = msg("00026:02", all152); +var msg438 = msg("00026:02", all151); -var part753 = // "Pattern{Constant(''), Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#436:00026:03/2", "nwparser.p0", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}"); +var part752 = match("MESSAGE#436:00026:03/2", "nwparser.p0", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}"); -var all153 = all_match({ +var all152 = all_match({ processors: [ - dup197, - dup373, - part753, + dup195, + dup370, + part752, ], on_success: processor_chain([ dup1, @@ -10340,33 +9307,30 @@ var all153 = all_match({ ]), }); -var msg439 = msg("00026:03", all153); +var msg439 = msg("00026:03", all152); -var part754 = // "Pattern{Constant('SCS: Connection has been terminated for admin user '), Field(administrator,true), Constant(' at '), Field(hostip,false), Constant(':'), Field(network_port,false)}" -match("MESSAGE#437:00026:04", "nwparser.payload", "SCS: Connection has been terminated for admin user %{administrator->} at %{hostip}:%{network_port}", processor_chain([ - dup200, +var part753 = match("MESSAGE#437:00026:04", "nwparser.payload", "SCS: Connection has been terminated for admin user %{administrator->} at %{hostip}:%{network_port}", processor_chain([ + dup198, dup2, dup4, dup5, dup3, ])); -var msg440 = msg("00026:04", part754); +var msg440 = msg("00026:04", part753); -var part755 = // "Pattern{Constant('SCS: Host client has requested NO cipher from '), Field(interface,false)}" -match("MESSAGE#438:00026:05", "nwparser.payload", "SCS: Host client has requested NO cipher from %{interface}", processor_chain([ - dup200, +var part754 = match("MESSAGE#438:00026:05", "nwparser.payload", "SCS: Host client has requested NO cipher from %{interface}", processor_chain([ + dup198, dup2, dup3, dup4, dup5, ])); -var msg441 = msg("00026:05", part755); +var msg441 = msg("00026:05", part754); -var part756 = // "Pattern{Constant('SCS: SSH user '), Field(username,true), Constant(' has been authenticated using PKA RSA from '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('. (key-ID='), Field(fld2,false)}" -match("MESSAGE#439:00026:06", "nwparser.payload", "SCS: SSH user %{username->} has been authenticated using PKA RSA from %{saddr}:%{sport}. (key-ID=%{fld2}", processor_chain([ - dup201, +var part755 = match("MESSAGE#439:00026:06", "nwparser.payload", "SCS: SSH user %{username->} has been authenticated using PKA RSA from %{saddr}:%{sport}. (key-ID=%{fld2}", processor_chain([ + dup199, dup29, dup30, dup31, @@ -10377,11 +9341,10 @@ match("MESSAGE#439:00026:06", "nwparser.payload", "SCS: SSH user %{username->} h dup5, ])); -var msg442 = msg("00026:06", part756); +var msg442 = msg("00026:06", part755); -var part757 = // "Pattern{Constant('SCS: SSH user '), Field(username,true), Constant(' has been authenticated using password from '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('.')}" -match("MESSAGE#440:00026:07", "nwparser.payload", "SCS: SSH user %{username->} has been authenticated using password from %{saddr}:%{sport}.", processor_chain([ - dup201, +var part756 = match("MESSAGE#440:00026:07", "nwparser.payload", "SCS: SSH user %{username->} has been authenticated using password from %{saddr}:%{sport}.", processor_chain([ + dup199, dup29, dup30, dup31, @@ -10392,22 +9355,20 @@ match("MESSAGE#440:00026:07", "nwparser.payload", "SCS: SSH user %{username->} h dup5, ])); -var msg443 = msg("00026:07", part757); +var msg443 = msg("00026:07", part756); -var part758 = // "Pattern{Constant('SSH user '), Field(username,true), Constant(' has been authenticated using '), Field(p0,false)}" -match("MESSAGE#441:00026:08/0", "nwparser.payload", "SSH user %{username->} has been authenticated using %{p0}"); +var part757 = match("MESSAGE#441:00026:08/0", "nwparser.payload", "SSH user %{username->} has been authenticated using %{p0}"); -var part759 = // "Pattern{Constant('from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' [ with key ID '), Field(fld2,true), Constant(' ]')}" -match("MESSAGE#441:00026:08/2", "nwparser.p0", "from %{saddr}:%{sport->} [ with key ID %{fld2->} ]"); +var part758 = match("MESSAGE#441:00026:08/2", "nwparser.p0", "from %{saddr}:%{sport->} [ with key ID %{fld2->} ]"); -var all154 = all_match({ +var all153 = all_match({ processors: [ + part757, + dup372, part758, - dup375, - part759, ], on_success: processor_chain([ - dup201, + dup199, dup29, dup30, dup31, @@ -10419,10 +9380,9 @@ var all154 = all_match({ ]), }); -var msg444 = msg("00026:08", all154); +var msg444 = msg("00026:08", all153); -var part760 = // "Pattern{Constant('IPSec tunnel on int '), Field(interface,true), Constant(' with tunnel ID '), Field(fld2,true), Constant(' received a packet with a bad SPI.')}" -match("MESSAGE#442:00026:09", "nwparser.payload", "IPSec tunnel on int %{interface->} with tunnel ID %{fld2->} received a packet with a bad SPI.", processor_chain([ +var part759 = match("MESSAGE#442:00026:09", "nwparser.payload", "IPSec tunnel on int %{interface->} with tunnel ID %{fld2->} received a packet with a bad SPI.", processor_chain([ dup19, dup2, dup3, @@ -10430,45 +9390,40 @@ match("MESSAGE#442:00026:09", "nwparser.payload", "IPSec tunnel on int %{interfa dup5, ])); -var msg445 = msg("00026:09", part760); +var msg445 = msg("00026:09", part759); -var part761 = // "Pattern{Constant('SSH: '), Field(p0,false)}" -match("MESSAGE#443:00026:10/0", "nwparser.payload", "SSH: %{p0}"); +var part760 = match("MESSAGE#443:00026:10/0", "nwparser.payload", "SSH: %{p0}"); -var part762 = // "Pattern{Constant('Failed '), Field(p0,false)}" -match("MESSAGE#443:00026:10/1_0", "nwparser.p0", "Failed %{p0}"); +var part761 = match("MESSAGE#443:00026:10/1_0", "nwparser.p0", "Failed %{p0}"); -var part763 = // "Pattern{Constant('Attempt '), Field(p0,false)}" -match("MESSAGE#443:00026:10/1_1", "nwparser.p0", "Attempt %{p0}"); +var part762 = match("MESSAGE#443:00026:10/1_1", "nwparser.p0", "Attempt %{p0}"); var select174 = linear_select([ + part761, part762, - part763, ]); -var part764 = // "Pattern{Constant('bind duplicate '), Field(p0,false)}" -match("MESSAGE#443:00026:10/3_0", "nwparser.p0", "bind duplicate %{p0}"); +var part763 = match("MESSAGE#443:00026:10/3_0", "nwparser.p0", "bind duplicate %{p0}"); var select175 = linear_select([ - part764, - dup203, + part763, + dup201, ]); -var part765 = // "Pattern{Constant('admin user ''), Field(administrator,false), Constant('' (Key ID '), Field(fld2,false), Constant(')')}" -match("MESSAGE#443:00026:10/6", "nwparser.p0", "admin user '%{administrator}' (Key ID %{fld2})"); +var part764 = match("MESSAGE#443:00026:10/6", "nwparser.p0", "admin user '%{administrator}' (Key ID %{fld2})"); -var all155 = all_match({ +var all154 = all_match({ processors: [ - part761, + part760, select174, dup103, select175, - dup204, - dup376, - part765, + dup202, + dup373, + part764, ], on_success: processor_chain([ - dup205, + dup203, dup2, dup3, dup4, @@ -10476,10 +9431,9 @@ var all155 = all_match({ ]), }); -var msg446 = msg("00026:10", all155); +var msg446 = msg("00026:10", all154); -var part766 = // "Pattern{Constant('SSH: Maximum number of PKA keys ('), Field(fld2,false), Constant(') has been bound to user ''), Field(username,false), Constant('' Key not bound. (Key ID '), Field(fld3,false), Constant(')')}" -match("MESSAGE#444:00026:11", "nwparser.payload", "SSH: Maximum number of PKA keys (%{fld2}) has been bound to user '%{username}' Key not bound. (Key ID %{fld3})", processor_chain([ +var part765 = match("MESSAGE#444:00026:11", "nwparser.payload", "SSH: Maximum number of PKA keys (%{fld2}) has been bound to user '%{username}' Key not bound. (Key ID %{fld3})", processor_chain([ dup44, dup2, dup3, @@ -10487,10 +9441,9 @@ match("MESSAGE#444:00026:11", "nwparser.payload", "SSH: Maximum number of PKA ke dup5, ])); -var msg447 = msg("00026:11", part766); +var msg447 = msg("00026:11", part765); -var part767 = // "Pattern{Constant('IKE '), Field(fld2,false), Constant(': Missing heartbeats have exceeded the threshold. All Phase 1 and 2 SAs have been removed')}" -match("MESSAGE#445:00026:12", "nwparser.payload", "IKE %{fld2}: Missing heartbeats have exceeded the threshold. All Phase 1 and 2 SAs have been removed", processor_chain([ +var part766 = match("MESSAGE#445:00026:12", "nwparser.payload", "IKE %{fld2}: Missing heartbeats have exceeded the threshold. All Phase 1 and 2 SAs have been removed", processor_chain([ dup44, dup2, dup3, @@ -10498,7 +9451,7 @@ match("MESSAGE#445:00026:12", "nwparser.payload", "IKE %{fld2}: Missing heartbea dup5, ])); -var msg448 = msg("00026:12", part767); +var msg448 = msg("00026:12", part766); var select176 = linear_select([ msg435, @@ -10517,33 +9470,29 @@ var select176 = linear_select([ msg448, ]); -var part768 = // "Pattern{Constant('user '), Field(username,true), Constant(' from '), Field(p0,false)}" -match("MESSAGE#446:00027/2", "nwparser.p0", "user %{username->} from %{p0}"); +var part767 = match("MESSAGE#446:00027/2", "nwparser.p0", "user %{username->} from %{p0}"); -var part769 = // "Pattern{Constant('IP address '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#446:00027/3_0", "nwparser.p0", "IP address %{saddr}:%{sport}"); +var part768 = match("MESSAGE#446:00027/3_0", "nwparser.p0", "IP address %{saddr}:%{sport}"); -var part770 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#446:00027/3_1", "nwparser.p0", "%{saddr}:%{sport}"); +var part769 = match("MESSAGE#446:00027/3_1", "nwparser.p0", "%{saddr}:%{sport}"); -var part771 = // "Pattern{Constant('console'), Field(,false)}" -match("MESSAGE#446:00027/3_2", "nwparser.p0", "console%{}"); +var part770 = match("MESSAGE#446:00027/3_2", "nwparser.p0", "console%{}"); var select177 = linear_select([ + part768, part769, part770, - part771, ]); -var all156 = all_match({ +var all155 = all_match({ processors: [ - dup206, - dup377, - part768, + dup204, + dup374, + part767, select177, ], on_success: processor_chain([ - dup208, + dup206, dup30, dup31, dup54, @@ -10554,10 +9503,9 @@ var all156 = all_match({ ]), }); -var msg449 = msg("00027", all156); +var msg449 = msg("00027", all155); -var part772 = // "Pattern{Field(change_attribute,true), Constant(' has been restored from '), Field(change_old,true), Constant(' to default port '), Field(change_new,false), Constant('. '), Field(info,false)}" -match("MESSAGE#447:00027:01", "nwparser.payload", "%{change_attribute->} has been restored from %{change_old->} to default port %{change_new}. %{info}", processor_chain([ +var part771 = match("MESSAGE#447:00027:01", "nwparser.payload", "%{change_attribute->} has been restored from %{change_old->} to default port %{change_new}. %{info}", processor_chain([ dup1, dup2, dup3, @@ -10565,10 +9513,9 @@ match("MESSAGE#447:00027:01", "nwparser.payload", "%{change_attribute->} has bee dup5, ])); -var msg450 = msg("00027:01", part772); +var msg450 = msg("00027:01", part771); -var part773 = // "Pattern{Field(change_attribute,true), Constant(' has been restored from '), Field(change_old,true), Constant(' to '), Field(change_new,false), Constant('. '), Field(info,false)}" -match("MESSAGE#448:00027:02", "nwparser.payload", "%{change_attribute->} has been restored from %{change_old->} to %{change_new}. %{info}", processor_chain([ +var part772 = match("MESSAGE#448:00027:02", "nwparser.payload", "%{change_attribute->} has been restored from %{change_old->} to %{change_new}. %{info}", processor_chain([ dup1, dup2, dup3, @@ -10576,10 +9523,9 @@ match("MESSAGE#448:00027:02", "nwparser.payload", "%{change_attribute->} has bee dup5, ])); -var msg451 = msg("00027:02", part773); +var msg451 = msg("00027:02", part772); -var part774 = // "Pattern{Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to port '), Field(change_new,false), Constant('. '), Field(info,false)}" -match("MESSAGE#449:00027:03", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to port %{change_new}. %{info}", processor_chain([ +var part773 = match("MESSAGE#449:00027:03", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to port %{change_new}. %{info}", processor_chain([ dup1, dup2, dup3, @@ -10587,10 +9533,9 @@ match("MESSAGE#449:00027:03", "nwparser.payload", "%{change_attribute->} has bee dup5, ])); -var msg452 = msg("00027:03", part774); +var msg452 = msg("00027:03", part773); -var part775 = // "Pattern{Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to port '), Field(change_new,false)}" -match("MESSAGE#450:00027:04", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to port %{change_new}", processor_chain([ +var part774 = match("MESSAGE#450:00027:04", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to port %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -10598,43 +9543,38 @@ match("MESSAGE#450:00027:04", "nwparser.payload", "%{change_attribute->} has bee dup5, ])); -var msg453 = msg("00027:04", part775); +var msg453 = msg("00027:04", part774); -var part776 = // "Pattern{Constant('ScreenOS '), Field(version,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#451:00027:05/0", "nwparser.payload", "ScreenOS %{version->} %{p0}"); +var part775 = match("MESSAGE#451:00027:05/0", "nwparser.payload", "ScreenOS %{version->} %{p0}"); -var part777 = // "Pattern{Constant('Serial '), Field(p0,false)}" -match("MESSAGE#451:00027:05/1_0", "nwparser.p0", "Serial %{p0}"); +var part776 = match("MESSAGE#451:00027:05/1_0", "nwparser.p0", "Serial %{p0}"); -var part778 = // "Pattern{Constant('serial '), Field(p0,false)}" -match("MESSAGE#451:00027:05/1_1", "nwparser.p0", "serial %{p0}"); +var part777 = match("MESSAGE#451:00027:05/1_1", "nwparser.p0", "serial %{p0}"); var select178 = linear_select([ + part776, part777, - part778, ]); -var part779 = // "Pattern{Constant('# '), Field(fld2,false), Constant(': Asset recovery '), Field(p0,false)}" -match("MESSAGE#451:00027:05/2", "nwparser.p0", "# %{fld2}: Asset recovery %{p0}"); +var part778 = match("MESSAGE#451:00027:05/2", "nwparser.p0", "# %{fld2}: Asset recovery %{p0}"); -var part780 = // "Pattern{Constant('performed '), Field(p0,false)}" -match("MESSAGE#451:00027:05/3_0", "nwparser.p0", "performed %{p0}"); +var part779 = match("MESSAGE#451:00027:05/3_0", "nwparser.p0", "performed %{p0}"); var select179 = linear_select([ - part780, + part779, dup127, ]); var select180 = linear_select([ - dup209, - dup210, + dup207, + dup208, ]); -var all157 = all_match({ +var all156 = all_match({ processors: [ - part776, + part775, select178, - part779, + part778, select179, dup23, select180, @@ -10648,19 +9588,18 @@ var all157 = all_match({ ]), }); -var msg454 = msg("00027:05", all157); +var msg454 = msg("00027:05", all156); -var part781 = // "Pattern{Constant('Device Reset (Asset Recovery) has been '), Field(p0,false)}" -match("MESSAGE#452:00027:06/0", "nwparser.payload", "Device Reset (Asset Recovery) has been %{p0}"); +var part780 = match("MESSAGE#452:00027:06/0", "nwparser.payload", "Device Reset (Asset Recovery) has been %{p0}"); var select181 = linear_select([ - dup210, - dup209, + dup208, + dup207, ]); -var all158 = all_match({ +var all157 = all_match({ processors: [ - part781, + part780, select181, ], on_success: processor_chain([ @@ -10672,10 +9611,9 @@ var all158 = all_match({ ]), }); -var msg455 = msg("00027:06", all158); +var msg455 = msg("00027:06", all157); -var part782 = // "Pattern{Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false), Constant('. '), Field(info,false)}" -match("MESSAGE#453:00027:07", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}. %{info}", processor_chain([ +var part781 = match("MESSAGE#453:00027:07", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}. %{info}", processor_chain([ dup1, dup2, dup3, @@ -10683,10 +9621,9 @@ match("MESSAGE#453:00027:07", "nwparser.payload", "%{change_attribute->} has bee dup5, ])); -var msg456 = msg("00027:07", part782); +var msg456 = msg("00027:07", part781); -var part783 = // "Pattern{Constant('System configuration has been erased'), Field(,false)}" -match("MESSAGE#454:00027:08", "nwparser.payload", "System configuration has been erased%{}", processor_chain([ +var part782 = match("MESSAGE#454:00027:08", "nwparser.payload", "System configuration has been erased%{}", processor_chain([ dup1, dup2, dup3, @@ -10694,10 +9631,9 @@ match("MESSAGE#454:00027:08", "nwparser.payload", "System configuration has been dup5, ])); -var msg457 = msg("00027:08", part783); +var msg457 = msg("00027:08", part782); -var part784 = // "Pattern{Constant('License key '), Field(fld2,true), Constant(' is due to expire in '), Field(fld3,false), Constant('.')}" -match("MESSAGE#455:00027:09", "nwparser.payload", "License key %{fld2->} is due to expire in %{fld3}.", processor_chain([ +var part783 = match("MESSAGE#455:00027:09", "nwparser.payload", "License key %{fld2->} is due to expire in %{fld3}.", processor_chain([ dup44, dup2, dup3, @@ -10705,10 +9641,9 @@ match("MESSAGE#455:00027:09", "nwparser.payload", "License key %{fld2->} is due dup5, ])); -var msg458 = msg("00027:09", part784); +var msg458 = msg("00027:09", part783); -var part785 = // "Pattern{Constant('License key '), Field(fld2,true), Constant(' has expired.')}" -match("MESSAGE#456:00027:10", "nwparser.payload", "License key %{fld2->} has expired.", processor_chain([ +var part784 = match("MESSAGE#456:00027:10", "nwparser.payload", "License key %{fld2->} has expired.", processor_chain([ dup44, dup2, dup3, @@ -10716,10 +9651,9 @@ match("MESSAGE#456:00027:10", "nwparser.payload", "License key %{fld2->} has exp dup5, ])); -var msg459 = msg("00027:10", part785); +var msg459 = msg("00027:10", part784); -var part786 = // "Pattern{Constant('License key '), Field(fld2,true), Constant(' expired after 30-day grace period.')}" -match("MESSAGE#457:00027:11", "nwparser.payload", "License key %{fld2->} expired after 30-day grace period.", processor_chain([ +var part785 = match("MESSAGE#457:00027:11", "nwparser.payload", "License key %{fld2->} expired after 30-day grace period.", processor_chain([ dup44, dup2, dup3, @@ -10727,27 +9661,24 @@ match("MESSAGE#457:00027:11", "nwparser.payload", "License key %{fld2->} expired dup5, ])); -var msg460 = msg("00027:11", part786); +var msg460 = msg("00027:11", part785); -var part787 = // "Pattern{Constant('Request to retrieve license key failed to reach '), Field(p0,false)}" -match("MESSAGE#458:00027:12/0", "nwparser.payload", "Request to retrieve license key failed to reach %{p0}"); +var part786 = match("MESSAGE#458:00027:12/0", "nwparser.payload", "Request to retrieve license key failed to reach %{p0}"); -var part788 = // "Pattern{Constant('the server '), Field(p0,false)}" -match("MESSAGE#458:00027:12/1_0", "nwparser.p0", "the server %{p0}"); +var part787 = match("MESSAGE#458:00027:12/1_0", "nwparser.p0", "the server %{p0}"); var select182 = linear_select([ - part788, - dup195, + part787, + dup193, ]); -var part789 = // "Pattern{Constant('by '), Field(fld2,false), Constant('. Server url: '), Field(url,false)}" -match("MESSAGE#458:00027:12/2", "nwparser.p0", "by %{fld2}. Server url: %{url}"); +var part788 = match("MESSAGE#458:00027:12/2", "nwparser.p0", "by %{fld2}. Server url: %{url}"); -var all159 = all_match({ +var all158 = all_match({ processors: [ - part787, + part786, select182, - part789, + part788, ], on_success: processor_chain([ dup19, @@ -10758,19 +9689,18 @@ var all159 = all_match({ ]), }); -var msg461 = msg("00027:12", all159); +var msg461 = msg("00027:12", all158); -var part790 = // "Pattern{Constant('user '), Field(username,false)}" -match("MESSAGE#459:00027:13/2", "nwparser.p0", "user %{username}"); +var part789 = match("MESSAGE#459:00027:13/2", "nwparser.p0", "user %{username}"); -var all160 = all_match({ +var all159 = all_match({ processors: [ - dup206, - dup377, - part790, + dup204, + dup374, + part789, ], on_success: processor_chain([ - dup208, + dup206, dup30, dup31, dup54, @@ -10781,30 +9711,26 @@ var all160 = all_match({ ]), }); -var msg462 = msg("00027:13", all160); +var msg462 = msg("00027:13", all159); -var part791 = // "Pattern{Constant('Configuration Erasure Process '), Field(p0,false)}" -match("MESSAGE#460:00027:14/0", "nwparser.payload", "Configuration Erasure Process %{p0}"); +var part790 = match("MESSAGE#460:00027:14/0", "nwparser.payload", "Configuration Erasure Process %{p0}"); -var part792 = // "Pattern{Constant('has been initiated '), Field(p0,false)}" -match("MESSAGE#460:00027:14/1_0", "nwparser.p0", "has been initiated %{p0}"); +var part791 = match("MESSAGE#460:00027:14/1_0", "nwparser.p0", "has been initiated %{p0}"); -var part793 = // "Pattern{Constant('aborted '), Field(p0,false)}" -match("MESSAGE#460:00027:14/1_1", "nwparser.p0", "aborted %{p0}"); +var part792 = match("MESSAGE#460:00027:14/1_1", "nwparser.p0", "aborted %{p0}"); var select183 = linear_select([ + part791, part792, - part793, ]); -var part794 = // "Pattern{Constant('.'), Field(space,false), Constant('('), Field(fld1,false), Constant(')')}" -match("MESSAGE#460:00027:14/2", "nwparser.p0", ".%{space}(%{fld1})"); +var part793 = match("MESSAGE#460:00027:14/2", "nwparser.p0", ".%{space}(%{fld1})"); -var all161 = all_match({ +var all160 = all_match({ processors: [ - part791, + part790, select183, - part794, + part793, ], on_success: processor_chain([ dup1, @@ -10816,10 +9742,9 @@ var all161 = all_match({ ]), }); -var msg463 = msg("00027:14", all161); +var msg463 = msg("00027:14", all160); -var part795 = // "Pattern{Constant('Waiting for 2nd confirmation. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#461:00027:15", "nwparser.payload", "Waiting for 2nd confirmation. (%{fld1})", processor_chain([ +var part794 = match("MESSAGE#461:00027:15", "nwparser.payload", "Waiting for 2nd confirmation. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -10828,10 +9753,9 @@ match("MESSAGE#461:00027:15", "nwparser.payload", "Waiting for 2nd confirmation. dup5, ])); -var msg464 = msg("00027:15", part795); +var msg464 = msg("00027:15", part794); -var part796 = // "Pattern{Constant('Admin '), Field(fld3,true), Constant(' policy id '), Field(policy_id,true), Constant(' name "'), Field(fld2,true), Constant(' has been re-enabled by NetScreen system after being locked due to excessive failed login attempts ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1220:00027:16", "nwparser.payload", "Admin %{fld3->} policy id %{policy_id->} name \"%{fld2->} has been re-enabled by NetScreen system after being locked due to excessive failed login attempts (%{fld1})", processor_chain([ +var part795 = match("MESSAGE#1220:00027:16", "nwparser.payload", "Admin %{fld3->} policy id %{policy_id->} name \"%{fld2->} has been re-enabled by NetScreen system after being locked due to excessive failed login attempts (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -10840,10 +9764,9 @@ match("MESSAGE#1220:00027:16", "nwparser.payload", "Admin %{fld3->} policy id %{ dup5, ])); -var msg465 = msg("00027:16", part796); +var msg465 = msg("00027:16", part795); -var part797 = // "Pattern{Constant('Admin '), Field(username,true), Constant(' is locked and will be unlocked after '), Field(duration,true), Constant(' minutes ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1225:00027:17", "nwparser.payload", "Admin %{username->} is locked and will be unlocked after %{duration->} minutes (%{fld1})", processor_chain([ +var part796 = match("MESSAGE#1225:00027:17", "nwparser.payload", "Admin %{username->} is locked and will be unlocked after %{duration->} minutes (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -10851,10 +9774,9 @@ match("MESSAGE#1225:00027:17", "nwparser.payload", "Admin %{username->} is locke dup9, ])); -var msg466 = msg("00027:17", part797); +var msg466 = msg("00027:17", part796); -var part798 = // "Pattern{Constant('Login attempt by admin '), Field(username,true), Constant(' from '), Field(saddr,true), Constant(' is refused as this account is locked ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1226:00027:18", "nwparser.payload", "Login attempt by admin %{username->} from %{saddr->} is refused as this account is locked (%{fld1})", processor_chain([ +var part797 = match("MESSAGE#1226:00027:18", "nwparser.payload", "Login attempt by admin %{username->} from %{saddr->} is refused as this account is locked (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -10862,10 +9784,9 @@ match("MESSAGE#1226:00027:18", "nwparser.payload", "Login attempt by admin %{use dup9, ])); -var msg467 = msg("00027:18", part798); +var msg467 = msg("00027:18", part797); -var part799 = // "Pattern{Constant('Admin '), Field(username,true), Constant(' has been re-enabled by NetScreen system after being locked due to excessive failed login attempts ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1227:00027:19", "nwparser.payload", "Admin %{username->} has been re-enabled by NetScreen system after being locked due to excessive failed login attempts (%{fld1})", processor_chain([ +var part798 = match("MESSAGE#1227:00027:19", "nwparser.payload", "Admin %{username->} has been re-enabled by NetScreen system after being locked due to excessive failed login attempts (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -10873,7 +9794,7 @@ match("MESSAGE#1227:00027:19", "nwparser.payload", "Admin %{username->} has been dup9, ])); -var msg468 = msg("00027:19", part799); +var msg468 = msg("00027:19", part798); var select184 = linear_select([ msg449, @@ -10898,28 +9819,24 @@ var select184 = linear_select([ msg468, ]); -var part800 = // "Pattern{Constant('An Intruder'), Field(p0,false)}" -match("MESSAGE#462:00028/0_0", "nwparser.payload", "An Intruder%{p0}"); +var part799 = match("MESSAGE#462:00028/0_0", "nwparser.payload", "An Intruder%{p0}"); -var part801 = // "Pattern{Constant('Intruder'), Field(p0,false)}" -match("MESSAGE#462:00028/0_1", "nwparser.payload", "Intruder%{p0}"); +var part800 = match("MESSAGE#462:00028/0_1", "nwparser.payload", "Intruder%{p0}"); -var part802 = // "Pattern{Constant('An intruter'), Field(p0,false)}" -match("MESSAGE#462:00028/0_2", "nwparser.payload", "An intruter%{p0}"); +var part801 = match("MESSAGE#462:00028/0_2", "nwparser.payload", "An intruter%{p0}"); var select185 = linear_select([ + part799, part800, part801, - part802, ]); -var part803 = // "Pattern{Field(,false), Constant('has attempted to connect to the NetScreen-Global PRO port! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' at interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#462:00028/1", "nwparser.p0", "%{}has attempted to connect to the NetScreen-Global PRO port! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times"); +var part802 = match("MESSAGE#462:00028/1", "nwparser.p0", "%{}has attempted to connect to the NetScreen-Global PRO port! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times"); -var all162 = all_match({ +var all161 = all_match({ processors: [ select185, - part803, + part802, ], on_success: processor_chain([ dup58, @@ -10933,52 +9850,46 @@ var all162 = all_match({ ]), }); -var msg469 = msg("00028", all162); +var msg469 = msg("00028", all161); -var part804 = // "Pattern{Constant('DNS has been refreshed'), Field(,false)}" -match("MESSAGE#463:00029", "nwparser.payload", "DNS has been refreshed%{}", processor_chain([ - dup211, +var part803 = match("MESSAGE#463:00029", "nwparser.payload", "DNS has been refreshed%{}", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg470 = msg("00029", part804); +var msg470 = msg("00029", part803); -var part805 = // "Pattern{Constant('DHCP file write: out of memory.'), Field(,false)}" -match("MESSAGE#464:00029:01", "nwparser.payload", "DHCP file write: out of memory.%{}", processor_chain([ - dup186, +var part804 = match("MESSAGE#464:00029:01", "nwparser.payload", "DHCP file write: out of memory.%{}", processor_chain([ + dup184, dup2, dup3, dup4, dup5, ])); -var msg471 = msg("00029:01", part805); +var msg471 = msg("00029:01", part804); -var part806 = // "Pattern{Constant('The DHCP process cannot open file '), Field(fld2,true), Constant(' to '), Field(p0,false)}" -match("MESSAGE#465:00029:02/0", "nwparser.payload", "The DHCP process cannot open file %{fld2->} to %{p0}"); +var part805 = match("MESSAGE#465:00029:02/0", "nwparser.payload", "The DHCP process cannot open file %{fld2->} to %{p0}"); -var part807 = // "Pattern{Constant('read '), Field(p0,false)}" -match("MESSAGE#465:00029:02/1_0", "nwparser.p0", "read %{p0}"); +var part806 = match("MESSAGE#465:00029:02/1_0", "nwparser.p0", "read %{p0}"); -var part808 = // "Pattern{Constant('write '), Field(p0,false)}" -match("MESSAGE#465:00029:02/1_1", "nwparser.p0", "write %{p0}"); +var part807 = match("MESSAGE#465:00029:02/1_1", "nwparser.p0", "write %{p0}"); var select186 = linear_select([ + part806, part807, - part808, ]); -var part809 = // "Pattern{Constant('data.'), Field(,false)}" -match("MESSAGE#465:00029:02/2", "nwparser.p0", "data.%{}"); +var part808 = match("MESSAGE#465:00029:02/2", "nwparser.p0", "data.%{}"); -var all163 = all_match({ +var all162 = all_match({ processors: [ - part806, + part805, select186, - part809, + part808, ], on_success: processor_chain([ dup117, @@ -10989,32 +9900,28 @@ var all163 = all_match({ ]), }); -var msg472 = msg("00029:02", all163); +var msg472 = msg("00029:02", all162); -var part810 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' is full. Unable to '), Field(p0,false)}" -match("MESSAGE#466:00029:03/2", "nwparser.p0", "%{} %{interface->} is full. Unable to %{p0}"); +var part809 = match("MESSAGE#466:00029:03/2", "nwparser.p0", "%{} %{interface->} is full. Unable to %{p0}"); -var part811 = // "Pattern{Constant('commit '), Field(p0,false)}" -match("MESSAGE#466:00029:03/3_0", "nwparser.p0", "commit %{p0}"); +var part810 = match("MESSAGE#466:00029:03/3_0", "nwparser.p0", "commit %{p0}"); -var part812 = // "Pattern{Constant('offer '), Field(p0,false)}" -match("MESSAGE#466:00029:03/3_1", "nwparser.p0", "offer %{p0}"); +var part811 = match("MESSAGE#466:00029:03/3_1", "nwparser.p0", "offer %{p0}"); var select187 = linear_select([ + part810, part811, - part812, ]); -var part813 = // "Pattern{Constant('IP address to client at '), Field(fld2,false)}" -match("MESSAGE#466:00029:03/4", "nwparser.p0", "IP address to client at %{fld2}"); +var part812 = match("MESSAGE#466:00029:03/4", "nwparser.p0", "IP address to client at %{fld2}"); -var all164 = all_match({ +var all163 = all_match({ processors: [ - dup212, - dup339, - part810, + dup210, + dup337, + part809, select187, - part813, + part812, ], on_success: processor_chain([ dup117, @@ -11025,10 +9932,9 @@ var all164 = all_match({ ]), }); -var msg473 = msg("00029:03", all164); +var msg473 = msg("00029:03", all163); -var part814 = // "Pattern{Constant('DHCP server set to OFF on '), Field(interface,true), Constant(' (another server found on '), Field(hostip,false), Constant(').')}" -match("MESSAGE#467:00029:04", "nwparser.payload", "DHCP server set to OFF on %{interface->} (another server found on %{hostip}).", processor_chain([ +var part813 = match("MESSAGE#467:00029:04", "nwparser.payload", "DHCP server set to OFF on %{interface->} (another server found on %{hostip}).", processor_chain([ dup44, dup2, dup3, @@ -11036,7 +9942,7 @@ match("MESSAGE#467:00029:04", "nwparser.payload", "DHCP server set to OFF on %{i dup5, ])); -var msg474 = msg("00029:04", part814); +var msg474 = msg("00029:04", part813); var select188 = linear_select([ msg470, @@ -11046,8 +9952,7 @@ var select188 = linear_select([ msg474, ]); -var part815 = // "Pattern{Constant('CA configuration is invalid'), Field(,false)}" -match("MESSAGE#468:00030", "nwparser.payload", "CA configuration is invalid%{}", processor_chain([ +var part814 = match("MESSAGE#468:00030", "nwparser.payload", "CA configuration is invalid%{}", processor_chain([ dup18, dup2, dup3, @@ -11055,25 +9960,22 @@ match("MESSAGE#468:00030", "nwparser.payload", "CA configuration is invalid%{}", dup5, ])); -var msg475 = msg("00030", part815); +var msg475 = msg("00030", part814); -var part816 = // "Pattern{Constant('DSS checking of CRLs has been changed from '), Field(p0,false)}" -match("MESSAGE#469:00030:01/0", "nwparser.payload", "DSS checking of CRLs has been changed from %{p0}"); +var part815 = match("MESSAGE#469:00030:01/0", "nwparser.payload", "DSS checking of CRLs has been changed from %{p0}"); -var part817 = // "Pattern{Constant('0 to 1'), Field(,false)}" -match("MESSAGE#469:00030:01/1_0", "nwparser.p0", "0 to 1%{}"); +var part816 = match("MESSAGE#469:00030:01/1_0", "nwparser.p0", "0 to 1%{}"); -var part818 = // "Pattern{Constant('1 to 0'), Field(,false)}" -match("MESSAGE#469:00030:01/1_1", "nwparser.p0", "1 to 0%{}"); +var part817 = match("MESSAGE#469:00030:01/1_1", "nwparser.p0", "1 to 0%{}"); var select189 = linear_select([ + part816, part817, - part818, ]); -var all165 = all_match({ +var all164 = all_match({ processors: [ - part816, + part815, select189, ], on_success: processor_chain([ @@ -11085,10 +9987,9 @@ var all165 = all_match({ ]), }); -var msg476 = msg("00030:01", all165); +var msg476 = msg("00030:01", all164); -var part819 = // "Pattern{Constant('For the X509 certificate '), Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#470:00030:05", "nwparser.payload", "For the X509 certificate %{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ +var part818 = match("MESSAGE#470:00030:05", "nwparser.payload", "For the X509 certificate %{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -11096,10 +9997,9 @@ match("MESSAGE#470:00030:05", "nwparser.payload", "For the X509 certificate %{ch dup5, ])); -var msg477 = msg("00030:05", part819); +var msg477 = msg("00030:05", part818); -var part820 = // "Pattern{Constant('In the X509 certificate request the '), Field(fld2,true), Constant(' field has been changed from '), Field(fld3,false)}" -match("MESSAGE#471:00030:06", "nwparser.payload", "In the X509 certificate request the %{fld2->} field has been changed from %{fld3}", processor_chain([ +var part819 = match("MESSAGE#471:00030:06", "nwparser.payload", "In the X509 certificate request the %{fld2->} field has been changed from %{fld3}", processor_chain([ dup1, dup2, dup3, @@ -11107,10 +10007,9 @@ match("MESSAGE#471:00030:06", "nwparser.payload", "In the X509 certificate reque dup5, ])); -var msg478 = msg("00030:06", part820); +var msg478 = msg("00030:06", part819); -var part821 = // "Pattern{Constant('RA X509 certificate cannot be loaded'), Field(,false)}" -match("MESSAGE#472:00030:07", "nwparser.payload", "RA X509 certificate cannot be loaded%{}", processor_chain([ +var part820 = match("MESSAGE#472:00030:07", "nwparser.payload", "RA X509 certificate cannot be loaded%{}", processor_chain([ dup19, dup2, dup3, @@ -11118,10 +10017,9 @@ match("MESSAGE#472:00030:07", "nwparser.payload", "RA X509 certificate cannot be dup5, ])); -var msg479 = msg("00030:07", part821); +var msg479 = msg("00030:07", part820); -var part822 = // "Pattern{Constant('Self-signed X509 certificate cannot be generated'), Field(,false)}" -match("MESSAGE#473:00030:10", "nwparser.payload", "Self-signed X509 certificate cannot be generated%{}", processor_chain([ +var part821 = match("MESSAGE#473:00030:10", "nwparser.payload", "Self-signed X509 certificate cannot be generated%{}", processor_chain([ dup86, dup2, dup3, @@ -11129,10 +10027,9 @@ match("MESSAGE#473:00030:10", "nwparser.payload", "Self-signed X509 certificate dup5, ])); -var msg480 = msg("00030:10", part822); +var msg480 = msg("00030:10", part821); -var part823 = // "Pattern{Constant('The public key for ScreenOS image has successfully been updated'), Field(,false)}" -match("MESSAGE#474:00030:12", "nwparser.payload", "The public key for ScreenOS image has successfully been updated%{}", processor_chain([ +var part822 = match("MESSAGE#474:00030:12", "nwparser.payload", "The public key for ScreenOS image has successfully been updated%{}", processor_chain([ dup1, dup2, dup3, @@ -11140,25 +10037,22 @@ match("MESSAGE#474:00030:12", "nwparser.payload", "The public key for ScreenOS i dup5, ])); -var msg481 = msg("00030:12", part823); +var msg481 = msg("00030:12", part822); -var part824 = // "Pattern{Constant('The public key used for ScreenOS image authentication cannot be '), Field(p0,false)}" -match("MESSAGE#475:00030:13/0", "nwparser.payload", "The public key used for ScreenOS image authentication cannot be %{p0}"); +var part823 = match("MESSAGE#475:00030:13/0", "nwparser.payload", "The public key used for ScreenOS image authentication cannot be %{p0}"); -var part825 = // "Pattern{Constant('decoded'), Field(,false)}" -match("MESSAGE#475:00030:13/1_0", "nwparser.p0", "decoded%{}"); +var part824 = match("MESSAGE#475:00030:13/1_0", "nwparser.p0", "decoded%{}"); -var part826 = // "Pattern{Constant('loaded'), Field(,false)}" -match("MESSAGE#475:00030:13/1_1", "nwparser.p0", "loaded%{}"); +var part825 = match("MESSAGE#475:00030:13/1_1", "nwparser.p0", "loaded%{}"); var select190 = linear_select([ + part824, part825, - part826, ]); -var all166 = all_match({ +var all165 = all_match({ processors: [ - part824, + part823, select190, ], on_success: processor_chain([ @@ -11172,48 +10066,41 @@ var all166 = all_match({ ]), }); -var msg482 = msg("00030:13", all166); +var msg482 = msg("00030:13", all165); -var part827 = // "Pattern{Constant('CA IDENT '), Field(p0,false)}" -match("MESSAGE#476:00030:14/1_0", "nwparser.p0", "CA IDENT %{p0}"); +var part826 = match("MESSAGE#476:00030:14/1_0", "nwparser.p0", "CA IDENT %{p0}"); -var part828 = // "Pattern{Constant('Challenge password '), Field(p0,false)}" -match("MESSAGE#476:00030:14/1_1", "nwparser.p0", "Challenge password %{p0}"); +var part827 = match("MESSAGE#476:00030:14/1_1", "nwparser.p0", "Challenge password %{p0}"); -var part829 = // "Pattern{Constant('CA CGI URL '), Field(p0,false)}" -match("MESSAGE#476:00030:14/1_2", "nwparser.p0", "CA CGI URL %{p0}"); +var part828 = match("MESSAGE#476:00030:14/1_2", "nwparser.p0", "CA CGI URL %{p0}"); -var part830 = // "Pattern{Constant('RA CGI URL '), Field(p0,false)}" -match("MESSAGE#476:00030:14/1_3", "nwparser.p0", "RA CGI URL %{p0}"); +var part829 = match("MESSAGE#476:00030:14/1_3", "nwparser.p0", "RA CGI URL %{p0}"); var select191 = linear_select([ + part826, part827, part828, part829, - part830, ]); -var part831 = // "Pattern{Constant('for SCEP '), Field(p0,false)}" -match("MESSAGE#476:00030:14/2", "nwparser.p0", "for SCEP %{p0}"); +var part830 = match("MESSAGE#476:00030:14/2", "nwparser.p0", "for SCEP %{p0}"); -var part832 = // "Pattern{Constant('requests '), Field(p0,false)}" -match("MESSAGE#476:00030:14/3_0", "nwparser.p0", "requests %{p0}"); +var part831 = match("MESSAGE#476:00030:14/3_0", "nwparser.p0", "requests %{p0}"); var select192 = linear_select([ - part832, + part831, dup16, ]); -var part833 = // "Pattern{Constant('has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#476:00030:14/4", "nwparser.p0", "has been changed from %{change_old->} to %{change_new}"); +var part832 = match("MESSAGE#476:00030:14/4", "nwparser.p0", "has been changed from %{change_old->} to %{change_new}"); -var all167 = all_match({ +var all166 = all_match({ processors: [ dup55, select191, - part831, + part830, select192, - part833, + part832, ], on_success: processor_chain([ dup1, @@ -11224,14 +10111,13 @@ var all167 = all_match({ ]), }); -var msg483 = msg("00030:14", all167); +var msg483 = msg("00030:14", all166); -var msg484 = msg("00030:02", dup378); +var msg484 = msg("00030:02", dup375); -var part834 = // "Pattern{Constant('X509 certificate for ScreenOS image authentication is invalid'), Field(,false)}" -match("MESSAGE#478:00030:15", "nwparser.payload", "X509 certificate for ScreenOS image authentication is invalid%{}", processor_chain([ +var part833 = match("MESSAGE#478:00030:15", "nwparser.payload", "X509 certificate for ScreenOS image authentication is invalid%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11240,10 +10126,9 @@ match("MESSAGE#478:00030:15", "nwparser.payload", "X509 certificate for ScreenOS dup5, ])); -var msg485 = msg("00030:15", part834); +var msg485 = msg("00030:15", part833); -var part835 = // "Pattern{Constant('X509 certificate has been deleted'), Field(,false)}" -match("MESSAGE#479:00030:16", "nwparser.payload", "X509 certificate has been deleted%{}", processor_chain([ +var part834 = match("MESSAGE#479:00030:16", "nwparser.payload", "X509 certificate has been deleted%{}", processor_chain([ dup1, dup2, dup3, @@ -11251,10 +10136,9 @@ match("MESSAGE#479:00030:16", "nwparser.payload", "X509 certificate has been del dup5, ])); -var msg486 = msg("00030:16", part835); +var msg486 = msg("00030:16", part834); -var part836 = // "Pattern{Constant('PKI CRL: no revoke info accept per config DN '), Field(interface,false), Constant('.')}" -match("MESSAGE#480:00030:18", "nwparser.payload", "PKI CRL: no revoke info accept per config DN %{interface}.", processor_chain([ +var part835 = match("MESSAGE#480:00030:18", "nwparser.payload", "PKI CRL: no revoke info accept per config DN %{interface}.", processor_chain([ dup1, dup2, dup3, @@ -11262,30 +10146,26 @@ match("MESSAGE#480:00030:18", "nwparser.payload", "PKI CRL: no revoke info accep dup5, ])); -var msg487 = msg("00030:18", part836); +var msg487 = msg("00030:18", part835); -var part837 = // "Pattern{Constant('PKI: A configurable item '), Field(change_attribute,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#481:00030:19/0", "nwparser.payload", "PKI: A configurable item %{change_attribute->} %{p0}"); +var part836 = match("MESSAGE#481:00030:19/0", "nwparser.payload", "PKI: A configurable item %{change_attribute->} %{p0}"); -var part838 = // "Pattern{Constant('mode '), Field(p0,false)}" -match("MESSAGE#481:00030:19/1_0", "nwparser.p0", "mode %{p0}"); +var part837 = match("MESSAGE#481:00030:19/1_0", "nwparser.p0", "mode %{p0}"); -var part839 = // "Pattern{Constant('field'), Field(p0,false)}" -match("MESSAGE#481:00030:19/1_1", "nwparser.p0", "field%{p0}"); +var part838 = match("MESSAGE#481:00030:19/1_1", "nwparser.p0", "field%{p0}"); var select193 = linear_select([ + part837, part838, - part839, ]); -var part840 = // "Pattern{Field(,false), Constant('has changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#481:00030:19/2", "nwparser.p0", "%{}has changed from %{change_old->} to %{change_new}"); +var part839 = match("MESSAGE#481:00030:19/2", "nwparser.p0", "%{}has changed from %{change_old->} to %{change_new}"); -var all168 = all_match({ +var all167 = all_match({ processors: [ - part837, + part836, select193, - part840, + part839, ], on_success: processor_chain([ dup1, @@ -11296,10 +10176,9 @@ var all168 = all_match({ ]), }); -var msg488 = msg("00030:19", all168); +var msg488 = msg("00030:19", all167); -var part841 = // "Pattern{Constant('PKI: NSRP cold sync start for total of '), Field(fld2,true), Constant(' items.')}" -match("MESSAGE#482:00030:30", "nwparser.payload", "PKI: NSRP cold sync start for total of %{fld2->} items.", processor_chain([ +var part840 = match("MESSAGE#482:00030:30", "nwparser.payload", "PKI: NSRP cold sync start for total of %{fld2->} items.", processor_chain([ dup44, dup2, dup3, @@ -11307,10 +10186,9 @@ match("MESSAGE#482:00030:30", "nwparser.payload", "PKI: NSRP cold sync start for dup5, ])); -var msg489 = msg("00030:30", part841); +var msg489 = msg("00030:30", part840); -var part842 = // "Pattern{Constant('PKI: NSRP sync received cold sync item '), Field(fld2,true), Constant(' out of order expect '), Field(fld3,true), Constant(' of '), Field(fld4,false), Constant('.')}" -match("MESSAGE#483:00030:31", "nwparser.payload", "PKI: NSRP sync received cold sync item %{fld2->} out of order expect %{fld3->} of %{fld4}.", processor_chain([ +var part841 = match("MESSAGE#483:00030:31", "nwparser.payload", "PKI: NSRP sync received cold sync item %{fld2->} out of order expect %{fld3->} of %{fld4}.", processor_chain([ dup86, dup2, dup3, @@ -11318,10 +10196,9 @@ match("MESSAGE#483:00030:31", "nwparser.payload", "PKI: NSRP sync received cold dup5, ])); -var msg490 = msg("00030:31", part842); +var msg490 = msg("00030:31", part841); -var part843 = // "Pattern{Constant('PKI: NSRP sync received cold sync item '), Field(fld2,true), Constant(' without first item.')}" -match("MESSAGE#484:00030:32", "nwparser.payload", "PKI: NSRP sync received cold sync item %{fld2->} without first item.", processor_chain([ +var part842 = match("MESSAGE#484:00030:32", "nwparser.payload", "PKI: NSRP sync received cold sync item %{fld2->} without first item.", processor_chain([ dup86, dup2, dup3, @@ -11329,10 +10206,9 @@ match("MESSAGE#484:00030:32", "nwparser.payload", "PKI: NSRP sync received cold dup5, ])); -var msg491 = msg("00030:32", part843); +var msg491 = msg("00030:32", part842); -var part844 = // "Pattern{Constant('PKI: NSRP sync received normal item during cold sync.'), Field(,false)}" -match("MESSAGE#485:00030:33", "nwparser.payload", "PKI: NSRP sync received normal item during cold sync.%{}", processor_chain([ +var part843 = match("MESSAGE#485:00030:33", "nwparser.payload", "PKI: NSRP sync received normal item during cold sync.%{}", processor_chain([ dup44, dup2, dup3, @@ -11340,10 +10216,9 @@ match("MESSAGE#485:00030:33", "nwparser.payload", "PKI: NSRP sync received norma dup5, ])); -var msg492 = msg("00030:33", part844); +var msg492 = msg("00030:33", part843); -var part845 = // "Pattern{Constant('PKI: The CRL '), Field(policy_id,true), Constant(' is deleted.')}" -match("MESSAGE#486:00030:34", "nwparser.payload", "PKI: The CRL %{policy_id->} is deleted.", processor_chain([ +var part844 = match("MESSAGE#486:00030:34", "nwparser.payload", "PKI: The CRL %{policy_id->} is deleted.", processor_chain([ dup1, dup2, dup3, @@ -11351,10 +10226,9 @@ match("MESSAGE#486:00030:34", "nwparser.payload", "PKI: The CRL %{policy_id->} i dup5, ])); -var msg493 = msg("00030:34", part845); +var msg493 = msg("00030:34", part844); -var part846 = // "Pattern{Constant('PKI: The NSRP high availability synchronization '), Field(fld2,true), Constant(' failed.')}" -match("MESSAGE#487:00030:35", "nwparser.payload", "PKI: The NSRP high availability synchronization %{fld2->} failed.", processor_chain([ +var part845 = match("MESSAGE#487:00030:35", "nwparser.payload", "PKI: The NSRP high availability synchronization %{fld2->} failed.", processor_chain([ dup86, dup2, dup3, @@ -11362,10 +10236,9 @@ match("MESSAGE#487:00030:35", "nwparser.payload", "PKI: The NSRP high availabili dup5, ])); -var msg494 = msg("00030:35", part846); +var msg494 = msg("00030:35", part845); -var part847 = // "Pattern{Constant('PKI: The '), Field(change_attribute,true), Constant(' has changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false), Constant('.')}" -match("MESSAGE#488:00030:36", "nwparser.payload", "PKI: The %{change_attribute->} has changed from %{change_old->} to %{change_new}.", processor_chain([ +var part846 = match("MESSAGE#488:00030:36", "nwparser.payload", "PKI: The %{change_attribute->} has changed from %{change_old->} to %{change_new}.", processor_chain([ dup1, dup2, dup3, @@ -11373,12 +10246,11 @@ match("MESSAGE#488:00030:36", "nwparser.payload", "PKI: The %{change_attribute-> dup5, ])); -var msg495 = msg("00030:36", part847); +var msg495 = msg("00030:36", part846); -var part848 = // "Pattern{Constant('PKI: The X.509 certificate for the ScreenOS image authentication is invalid.'), Field(,false)}" -match("MESSAGE#489:00030:37", "nwparser.payload", "PKI: The X.509 certificate for the ScreenOS image authentication is invalid.%{}", processor_chain([ +var part847 = match("MESSAGE#489:00030:37", "nwparser.payload", "PKI: The X.509 certificate for the ScreenOS image authentication is invalid.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11387,12 +10259,11 @@ match("MESSAGE#489:00030:37", "nwparser.payload", "PKI: The X.509 certificate fo dup5, ])); -var msg496 = msg("00030:37", part848); +var msg496 = msg("00030:37", part847); -var part849 = // "Pattern{Constant('PKI: The X.509 local certificate cannot be sync to vsd member.'), Field(,false)}" -match("MESSAGE#490:00030:38", "nwparser.payload", "PKI: The X.509 local certificate cannot be sync to vsd member.%{}", processor_chain([ +var part848 = match("MESSAGE#490:00030:38", "nwparser.payload", "PKI: The X.509 local certificate cannot be sync to vsd member.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11401,31 +10272,28 @@ match("MESSAGE#490:00030:38", "nwparser.payload", "PKI: The X.509 local certific dup5, ])); -var msg497 = msg("00030:38", part849); +var msg497 = msg("00030:38", part848); -var part850 = // "Pattern{Constant('PKI: The X.509 certificate '), Field(p0,false)}" -match("MESSAGE#491:00030:39/0", "nwparser.payload", "PKI: The X.509 certificate %{p0}"); +var part849 = match("MESSAGE#491:00030:39/0", "nwparser.payload", "PKI: The X.509 certificate %{p0}"); -var part851 = // "Pattern{Constant('revocation list '), Field(p0,false)}" -match("MESSAGE#491:00030:39/1_0", "nwparser.p0", "revocation list %{p0}"); +var part850 = match("MESSAGE#491:00030:39/1_0", "nwparser.p0", "revocation list %{p0}"); var select194 = linear_select([ - part851, + part850, dup16, ]); -var part852 = // "Pattern{Constant('cannot be loaded during NSRP synchronization.'), Field(,false)}" -match("MESSAGE#491:00030:39/2", "nwparser.p0", "cannot be loaded during NSRP synchronization.%{}"); +var part851 = match("MESSAGE#491:00030:39/2", "nwparser.p0", "cannot be loaded during NSRP synchronization.%{}"); -var all169 = all_match({ +var all168 = all_match({ processors: [ - part850, + part849, select194, - part852, + part851, ], on_success: processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11435,23 +10303,21 @@ var all169 = all_match({ ]), }); -var msg498 = msg("00030:39", all169); +var msg498 = msg("00030:39", all168); -var part853 = // "Pattern{Constant('X509 '), Field(p0,false)}" -match("MESSAGE#492:00030:17/0", "nwparser.payload", "X509 %{p0}"); +var part852 = match("MESSAGE#492:00030:17/0", "nwparser.payload", "X509 %{p0}"); -var part854 = // "Pattern{Constant('cannot be loaded'), Field(,false)}" -match("MESSAGE#492:00030:17/2", "nwparser.p0", "cannot be loaded%{}"); +var part853 = match("MESSAGE#492:00030:17/2", "nwparser.p0", "cannot be loaded%{}"); -var all170 = all_match({ +var all169 = all_match({ processors: [ + part852, + dup376, part853, - dup379, - part854, ], on_success: processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11461,31 +10327,28 @@ var all170 = all_match({ ]), }); -var msg499 = msg("00030:17", all170); +var msg499 = msg("00030:17", all169); -var part855 = // "Pattern{Constant('PKI: The certificate '), Field(fld2,true), Constant(' will expire '), Field(p0,false)}" -match("MESSAGE#493:00030:40/0", "nwparser.payload", "PKI: The certificate %{fld2->} will expire %{p0}"); +var part854 = match("MESSAGE#493:00030:40/0", "nwparser.payload", "PKI: The certificate %{fld2->} will expire %{p0}"); -var part856 = // "Pattern{Constant('please '), Field(p0,false)}" -match("MESSAGE#493:00030:40/1_1", "nwparser.p0", "please %{p0}"); +var part855 = match("MESSAGE#493:00030:40/1_1", "nwparser.p0", "please %{p0}"); var select195 = linear_select([ - dup216, - part856, + dup214, + part855, ]); -var part857 = // "Pattern{Constant('renew.'), Field(,false)}" -match("MESSAGE#493:00030:40/2", "nwparser.p0", "renew.%{}"); +var part856 = match("MESSAGE#493:00030:40/2", "nwparser.p0", "renew.%{}"); -var all171 = all_match({ +var all170 = all_match({ processors: [ - part855, + part854, select195, - part857, + part856, ], on_success: processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11495,12 +10358,11 @@ var all171 = all_match({ ]), }); -var msg500 = msg("00030:40", all171); +var msg500 = msg("00030:40", all170); -var part858 = // "Pattern{Constant('PKI: The certificate revocation list has expired issued by certificate authority '), Field(fld2,false), Constant('.')}" -match("MESSAGE#494:00030:41", "nwparser.payload", "PKI: The certificate revocation list has expired issued by certificate authority %{fld2}.", processor_chain([ +var part857 = match("MESSAGE#494:00030:41", "nwparser.payload", "PKI: The certificate revocation list has expired issued by certificate authority %{fld2}.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11509,12 +10371,11 @@ match("MESSAGE#494:00030:41", "nwparser.payload", "PKI: The certificate revocati dup5, ])); -var msg501 = msg("00030:41", part858); +var msg501 = msg("00030:41", part857); -var part859 = // "Pattern{Constant('PKI: The configuration content of certificate authority '), Field(fld2,true), Constant(' is not valid.')}" -match("MESSAGE#495:00030:42", "nwparser.payload", "PKI: The configuration content of certificate authority %{fld2->} is not valid.", processor_chain([ +var part858 = match("MESSAGE#495:00030:42", "nwparser.payload", "PKI: The configuration content of certificate authority %{fld2->} is not valid.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11523,12 +10384,11 @@ match("MESSAGE#495:00030:42", "nwparser.payload", "PKI: The configuration conten dup5, ])); -var msg502 = msg("00030:42", part859); +var msg502 = msg("00030:42", part858); -var part860 = // "Pattern{Constant('PKI: The device cannot allocate this object id number '), Field(fld2,false), Constant('.')}" -match("MESSAGE#496:00030:43", "nwparser.payload", "PKI: The device cannot allocate this object id number %{fld2}.", processor_chain([ +var part859 = match("MESSAGE#496:00030:43", "nwparser.payload", "PKI: The device cannot allocate this object id number %{fld2}.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11537,12 +10397,11 @@ match("MESSAGE#496:00030:43", "nwparser.payload", "PKI: The device cannot alloca dup5, ])); -var msg503 = msg("00030:43", part860); +var msg503 = msg("00030:43", part859); -var part861 = // "Pattern{Constant('PKI: The device cannot extract the X.509 certificate revocation list [ (CRL) ].'), Field(,false)}" -match("MESSAGE#497:00030:44", "nwparser.payload", "PKI: The device cannot extract the X.509 certificate revocation list [ (CRL) ].%{}", processor_chain([ +var part860 = match("MESSAGE#497:00030:44", "nwparser.payload", "PKI: The device cannot extract the X.509 certificate revocation list [ (CRL) ].%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11551,12 +10410,11 @@ match("MESSAGE#497:00030:44", "nwparser.payload", "PKI: The device cannot extrac dup5, ])); -var msg504 = msg("00030:44", part861); +var msg504 = msg("00030:44", part860); -var part862 = // "Pattern{Constant('PKI: The device cannot find the PKI object '), Field(fld2,true), Constant(' during cold sync.')}" -match("MESSAGE#498:00030:45", "nwparser.payload", "PKI: The device cannot find the PKI object %{fld2->} during cold sync.", processor_chain([ +var part861 = match("MESSAGE#498:00030:45", "nwparser.payload", "PKI: The device cannot find the PKI object %{fld2->} during cold sync.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11565,12 +10423,11 @@ match("MESSAGE#498:00030:45", "nwparser.payload", "PKI: The device cannot find t dup5, ])); -var msg505 = msg("00030:45", part862); +var msg505 = msg("00030:45", part861); -var part863 = // "Pattern{Constant('PKI: The device cannot load X.509 certificate onto the device certificate '), Field(fld2,false), Constant('.')}" -match("MESSAGE#499:00030:46", "nwparser.payload", "PKI: The device cannot load X.509 certificate onto the device certificate %{fld2}.", processor_chain([ +var part862 = match("MESSAGE#499:00030:46", "nwparser.payload", "PKI: The device cannot load X.509 certificate onto the device certificate %{fld2}.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11579,12 +10436,11 @@ match("MESSAGE#499:00030:46", "nwparser.payload", "PKI: The device cannot load X dup5, ])); -var msg506 = msg("00030:46", part863); +var msg506 = msg("00030:46", part862); -var part864 = // "Pattern{Constant('PKI: The device cannot load a certificate pending SCEP completion.'), Field(,false)}" -match("MESSAGE#500:00030:47", "nwparser.payload", "PKI: The device cannot load a certificate pending SCEP completion.%{}", processor_chain([ +var part863 = match("MESSAGE#500:00030:47", "nwparser.payload", "PKI: The device cannot load a certificate pending SCEP completion.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11593,12 +10449,11 @@ match("MESSAGE#500:00030:47", "nwparser.payload", "PKI: The device cannot load a dup5, ])); -var msg507 = msg("00030:47", part864); +var msg507 = msg("00030:47", part863); -var part865 = // "Pattern{Constant('PKI: The device cannot load an X.509 certificate revocation list (CRL).'), Field(,false)}" -match("MESSAGE#501:00030:48", "nwparser.payload", "PKI: The device cannot load an X.509 certificate revocation list (CRL).%{}", processor_chain([ +var part864 = match("MESSAGE#501:00030:48", "nwparser.payload", "PKI: The device cannot load an X.509 certificate revocation list (CRL).%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11607,12 +10462,11 @@ match("MESSAGE#501:00030:48", "nwparser.payload", "PKI: The device cannot load a dup5, ])); -var msg508 = msg("00030:48", part865); +var msg508 = msg("00030:48", part864); -var part866 = // "Pattern{Constant('PKI: The device cannot load the CA certificate received through SCEP.'), Field(,false)}" -match("MESSAGE#502:00030:49", "nwparser.payload", "PKI: The device cannot load the CA certificate received through SCEP.%{}", processor_chain([ +var part865 = match("MESSAGE#502:00030:49", "nwparser.payload", "PKI: The device cannot load the CA certificate received through SCEP.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11621,12 +10475,11 @@ match("MESSAGE#502:00030:49", "nwparser.payload", "PKI: The device cannot load t dup5, ])); -var msg509 = msg("00030:49", part866); +var msg509 = msg("00030:49", part865); -var part867 = // "Pattern{Constant('PKI: The device cannot load the X.509 certificate revocation list (CRL) from the file.'), Field(,false)}" -match("MESSAGE#503:00030:50", "nwparser.payload", "PKI: The device cannot load the X.509 certificate revocation list (CRL) from the file.%{}", processor_chain([ +var part866 = match("MESSAGE#503:00030:50", "nwparser.payload", "PKI: The device cannot load the X.509 certificate revocation list (CRL) from the file.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11635,12 +10488,11 @@ match("MESSAGE#503:00030:50", "nwparser.payload", "PKI: The device cannot load t dup5, ])); -var msg510 = msg("00030:50", part867); +var msg510 = msg("00030:50", part866); -var part868 = // "Pattern{Constant('PKI: The device cannot load the X.509 local certificate received through SCEP.'), Field(,false)}" -match("MESSAGE#504:00030:51", "nwparser.payload", "PKI: The device cannot load the X.509 local certificate received through SCEP.%{}", processor_chain([ +var part867 = match("MESSAGE#504:00030:51", "nwparser.payload", "PKI: The device cannot load the X.509 local certificate received through SCEP.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11649,12 +10501,11 @@ match("MESSAGE#504:00030:51", "nwparser.payload", "PKI: The device cannot load t dup5, ])); -var msg511 = msg("00030:51", part868); +var msg511 = msg("00030:51", part867); -var part869 = // "Pattern{Constant('PKI: The device cannot load the X.509 '), Field(product,true), Constant(' during boot.')}" -match("MESSAGE#505:00030:52", "nwparser.payload", "PKI: The device cannot load the X.509 %{product->} during boot.", processor_chain([ +var part868 = match("MESSAGE#505:00030:52", "nwparser.payload", "PKI: The device cannot load the X.509 %{product->} during boot.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11663,12 +10514,11 @@ match("MESSAGE#505:00030:52", "nwparser.payload", "PKI: The device cannot load t dup5, ])); -var msg512 = msg("00030:52", part869); +var msg512 = msg("00030:52", part868); -var part870 = // "Pattern{Constant('PKI: The device cannot load the X.509 certificate file.'), Field(,false)}" -match("MESSAGE#506:00030:53", "nwparser.payload", "PKI: The device cannot load the X.509 certificate file.%{}", processor_chain([ +var part869 = match("MESSAGE#506:00030:53", "nwparser.payload", "PKI: The device cannot load the X.509 certificate file.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11677,12 +10527,11 @@ match("MESSAGE#506:00030:53", "nwparser.payload", "PKI: The device cannot load t dup5, ])); -var msg513 = msg("00030:53", part870); +var msg513 = msg("00030:53", part869); -var part871 = // "Pattern{Constant('PKI: The device completed the coldsync of the PKI object at '), Field(fld2,true), Constant(' attempt.')}" -match("MESSAGE#507:00030:54", "nwparser.payload", "PKI: The device completed the coldsync of the PKI object at %{fld2->} attempt.", processor_chain([ +var part870 = match("MESSAGE#507:00030:54", "nwparser.payload", "PKI: The device completed the coldsync of the PKI object at %{fld2->} attempt.", processor_chain([ dup44, - dup213, + dup211, dup31, dup2, dup3, @@ -11690,20 +10539,19 @@ match("MESSAGE#507:00030:54", "nwparser.payload", "PKI: The device completed the dup5, ])); -var msg514 = msg("00030:54", part871); +var msg514 = msg("00030:54", part870); -var part872 = // "Pattern{Constant('PKI: The device could not generate '), Field(p0,false)}" -match("MESSAGE#508:00030:55/0", "nwparser.payload", "PKI: The device could not generate %{p0}"); +var part871 = match("MESSAGE#508:00030:55/0", "nwparser.payload", "PKI: The device could not generate %{p0}"); -var all172 = all_match({ +var all171 = all_match({ processors: [ - part872, - dup380, - dup219, + part871, + dup377, + dup217, ], on_success: processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11713,12 +10561,11 @@ var all172 = all_match({ ]), }); -var msg515 = msg("00030:55", all172); +var msg515 = msg("00030:55", all171); -var part873 = // "Pattern{Constant('PKI: The device detected an invalid RSA key.'), Field(,false)}" -match("MESSAGE#509:00030:56", "nwparser.payload", "PKI: The device detected an invalid RSA key.%{}", processor_chain([ +var part872 = match("MESSAGE#509:00030:56", "nwparser.payload", "PKI: The device detected an invalid RSA key.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11727,12 +10574,11 @@ match("MESSAGE#509:00030:56", "nwparser.payload", "PKI: The device detected an i dup5, ])); -var msg516 = msg("00030:56", part873); +var msg516 = msg("00030:56", part872); -var part874 = // "Pattern{Constant('PKI: The device detected an invalid digital signature algorithm (DSA) key.'), Field(,false)}" -match("MESSAGE#510:00030:57", "nwparser.payload", "PKI: The device detected an invalid digital signature algorithm (DSA) key.%{}", processor_chain([ +var part873 = match("MESSAGE#510:00030:57", "nwparser.payload", "PKI: The device detected an invalid digital signature algorithm (DSA) key.%{}", processor_chain([ dup35, - dup220, + dup218, dup31, dup39, dup2, @@ -11741,12 +10587,11 @@ match("MESSAGE#510:00030:57", "nwparser.payload", "PKI: The device detected an i dup5, ])); -var msg517 = msg("00030:57", part874); +var msg517 = msg("00030:57", part873); -var part875 = // "Pattern{Constant('PKI: The device failed to coldsync the PKI object at '), Field(fld2,true), Constant(' attempt.')}" -match("MESSAGE#511:00030:58", "nwparser.payload", "PKI: The device failed to coldsync the PKI object at %{fld2->} attempt.", processor_chain([ +var part874 = match("MESSAGE#511:00030:58", "nwparser.payload", "PKI: The device failed to coldsync the PKI object at %{fld2->} attempt.", processor_chain([ dup86, - dup220, + dup218, dup31, dup54, dup2, @@ -11755,38 +10600,24 @@ match("MESSAGE#511:00030:58", "nwparser.payload", "PKI: The device failed to col dup5, ])); -var msg518 = msg("00030:58", part875); - -var part876 = // "Pattern{Constant('PKI: The device failed to decode the public key of the image'), Field(p0,false)}" -match("MESSAGE#512:00030:59/0", "nwparser.payload", "PKI: The device failed to decode the public key of the image%{p0}"); +var msg518 = msg("00030:58", part874); -var part877 = // "Pattern{Constant('s signer certificate.'), Field(,false)}" -match("MESSAGE#512:00030:59/2", "nwparser.p0", "s signer certificate.%{}"); - -var all173 = all_match({ - processors: [ - part876, - dup363, - part877, - ], - on_success: processor_chain([ - dup35, - dup220, - dup31, - dup54, - dup2, - dup3, - dup4, - dup5, - ]), -}); +var part875 = match("MESSAGE#512:00030:59", "nwparser.payload", "PKI: The device failed to decode the public key of the image%{quote}s signer certificate.", processor_chain([ + dup35, + dup218, + dup31, + dup54, + dup2, + dup3, + dup4, + dup5, +])); -var msg519 = msg("00030:59", all173); +var msg519 = msg("00030:59", part875); -var part878 = // "Pattern{Constant('PKI: The device failed to install the RSA key.'), Field(,false)}" -match("MESSAGE#513:00030:60", "nwparser.payload", "PKI: The device failed to install the RSA key.%{}", processor_chain([ +var part876 = match("MESSAGE#513:00030:60", "nwparser.payload", "PKI: The device failed to install the RSA key.%{}", processor_chain([ dup35, - dup220, + dup218, dup31, dup54, dup2, @@ -11795,12 +10626,11 @@ match("MESSAGE#513:00030:60", "nwparser.payload", "PKI: The device failed to ins dup5, ])); -var msg520 = msg("00030:60", part878); +var msg520 = msg("00030:60", part876); -var part879 = // "Pattern{Constant('PKI: The device failed to retrieve the pending certificate '), Field(fld2,false), Constant('.')}" -match("MESSAGE#514:00030:61", "nwparser.payload", "PKI: The device failed to retrieve the pending certificate %{fld2}.", processor_chain([ +var part877 = match("MESSAGE#514:00030:61", "nwparser.payload", "PKI: The device failed to retrieve the pending certificate %{fld2}.", processor_chain([ dup35, - dup213, + dup211, dup31, dup54, dup2, @@ -11809,12 +10639,11 @@ match("MESSAGE#514:00030:61", "nwparser.payload", "PKI: The device failed to ret dup5, ])); -var msg521 = msg("00030:61", part879); +var msg521 = msg("00030:61", part877); -var part880 = // "Pattern{Constant('PKI: The device failed to save the certificate authority related configuration.'), Field(,false)}" -match("MESSAGE#515:00030:62", "nwparser.payload", "PKI: The device failed to save the certificate authority related configuration.%{}", processor_chain([ +var part878 = match("MESSAGE#515:00030:62", "nwparser.payload", "PKI: The device failed to save the certificate authority related configuration.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup54, dup2, @@ -11823,12 +10652,11 @@ match("MESSAGE#515:00030:62", "nwparser.payload", "PKI: The device failed to sav dup5, ])); -var msg522 = msg("00030:62", part880); +var msg522 = msg("00030:62", part878); -var part881 = // "Pattern{Constant('PKI: The device failed to store the authority configuration.'), Field(,false)}" -match("MESSAGE#516:00030:63", "nwparser.payload", "PKI: The device failed to store the authority configuration.%{}", processor_chain([ +var part879 = match("MESSAGE#516:00030:63", "nwparser.payload", "PKI: The device failed to store the authority configuration.%{}", processor_chain([ dup18, - dup221, + dup219, dup51, dup54, dup2, @@ -11837,12 +10665,11 @@ match("MESSAGE#516:00030:63", "nwparser.payload", "PKI: The device failed to sto dup5, ])); -var msg523 = msg("00030:63", part881); +var msg523 = msg("00030:63", part879); -var part882 = // "Pattern{Constant('PKI: The device failed to synchronize new DSA/RSA key pair to NSRP peer.'), Field(,false)}" -match("MESSAGE#517:00030:64", "nwparser.payload", "PKI: The device failed to synchronize new DSA/RSA key pair to NSRP peer.%{}", processor_chain([ +var part880 = match("MESSAGE#517:00030:64", "nwparser.payload", "PKI: The device failed to synchronize new DSA/RSA key pair to NSRP peer.%{}", processor_chain([ dup18, - dup220, + dup218, dup51, dup54, dup2, @@ -11851,12 +10678,11 @@ match("MESSAGE#517:00030:64", "nwparser.payload", "PKI: The device failed to syn dup5, ])); -var msg524 = msg("00030:64", part882); +var msg524 = msg("00030:64", part880); -var part883 = // "Pattern{Constant('PKI: The device failed to synchronize DSA/RSA key pair to NSRP peer.'), Field(,false)}" -match("MESSAGE#518:00030:65", "nwparser.payload", "PKI: The device failed to synchronize DSA/RSA key pair to NSRP peer.%{}", processor_chain([ +var part881 = match("MESSAGE#518:00030:65", "nwparser.payload", "PKI: The device failed to synchronize DSA/RSA key pair to NSRP peer.%{}", processor_chain([ dup18, - dup220, + dup218, dup51, dup54, dup2, @@ -11865,12 +10691,11 @@ match("MESSAGE#518:00030:65", "nwparser.payload", "PKI: The device failed to syn dup5, ])); -var msg525 = msg("00030:65", part883); +var msg525 = msg("00030:65", part881); -var part884 = // "Pattern{Constant('PKI: The device has detected an invalid X.509 object attribute '), Field(fld2,false), Constant('.')}" -match("MESSAGE#519:00030:66", "nwparser.payload", "PKI: The device has detected an invalid X.509 object attribute %{fld2}.", processor_chain([ +var part882 = match("MESSAGE#519:00030:66", "nwparser.payload", "PKI: The device has detected an invalid X.509 object attribute %{fld2}.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11879,12 +10704,11 @@ match("MESSAGE#519:00030:66", "nwparser.payload", "PKI: The device has detected dup5, ])); -var msg526 = msg("00030:66", part884); +var msg526 = msg("00030:66", part882); -var part885 = // "Pattern{Constant('PKI: The device has detected invalid X.509 object content.'), Field(,false)}" -match("MESSAGE#520:00030:67", "nwparser.payload", "PKI: The device has detected invalid X.509 object content.%{}", processor_chain([ +var part883 = match("MESSAGE#520:00030:67", "nwparser.payload", "PKI: The device has detected invalid X.509 object content.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11893,12 +10717,11 @@ match("MESSAGE#520:00030:67", "nwparser.payload", "PKI: The device has detected dup5, ])); -var msg527 = msg("00030:67", part885); +var msg527 = msg("00030:67", part883); -var part886 = // "Pattern{Constant('PKI: The device has failed to load an invalid X.509 object.'), Field(,false)}" -match("MESSAGE#521:00030:68", "nwparser.payload", "PKI: The device has failed to load an invalid X.509 object.%{}", processor_chain([ +var part884 = match("MESSAGE#521:00030:68", "nwparser.payload", "PKI: The device has failed to load an invalid X.509 object.%{}", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -11907,10 +10730,9 @@ match("MESSAGE#521:00030:68", "nwparser.payload", "PKI: The device has failed to dup5, ])); -var msg528 = msg("00030:68", part886); +var msg528 = msg("00030:68", part884); -var part887 = // "Pattern{Constant('PKI: The device is loading the version 0 PKI data.'), Field(,false)}" -match("MESSAGE#522:00030:69", "nwparser.payload", "PKI: The device is loading the version 0 PKI data.%{}", processor_chain([ +var part885 = match("MESSAGE#522:00030:69", "nwparser.payload", "PKI: The device is loading the version 0 PKI data.%{}", processor_chain([ dup44, dup2, dup3, @@ -11918,16 +10740,15 @@ match("MESSAGE#522:00030:69", "nwparser.payload", "PKI: The device is loading th dup5, ])); -var msg529 = msg("00030:69", part887); +var msg529 = msg("00030:69", part885); -var part888 = // "Pattern{Constant('PKI: The device successfully generated a new '), Field(p0,false)}" -match("MESSAGE#523:00030:70/0", "nwparser.payload", "PKI: The device successfully generated a new %{p0}"); +var part886 = match("MESSAGE#523:00030:70/0", "nwparser.payload", "PKI: The device successfully generated a new %{p0}"); -var all174 = all_match({ +var all172 = all_match({ processors: [ - part888, - dup380, - dup219, + part886, + dup377, + dup217, ], on_success: processor_chain([ dup44, @@ -11938,87 +10759,56 @@ var all174 = all_match({ ]), }); -var msg530 = msg("00030:70", all174); +var msg530 = msg("00030:70", all172); -var part889 = // "Pattern{Constant('PKI: The public key of image'), Field(p0,false)}" -match("MESSAGE#524:00030:71/0", "nwparser.payload", "PKI: The public key of image%{p0}"); +var part887 = match("MESSAGE#524:00030:71", "nwparser.payload", "PKI: The public key of image%{quote}s signer has been loaded successfully, for future image authentication.", processor_chain([ + dup44, + dup2, + dup3, + dup4, + dup5, +])); -var part890 = // "Pattern{Constant('s signer has been loaded successfully, for future image authentication.'), Field(,false)}" -match("MESSAGE#524:00030:71/2", "nwparser.p0", "s signer has been loaded successfully, for future image authentication.%{}"); +var msg531 = msg("00030:71", part887); -var all175 = all_match({ - processors: [ - part889, - dup363, - part890, - ], - on_success: processor_chain([ - dup44, - dup2, - dup3, - dup4, - dup5, - ]), -}); +var part888 = match("MESSAGE#525:00030:72", "nwparser.payload", "PKI: The signature of the image%{quote}s signer certificate cannot be verified.", processor_chain([ + dup35, + dup211, + dup31, + dup39, + dup2, + dup3, + dup4, + dup5, +])); -var msg531 = msg("00030:71", all175); +var msg532 = msg("00030:72", part888); -var part891 = // "Pattern{Constant('PKI: The signature of the image'), Field(p0,false)}" -match("MESSAGE#525:00030:72/0", "nwparser.payload", "PKI: The signature of the image%{p0}"); +var part889 = match("MESSAGE#526:00030:73/0", "nwparser.payload", "PKI: The %{p0}"); -var part892 = // "Pattern{Constant('s signer certificate cannot be verified.'), Field(,false)}" -match("MESSAGE#525:00030:72/2", "nwparser.p0", "s signer certificate cannot be verified.%{}"); +var part890 = match("MESSAGE#526:00030:73/1_0", "nwparser.p0", "file name %{p0}"); -var all176 = all_match({ - processors: [ - part891, - dup363, - part892, - ], - on_success: processor_chain([ - dup35, - dup213, - dup31, - dup39, - dup2, - dup3, - dup4, - dup5, - ]), -}); - -var msg532 = msg("00030:72", all176); - -var part893 = // "Pattern{Constant('PKI: The '), Field(p0,false)}" -match("MESSAGE#526:00030:73/0", "nwparser.payload", "PKI: The %{p0}"); +var part891 = match("MESSAGE#526:00030:73/1_1", "nwparser.p0", "friendly name of a certificate %{p0}"); -var part894 = // "Pattern{Constant('file name '), Field(p0,false)}" -match("MESSAGE#526:00030:73/1_0", "nwparser.p0", "file name %{p0}"); - -var part895 = // "Pattern{Constant('friendly name of a certificate '), Field(p0,false)}" -match("MESSAGE#526:00030:73/1_1", "nwparser.p0", "friendly name of a certificate %{p0}"); - -var part896 = // "Pattern{Constant('vsys name '), Field(p0,false)}" -match("MESSAGE#526:00030:73/1_2", "nwparser.p0", "vsys name %{p0}"); +var part892 = match("MESSAGE#526:00030:73/1_2", "nwparser.p0", "vsys name %{p0}"); var select196 = linear_select([ - part894, - part895, - part896, + part890, + part891, + part892, ]); -var part897 = // "Pattern{Constant('is too long '), Field(fld2,true), Constant(' to do NSRP synchronization allowed '), Field(fld3,false), Constant('.')}" -match("MESSAGE#526:00030:73/2", "nwparser.p0", "is too long %{fld2->} to do NSRP synchronization allowed %{fld3}."); +var part893 = match("MESSAGE#526:00030:73/2", "nwparser.p0", "is too long %{fld2->} to do NSRP synchronization allowed %{fld3}."); -var all177 = all_match({ +var all173 = all_match({ processors: [ - part893, + part889, select196, - part897, + part893, ], on_success: processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -12028,10 +10818,9 @@ var all177 = all_match({ ]), }); -var msg533 = msg("00030:73", all177); +var msg533 = msg("00030:73", all173); -var part898 = // "Pattern{Constant('PKI: Upgrade from earlier version save to file.'), Field(,false)}" -match("MESSAGE#527:00030:74", "nwparser.payload", "PKI: Upgrade from earlier version save to file.%{}", processor_chain([ +var part894 = match("MESSAGE#527:00030:74", "nwparser.payload", "PKI: Upgrade from earlier version save to file.%{}", processor_chain([ dup44, dup2, dup3, @@ -12039,10 +10828,9 @@ match("MESSAGE#527:00030:74", "nwparser.payload", "PKI: Upgrade from earlier ver dup5, ])); -var msg534 = msg("00030:74", part898); +var msg534 = msg("00030:74", part894); -var part899 = // "Pattern{Constant('PKI: X.509 certificate has been deleted distinguished name '), Field(username,false), Constant('.')}" -match("MESSAGE#528:00030:75", "nwparser.payload", "PKI: X.509 certificate has been deleted distinguished name %{username}.", processor_chain([ +var part895 = match("MESSAGE#528:00030:75", "nwparser.payload", "PKI: X.509 certificate has been deleted distinguished name %{username}.", processor_chain([ dup44, dup2, dup3, @@ -12050,19 +10838,17 @@ match("MESSAGE#528:00030:75", "nwparser.payload", "PKI: X.509 certificate has be dup5, ])); -var msg535 = msg("00030:75", part899); +var msg535 = msg("00030:75", part895); -var part900 = // "Pattern{Constant('PKI: X.509 '), Field(p0,false)}" -match("MESSAGE#529:00030:76/0", "nwparser.payload", "PKI: X.509 %{p0}"); +var part896 = match("MESSAGE#529:00030:76/0", "nwparser.payload", "PKI: X.509 %{p0}"); -var part901 = // "Pattern{Constant('file has been loaded successfully filename '), Field(fld2,false), Constant('.')}" -match("MESSAGE#529:00030:76/2", "nwparser.p0", "file has been loaded successfully filename %{fld2}."); +var part897 = match("MESSAGE#529:00030:76/2", "nwparser.p0", "file has been loaded successfully filename %{fld2}."); -var all178 = all_match({ +var all174 = all_match({ processors: [ - part900, - dup379, - part901, + part896, + dup376, + part897, ], on_success: processor_chain([ dup44, @@ -12073,12 +10859,11 @@ var all178 = all_match({ ]), }); -var msg536 = msg("00030:76", all178); +var msg536 = msg("00030:76", all174); -var part902 = // "Pattern{Constant('PKI: failed to install DSA key.'), Field(,false)}" -match("MESSAGE#530:00030:77", "nwparser.payload", "PKI: failed to install DSA key.%{}", processor_chain([ +var part898 = match("MESSAGE#530:00030:77", "nwparser.payload", "PKI: failed to install DSA key.%{}", processor_chain([ dup18, - dup220, + dup218, dup51, dup54, dup2, @@ -12087,13 +10872,12 @@ match("MESSAGE#530:00030:77", "nwparser.payload", "PKI: failed to install DSA ke dup5, ])); -var msg537 = msg("00030:77", part902); +var msg537 = msg("00030:77", part898); -var part903 = // "Pattern{Constant('PKI: no FQDN available when requesting certificate.'), Field(,false)}" -match("MESSAGE#531:00030:78", "nwparser.payload", "PKI: no FQDN available when requesting certificate.%{}", processor_chain([ +var part899 = match("MESSAGE#531:00030:78", "nwparser.payload", "PKI: no FQDN available when requesting certificate.%{}", processor_chain([ dup35, - dup213, - dup222, + dup211, + dup220, dup31, dup39, dup2, @@ -12102,13 +10886,12 @@ match("MESSAGE#531:00030:78", "nwparser.payload", "PKI: no FQDN available when r dup5, ])); -var msg538 = msg("00030:78", part903); +var msg538 = msg("00030:78", part899); -var part904 = // "Pattern{Constant('PKI: no cert revocation check per config DN '), Field(username,false), Constant('.')}" -match("MESSAGE#532:00030:79", "nwparser.payload", "PKI: no cert revocation check per config DN %{username}.", processor_chain([ +var part900 = match("MESSAGE#532:00030:79", "nwparser.payload", "PKI: no cert revocation check per config DN %{username}.", processor_chain([ dup35, - dup213, - dup222, + dup211, + dup220, dup31, dup39, dup2, @@ -12117,10 +10900,9 @@ match("MESSAGE#532:00030:79", "nwparser.payload", "PKI: no cert revocation check dup5, ])); -var msg539 = msg("00030:79", part904); +var msg539 = msg("00030:79", part900); -var part905 = // "Pattern{Constant('PKI: no nsrp sync for pre 2.5 objects.'), Field(,false)}" -match("MESSAGE#533:00030:80", "nwparser.payload", "PKI: no nsrp sync for pre 2.5 objects.%{}", processor_chain([ +var part901 = match("MESSAGE#533:00030:80", "nwparser.payload", "PKI: no nsrp sync for pre 2.5 objects.%{}", processor_chain([ dup44, dup2, dup3, @@ -12128,10 +10910,9 @@ match("MESSAGE#533:00030:80", "nwparser.payload", "PKI: no nsrp sync for pre 2.5 dup5, ])); -var msg540 = msg("00030:80", part905); +var msg540 = msg("00030:80", part901); -var part906 = // "Pattern{Constant('X509 certificate with subject name '), Field(fld2,true), Constant(' is deleted.')}" -match("MESSAGE#534:00030:81", "nwparser.payload", "X509 certificate with subject name %{fld2->} is deleted.", processor_chain([ +var part902 = match("MESSAGE#534:00030:81", "nwparser.payload", "X509 certificate with subject name %{fld2->} is deleted.", processor_chain([ dup44, dup2, dup3, @@ -12139,10 +10920,9 @@ match("MESSAGE#534:00030:81", "nwparser.payload", "X509 certificate with subject dup5, ])); -var msg541 = msg("00030:81", part906); +var msg541 = msg("00030:81", part902); -var part907 = // "Pattern{Constant('create new authcfg for CA '), Field(fld2,false)}" -match("MESSAGE#535:00030:82", "nwparser.payload", "create new authcfg for CA %{fld2}", processor_chain([ +var part903 = match("MESSAGE#535:00030:82", "nwparser.payload", "create new authcfg for CA %{fld2}", processor_chain([ dup44, dup2, dup3, @@ -12150,12 +10930,11 @@ match("MESSAGE#535:00030:82", "nwparser.payload", "create new authcfg for CA %{f dup5, ])); -var msg542 = msg("00030:82", part907); +var msg542 = msg("00030:82", part903); -var part908 = // "Pattern{Constant('loadCert: Cannot acquire authcfg for this CA cert '), Field(fld2,false), Constant('.')}" -match("MESSAGE#536:00030:83", "nwparser.payload", "loadCert: Cannot acquire authcfg for this CA cert %{fld2}.", processor_chain([ +var part904 = match("MESSAGE#536:00030:83", "nwparser.payload", "loadCert: Cannot acquire authcfg for this CA cert %{fld2}.", processor_chain([ dup35, - dup213, + dup211, dup31, dup39, dup2, @@ -12164,10 +10943,9 @@ match("MESSAGE#536:00030:83", "nwparser.payload", "loadCert: Cannot acquire auth dup5, ])); -var msg543 = msg("00030:83", part908); +var msg543 = msg("00030:83", part904); -var part909 = // "Pattern{Constant('upgrade to 4.0 copy authcfg from global.'), Field(,false)}" -match("MESSAGE#537:00030:84", "nwparser.payload", "upgrade to 4.0 copy authcfg from global.%{}", processor_chain([ +var part905 = match("MESSAGE#537:00030:84", "nwparser.payload", "upgrade to 4.0 copy authcfg from global.%{}", processor_chain([ dup44, dup2, dup3, @@ -12175,10 +10953,9 @@ match("MESSAGE#537:00030:84", "nwparser.payload", "upgrade to 4.0 copy authcfg f dup5, ])); -var msg544 = msg("00030:84", part909); +var msg544 = msg("00030:84", part905); -var part910 = // "Pattern{Constant('System CPU utilization is high ('), Field(fld2,true), Constant(' alarm threshold: '), Field(trigger_val,false), Constant(') '), Field(info,false)}" -match("MESSAGE#538:00030:85", "nwparser.payload", "System CPU utilization is high (%{fld2->} alarm threshold: %{trigger_val}) %{info}", processor_chain([ +var part906 = match("MESSAGE#538:00030:85", "nwparser.payload", "System CPU utilization is high (%{fld2->} alarm threshold: %{trigger_val}) %{info}", processor_chain([ setc("eventcategory","1603080000"), dup2, dup3, @@ -12186,19 +10963,18 @@ match("MESSAGE#538:00030:85", "nwparser.payload", "System CPU utilization is hig dup5, ])); -var msg545 = msg("00030:85", part910); +var msg545 = msg("00030:85", part906); -var part911 = // "Pattern{Constant('Pair-wise invoked by started after key generation. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#539:00030:86/2", "nwparser.p0", "Pair-wise invoked by started after key generation. (%{fld1})"); +var part907 = match("MESSAGE#539:00030:86/2", "nwparser.p0", "Pair-wise invoked by started after key generation. (%{fld1})"); -var all179 = all_match({ +var all175 = all_match({ processors: [ - dup223, - dup381, - part911, + dup221, + dup378, + part907, ], on_success: processor_chain([ - dup225, + dup223, dup2, dup4, dup5, @@ -12206,11 +10982,10 @@ var all179 = all_match({ ]), }); -var msg546 = msg("00030:86", all179); +var msg546 = msg("00030:86", all175); -var part912 = // "Pattern{Constant('SYSTEM CPU utilization is high ('), Field(fld2,true), Constant(' > '), Field(fld3,true), Constant(' ) '), Field(fld4,true), Constant(' times in '), Field(fld5,true), Constant(' minute ('), Field(fld1,false), Constant(')<<'), Field(fld6,false), Constant('>')}" -match("MESSAGE#1214:00030:87", "nwparser.payload", "SYSTEM CPU utilization is high (%{fld2->} > %{fld3->} ) %{fld4->} times in %{fld5->} minute (%{fld1})\u003c\u003c%{fld6}>", processor_chain([ - dup211, +var part908 = match("MESSAGE#1214:00030:87", "nwparser.payload", "SYSTEM CPU utilization is high (%{fld2->} > %{fld3->} ) %{fld4->} times in %{fld5->} minute (%{fld1})\u003c\u003c%{fld6}>", processor_chain([ + dup209, dup2, dup3, dup4, @@ -12218,19 +10993,18 @@ match("MESSAGE#1214:00030:87", "nwparser.payload", "SYSTEM CPU utilization is hi dup9, ])); -var msg547 = msg("00030:87", part912); +var msg547 = msg("00030:87", part908); -var part913 = // "Pattern{Constant('Pair-wise invoked by passed. ('), Field(fld1,false), Constant(')<<'), Field(fld6,false), Constant('>')}" -match("MESSAGE#1217:00030:88/2", "nwparser.p0", "Pair-wise invoked by passed. (%{fld1})\u003c\u003c%{fld6}>"); +var part909 = match("MESSAGE#1217:00030:88/2", "nwparser.p0", "Pair-wise invoked by passed. (%{fld1})\u003c\u003c%{fld6}>"); -var all180 = all_match({ +var all176 = all_match({ processors: [ - dup223, - dup381, - part913, + dup221, + dup378, + part909, ], on_success: processor_chain([ - dup225, + dup223, dup2, dup4, dup5, @@ -12238,7 +11012,7 @@ var all180 = all_match({ ]), }); -var msg548 = msg("00030:88", all180); +var msg548 = msg("00030:88", all176); var select197 = linear_select([ msg475, @@ -12317,8 +11091,7 @@ var select197 = linear_select([ msg548, ]); -var part914 = // "Pattern{Constant('ARP detected IP conflict: IP address '), Field(hostip,true), Constant(' changed from '), Field(sinterface,true), Constant(' to interface '), Field(dinterface,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#540:00031:13", "nwparser.payload", "ARP detected IP conflict: IP address %{hostip->} changed from %{sinterface->} to interface %{dinterface->} (%{fld1})", processor_chain([ +var part910 = match("MESSAGE#540:00031:13", "nwparser.payload", "ARP detected IP conflict: IP address %{hostip->} changed from %{sinterface->} to interface %{dinterface->} (%{fld1})", processor_chain([ dup121, dup2, dup3, @@ -12327,10 +11100,9 @@ match("MESSAGE#540:00031:13", "nwparser.payload", "ARP detected IP conflict: IP dup5, ])); -var msg549 = msg("00031:13", part914); +var msg549 = msg("00031:13", part910); -var part915 = // "Pattern{Constant('SNMP AuthenTraps have been '), Field(disposition,false)}" -match("MESSAGE#541:00031", "nwparser.payload", "SNMP AuthenTraps have been %{disposition}", processor_chain([ +var part911 = match("MESSAGE#541:00031", "nwparser.payload", "SNMP AuthenTraps have been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -12338,10 +11110,9 @@ match("MESSAGE#541:00031", "nwparser.payload", "SNMP AuthenTraps have been %{dis dup5, ])); -var msg550 = msg("00031", part915); +var msg550 = msg("00031", part911); -var part916 = // "Pattern{Constant('SNMP VPN has been '), Field(disposition,false)}" -match("MESSAGE#542:00031:01", "nwparser.payload", "SNMP VPN has been %{disposition}", processor_chain([ +var part912 = match("MESSAGE#542:00031:01", "nwparser.payload", "SNMP VPN has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -12349,29 +11120,25 @@ match("MESSAGE#542:00031:01", "nwparser.payload", "SNMP VPN has been %{dispositi dup5, ])); -var msg551 = msg("00031:01", part916); +var msg551 = msg("00031:01", part912); -var part917 = // "Pattern{Constant('SNMP community '), Field(fld2,true), Constant(' attributes-write access '), Field(p0,false)}" -match("MESSAGE#543:00031:02/0", "nwparser.payload", "SNMP community %{fld2->} attributes-write access %{p0}"); +var part913 = match("MESSAGE#543:00031:02/0", "nwparser.payload", "SNMP community %{fld2->} attributes-write access %{p0}"); -var part918 = // "Pattern{Constant('; receive traps '), Field(p0,false)}" -match("MESSAGE#543:00031:02/2", "nwparser.p0", "; receive traps %{p0}"); +var part914 = match("MESSAGE#543:00031:02/2", "nwparser.p0", "; receive traps %{p0}"); -var part919 = // "Pattern{Constant('; receive traffic alarms '), Field(p0,false)}" -match("MESSAGE#543:00031:02/4", "nwparser.p0", "; receive traffic alarms %{p0}"); +var part915 = match("MESSAGE#543:00031:02/4", "nwparser.p0", "; receive traffic alarms %{p0}"); -var part920 = // "Pattern{Constant('-have been modified'), Field(,false)}" -match("MESSAGE#543:00031:02/6", "nwparser.p0", "-have been modified%{}"); +var part916 = match("MESSAGE#543:00031:02/6", "nwparser.p0", "-have been modified%{}"); -var all181 = all_match({ +var all177 = all_match({ processors: [ - part917, - dup382, - part918, - dup382, - part919, - dup382, - part920, + part913, + dup379, + part914, + dup379, + part915, + dup379, + part916, ], on_success: processor_chain([ dup1, @@ -12382,24 +11149,22 @@ var all181 = all_match({ ]), }); -var msg552 = msg("00031:02", all181); +var msg552 = msg("00031:02", all177); -var part921 = // "Pattern{Field(fld2,true), Constant(' SNMP host '), Field(hostip,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#544:00031:03/0", "nwparser.payload", "%{fld2->} SNMP host %{hostip->} has been %{p0}"); +var part917 = match("MESSAGE#544:00031:03/0", "nwparser.payload", "%{fld2->} SNMP host %{hostip->} has been %{p0}"); var select198 = linear_select([ dup130, dup129, ]); -var part922 = // "Pattern{Constant('SNMP community '), Field(fld3,false)}" -match("MESSAGE#544:00031:03/2", "nwparser.p0", "SNMP community %{fld3}"); +var part918 = match("MESSAGE#544:00031:03/2", "nwparser.p0", "SNMP community %{fld3}"); -var all182 = all_match({ +var all178 = all_match({ processors: [ - part921, + part917, select198, - part922, + part918, ], on_success: processor_chain([ dup1, @@ -12410,27 +11175,24 @@ var all182 = all_match({ ]), }); -var msg553 = msg("00031:03", all182); +var msg553 = msg("00031:03", all178); -var part923 = // "Pattern{Constant('SNMP '), Field(p0,false)}" -match("MESSAGE#545:00031:04/0", "nwparser.payload", "SNMP %{p0}"); +var part919 = match("MESSAGE#545:00031:04/0", "nwparser.payload", "SNMP %{p0}"); -var part924 = // "Pattern{Constant('contact '), Field(p0,false)}" -match("MESSAGE#545:00031:04/1_0", "nwparser.p0", "contact %{p0}"); +var part920 = match("MESSAGE#545:00031:04/1_0", "nwparser.p0", "contact %{p0}"); var select199 = linear_select([ - part924, - dup228, + part920, + dup226, ]); -var part925 = // "Pattern{Constant('description has been modified'), Field(,false)}" -match("MESSAGE#545:00031:04/2", "nwparser.p0", "description has been modified%{}"); +var part921 = match("MESSAGE#545:00031:04/2", "nwparser.p0", "description has been modified%{}"); -var all183 = all_match({ +var all179 = all_match({ processors: [ - part923, + part919, select199, - part925, + part921, ], on_success: processor_chain([ dup1, @@ -12441,24 +11203,22 @@ var all183 = all_match({ ]), }); -var msg554 = msg("00031:04", all183); +var msg554 = msg("00031:04", all179); -var part926 = // "Pattern{Constant('SNMP system '), Field(p0,false)}" -match("MESSAGE#546:00031:11/0", "nwparser.payload", "SNMP system %{p0}"); +var part922 = match("MESSAGE#546:00031:11/0", "nwparser.payload", "SNMP system %{p0}"); var select200 = linear_select([ - dup228, + dup226, dup25, ]); -var part927 = // "Pattern{Constant('has been changed to '), Field(fld2,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#546:00031:11/2", "nwparser.p0", "has been changed to %{fld2}. (%{fld1})"); +var part923 = match("MESSAGE#546:00031:11/2", "nwparser.p0", "has been changed to %{fld2}. (%{fld1})"); -var all184 = all_match({ +var all180 = all_match({ processors: [ - part926, + part922, select200, - part927, + part923, ], on_success: processor_chain([ dup1, @@ -12470,58 +11230,49 @@ var all184 = all_match({ ]), }); -var msg555 = msg("00031:11", all184); +var msg555 = msg("00031:11", all180); -var part928 = // "Pattern{Field(fld2,false), Constant(': SNMP community name "'), Field(fld3,false), Constant('" '), Field(p0,false)}" -match("MESSAGE#547:00031:08/0", "nwparser.payload", "%{fld2}: SNMP community name \"%{fld3}\" %{p0}"); +var part924 = match("MESSAGE#547:00031:08/0", "nwparser.payload", "%{fld2}: SNMP community name \"%{fld3}\" %{p0}"); -var part929 = // "Pattern{Constant('attributes -- '), Field(p0,false)}" -match("MESSAGE#547:00031:08/1_0", "nwparser.p0", "attributes -- %{p0}"); +var part925 = match("MESSAGE#547:00031:08/1_0", "nwparser.p0", "attributes -- %{p0}"); -var part930 = // "Pattern{Constant('-- '), Field(p0,false)}" -match("MESSAGE#547:00031:08/1_1", "nwparser.p0", "-- %{p0}"); +var part926 = match("MESSAGE#547:00031:08/1_1", "nwparser.p0", "-- %{p0}"); var select201 = linear_select([ - part929, - part930, + part925, + part926, ]); -var part931 = // "Pattern{Constant('write access, '), Field(p0,false)}" -match("MESSAGE#547:00031:08/2", "nwparser.p0", "write access, %{p0}"); +var part927 = match("MESSAGE#547:00031:08/2", "nwparser.p0", "write access, %{p0}"); -var part932 = // "Pattern{Constant('; receive traps, '), Field(p0,false)}" -match("MESSAGE#547:00031:08/4", "nwparser.p0", "; receive traps, %{p0}"); +var part928 = match("MESSAGE#547:00031:08/4", "nwparser.p0", "; receive traps, %{p0}"); -var part933 = // "Pattern{Constant('; receive traffic alarms, '), Field(p0,false)}" -match("MESSAGE#547:00031:08/6", "nwparser.p0", "; receive traffic alarms, %{p0}"); +var part929 = match("MESSAGE#547:00031:08/6", "nwparser.p0", "; receive traffic alarms, %{p0}"); -var part934 = // "Pattern{Constant('-'), Field(p0,false)}" -match("MESSAGE#547:00031:08/8", "nwparser.p0", "-%{p0}"); +var part930 = match("MESSAGE#547:00031:08/8", "nwparser.p0", "-%{p0}"); -var part935 = // "Pattern{Constant('- '), Field(p0,false)}" -match("MESSAGE#547:00031:08/9_0", "nwparser.p0", "- %{p0}"); +var part931 = match("MESSAGE#547:00031:08/9_0", "nwparser.p0", "- %{p0}"); var select202 = linear_select([ - part935, + part931, dup96, ]); -var part936 = // "Pattern{Constant('have been modified'), Field(,false)}" -match("MESSAGE#547:00031:08/10", "nwparser.p0", "have been modified%{}"); +var part932 = match("MESSAGE#547:00031:08/10", "nwparser.p0", "have been modified%{}"); -var all185 = all_match({ +var all181 = all_match({ processors: [ - part928, + part924, select201, - part931, - dup382, - part932, - dup382, - part933, - dup382, - part934, + part927, + dup379, + part928, + dup379, + part929, + dup379, + part930, select202, - part936, + part932, ], on_success: processor_chain([ dup1, @@ -12532,16 +11283,15 @@ var all185 = all_match({ ]), }); -var msg556 = msg("00031:08", all185); +var msg556 = msg("00031:08", all181); -var part937 = // "Pattern{Constant('Detect IP conflict ('), Field(fld2,false), Constant(') on '), Field(p0,false)}" -match("MESSAGE#548:00031:05/0", "nwparser.payload", "Detect IP conflict (%{fld2}) on %{p0}"); +var part933 = match("MESSAGE#548:00031:05/0", "nwparser.payload", "Detect IP conflict (%{fld2}) on %{p0}"); -var all186 = all_match({ +var all182 = all_match({ processors: [ - part937, - dup339, - dup229, + part933, + dup337, + dup227, ], on_success: processor_chain([ dup121, @@ -12552,43 +11302,39 @@ var all186 = all_match({ ]), }); -var msg557 = msg("00031:05", all186); +var msg557 = msg("00031:05", all182); -var part938 = // "Pattern{Constant('q, '), Field(p0,false)}" -match("MESSAGE#549:00031:06/1_0", "nwparser.p0", "q, %{p0}"); +var part934 = match("MESSAGE#549:00031:06/1_0", "nwparser.p0", "q, %{p0}"); var select203 = linear_select([ - part938, - dup231, - dup232, + part934, + dup229, + dup230, ]); -var part939 = // "Pattern{Constant('detect IP conflict ( '), Field(hostip,true), Constant(' )'), Field(p0,false)}" -match("MESSAGE#549:00031:06/2", "nwparser.p0", "detect IP conflict ( %{hostip->} )%{p0}"); +var part935 = match("MESSAGE#549:00031:06/2", "nwparser.p0", "detect IP conflict ( %{hostip->} )%{p0}"); var select204 = linear_select([ dup105, dup96, ]); -var part940 = // "Pattern{Constant('mac'), Field(p0,false)}" -match("MESSAGE#549:00031:06/4", "nwparser.p0", "mac%{p0}"); +var part936 = match("MESSAGE#549:00031:06/4", "nwparser.p0", "mac%{p0}"); -var part941 = // "Pattern{Constant(''), Field(macaddr,true), Constant(' on '), Field(p0,false)}" -match("MESSAGE#549:00031:06/6", "nwparser.p0", "%{macaddr->} on %{p0}"); +var part937 = match("MESSAGE#549:00031:06/6", "nwparser.p0", "%{macaddr->} on %{p0}"); -var all187 = all_match({ +var all183 = all_match({ processors: [ - dup230, + dup228, select203, - part939, + part935, select204, - part940, - dup358, - part941, - dup354, + part936, + dup356, + part937, + dup352, dup23, - dup383, + dup380, ], on_success: processor_chain([ dup121, @@ -12600,18 +11346,17 @@ var all187 = all_match({ ]), }); -var msg558 = msg("00031:06", all187); +var msg558 = msg("00031:06", all183); -var part942 = // "Pattern{Constant('detects a duplicate virtual security device group master IP address '), Field(hostip,false), Constant(', MAC address '), Field(macaddr,true), Constant(' on '), Field(p0,false)}" -match("MESSAGE#550:00031:07/2", "nwparser.p0", "detects a duplicate virtual security device group master IP address %{hostip}, MAC address %{macaddr->} on %{p0}"); +var part938 = match("MESSAGE#550:00031:07/2", "nwparser.p0", "detects a duplicate virtual security device group master IP address %{hostip}, MAC address %{macaddr->} on %{p0}"); -var all188 = all_match({ +var all184 = all_match({ processors: [ - dup230, - dup384, - part942, - dup339, - dup229, + dup228, + dup381, + part938, + dup337, + dup227, ], on_success: processor_chain([ dup121, @@ -12622,17 +11367,16 @@ var all188 = all_match({ ]), }); -var msg559 = msg("00031:07", all188); +var msg559 = msg("00031:07", all184); -var part943 = // "Pattern{Constant('detected an IP conflict (IP '), Field(hostip,false), Constant(', MAC '), Field(macaddr,false), Constant(') on interface '), Field(p0,false)}" -match("MESSAGE#551:00031:09/2", "nwparser.p0", "detected an IP conflict (IP %{hostip}, MAC %{macaddr}) on interface %{p0}"); +var part939 = match("MESSAGE#551:00031:09/2", "nwparser.p0", "detected an IP conflict (IP %{hostip}, MAC %{macaddr}) on interface %{p0}"); -var all189 = all_match({ +var all185 = all_match({ processors: [ - dup230, - dup384, - part943, - dup383, + dup228, + dup381, + part939, + dup380, ], on_success: processor_chain([ dup121, @@ -12644,10 +11388,9 @@ var all189 = all_match({ ]), }); -var msg560 = msg("00031:09", all189); +var msg560 = msg("00031:09", all185); -var part944 = // "Pattern{Field(fld2,false), Constant(': SNMP community "'), Field(fld3,false), Constant('" has been moved. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#552:00031:10", "nwparser.payload", "%{fld2}: SNMP community \"%{fld3}\" has been moved. (%{fld1})", processor_chain([ +var part940 = match("MESSAGE#552:00031:10", "nwparser.payload", "%{fld2}: SNMP community \"%{fld3}\" has been moved. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -12656,10 +11399,9 @@ match("MESSAGE#552:00031:10", "nwparser.payload", "%{fld2}: SNMP community \"%{f dup5, ])); -var msg561 = msg("00031:10", part944); +var msg561 = msg("00031:10", part940); -var part945 = // "Pattern{Field(fld2,true), Constant(' system contact has been changed to '), Field(fld3,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#553:00031:12", "nwparser.payload", "%{fld2->} system contact has been changed to %{fld3}. (%{fld1})", processor_chain([ +var part941 = match("MESSAGE#553:00031:12", "nwparser.payload", "%{fld2->} system contact has been changed to %{fld3}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -12668,7 +11410,7 @@ match("MESSAGE#553:00031:12", "nwparser.payload", "%{fld2->} system contact has dup5, ])); -var msg562 = msg("00031:12", part945); +var msg562 = msg("00031:12", part941); var select205 = linear_select([ msg549, @@ -12687,9 +11429,8 @@ var select205 = linear_select([ msg562, ]); -var part946 = // "Pattern{Field(signame,true), Constant(' has been detected and blocked! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#554:00032", "nwparser.payload", "%{signame->} has been detected and blocked! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ - dup234, +var part942 = match("MESSAGE#554:00032", "nwparser.payload", "%{signame->} has been detected and blocked! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ + dup232, dup2, dup3, dup59, @@ -12698,11 +11439,10 @@ match("MESSAGE#554:00032", "nwparser.payload", "%{signame->} has been detected a dup61, ])); -var msg563 = msg("00032", part946); +var msg563 = msg("00032", part942); -var part947 = // "Pattern{Field(signame,true), Constant(' has been detected and blocked! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false)}" -match("MESSAGE#555:00032:01", "nwparser.payload", "%{signame->} has been detected and blocked! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}", processor_chain([ - dup234, +var part943 = match("MESSAGE#555:00032:01", "nwparser.payload", "%{signame->} has been detected and blocked! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}", processor_chain([ + dup232, dup2, dup3, dup4, @@ -12710,33 +11450,28 @@ match("MESSAGE#555:00032:01", "nwparser.payload", "%{signame->} has been detecte dup61, ])); -var msg564 = msg("00032:01", part947); +var msg564 = msg("00032:01", part943); -var part948 = // "Pattern{Constant('Vsys '), Field(fld2,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#556:00032:03/0", "nwparser.payload", "Vsys %{fld2->} has been %{p0}"); +var part944 = match("MESSAGE#556:00032:03/0", "nwparser.payload", "Vsys %{fld2->} has been %{p0}"); -var part949 = // "Pattern{Constant('changed to '), Field(fld3,false)}" -match("MESSAGE#556:00032:03/1_0", "nwparser.p0", "changed to %{fld3}"); +var part945 = match("MESSAGE#556:00032:03/1_0", "nwparser.p0", "changed to %{fld3}"); -var part950 = // "Pattern{Constant('created'), Field(,false)}" -match("MESSAGE#556:00032:03/1_1", "nwparser.p0", "created%{}"); +var part946 = match("MESSAGE#556:00032:03/1_1", "nwparser.p0", "created%{}"); -var part951 = // "Pattern{Constant('deleted'), Field(,false)}" -match("MESSAGE#556:00032:03/1_2", "nwparser.p0", "deleted%{}"); +var part947 = match("MESSAGE#556:00032:03/1_2", "nwparser.p0", "deleted%{}"); -var part952 = // "Pattern{Constant('removed'), Field(,false)}" -match("MESSAGE#556:00032:03/1_3", "nwparser.p0", "removed%{}"); +var part948 = match("MESSAGE#556:00032:03/1_3", "nwparser.p0", "removed%{}"); var select206 = linear_select([ - part949, - part950, - part951, - part952, + part945, + part946, + part947, + part948, ]); -var all190 = all_match({ +var all186 = all_match({ processors: [ - part948, + part944, select206, ], on_success: processor_chain([ @@ -12748,11 +11483,10 @@ var all190 = all_match({ ]), }); -var msg565 = msg("00032:03", all190); +var msg565 = msg("00032:03", all186); -var part953 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' on interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#557:00032:04", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ - dup234, +var part949 = match("MESSAGE#557:00032:04", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} on interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ + dup232, dup2, dup3, dup4, @@ -12761,10 +11495,9 @@ match("MESSAGE#557:00032:04", "nwparser.payload", "%{signame->} From %{saddr}:%{ dup61, ])); -var msg566 = msg("00032:04", part953); +var msg566 = msg("00032:04", part949); -var part954 = // "Pattern{Field(change_attribute,true), Constant(' for vsys '), Field(fld2,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#558:00032:05", "nwparser.payload", "%{change_attribute->} for vsys %{fld2->} has been changed from %{change_old->} to %{change_new}", processor_chain([ +var part950 = match("MESSAGE#558:00032:05", "nwparser.payload", "%{change_attribute->} for vsys %{fld2->} has been changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -12772,9 +11505,9 @@ match("MESSAGE#558:00032:05", "nwparser.payload", "%{change_attribute->} for vsy dup5, ])); -var msg567 = msg("00032:05", part954); +var msg567 = msg("00032:05", part950); -var msg568 = msg("00032:02", dup378); +var msg568 = msg("00032:02", dup375); var select207 = linear_select([ msg563, @@ -12785,8 +11518,7 @@ var select207 = linear_select([ msg568, ]); -var part955 = // "Pattern{Constant('NSM has been '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#560:00033:25", "nwparser.payload", "NSM has been %{disposition}. (%{fld1})", processor_chain([ +var part951 = match("MESSAGE#560:00033:25", "nwparser.payload", "NSM has been %{disposition}. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -12796,28 +11528,25 @@ match("MESSAGE#560:00033:25", "nwparser.payload", "NSM has been %{disposition}. setc("agent","NSM"), ])); -var msg569 = msg("00033:25", part955); +var msg569 = msg("00033:25", part951); -var part956 = // "Pattern{Constant('timeout value has been '), Field(p0,false)}" -match("MESSAGE#561:00033/1", "nwparser.p0", "timeout value has been %{p0}"); +var part952 = match("MESSAGE#561:00033/1", "nwparser.p0", "timeout value has been %{p0}"); -var part957 = // "Pattern{Constant('returned'), Field(p0,false)}" -match("MESSAGE#561:00033/2_1", "nwparser.p0", "returned%{p0}"); +var part953 = match("MESSAGE#561:00033/2_1", "nwparser.p0", "returned%{p0}"); var select208 = linear_select([ dup52, - part957, + part953, ]); -var part958 = // "Pattern{Field(,false), Constant('to '), Field(fld2,false)}" -match("MESSAGE#561:00033/3", "nwparser.p0", "%{}to %{fld2}"); +var part954 = match("MESSAGE#561:00033/3", "nwparser.p0", "%{}to %{fld2}"); -var all191 = all_match({ +var all187 = all_match({ processors: [ - dup385, - part956, + dup382, + part952, select208, - part958, + part954, ], on_success: processor_chain([ dup1, @@ -12828,29 +11557,26 @@ var all191 = all_match({ ]), }); -var msg570 = msg("00033", all191); +var msg570 = msg("00033", all187); -var part959 = // "Pattern{Constant('Global PRO '), Field(p0,false)}" -match("MESSAGE#562:00033:03/1_0", "nwparser.p0", "Global PRO %{p0}"); +var part955 = match("MESSAGE#562:00033:03/1_0", "nwparser.p0", "Global PRO %{p0}"); -var part960 = // "Pattern{Field(fld3,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#562:00033:03/1_1", "nwparser.p0", "%{fld3->} %{p0}"); +var part956 = match("MESSAGE#562:00033:03/1_1", "nwparser.p0", "%{fld3->} %{p0}"); var select209 = linear_select([ - part959, - part960, + part955, + part956, ]); -var part961 = // "Pattern{Constant('host has been set to '), Field(fld4,false)}" -match("MESSAGE#562:00033:03/4", "nwparser.p0", "host has been set to %{fld4}"); +var part957 = match("MESSAGE#562:00033:03/4", "nwparser.p0", "host has been set to %{fld4}"); -var all192 = all_match({ +var all188 = all_match({ processors: [ - dup162, + dup160, select209, dup23, - dup372, - part961, + dup369, + part957, ], on_success: processor_chain([ dup1, @@ -12861,17 +11587,16 @@ var all192 = all_match({ ]), }); -var msg571 = msg("00033:03", all192); +var msg571 = msg("00033:03", all188); -var part962 = // "Pattern{Constant('host has been '), Field(disposition,false)}" -match("MESSAGE#563:00033:02/3", "nwparser.p0", "host has been %{disposition}"); +var part958 = match("MESSAGE#563:00033:02/3", "nwparser.p0", "host has been %{disposition}"); -var all193 = all_match({ +var all189 = all_match({ processors: [ - dup385, + dup382, dup23, - dup372, - part962, + dup369, + part958, ], on_success: processor_chain([ dup1, @@ -12882,10 +11607,9 @@ var all193 = all_match({ ]), }); -var msg572 = msg("00033:02", all193); +var msg572 = msg("00033:02", all189); -var part963 = // "Pattern{Constant('Reporting of '), Field(fld2,true), Constant(' to '), Field(fld3,true), Constant(' has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#564:00033:04", "nwparser.payload", "Reporting of %{fld2->} to %{fld3->} has been %{disposition}.", processor_chain([ +var part959 = match("MESSAGE#564:00033:04", "nwparser.payload", "Reporting of %{fld2->} to %{fld3->} has been %{disposition}.", processor_chain([ dup1, dup2, dup3, @@ -12893,10 +11617,9 @@ match("MESSAGE#564:00033:04", "nwparser.payload", "Reporting of %{fld2->} to %{f dup5, ])); -var msg573 = msg("00033:04", part963); +var msg573 = msg("00033:04", part959); -var part964 = // "Pattern{Constant('Global PRO has been '), Field(disposition,false)}" -match("MESSAGE#565:00033:05", "nwparser.payload", "Global PRO has been %{disposition}", processor_chain([ +var part960 = match("MESSAGE#565:00033:05", "nwparser.payload", "Global PRO has been %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -12904,10 +11627,9 @@ match("MESSAGE#565:00033:05", "nwparser.payload", "Global PRO has been %{disposi dup5, ])); -var msg574 = msg("00033:05", part964); +var msg574 = msg("00033:05", part960); -var part965 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' and arriving at interface '), Field(interface,false), Constant('. The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#566:00033:06", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}. The attack occurred %{dclass_counter1->} times", processor_chain([ +var part961 = match("MESSAGE#566:00033:06", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}. The attack occurred %{dclass_counter1->} times", processor_chain([ dup27, dup2, dup3, @@ -12917,10 +11639,9 @@ match("MESSAGE#566:00033:06", "nwparser.payload", "%{signame}! From %{saddr}:%{s dup61, ])); -var msg575 = msg("00033:06", part965); +var msg575 = msg("00033:06", part961); -var part966 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' and arriving at interface '), Field(interface,false), Constant('. The threshold was exceeded '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#567:00033:01", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}. The threshold was exceeded %{dclass_counter1->} times", processor_chain([ +var part962 = match("MESSAGE#567:00033:01", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}. The threshold was exceeded %{dclass_counter1->} times", processor_chain([ dup27, dup2, dup3, @@ -12930,10 +11651,9 @@ match("MESSAGE#567:00033:01", "nwparser.payload", "%{signame}! From %{saddr}:%{s dup61, ])); -var msg576 = msg("00033:01", part966); +var msg576 = msg("00033:01", part962); -var part967 = // "Pattern{Constant('User-defined service '), Field(service,true), Constant(' has been '), Field(disposition,true), Constant(' from '), Field(fld2,true), Constant(' distribution')}" -match("MESSAGE#568:00033:07", "nwparser.payload", "User-defined service %{service->} has been %{disposition->} from %{fld2->} distribution", processor_chain([ +var part963 = match("MESSAGE#568:00033:07", "nwparser.payload", "User-defined service %{service->} has been %{disposition->} from %{fld2->} distribution", processor_chain([ dup1, dup2, dup3, @@ -12941,16 +11661,15 @@ match("MESSAGE#568:00033:07", "nwparser.payload", "User-defined service %{servic dup5, ])); -var msg577 = msg("00033:07", part967); +var msg577 = msg("00033:07", part963); -var part968 = // "Pattern{Constant('?s CA certificate field has not been specified.'), Field(,false)}" -match("MESSAGE#569:00033:08/2", "nwparser.p0", "?s CA certificate field has not been specified.%{}"); +var part964 = match("MESSAGE#569:00033:08/2", "nwparser.p0", "?s CA certificate field has not been specified.%{}"); -var all194 = all_match({ +var all190 = all_match({ processors: [ - dup237, - dup386, - part968, + dup235, + dup383, + part964, ], on_success: processor_chain([ dup1, @@ -12961,16 +11680,15 @@ var all194 = all_match({ ]), }); -var msg578 = msg("00033:08", all194); +var msg578 = msg("00033:08", all190); -var part969 = // "Pattern{Constant('?s Cert-Subject field has not been specified.'), Field(,false)}" -match("MESSAGE#570:00033:09/2", "nwparser.p0", "?s Cert-Subject field has not been specified.%{}"); +var part965 = match("MESSAGE#570:00033:09/2", "nwparser.p0", "?s Cert-Subject field has not been specified.%{}"); -var all195 = all_match({ +var all191 = all_match({ processors: [ - dup237, - dup386, - part969, + dup235, + dup383, + part965, ], on_success: processor_chain([ dup1, @@ -12981,24 +11699,22 @@ var all195 = all_match({ ]), }); -var msg579 = msg("00033:09", all195); +var msg579 = msg("00033:09", all191); -var part970 = // "Pattern{Constant('?s host field has been '), Field(p0,false)}" -match("MESSAGE#571:00033:10/2", "nwparser.p0", "?s host field has been %{p0}"); +var part966 = match("MESSAGE#571:00033:10/2", "nwparser.p0", "?s host field has been %{p0}"); -var part971 = // "Pattern{Constant('set to '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#571:00033:10/3_0", "nwparser.p0", "set to %{fld2->} %{p0}"); +var part967 = match("MESSAGE#571:00033:10/3_0", "nwparser.p0", "set to %{fld2->} %{p0}"); var select210 = linear_select([ - part971, - dup240, + part967, + dup238, ]); -var all196 = all_match({ +var all192 = all_match({ processors: [ - dup237, - dup386, - part970, + dup235, + dup383, + part966, select210, dup116, ], @@ -13011,21 +11727,19 @@ var all196 = all_match({ ]), }); -var msg580 = msg("00033:10", all196); +var msg580 = msg("00033:10", all192); -var part972 = // "Pattern{Constant('?s outgoing interface used to report NACN to Policy Manager '), Field(p0,false)}" -match("MESSAGE#572:00033:11/2", "nwparser.p0", "?s outgoing interface used to report NACN to Policy Manager %{p0}"); +var part968 = match("MESSAGE#572:00033:11/2", "nwparser.p0", "?s outgoing interface used to report NACN to Policy Manager %{p0}"); -var part973 = // "Pattern{Constant('has not been specified.'), Field(,false)}" -match("MESSAGE#572:00033:11/4", "nwparser.p0", "has not been specified.%{}"); +var part969 = match("MESSAGE#572:00033:11/4", "nwparser.p0", "has not been specified.%{}"); -var all197 = all_match({ +var all193 = all_match({ processors: [ - dup237, - dup386, - part972, - dup386, - part973, + dup235, + dup383, + part968, + dup383, + part969, ], on_success: processor_chain([ dup1, @@ -13036,21 +11750,20 @@ var all197 = all_match({ ]), }); -var msg581 = msg("00033:11", all197); +var msg581 = msg("00033:11", all193); -var part974 = // "Pattern{Constant('?s password field has been '), Field(p0,false)}" -match("MESSAGE#573:00033:12/2", "nwparser.p0", "?s password field has been %{p0}"); +var part970 = match("MESSAGE#573:00033:12/2", "nwparser.p0", "?s password field has been %{p0}"); var select211 = linear_select([ dup101, - dup240, + dup238, ]); -var all198 = all_match({ +var all194 = all_match({ processors: [ - dup237, - dup386, - part974, + dup235, + dup383, + part970, select211, dup116, ], @@ -13063,27 +11776,24 @@ var all198 = all_match({ ]), }); -var msg582 = msg("00033:12", all198); +var msg582 = msg("00033:12", all194); -var part975 = // "Pattern{Constant('?s policy-domain field has been '), Field(p0,false)}" -match("MESSAGE#574:00033:13/2", "nwparser.p0", "?s policy-domain field has been %{p0}"); +var part971 = match("MESSAGE#574:00033:13/2", "nwparser.p0", "?s policy-domain field has been %{p0}"); -var part976 = // "Pattern{Constant('unset .'), Field(,false)}" -match("MESSAGE#574:00033:13/3_0", "nwparser.p0", "unset .%{}"); +var part972 = match("MESSAGE#574:00033:13/3_0", "nwparser.p0", "unset .%{}"); -var part977 = // "Pattern{Constant('set to '), Field(domain,false), Constant('.')}" -match("MESSAGE#574:00033:13/3_1", "nwparser.p0", "set to %{domain}."); +var part973 = match("MESSAGE#574:00033:13/3_1", "nwparser.p0", "set to %{domain}."); var select212 = linear_select([ - part976, - part977, + part972, + part973, ]); -var all199 = all_match({ +var all195 = all_match({ processors: [ - dup237, - dup386, - part975, + dup235, + dup383, + part971, select212, ], on_success: processor_chain([ @@ -13095,16 +11805,15 @@ var all199 = all_match({ ]), }); -var msg583 = msg("00033:13", all199); +var msg583 = msg("00033:13", all195); -var part978 = // "Pattern{Constant('?s CA certificate field has been set to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#575:00033:14/2", "nwparser.p0", "?s CA certificate field has been set to %{fld2}."); +var part974 = match("MESSAGE#575:00033:14/2", "nwparser.p0", "?s CA certificate field has been set to %{fld2}."); -var all200 = all_match({ +var all196 = all_match({ processors: [ - dup237, - dup386, - part978, + dup235, + dup383, + part974, ], on_success: processor_chain([ dup1, @@ -13115,16 +11824,15 @@ var all200 = all_match({ ]), }); -var msg584 = msg("00033:14", all200); +var msg584 = msg("00033:14", all196); -var part979 = // "Pattern{Constant('?s Cert-Subject field has been set to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#576:00033:15/2", "nwparser.p0", "?s Cert-Subject field has been set to %{fld2}."); +var part975 = match("MESSAGE#576:00033:15/2", "nwparser.p0", "?s Cert-Subject field has been set to %{fld2}."); -var all201 = all_match({ +var all197 = all_match({ processors: [ - dup237, - dup386, - part979, + dup235, + dup383, + part975, ], on_success: processor_chain([ dup1, @@ -13135,16 +11843,15 @@ var all201 = all_match({ ]), }); -var msg585 = msg("00033:15", all201); +var msg585 = msg("00033:15", all197); -var part980 = // "Pattern{Constant('?s outgoing-interface field has been set to '), Field(interface,false), Constant('.')}" -match("MESSAGE#577:00033:16/2", "nwparser.p0", "?s outgoing-interface field has been set to %{interface}."); +var part976 = match("MESSAGE#577:00033:16/2", "nwparser.p0", "?s outgoing-interface field has been set to %{interface}."); -var all202 = all_match({ +var all198 = all_match({ processors: [ - dup237, - dup386, - part980, + dup235, + dup383, + part976, ], on_success: processor_chain([ dup1, @@ -13155,27 +11862,24 @@ var all202 = all_match({ ]), }); -var msg586 = msg("00033:16", all202); +var msg586 = msg("00033:16", all198); -var part981 = // "Pattern{Constant('?s port field has been '), Field(p0,false)}" -match("MESSAGE#578:00033:17/2", "nwparser.p0", "?s port field has been %{p0}"); +var part977 = match("MESSAGE#578:00033:17/2", "nwparser.p0", "?s port field has been %{p0}"); -var part982 = // "Pattern{Constant('set to '), Field(network_port,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#578:00033:17/3_0", "nwparser.p0", "set to %{network_port->} %{p0}"); +var part978 = match("MESSAGE#578:00033:17/3_0", "nwparser.p0", "set to %{network_port->} %{p0}"); -var part983 = // "Pattern{Constant('reset to the default value '), Field(p0,false)}" -match("MESSAGE#578:00033:17/3_1", "nwparser.p0", "reset to the default value %{p0}"); +var part979 = match("MESSAGE#578:00033:17/3_1", "nwparser.p0", "reset to the default value %{p0}"); var select213 = linear_select([ - part982, - part983, + part978, + part979, ]); -var all203 = all_match({ +var all199 = all_match({ processors: [ - dup237, - dup386, - part981, + dup235, + dup383, + part977, select213, dup116, ], @@ -13188,21 +11892,19 @@ var all203 = all_match({ ]), }); -var msg587 = msg("00033:17", all203); +var msg587 = msg("00033:17", all199); -var part984 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(p0,false)}" -match("MESSAGE#579:00033:19/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{p0}"); +var part980 = match("MESSAGE#579:00033:19/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{p0}"); -var part985 = // "Pattern{Field(fld99,false), Constant('arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' time.')}" -match("MESSAGE#579:00033:19/4", "nwparser.p0", "%{fld99}arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} time."); +var part981 = match("MESSAGE#579:00033:19/4", "nwparser.p0", "%{fld99}arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} time."); -var all204 = all_match({ +var all200 = all_match({ processors: [ - part984, - dup341, + part980, + dup339, dup70, - dup342, - part985, + dup340, + part981, ], on_success: processor_chain([ dup27, @@ -13215,10 +11917,9 @@ var all204 = all_match({ ]), }); -var msg588 = msg("00033:19", all204); +var msg588 = msg("00033:19", all200); -var part986 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' time.')}" -match("MESSAGE#580:00033:20", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} time.", processor_chain([ +var part982 = match("MESSAGE#580:00033:20", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} time.", processor_chain([ dup27, dup2, dup4, @@ -13228,12 +11929,12 @@ match("MESSAGE#580:00033:20", "nwparser.payload", "%{signame}! From %{saddr->} t dup60, ])); -var msg589 = msg("00033:20", part986); +var msg589 = msg("00033:20", part982); -var all205 = all_match({ +var all201 = all_match({ processors: [ - dup241, - dup345, + dup239, + dup343, dup83, ], on_success: processor_chain([ @@ -13248,15 +11949,14 @@ var all205 = all_match({ ]), }); -var msg590 = msg("00033:21", all205); +var msg590 = msg("00033:21", all201); -var part987 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#582:00033:22/0", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); +var part983 = match("MESSAGE#582:00033:22/0", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); -var all206 = all_match({ +var all202 = all_match({ processors: [ - part987, - dup345, + part983, + dup343, dup83, ], on_success: processor_chain([ @@ -13271,10 +11971,9 @@ var all206 = all_match({ ]), }); -var msg591 = msg("00033:22", all206); +var msg591 = msg("00033:22", all202); -var part988 = // "Pattern{Constant('NSM primary server with name '), Field(hostname,true), Constant(' was set: addr '), Field(hostip,false), Constant(', port '), Field(network_port,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#583:00033:23", "nwparser.payload", "NSM primary server with name %{hostname->} was set: addr %{hostip}, port %{network_port}. (%{fld1})", processor_chain([ +var part984 = match("MESSAGE#583:00033:23", "nwparser.payload", "NSM primary server with name %{hostname->} was set: addr %{hostip}, port %{network_port}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -13283,10 +11982,9 @@ match("MESSAGE#583:00033:23", "nwparser.payload", "NSM primary server with name dup5, ])); -var msg592 = msg("00033:23", part988); +var msg592 = msg("00033:23", part984); -var part989 = // "Pattern{Constant('session threshold From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.'), Field(info,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#584:00033:24", "nwparser.payload", "session threshold From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{info}. (%{fld1})", processor_chain([ +var part985 = match("MESSAGE#584:00033:24", "nwparser.payload", "session threshold From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{info}. (%{fld1})", processor_chain([ setc("eventcategory","1001030500"), dup2, dup3, @@ -13295,7 +11993,7 @@ match("MESSAGE#584:00033:24", "nwparser.payload", "session threshold From %{sadd dup5, ])); -var msg593 = msg("00033:24", part989); +var msg593 = msg("00033:24", part985); var select214 = linear_select([ msg569, @@ -13325,49 +12023,44 @@ var select214 = linear_select([ msg593, ]); -var part990 = // "Pattern{Constant('SCS: Failed '), Field(p0,false)}" -match("MESSAGE#585:00034/0_0", "nwparser.payload", "SCS: Failed %{p0}"); +var part986 = match("MESSAGE#585:00034/0_0", "nwparser.payload", "SCS: Failed %{p0}"); -var part991 = // "Pattern{Constant('Failed '), Field(p0,false)}" -match("MESSAGE#585:00034/0_1", "nwparser.payload", "Failed %{p0}"); +var part987 = match("MESSAGE#585:00034/0_1", "nwparser.payload", "Failed %{p0}"); var select215 = linear_select([ - part990, - part991, + part986, + part987, ]); -var part992 = // "Pattern{Constant('bind '), Field(p0,false)}" -match("MESSAGE#585:00034/2_0", "nwparser.p0", "bind %{p0}"); +var part988 = match("MESSAGE#585:00034/2_0", "nwparser.p0", "bind %{p0}"); -var part993 = // "Pattern{Constant('retrieve '), Field(p0,false)}" -match("MESSAGE#585:00034/2_2", "nwparser.p0", "retrieve %{p0}"); +var part989 = match("MESSAGE#585:00034/2_2", "nwparser.p0", "retrieve %{p0}"); var select216 = linear_select([ - part992, - dup203, - part993, + part988, + dup201, + part989, ]); var select217 = linear_select([ - dup198, + dup196, dup103, - dup165, + dup163, ]); -var part994 = // "Pattern{Constant('SSH user '), Field(username,false), Constant('. (Key ID='), Field(fld2,false), Constant(')')}" -match("MESSAGE#585:00034/5", "nwparser.p0", "SSH user %{username}. (Key ID=%{fld2})"); +var part990 = match("MESSAGE#585:00034/5", "nwparser.p0", "SSH user %{username}. (Key ID=%{fld2})"); -var all207 = all_match({ +var all203 = all_match({ processors: [ select215, dup103, select216, - dup204, + dup202, select217, - part994, + part990, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13375,42 +12068,37 @@ var all207 = all_match({ ]), }); -var msg594 = msg("00034", all207); +var msg594 = msg("00034", all203); -var part995 = // "Pattern{Constant('SCS: Incompatible '), Field(p0,false)}" -match("MESSAGE#586:00034:01/0_0", "nwparser.payload", "SCS: Incompatible %{p0}"); +var part991 = match("MESSAGE#586:00034:01/0_0", "nwparser.payload", "SCS: Incompatible %{p0}"); -var part996 = // "Pattern{Constant('Incompatible '), Field(p0,false)}" -match("MESSAGE#586:00034:01/0_1", "nwparser.payload", "Incompatible %{p0}"); +var part992 = match("MESSAGE#586:00034:01/0_1", "nwparser.payload", "Incompatible %{p0}"); var select218 = linear_select([ - part995, - part996, + part991, + part992, ]); -var part997 = // "Pattern{Constant('SSH version '), Field(version,true), Constant(' has been received from '), Field(p0,false)}" -match("MESSAGE#586:00034:01/1", "nwparser.p0", "SSH version %{version->} has been received from %{p0}"); +var part993 = match("MESSAGE#586:00034:01/1", "nwparser.p0", "SSH version %{version->} has been received from %{p0}"); -var part998 = // "Pattern{Constant('the SSH '), Field(p0,false)}" -match("MESSAGE#586:00034:01/2_0", "nwparser.p0", "the SSH %{p0}"); +var part994 = match("MESSAGE#586:00034:01/2_0", "nwparser.p0", "the SSH %{p0}"); var select219 = linear_select([ - part998, - dup243, + part994, + dup241, ]); -var part999 = // "Pattern{Constant('client at '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#586:00034:01/3", "nwparser.p0", "client at %{saddr}:%{sport}"); +var part995 = match("MESSAGE#586:00034:01/3", "nwparser.p0", "client at %{saddr}:%{sport}"); -var all208 = all_match({ +var all204 = all_match({ processors: [ select218, - part997, + part993, select219, - part999, + part995, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13418,29 +12106,27 @@ var all208 = all_match({ ]), }); -var msg595 = msg("00034:01", all208); +var msg595 = msg("00034:01", all204); -var part1000 = // "Pattern{Constant('Maximum number of SCS sessions '), Field(fld2,true), Constant(' has been reached. Connection request from SSH user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has been '), Field(disposition,false)}" -match("MESSAGE#587:00034:02", "nwparser.payload", "Maximum number of SCS sessions %{fld2->} has been reached. Connection request from SSH user %{username->} at %{saddr}:%{sport->} has been %{disposition}", processor_chain([ - dup242, +var part996 = match("MESSAGE#587:00034:02", "nwparser.payload", "Maximum number of SCS sessions %{fld2->} has been reached. Connection request from SSH user %{username->} at %{saddr}:%{sport->} has been %{disposition}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg596 = msg("00034:02", part1000); +var msg596 = msg("00034:02", part996); -var part1001 = // "Pattern{Constant('device failed to authenticate the SSH client at '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#588:00034:03/1", "nwparser.p0", "device failed to authenticate the SSH client at %{saddr}:%{sport}"); +var part997 = match("MESSAGE#588:00034:03/1", "nwparser.p0", "device failed to authenticate the SSH client at %{saddr}:%{sport}"); -var all209 = all_match({ +var all205 = all_match({ processors: [ - dup387, - part1001, + dup384, + part997, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13448,56 +12134,50 @@ var all209 = all_match({ ]), }); -var msg597 = msg("00034:03", all209); +var msg597 = msg("00034:03", all205); -var part1002 = // "Pattern{Constant('SCS: NetScreen device failed to generate a PKA RSA challenge for SSH user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('. (Key ID='), Field(fld2,false), Constant(')')}" -match("MESSAGE#589:00034:04", "nwparser.payload", "SCS: NetScreen device failed to generate a PKA RSA challenge for SSH user %{username->} at %{saddr}:%{sport}. (Key ID=%{fld2})", processor_chain([ - dup242, +var part998 = match("MESSAGE#589:00034:04", "nwparser.payload", "SCS: NetScreen device failed to generate a PKA RSA challenge for SSH user %{username->} at %{saddr}:%{sport}. (Key ID=%{fld2})", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg598 = msg("00034:04", part1002); +var msg598 = msg("00034:04", part998); -var part1003 = // "Pattern{Constant('NetScreen device failed to generate a PKA RSA challenge for SSH user '), Field(username,false), Constant('. (Key ID='), Field(fld2,false), Constant(')')}" -match("MESSAGE#590:00034:05", "nwparser.payload", "NetScreen device failed to generate a PKA RSA challenge for SSH user %{username}. (Key ID=%{fld2})", processor_chain([ - dup242, +var part999 = match("MESSAGE#590:00034:05", "nwparser.payload", "NetScreen device failed to generate a PKA RSA challenge for SSH user %{username}. (Key ID=%{fld2})", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg599 = msg("00034:05", part1003); +var msg599 = msg("00034:05", part999); -var part1004 = // "Pattern{Constant('device failed to '), Field(p0,false)}" -match("MESSAGE#591:00034:06/1", "nwparser.p0", "device failed to %{p0}"); +var part1000 = match("MESSAGE#591:00034:06/1", "nwparser.p0", "device failed to %{p0}"); -var part1005 = // "Pattern{Constant('identify itself '), Field(p0,false)}" -match("MESSAGE#591:00034:06/2_0", "nwparser.p0", "identify itself %{p0}"); +var part1001 = match("MESSAGE#591:00034:06/2_0", "nwparser.p0", "identify itself %{p0}"); -var part1006 = // "Pattern{Constant('send the identification string '), Field(p0,false)}" -match("MESSAGE#591:00034:06/2_1", "nwparser.p0", "send the identification string %{p0}"); +var part1002 = match("MESSAGE#591:00034:06/2_1", "nwparser.p0", "send the identification string %{p0}"); var select220 = linear_select([ - part1005, - part1006, + part1001, + part1002, ]); -var part1007 = // "Pattern{Constant('to the SSH client at '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#591:00034:06/3", "nwparser.p0", "to the SSH client at %{saddr}:%{sport}"); +var part1003 = match("MESSAGE#591:00034:06/3", "nwparser.p0", "to the SSH client at %{saddr}:%{sport}"); -var all210 = all_match({ +var all206 = all_match({ processors: [ - dup387, - part1004, + dup384, + part1000, select220, - part1007, + part1003, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13505,73 +12185,65 @@ var all210 = all_match({ ]), }); -var msg600 = msg("00034:06", all210); +var msg600 = msg("00034:06", all206); -var part1008 = // "Pattern{Constant('SCS connection has been terminated for admin user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#592:00034:07", "nwparser.payload", "SCS connection has been terminated for admin user %{username->} at %{saddr}:%{sport}", processor_chain([ - dup242, +var part1004 = match("MESSAGE#592:00034:07", "nwparser.payload", "SCS connection has been terminated for admin user %{username->} at %{saddr}:%{sport}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg601 = msg("00034:07", part1008); +var msg601 = msg("00034:07", part1004); -var part1009 = // "Pattern{Constant('SCS: SCS has been '), Field(disposition,true), Constant(' for '), Field(username,true), Constant(' with '), Field(fld2,true), Constant(' existing PKA keys already bound to '), Field(fld3,true), Constant(' SSH users.')}" -match("MESSAGE#593:00034:08", "nwparser.payload", "SCS: SCS has been %{disposition->} for %{username->} with %{fld2->} existing PKA keys already bound to %{fld3->} SSH users.", processor_chain([ - dup242, +var part1005 = match("MESSAGE#593:00034:08", "nwparser.payload", "SCS: SCS has been %{disposition->} for %{username->} with %{fld2->} existing PKA keys already bound to %{fld3->} SSH users.", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg602 = msg("00034:08", part1009); +var msg602 = msg("00034:08", part1005); -var part1010 = // "Pattern{Constant('SCS has been '), Field(disposition,true), Constant(' for '), Field(username,true), Constant(' with '), Field(fld2,true), Constant(' PKA keys already bound to '), Field(fld3,true), Constant(' SSH users')}" -match("MESSAGE#594:00034:09", "nwparser.payload", "SCS has been %{disposition->} for %{username->} with %{fld2->} PKA keys already bound to %{fld3->} SSH users", processor_chain([ - dup242, +var part1006 = match("MESSAGE#594:00034:09", "nwparser.payload", "SCS has been %{disposition->} for %{username->} with %{fld2->} PKA keys already bound to %{fld3->} SSH users", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg603 = msg("00034:09", part1010); +var msg603 = msg("00034:09", part1006); -var part1011 = // "Pattern{Field(,false), Constant('client at '), Field(saddr,true), Constant(' has attempted to make an SCS connection to '), Field(p0,false)}" -match("MESSAGE#595:00034:10/2", "nwparser.p0", "%{}client at %{saddr->} has attempted to make an SCS connection to %{p0}"); +var part1007 = match("MESSAGE#595:00034:10/2", "nwparser.p0", "%{}client at %{saddr->} has attempted to make an SCS connection to %{p0}"); -var part1012 = // "Pattern{Constant(''), Field(interface,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#595:00034:10/4", "nwparser.p0", "%{interface->} %{p0}"); +var part1008 = match("MESSAGE#595:00034:10/4", "nwparser.p0", "%{interface->} %{p0}"); -var part1013 = // "Pattern{Constant('with'), Field(p0,false)}" -match("MESSAGE#595:00034:10/5_0", "nwparser.p0", "with%{p0}"); +var part1009 = match("MESSAGE#595:00034:10/5_0", "nwparser.p0", "with%{p0}"); -var part1014 = // "Pattern{Constant('at'), Field(p0,false)}" -match("MESSAGE#595:00034:10/5_1", "nwparser.p0", "at%{p0}"); +var part1010 = match("MESSAGE#595:00034:10/5_1", "nwparser.p0", "at%{p0}"); var select221 = linear_select([ - part1013, - part1014, + part1009, + part1010, ]); -var part1015 = // "Pattern{Field(,false), Constant('IP '), Field(hostip,true), Constant(' but '), Field(disposition,true), Constant(' because '), Field(result,false)}" -match("MESSAGE#595:00034:10/6", "nwparser.p0", "%{}IP %{hostip->} but %{disposition->} because %{result}"); +var part1011 = match("MESSAGE#595:00034:10/6", "nwparser.p0", "%{}IP %{hostip->} but %{disposition->} because %{result}"); -var all211 = all_match({ +var all207 = all_match({ processors: [ - dup246, - dup388, - part1011, - dup354, - part1012, + dup244, + dup385, + part1007, + dup352, + part1008, select221, - part1015, + part1011, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13579,24 +12251,22 @@ var all211 = all_match({ ]), }); -var msg604 = msg("00034:10", all211); +var msg604 = msg("00034:10", all207); -var part1016 = // "Pattern{Field(,false), Constant('client at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has attempted to make an SCS connection to '), Field(p0,false)}" -match("MESSAGE#596:00034:12/2", "nwparser.p0", "%{}client at %{saddr}:%{sport->} has attempted to make an SCS connection to %{p0}"); +var part1012 = match("MESSAGE#596:00034:12/2", "nwparser.p0", "%{}client at %{saddr}:%{sport->} has attempted to make an SCS connection to %{p0}"); -var part1017 = // "Pattern{Constant('but '), Field(disposition,true), Constant(' because '), Field(result,false)}" -match("MESSAGE#596:00034:12/4", "nwparser.p0", "but %{disposition->} because %{result}"); +var part1013 = match("MESSAGE#596:00034:12/4", "nwparser.p0", "but %{disposition->} because %{result}"); -var all212 = all_match({ +var all208 = all_match({ processors: [ - dup246, - dup388, - part1016, - dup389, - part1017, + dup244, + dup385, + part1012, + dup386, + part1013, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13604,24 +12274,22 @@ var all212 = all_match({ ]), }); -var msg605 = msg("00034:12", all212); +var msg605 = msg("00034:12", all208); -var part1018 = // "Pattern{Field(,false), Constant('client at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has '), Field(disposition,true), Constant(' to make an SCS connection to '), Field(p0,false)}" -match("MESSAGE#597:00034:11/2", "nwparser.p0", "%{}client at %{saddr}:%{sport->} has %{disposition->} to make an SCS connection to %{p0}"); +var part1014 = match("MESSAGE#597:00034:11/2", "nwparser.p0", "%{}client at %{saddr}:%{sport->} has %{disposition->} to make an SCS connection to %{p0}"); -var part1019 = // "Pattern{Constant('because '), Field(result,false)}" -match("MESSAGE#597:00034:11/4", "nwparser.p0", "because %{result}"); +var part1015 = match("MESSAGE#597:00034:11/4", "nwparser.p0", "because %{result}"); -var all213 = all_match({ +var all209 = all_match({ processors: [ - dup246, - dup388, - part1018, - dup389, - part1019, + dup244, + dup385, + part1014, + dup386, + part1015, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13629,30 +12297,28 @@ var all213 = all_match({ ]), }); -var msg606 = msg("00034:11", all213); +var msg606 = msg("00034:11", all209); -var part1020 = // "Pattern{Constant('SSH client at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has '), Field(disposition,true), Constant(' to make an SCS connection because '), Field(result,false)}" -match("MESSAGE#598:00034:15", "nwparser.payload", "SSH client at %{saddr}:%{sport->} has %{disposition->} to make an SCS connection because %{result}", processor_chain([ - dup242, +var part1016 = match("MESSAGE#598:00034:15", "nwparser.payload", "SSH client at %{saddr}:%{sport->} has %{disposition->} to make an SCS connection because %{result}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg607 = msg("00034:15", part1020); +var msg607 = msg("00034:15", part1016); -var part1021 = // "Pattern{Constant('user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' cannot log in via SCS to '), Field(service,true), Constant(' using the shared '), Field(interface,true), Constant(' interface because '), Field(result,false)}" -match("MESSAGE#599:00034:18/2", "nwparser.p0", "user %{username->} at %{saddr}:%{sport->} cannot log in via SCS to %{service->} using the shared %{interface->} interface because %{result}"); +var part1017 = match("MESSAGE#599:00034:18/2", "nwparser.p0", "user %{username->} at %{saddr}:%{sport->} cannot log in via SCS to %{service->} using the shared %{interface->} interface because %{result}"); -var all214 = all_match({ +var all210 = all_match({ processors: [ - dup246, - dup390, - part1021, + dup244, + dup387, + part1017, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13660,19 +12326,18 @@ var all214 = all_match({ ]), }); -var msg608 = msg("00034:18", all214); +var msg608 = msg("00034:18", all210); -var part1022 = // "Pattern{Constant('user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has '), Field(disposition,true), Constant(' the PKA RSA challenge')}" -match("MESSAGE#600:00034:20/2", "nwparser.p0", "user %{username->} at %{saddr}:%{sport->} has %{disposition->} the PKA RSA challenge"); +var part1018 = match("MESSAGE#600:00034:20/2", "nwparser.p0", "user %{username->} at %{saddr}:%{sport->} has %{disposition->} the PKA RSA challenge"); -var all215 = all_match({ +var all211 = all_match({ processors: [ - dup246, - dup390, - part1022, + dup244, + dup387, + part1018, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13680,49 +12345,43 @@ var all215 = all_match({ ]), }); -var msg609 = msg("00034:20", all215); +var msg609 = msg("00034:20", all211); -var part1023 = // "Pattern{Constant('user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has requested '), Field(p0,false)}" -match("MESSAGE#601:00034:21/2", "nwparser.p0", "user %{username->} at %{saddr}:%{sport->} has requested %{p0}"); +var part1019 = match("MESSAGE#601:00034:21/2", "nwparser.p0", "user %{username->} at %{saddr}:%{sport->} has requested %{p0}"); -var part1024 = // "Pattern{Constant('authentication which is not '), Field(p0,false)}" -match("MESSAGE#601:00034:21/4", "nwparser.p0", "authentication which is not %{p0}"); +var part1020 = match("MESSAGE#601:00034:21/4", "nwparser.p0", "authentication which is not %{p0}"); -var part1025 = // "Pattern{Constant('supported '), Field(p0,false)}" -match("MESSAGE#601:00034:21/5_0", "nwparser.p0", "supported %{p0}"); +var part1021 = match("MESSAGE#601:00034:21/5_0", "nwparser.p0", "supported %{p0}"); var select222 = linear_select([ - part1025, + part1021, dup156, ]); -var part1026 = // "Pattern{Constant('for that '), Field(p0,false)}" -match("MESSAGE#601:00034:21/6", "nwparser.p0", "for that %{p0}"); +var part1022 = match("MESSAGE#601:00034:21/6", "nwparser.p0", "for that %{p0}"); -var part1027 = // "Pattern{Constant('client'), Field(,false)}" -match("MESSAGE#601:00034:21/7_0", "nwparser.p0", "client%{}"); +var part1023 = match("MESSAGE#601:00034:21/7_0", "nwparser.p0", "client%{}"); -var part1028 = // "Pattern{Constant('user'), Field(,false)}" -match("MESSAGE#601:00034:21/7_1", "nwparser.p0", "user%{}"); +var part1024 = match("MESSAGE#601:00034:21/7_1", "nwparser.p0", "user%{}"); var select223 = linear_select([ - part1027, - part1028, + part1023, + part1024, ]); -var all216 = all_match({ +var all212 = all_match({ processors: [ - dup246, - dup390, - part1023, - dup375, - part1024, + dup244, + dup387, + part1019, + dup372, + part1020, select222, - part1026, + part1022, select223, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13730,41 +12389,37 @@ var all216 = all_match({ ]), }); -var msg610 = msg("00034:21", all216); +var msg610 = msg("00034:21", all212); -var part1029 = // "Pattern{Constant('SSH user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has unsuccessfully attempted to log in via SCS to vsys '), Field(fld2,true), Constant(' using the shared untrusted interface')}" -match("MESSAGE#602:00034:22", "nwparser.payload", "SSH user %{username->} at %{saddr}:%{sport->} has unsuccessfully attempted to log in via SCS to vsys %{fld2->} using the shared untrusted interface", processor_chain([ - dup242, +var part1025 = match("MESSAGE#602:00034:22", "nwparser.payload", "SSH user %{username->} at %{saddr}:%{sport->} has unsuccessfully attempted to log in via SCS to vsys %{fld2->} using the shared untrusted interface", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg611 = msg("00034:22", part1029); +var msg611 = msg("00034:22", part1025); -var part1030 = // "Pattern{Constant('SCS: Unable '), Field(p0,false)}" -match("MESSAGE#603:00034:23/1_0", "nwparser.p0", "SCS: Unable %{p0}"); +var part1026 = match("MESSAGE#603:00034:23/1_0", "nwparser.p0", "SCS: Unable %{p0}"); -var part1031 = // "Pattern{Constant('Unable '), Field(p0,false)}" -match("MESSAGE#603:00034:23/1_1", "nwparser.p0", "Unable %{p0}"); +var part1027 = match("MESSAGE#603:00034:23/1_1", "nwparser.p0", "Unable %{p0}"); var select224 = linear_select([ - part1030, - part1031, + part1026, + part1027, ]); -var part1032 = // "Pattern{Constant('to validate cookie from the SSH client at '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#603:00034:23/2", "nwparser.p0", "to validate cookie from the SSH client at %{saddr}:%{sport}"); +var part1028 = match("MESSAGE#603:00034:23/2", "nwparser.p0", "to validate cookie from the SSH client at %{saddr}:%{sport}"); -var all217 = all_match({ +var all213 = all_match({ processors: [ - dup162, + dup160, select224, - part1032, + part1028, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13772,32 +12427,29 @@ var all217 = all_match({ ]), }); -var msg612 = msg("00034:23", all217); +var msg612 = msg("00034:23", all213); -var part1033 = // "Pattern{Constant('AC '), Field(username,true), Constant(' is advertising URL '), Field(fld2,false)}" -match("MESSAGE#604:00034:24", "nwparser.payload", "AC %{username->} is advertising URL %{fld2}", processor_chain([ - dup242, +var part1029 = match("MESSAGE#604:00034:24", "nwparser.payload", "AC %{username->} is advertising URL %{fld2}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg613 = msg("00034:24", part1033); +var msg613 = msg("00034:24", part1029); -var part1034 = // "Pattern{Constant('Message from AC '), Field(username,false), Constant(': '), Field(fld2,false)}" -match("MESSAGE#605:00034:25", "nwparser.payload", "Message from AC %{username}: %{fld2}", processor_chain([ - dup242, +var part1030 = match("MESSAGE#605:00034:25", "nwparser.payload", "Message from AC %{username}: %{fld2}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg614 = msg("00034:25", part1034); +var msg614 = msg("00034:25", part1030); -var part1035 = // "Pattern{Constant('PPPoE Settings changed'), Field(,false)}" -match("MESSAGE#606:00034:26", "nwparser.payload", "PPPoE Settings changed%{}", processor_chain([ +var part1031 = match("MESSAGE#606:00034:26", "nwparser.payload", "PPPoE Settings changed%{}", processor_chain([ dup1, dup2, dup3, @@ -13805,10 +12457,9 @@ match("MESSAGE#606:00034:26", "nwparser.payload", "PPPoE Settings changed%{}", p dup5, ])); -var msg615 = msg("00034:26", part1035); +var msg615 = msg("00034:26", part1031); -var part1036 = // "Pattern{Constant('PPPoE is '), Field(disposition,true), Constant(' on '), Field(interface,true), Constant(' interface')}" -match("MESSAGE#607:00034:27", "nwparser.payload", "PPPoE is %{disposition->} on %{interface->} interface", processor_chain([ +var part1032 = match("MESSAGE#607:00034:27", "nwparser.payload", "PPPoE is %{disposition->} on %{interface->} interface", processor_chain([ dup1, dup2, dup3, @@ -13816,121 +12467,99 @@ match("MESSAGE#607:00034:27", "nwparser.payload", "PPPoE is %{disposition->} on dup5, ])); -var msg616 = msg("00034:27", part1036); - -var part1037 = // "Pattern{Constant('PPPoE'), Field(p0,false)}" -match("MESSAGE#608:00034:28/0", "nwparser.payload", "PPPoE%{p0}"); +var msg616 = msg("00034:27", part1032); -var part1038 = // "Pattern{Constant('s session closed by AC'), Field(,false)}" -match("MESSAGE#608:00034:28/2", "nwparser.p0", "s session closed by AC%{}"); - -var all218 = all_match({ - processors: [ - part1037, - dup363, - part1038, - ], - on_success: processor_chain([ - dup211, - dup2, - dup3, - dup4, - dup5, - ]), -}); +var part1033 = match("MESSAGE#608:00034:28", "nwparser.payload", "PPPoE%{quote}s session closed by AC", processor_chain([ + dup209, + dup2, + dup3, + dup4, + dup5, +])); -var msg617 = msg("00034:28", all218); +var msg617 = msg("00034:28", part1033); -var part1039 = // "Pattern{Constant('SCS: Disabled for '), Field(username,false), Constant('. Attempted connection '), Field(disposition,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#609:00034:29", "nwparser.payload", "SCS: Disabled for %{username}. Attempted connection %{disposition->} from %{saddr}:%{sport}", processor_chain([ - dup242, +var part1034 = match("MESSAGE#609:00034:29", "nwparser.payload", "SCS: Disabled for %{username}. Attempted connection %{disposition->} from %{saddr}:%{sport}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg618 = msg("00034:29", part1039); +var msg618 = msg("00034:29", part1034); -var part1040 = // "Pattern{Constant('SCS: '), Field(disposition,true), Constant(' to remove PKA key removed.')}" -match("MESSAGE#610:00034:30", "nwparser.payload", "SCS: %{disposition->} to remove PKA key removed.", processor_chain([ - dup242, +var part1035 = match("MESSAGE#610:00034:30", "nwparser.payload", "SCS: %{disposition->} to remove PKA key removed.", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg619 = msg("00034:30", part1040); +var msg619 = msg("00034:30", part1035); -var part1041 = // "Pattern{Constant('SCS: '), Field(disposition,true), Constant(' to retrieve host key')}" -match("MESSAGE#611:00034:31", "nwparser.payload", "SCS: %{disposition->} to retrieve host key", processor_chain([ - dup242, +var part1036 = match("MESSAGE#611:00034:31", "nwparser.payload", "SCS: %{disposition->} to retrieve host key", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg620 = msg("00034:31", part1041); +var msg620 = msg("00034:31", part1036); -var part1042 = // "Pattern{Constant('SCS: '), Field(disposition,true), Constant(' to send identification string to client host at '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('.')}" -match("MESSAGE#612:00034:32", "nwparser.payload", "SCS: %{disposition->} to send identification string to client host at %{saddr}:%{sport}.", processor_chain([ - dup242, +var part1037 = match("MESSAGE#612:00034:32", "nwparser.payload", "SCS: %{disposition->} to send identification string to client host at %{saddr}:%{sport}.", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg621 = msg("00034:32", part1042); +var msg621 = msg("00034:32", part1037); -var part1043 = // "Pattern{Constant('SCS: Max '), Field(fld2,true), Constant(' sessions reached unabel to accept connection : '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#613:00034:33", "nwparser.payload", "SCS: Max %{fld2->} sessions reached unabel to accept connection : %{saddr}:%{sport}", processor_chain([ - dup242, +var part1038 = match("MESSAGE#613:00034:33", "nwparser.payload", "SCS: Max %{fld2->} sessions reached unabel to accept connection : %{saddr}:%{sport}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg622 = msg("00034:33", part1043); +var msg622 = msg("00034:33", part1038); -var part1044 = // "Pattern{Constant('SCS: Maximum number for SCS sessions '), Field(fld2,true), Constant(' has been reached. Connection request from SSH user at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#614:00034:34", "nwparser.payload", "SCS: Maximum number for SCS sessions %{fld2->} has been reached. Connection request from SSH user at %{saddr}:%{sport->} has been %{disposition}.", processor_chain([ - dup242, +var part1039 = match("MESSAGE#614:00034:34", "nwparser.payload", "SCS: Maximum number for SCS sessions %{fld2->} has been reached. Connection request from SSH user at %{saddr}:%{sport->} has been %{disposition}.", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg623 = msg("00034:34", part1044); +var msg623 = msg("00034:34", part1039); -var part1045 = // "Pattern{Constant('SCS: SSH user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has unsuccessfully attempted to log in via SCS to '), Field(service,true), Constant(' using the shared untrusted interface because SCS is disabled on that interface.')}" -match("MESSAGE#615:00034:35", "nwparser.payload", "SCS: SSH user %{username->} at %{saddr}:%{sport->} has unsuccessfully attempted to log in via SCS to %{service->} using the shared untrusted interface because SCS is disabled on that interface.", processor_chain([ - dup242, +var part1040 = match("MESSAGE#615:00034:35", "nwparser.payload", "SCS: SSH user %{username->} at %{saddr}:%{sport->} has unsuccessfully attempted to log in via SCS to %{service->} using the shared untrusted interface because SCS is disabled on that interface.", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg624 = msg("00034:35", part1045); +var msg624 = msg("00034:35", part1040); -var part1046 = // "Pattern{Constant('SCS: Unsupported cipher type '), Field(fld2,true), Constant(' requested from: '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#616:00034:36", "nwparser.payload", "SCS: Unsupported cipher type %{fld2->} requested from: %{saddr}:%{sport}", processor_chain([ - dup242, +var part1041 = match("MESSAGE#616:00034:36", "nwparser.payload", "SCS: Unsupported cipher type %{fld2->} requested from: %{saddr}:%{sport}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg625 = msg("00034:36", part1046); +var msg625 = msg("00034:36", part1041); -var part1047 = // "Pattern{Constant('The Point-to-Point Protocol over Ethernet (PPPoE) protocol settings changed'), Field(,false)}" -match("MESSAGE#617:00034:37", "nwparser.payload", "The Point-to-Point Protocol over Ethernet (PPPoE) protocol settings changed%{}", processor_chain([ +var part1042 = match("MESSAGE#617:00034:37", "nwparser.payload", "The Point-to-Point Protocol over Ethernet (PPPoE) protocol settings changed%{}", processor_chain([ dup1, dup2, dup3, @@ -13938,21 +12567,19 @@ match("MESSAGE#617:00034:37", "nwparser.payload", "The Point-to-Point Protocol o dup5, ])); -var msg626 = msg("00034:37", part1047); +var msg626 = msg("00034:37", part1042); -var part1048 = // "Pattern{Constant('SSH: '), Field(disposition,true), Constant(' to retreive PKA key bound to SSH user '), Field(username,true), Constant(' (Key ID '), Field(fld2,false), Constant(')')}" -match("MESSAGE#618:00034:38", "nwparser.payload", "SSH: %{disposition->} to retreive PKA key bound to SSH user %{username->} (Key ID %{fld2})", processor_chain([ - dup242, +var part1043 = match("MESSAGE#618:00034:38", "nwparser.payload", "SSH: %{disposition->} to retreive PKA key bound to SSH user %{username->} (Key ID %{fld2})", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg627 = msg("00034:38", part1048); +var msg627 = msg("00034:38", part1043); -var part1049 = // "Pattern{Constant('SSH: Error processing packet from host '), Field(saddr,true), Constant(' (Code '), Field(fld2,false), Constant(')')}" -match("MESSAGE#619:00034:39", "nwparser.payload", "SSH: Error processing packet from host %{saddr->} (Code %{fld2})", processor_chain([ +var part1044 = match("MESSAGE#619:00034:39", "nwparser.payload", "SSH: Error processing packet from host %{saddr->} (Code %{fld2})", processor_chain([ dup19, dup2, dup3, @@ -13960,10 +12587,9 @@ match("MESSAGE#619:00034:39", "nwparser.payload", "SSH: Error processing packet dup5, ])); -var msg628 = msg("00034:39", part1049); +var msg628 = msg("00034:39", part1044); -var part1050 = // "Pattern{Constant('SSH: Device failed to send initialization string to client at '), Field(saddr,false)}" -match("MESSAGE#620:00034:40", "nwparser.payload", "SSH: Device failed to send initialization string to client at %{saddr}", processor_chain([ +var part1045 = match("MESSAGE#620:00034:40", "nwparser.payload", "SSH: Device failed to send initialization string to client at %{saddr}", processor_chain([ dup19, dup2, dup3, @@ -13971,22 +12597,20 @@ match("MESSAGE#620:00034:40", "nwparser.payload", "SSH: Device failed to send in dup5, ])); -var msg629 = msg("00034:40", part1050); +var msg629 = msg("00034:40", part1045); -var part1051 = // "Pattern{Constant('SCP: Admin user ''), Field(administrator,false), Constant('' attempted to transfer file '), Field(p0,false)}" -match("MESSAGE#621:00034:41/0", "nwparser.payload", "SCP: Admin user '%{administrator}' attempted to transfer file %{p0}"); +var part1046 = match("MESSAGE#621:00034:41/0", "nwparser.payload", "SCP: Admin user '%{administrator}' attempted to transfer file %{p0}"); -var part1052 = // "Pattern{Constant('the device with insufficient privilege.'), Field(,false)}" -match("MESSAGE#621:00034:41/2", "nwparser.p0", "the device with insufficient privilege.%{}"); +var part1047 = match("MESSAGE#621:00034:41/2", "nwparser.p0", "the device with insufficient privilege.%{}"); -var all219 = all_match({ +var all214 = all_match({ processors: [ - part1051, - dup376, - part1052, + part1046, + dup373, + part1047, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -13994,21 +12618,19 @@ var all219 = all_match({ ]), }); -var msg630 = msg("00034:41", all219); +var msg630 = msg("00034:41", all214); -var part1053 = // "Pattern{Constant('SSH: Maximum number of SSH sessions ('), Field(fld2,false), Constant(') exceeded. Connection request from SSH user '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' denied.')}" -match("MESSAGE#622:00034:42", "nwparser.payload", "SSH: Maximum number of SSH sessions (%{fld2}) exceeded. Connection request from SSH user %{username->} at %{saddr->} denied.", processor_chain([ - dup242, +var part1048 = match("MESSAGE#622:00034:42", "nwparser.payload", "SSH: Maximum number of SSH sessions (%{fld2}) exceeded. Connection request from SSH user %{username->} at %{saddr->} denied.", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg631 = msg("00034:42", part1053); +var msg631 = msg("00034:42", part1048); -var part1054 = // "Pattern{Constant('Ethernet driver ran out of rx bd (port '), Field(network_port,false), Constant(')')}" -match("MESSAGE#623:00034:43", "nwparser.payload", "Ethernet driver ran out of rx bd (port %{network_port})", processor_chain([ +var part1049 = match("MESSAGE#623:00034:43", "nwparser.payload", "Ethernet driver ran out of rx bd (port %{network_port})", processor_chain([ dup19, dup2, dup3, @@ -14016,10 +12638,9 @@ match("MESSAGE#623:00034:43", "nwparser.payload", "Ethernet driver ran out of rx dup5, ])); -var msg632 = msg("00034:43", part1054); +var msg632 = msg("00034:43", part1049); -var part1055 = // "Pattern{Constant('Potential replay attack detected on SSH connection initiated from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1224:00034:44", "nwparser.payload", "Potential replay attack detected on SSH connection initiated from %{saddr}:%{sport->} (%{fld1})", processor_chain([ +var part1050 = match("MESSAGE#1224:00034:44", "nwparser.payload", "Potential replay attack detected on SSH connection initiated from %{saddr}:%{sport->} (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -14027,7 +12648,7 @@ match("MESSAGE#1224:00034:44", "nwparser.payload", "Potential replay attack dete dup9, ])); -var msg633 = msg("00034:44", part1055); +var msg633 = msg("00034:44", part1050); var select225 = linear_select([ msg594, @@ -14072,8 +12693,7 @@ var select225 = linear_select([ msg633, ]); -var part1056 = // "Pattern{Constant('PKI Verify Error: '), Field(resultcode,false), Constant(':'), Field(result,false)}" -match("MESSAGE#624:00035", "nwparser.payload", "PKI Verify Error: %{resultcode}:%{result}", processor_chain([ +var part1051 = match("MESSAGE#624:00035", "nwparser.payload", "PKI Verify Error: %{resultcode}:%{result}", processor_chain([ dup117, dup2, dup3, @@ -14081,10 +12701,9 @@ match("MESSAGE#624:00035", "nwparser.payload", "PKI Verify Error: %{resultcode}: dup5, ])); -var msg634 = msg("00035", part1056); +var msg634 = msg("00035", part1051); -var part1057 = // "Pattern{Constant('SSL - Error MessageID in incoming mail - '), Field(fld2,false)}" -match("MESSAGE#625:00035:01", "nwparser.payload", "SSL - Error MessageID in incoming mail - %{fld2}", processor_chain([ +var part1052 = match("MESSAGE#625:00035:01", "nwparser.payload", "SSL - Error MessageID in incoming mail - %{fld2}", processor_chain([ dup117, dup2, dup3, @@ -14092,10 +12711,9 @@ match("MESSAGE#625:00035:01", "nwparser.payload", "SSL - Error MessageID in inco dup5, ])); -var msg635 = msg("00035:01", part1057); +var msg635 = msg("00035:01", part1052); -var part1058 = // "Pattern{Constant('SSL - cipher type '), Field(fld2,true), Constant(' is not allowed in export or firewall only system')}" -match("MESSAGE#626:00035:02", "nwparser.payload", "SSL - cipher type %{fld2->} is not allowed in export or firewall only system", processor_chain([ +var part1053 = match("MESSAGE#626:00035:02", "nwparser.payload", "SSL - cipher type %{fld2->} is not allowed in export or firewall only system", processor_chain([ dup117, dup2, dup3, @@ -14103,10 +12721,9 @@ match("MESSAGE#626:00035:02", "nwparser.payload", "SSL - cipher type %{fld2->} i dup5, ])); -var msg636 = msg("00035:02", part1058); +var msg636 = msg("00035:02", part1053); -var part1059 = // "Pattern{Constant('SSL CA changed'), Field(,false)}" -match("MESSAGE#627:00035:03", "nwparser.payload", "SSL CA changed%{}", processor_chain([ +var part1054 = match("MESSAGE#627:00035:03", "nwparser.payload", "SSL CA changed%{}", processor_chain([ dup1, dup2, dup3, @@ -14114,34 +12731,29 @@ match("MESSAGE#627:00035:03", "nwparser.payload", "SSL CA changed%{}", processor dup5, ])); -var msg637 = msg("00035:03", part1059); +var msg637 = msg("00035:03", part1054); -var part1060 = // "Pattern{Constant('SSL Error when retrieve local c'), Field(p0,false)}" -match("MESSAGE#628:00035:04/0", "nwparser.payload", "SSL Error when retrieve local c%{p0}"); +var part1055 = match("MESSAGE#628:00035:04/0", "nwparser.payload", "SSL Error when retrieve local c%{p0}"); -var part1061 = // "Pattern{Constant('a(verify) '), Field(p0,false)}" -match("MESSAGE#628:00035:04/1_0", "nwparser.p0", "a(verify) %{p0}"); +var part1056 = match("MESSAGE#628:00035:04/1_0", "nwparser.p0", "a(verify) %{p0}"); -var part1062 = // "Pattern{Constant('ert(verify) '), Field(p0,false)}" -match("MESSAGE#628:00035:04/1_1", "nwparser.p0", "ert(verify) %{p0}"); +var part1057 = match("MESSAGE#628:00035:04/1_1", "nwparser.p0", "ert(verify) %{p0}"); -var part1063 = // "Pattern{Constant('ert(all) '), Field(p0,false)}" -match("MESSAGE#628:00035:04/1_2", "nwparser.p0", "ert(all) %{p0}"); +var part1058 = match("MESSAGE#628:00035:04/1_2", "nwparser.p0", "ert(all) %{p0}"); var select226 = linear_select([ - part1061, - part1062, - part1063, + part1056, + part1057, + part1058, ]); -var part1064 = // "Pattern{Constant(': '), Field(fld2,false)}" -match("MESSAGE#628:00035:04/2", "nwparser.p0", ": %{fld2}"); +var part1059 = match("MESSAGE#628:00035:04/2", "nwparser.p0", ": %{fld2}"); -var all220 = all_match({ +var all215 = all_match({ processors: [ - part1060, + part1055, select226, - part1064, + part1059, ], on_success: processor_chain([ dup117, @@ -14152,10 +12764,9 @@ var all220 = all_match({ ]), }); -var msg638 = msg("00035:04", all220); +var msg638 = msg("00035:04", all215); -var part1065 = // "Pattern{Constant('SSL No ssl context. Not ready for connections.'), Field(,false)}" -match("MESSAGE#629:00035:05", "nwparser.payload", "SSL No ssl context. Not ready for connections.%{}", processor_chain([ +var part1060 = match("MESSAGE#629:00035:05", "nwparser.payload", "SSL No ssl context. Not ready for connections.%{}", processor_chain([ dup117, dup2, dup3, @@ -14163,19 +12774,17 @@ match("MESSAGE#629:00035:05", "nwparser.payload", "SSL No ssl context. Not ready dup5, ])); -var msg639 = msg("00035:05", part1065); +var msg639 = msg("00035:05", part1060); -var part1066 = // "Pattern{Constant('SSL c'), Field(p0,false)}" -match("MESSAGE#630:00035:06/0", "nwparser.payload", "SSL c%{p0}"); +var part1061 = match("MESSAGE#630:00035:06/0", "nwparser.payload", "SSL c%{p0}"); -var part1067 = // "Pattern{Constant('changed to none'), Field(,false)}" -match("MESSAGE#630:00035:06/2", "nwparser.p0", "changed to none%{}"); +var part1062 = match("MESSAGE#630:00035:06/2", "nwparser.p0", "changed to none%{}"); -var all221 = all_match({ +var all216 = all_match({ processors: [ - part1066, - dup391, - part1067, + part1061, + dup388, + part1062, ], on_success: processor_chain([ dup1, @@ -14186,10 +12795,9 @@ var all221 = all_match({ ]), }); -var msg640 = msg("00035:06", all221); +var msg640 = msg("00035:06", all216); -var part1068 = // "Pattern{Constant('SSL cert subject mismatch: '), Field(fld2,true), Constant(' recieved '), Field(fld3,true), Constant(' is expected')}" -match("MESSAGE#631:00035:07", "nwparser.payload", "SSL cert subject mismatch: %{fld2->} recieved %{fld3->} is expected", processor_chain([ +var part1063 = match("MESSAGE#631:00035:07", "nwparser.payload", "SSL cert subject mismatch: %{fld2->} recieved %{fld3->} is expected", processor_chain([ dup19, dup2, dup3, @@ -14197,10 +12805,9 @@ match("MESSAGE#631:00035:07", "nwparser.payload", "SSL cert subject mismatch: %{ dup5, ])); -var msg641 = msg("00035:07", part1068); +var msg641 = msg("00035:07", part1063); -var part1069 = // "Pattern{Constant('SSL certificate changed'), Field(,false)}" -match("MESSAGE#632:00035:08", "nwparser.payload", "SSL certificate changed%{}", processor_chain([ +var part1064 = match("MESSAGE#632:00035:08", "nwparser.payload", "SSL certificate changed%{}", processor_chain([ dup1, dup2, dup3, @@ -14208,19 +12815,18 @@ match("MESSAGE#632:00035:08", "nwparser.payload", "SSL certificate changed%{}", dup5, ])); -var msg642 = msg("00035:08", part1069); +var msg642 = msg("00035:08", part1064); -var part1070 = // "Pattern{Constant('enabled'), Field(,false)}" -match("MESSAGE#633:00035:09/1_0", "nwparser.p0", "enabled%{}"); +var part1065 = match("MESSAGE#633:00035:09/1_0", "nwparser.p0", "enabled%{}"); var select227 = linear_select([ - part1070, + part1065, dup92, ]); -var all222 = all_match({ +var all217 = all_match({ processors: [ - dup255, + dup253, select227, ], on_success: processor_chain([ @@ -14232,29 +12838,26 @@ var all222 = all_match({ ]), }); -var msg643 = msg("00035:09", all222); +var msg643 = msg("00035:09", all217); -var part1071 = // "Pattern{Constant('SSL memory allocation fails in process_c'), Field(p0,false)}" -match("MESSAGE#634:00035:10/0", "nwparser.payload", "SSL memory allocation fails in process_c%{p0}"); +var part1066 = match("MESSAGE#634:00035:10/0", "nwparser.payload", "SSL memory allocation fails in process_c%{p0}"); -var part1072 = // "Pattern{Constant('a()'), Field(,false)}" -match("MESSAGE#634:00035:10/1_0", "nwparser.p0", "a()%{}"); +var part1067 = match("MESSAGE#634:00035:10/1_0", "nwparser.p0", "a()%{}"); -var part1073 = // "Pattern{Constant('ert()'), Field(,false)}" -match("MESSAGE#634:00035:10/1_1", "nwparser.p0", "ert()%{}"); +var part1068 = match("MESSAGE#634:00035:10/1_1", "nwparser.p0", "ert()%{}"); var select228 = linear_select([ - part1072, - part1073, + part1067, + part1068, ]); -var all223 = all_match({ +var all218 = all_match({ processors: [ - part1071, + part1066, select228, ], on_success: processor_chain([ - dup186, + dup184, dup2, dup3, dup4, @@ -14262,25 +12865,22 @@ var all223 = all_match({ ]), }); -var msg644 = msg("00035:10", all223); +var msg644 = msg("00035:10", all218); -var part1074 = // "Pattern{Constant('SSL no ssl c'), Field(p0,false)}" -match("MESSAGE#635:00035:11/0", "nwparser.payload", "SSL no ssl c%{p0}"); +var part1069 = match("MESSAGE#635:00035:11/0", "nwparser.payload", "SSL no ssl c%{p0}"); -var part1075 = // "Pattern{Constant('a'), Field(,false)}" -match("MESSAGE#635:00035:11/1_0", "nwparser.p0", "a%{}"); +var part1070 = match("MESSAGE#635:00035:11/1_0", "nwparser.p0", "a%{}"); -var part1076 = // "Pattern{Constant('ert'), Field(,false)}" -match("MESSAGE#635:00035:11/1_1", "nwparser.p0", "ert%{}"); +var part1071 = match("MESSAGE#635:00035:11/1_1", "nwparser.p0", "ert%{}"); var select229 = linear_select([ - part1075, - part1076, + part1070, + part1071, ]); -var all224 = all_match({ +var all219 = all_match({ processors: [ - part1074, + part1069, select229, ], on_success: processor_chain([ @@ -14292,19 +12892,17 @@ var all224 = all_match({ ]), }); -var msg645 = msg("00035:11", all224); +var msg645 = msg("00035:11", all219); -var part1077 = // "Pattern{Constant('SSL set c'), Field(p0,false)}" -match("MESSAGE#636:00035:12/0", "nwparser.payload", "SSL set c%{p0}"); +var part1072 = match("MESSAGE#636:00035:12/0", "nwparser.payload", "SSL set c%{p0}"); -var part1078 = // "Pattern{Constant('id is invalid '), Field(fld2,false)}" -match("MESSAGE#636:00035:12/2", "nwparser.p0", "id is invalid %{fld2}"); +var part1073 = match("MESSAGE#636:00035:12/2", "nwparser.p0", "id is invalid %{fld2}"); -var all225 = all_match({ +var all220 = all_match({ processors: [ - part1077, - dup391, - part1078, + part1072, + dup388, + part1073, ], on_success: processor_chain([ dup19, @@ -14315,24 +12913,22 @@ var all225 = all_match({ ]), }); -var msg646 = msg("00035:12", all225); +var msg646 = msg("00035:12", all220); -var part1079 = // "Pattern{Constant('verify '), Field(p0,false)}" -match("MESSAGE#637:00035:13/1_1", "nwparser.p0", "verify %{p0}"); +var part1074 = match("MESSAGE#637:00035:13/1_1", "nwparser.p0", "verify %{p0}"); var select230 = linear_select([ dup101, - part1079, + part1074, ]); -var part1080 = // "Pattern{Constant('cert failed. Key type is not RSA'), Field(,false)}" -match("MESSAGE#637:00035:13/2", "nwparser.p0", "cert failed. Key type is not RSA%{}"); +var part1075 = match("MESSAGE#637:00035:13/2", "nwparser.p0", "cert failed. Key type is not RSA%{}"); -var all226 = all_match({ +var all221 = all_match({ processors: [ - dup255, + dup253, select230, - part1080, + part1075, ], on_success: processor_chain([ dup19, @@ -14343,10 +12939,9 @@ var all226 = all_match({ ]), }); -var msg647 = msg("00035:13", all226); +var msg647 = msg("00035:13", all221); -var part1081 = // "Pattern{Constant('SSL ssl context init failed'), Field(,false)}" -match("MESSAGE#638:00035:14", "nwparser.payload", "SSL ssl context init failed%{}", processor_chain([ +var part1076 = match("MESSAGE#638:00035:14", "nwparser.payload", "SSL ssl context init failed%{}", processor_chain([ dup19, dup2, dup3, @@ -14354,29 +12949,26 @@ match("MESSAGE#638:00035:14", "nwparser.payload", "SSL ssl context init failed%{ dup5, ])); -var msg648 = msg("00035:14", part1081); +var msg648 = msg("00035:14", part1076); -var part1082 = // "Pattern{Field(change_attribute,true), Constant(' has been changed '), Field(p0,false)}" -match("MESSAGE#639:00035:15/0", "nwparser.payload", "%{change_attribute->} has been changed %{p0}"); +var part1077 = match("MESSAGE#639:00035:15/0", "nwparser.payload", "%{change_attribute->} has been changed %{p0}"); -var part1083 = // "Pattern{Constant('from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#639:00035:15/1_0", "nwparser.p0", "from %{change_old->} to %{change_new}"); +var part1078 = match("MESSAGE#639:00035:15/1_0", "nwparser.p0", "from %{change_old->} to %{change_new}"); -var part1084 = // "Pattern{Constant('to '), Field(fld2,false)}" -match("MESSAGE#639:00035:15/1_1", "nwparser.p0", "to %{fld2}"); +var part1079 = match("MESSAGE#639:00035:15/1_1", "nwparser.p0", "to %{fld2}"); var select231 = linear_select([ - part1083, - part1084, + part1078, + part1079, ]); -var all227 = all_match({ +var all222 = all_match({ processors: [ - part1082, + part1077, select231, ], on_success: processor_chain([ - dup186, + dup184, dup2, dup3, dup4, @@ -14384,10 +12976,9 @@ var all227 = all_match({ ]), }); -var msg649 = msg("00035:15", all227); +var msg649 = msg("00035:15", all222); -var part1085 = // "Pattern{Constant('web SSL certificate changed to by '), Field(username,true), Constant(' via web from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' '), Field(fld5,false)}" -match("MESSAGE#640:00035:16", "nwparser.payload", "web SSL certificate changed to by %{username->} via web from host %{saddr->} to %{daddr}:%{dport->} %{fld5}", processor_chain([ +var part1080 = match("MESSAGE#640:00035:16", "nwparser.payload", "web SSL certificate changed to by %{username->} via web from host %{saddr->} to %{daddr}:%{dport->} %{fld5}", processor_chain([ dup1, dup2, dup3, @@ -14395,7 +12986,7 @@ match("MESSAGE#640:00035:16", "nwparser.payload", "web SSL certificate changed t dup5, ])); -var msg650 = msg("00035:16", part1085); +var msg650 = msg("00035:16", part1080); var select232 = linear_select([ msg634, @@ -14417,39 +13008,35 @@ var select232 = linear_select([ msg650, ]); -var part1086 = // "Pattern{Constant('An optional ScreenOS feature has been activated via a software key'), Field(,false)}" -match("MESSAGE#641:00036", "nwparser.payload", "An optional ScreenOS feature has been activated via a software key%{}", processor_chain([ - dup211, +var part1081 = match("MESSAGE#641:00036", "nwparser.payload", "An optional ScreenOS feature has been activated via a software key%{}", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg651 = msg("00036", part1086); +var msg651 = msg("00036", part1081); -var part1087 = // "Pattern{Field(fld2,true), Constant(' license keys were updated successfully by '), Field(p0,false)}" -match("MESSAGE#642:00036:01/0", "nwparser.payload", "%{fld2->} license keys were updated successfully by %{p0}"); +var part1082 = match("MESSAGE#642:00036:01/0", "nwparser.payload", "%{fld2->} license keys were updated successfully by %{p0}"); -var part1088 = // "Pattern{Constant('manual '), Field(p0,false)}" -match("MESSAGE#642:00036:01/1_1", "nwparser.p0", "manual %{p0}"); +var part1083 = match("MESSAGE#642:00036:01/1_1", "nwparser.p0", "manual %{p0}"); var select233 = linear_select([ - dup216, - part1088, + dup214, + part1083, ]); -var part1089 = // "Pattern{Constant('retrieval'), Field(,false)}" -match("MESSAGE#642:00036:01/2", "nwparser.p0", "retrieval%{}"); +var part1084 = match("MESSAGE#642:00036:01/2", "nwparser.p0", "retrieval%{}"); -var all228 = all_match({ +var all223 = all_match({ processors: [ - part1087, + part1082, select233, - part1089, + part1084, ], on_success: processor_chain([ - dup256, + dup254, dup2, dup3, dup4, @@ -14457,30 +13044,27 @@ var all228 = all_match({ ]), }); -var msg652 = msg("00036:01", all228); +var msg652 = msg("00036:01", all223); var select234 = linear_select([ msg651, msg652, ]); -var part1090 = // "Pattern{Constant('Intra-zone block for zone '), Field(zone,true), Constant(' was set to o'), Field(p0,false)}" -match("MESSAGE#643:00037/0", "nwparser.payload", "Intra-zone block for zone %{zone->} was set to o%{p0}"); +var part1085 = match("MESSAGE#643:00037/0", "nwparser.payload", "Intra-zone block for zone %{zone->} was set to o%{p0}"); -var part1091 = // "Pattern{Constant('n'), Field(,false)}" -match("MESSAGE#643:00037/1_0", "nwparser.p0", "n%{}"); +var part1086 = match("MESSAGE#643:00037/1_0", "nwparser.p0", "n%{}"); -var part1092 = // "Pattern{Constant('ff'), Field(,false)}" -match("MESSAGE#643:00037/1_1", "nwparser.p0", "ff%{}"); +var part1087 = match("MESSAGE#643:00037/1_1", "nwparser.p0", "ff%{}"); var select235 = linear_select([ - part1091, - part1092, + part1086, + part1087, ]); -var all229 = all_match({ +var all224 = all_match({ processors: [ - part1090, + part1085, select235, ], on_success: processor_chain([ @@ -14492,25 +13076,23 @@ var all229 = all_match({ ]), }); -var msg653 = msg("00037", all229); +var msg653 = msg("00037", all224); -var part1093 = // "Pattern{Constant('New zone '), Field(zone,true), Constant(' ( '), Field(p0,false)}" -match("MESSAGE#644:00037:01/0", "nwparser.payload", "New zone %{zone->} ( %{p0}"); +var part1088 = match("MESSAGE#644:00037:01/0", "nwparser.payload", "New zone %{zone->} ( %{p0}"); var select236 = linear_select([ - dup257, - dup258, + dup255, + dup256, ]); -var part1094 = // "Pattern{Constant(''), Field(fld2,false), Constant(') was created.'), Field(p0,false)}" -match("MESSAGE#644:00037:01/2", "nwparser.p0", "%{fld2}) was created.%{p0}"); +var part1089 = match("MESSAGE#644:00037:01/2", "nwparser.p0", "%{fld2}) was created.%{p0}"); -var all230 = all_match({ +var all225 = all_match({ processors: [ - part1093, + part1088, select236, - part1094, - dup353, + part1089, + dup351, ], on_success: processor_chain([ dup1, @@ -14522,10 +13104,9 @@ var all230 = all_match({ ]), }); -var msg654 = msg("00037:01", all230); +var msg654 = msg("00037:01", all225); -var part1095 = // "Pattern{Constant('Tunnel zone '), Field(src_zone,true), Constant(' was bound to out zone '), Field(dst_zone,false), Constant('.')}" -match("MESSAGE#645:00037:02", "nwparser.payload", "Tunnel zone %{src_zone->} was bound to out zone %{dst_zone}.", processor_chain([ +var part1090 = match("MESSAGE#645:00037:02", "nwparser.payload", "Tunnel zone %{src_zone->} was bound to out zone %{dst_zone}.", processor_chain([ dup1, dup2, dup3, @@ -14533,39 +13114,34 @@ match("MESSAGE#645:00037:02", "nwparser.payload", "Tunnel zone %{src_zone->} was dup5, ])); -var msg655 = msg("00037:02", part1095); +var msg655 = msg("00037:02", part1090); -var part1096 = // "Pattern{Constant('was was '), Field(p0,false)}" -match("MESSAGE#646:00037:03/1_0", "nwparser.p0", "was was %{p0}"); +var part1091 = match("MESSAGE#646:00037:03/1_0", "nwparser.p0", "was was %{p0}"); -var part1097 = // "Pattern{Field(zone,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#646:00037:03/1_1", "nwparser.p0", "%{zone->} was %{p0}"); +var part1092 = match("MESSAGE#646:00037:03/1_1", "nwparser.p0", "%{zone->} was %{p0}"); var select237 = linear_select([ - part1096, - part1097, + part1091, + part1092, ]); -var part1098 = // "Pattern{Constant('virtual router '), Field(p0,false)}" -match("MESSAGE#646:00037:03/3", "nwparser.p0", "virtual router %{p0}"); +var part1093 = match("MESSAGE#646:00037:03/3", "nwparser.p0", "virtual router %{p0}"); -var part1099 = // "Pattern{Field(node,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#646:00037:03/4_0", "nwparser.p0", "%{node->} (%{fld1})"); +var part1094 = match("MESSAGE#646:00037:03/4_0", "nwparser.p0", "%{node->} (%{fld1})"); -var part1100 = // "Pattern{Field(node,false), Constant('.')}" -match("MESSAGE#646:00037:03/4_1", "nwparser.p0", "%{node}."); +var part1095 = match("MESSAGE#646:00037:03/4_1", "nwparser.p0", "%{node}."); var select238 = linear_select([ - part1099, - part1100, + part1094, + part1095, ]); -var all231 = all_match({ +var all226 = all_match({ processors: [ dup113, select237, - dup374, - part1098, + dup371, + part1093, select238, ], on_success: processor_chain([ @@ -14578,10 +13154,9 @@ var all231 = all_match({ ]), }); -var msg656 = msg("00037:03", all231); +var msg656 = msg("00037:03", all226); -var part1101 = // "Pattern{Constant('Zone '), Field(zone,true), Constant(' was changed to non-shared.')}" -match("MESSAGE#647:00037:04", "nwparser.payload", "Zone %{zone->} was changed to non-shared.", processor_chain([ +var part1096 = match("MESSAGE#647:00037:04", "nwparser.payload", "Zone %{zone->} was changed to non-shared.", processor_chain([ dup1, dup2, dup3, @@ -14589,32 +13164,29 @@ match("MESSAGE#647:00037:04", "nwparser.payload", "Zone %{zone->} was changed to dup5, ])); -var msg657 = msg("00037:04", part1101); +var msg657 = msg("00037:04", part1096); -var part1102 = // "Pattern{Constant('Zone '), Field(zone,true), Constant(' ( '), Field(p0,false)}" -match("MESSAGE#648:00037:05/0", "nwparser.payload", "Zone %{zone->} ( %{p0}"); +var part1097 = match("MESSAGE#648:00037:05/0", "nwparser.payload", "Zone %{zone->} ( %{p0}"); var select239 = linear_select([ - dup258, - dup257, + dup256, + dup255, ]); -var part1103 = // "Pattern{Constant(''), Field(fld2,false), Constant(') was deleted. '), Field(p0,false)}" -match("MESSAGE#648:00037:05/2", "nwparser.p0", "%{fld2}) was deleted. %{p0}"); +var part1098 = match("MESSAGE#648:00037:05/2", "nwparser.p0", "%{fld2}) was deleted. %{p0}"); -var part1104 = // "Pattern{Field(space,false)}" -match_copy("MESSAGE#648:00037:05/3_1", "nwparser.p0", "space"); +var part1099 = match_copy("MESSAGE#648:00037:05/3_1", "nwparser.p0", "space"); var select240 = linear_select([ dup10, - part1104, + part1099, ]); -var all232 = all_match({ +var all227 = all_match({ processors: [ - part1102, + part1097, select239, - part1103, + part1098, select240, ], on_success: processor_chain([ @@ -14627,10 +13199,9 @@ var all232 = all_match({ ]), }); -var msg658 = msg("00037:05", all232); +var msg658 = msg("00037:05", all227); -var part1105 = // "Pattern{Constant('IP/TCP reassembly for ALG was '), Field(disposition,true), Constant(' on zone '), Field(zone,false), Constant('.')}" -match("MESSAGE#649:00037:06", "nwparser.payload", "IP/TCP reassembly for ALG was %{disposition->} on zone %{zone}.", processor_chain([ +var part1100 = match("MESSAGE#649:00037:06", "nwparser.payload", "IP/TCP reassembly for ALG was %{disposition->} on zone %{zone}.", processor_chain([ dup1, dup2, dup3, @@ -14638,7 +13209,7 @@ match("MESSAGE#649:00037:06", "nwparser.payload", "IP/TCP reassembly for ALG was dup5, ])); -var msg659 = msg("00037:06", part1105); +var msg659 = msg("00037:06", part1100); var select241 = linear_select([ msg653, @@ -14650,23 +13221,20 @@ var select241 = linear_select([ msg659, ]); -var part1106 = // "Pattern{Constant('OSPF routing instance in vrouter '), Field(p0,false)}" -match("MESSAGE#650:00038/0", "nwparser.payload", "OSPF routing instance in vrouter %{p0}"); +var part1101 = match("MESSAGE#650:00038/0", "nwparser.payload", "OSPF routing instance in vrouter %{p0}"); -var part1107 = // "Pattern{Field(node,true), Constant(' is '), Field(p0,false)}" -match("MESSAGE#650:00038/1_0", "nwparser.p0", "%{node->} is %{p0}"); +var part1102 = match("MESSAGE#650:00038/1_0", "nwparser.p0", "%{node->} is %{p0}"); -var part1108 = // "Pattern{Field(node,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#650:00038/1_1", "nwparser.p0", "%{node->} %{p0}"); +var part1103 = match("MESSAGE#650:00038/1_1", "nwparser.p0", "%{node->} %{p0}"); var select242 = linear_select([ - part1107, - part1108, + part1102, + part1103, ]); -var all233 = all_match({ +var all228 = all_match({ processors: [ - part1106, + part1101, select242, dup36, ], @@ -14679,10 +13247,9 @@ var all233 = all_match({ ]), }); -var msg660 = msg("00038", all233); +var msg660 = msg("00038", all228); -var part1109 = // "Pattern{Constant('BGP instance name created for vr '), Field(node,false)}" -match("MESSAGE#651:00039", "nwparser.payload", "BGP instance name created for vr %{node}", processor_chain([ +var part1104 = match("MESSAGE#651:00039", "nwparser.payload", "BGP instance name created for vr %{node}", processor_chain([ dup1, dup2, dup3, @@ -14690,26 +13257,23 @@ match("MESSAGE#651:00039", "nwparser.payload", "BGP instance name created for vr dup5, ])); -var msg661 = msg("00039", part1109); +var msg661 = msg("00039", part1104); -var part1110 = // "Pattern{Constant('Low watermark'), Field(p0,false)}" -match("MESSAGE#652:00040/0_0", "nwparser.payload", "Low watermark%{p0}"); +var part1105 = match("MESSAGE#652:00040/0_0", "nwparser.payload", "Low watermark%{p0}"); -var part1111 = // "Pattern{Constant('High watermark'), Field(p0,false)}" -match("MESSAGE#652:00040/0_1", "nwparser.payload", "High watermark%{p0}"); +var part1106 = match("MESSAGE#652:00040/0_1", "nwparser.payload", "High watermark%{p0}"); var select243 = linear_select([ - part1110, - part1111, + part1105, + part1106, ]); -var part1112 = // "Pattern{Field(,false), Constant('for early aging has been changed to the default '), Field(fld2,false)}" -match("MESSAGE#652:00040/1", "nwparser.p0", "%{}for early aging has been changed to the default %{fld2}"); +var part1107 = match("MESSAGE#652:00040/1", "nwparser.p0", "%{}for early aging has been changed to the default %{fld2}"); -var all234 = all_match({ +var all229 = all_match({ processors: [ select243, - part1112, + part1107, ], on_success: processor_chain([ dup1, @@ -14720,10 +13284,9 @@ var all234 = all_match({ ]), }); -var msg662 = msg("00040", all234); +var msg662 = msg("00040", all229); -var part1113 = // "Pattern{Constant('VPN ''), Field(group,false), Constant('' from '), Field(daddr,true), Constant(' is '), Field(disposition,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#653:00040:01", "nwparser.payload", "VPN '%{group}' from %{daddr->} is %{disposition->} (%{fld1})", processor_chain([ +var part1108 = match("MESSAGE#653:00040:01", "nwparser.payload", "VPN '%{group}' from %{daddr->} is %{disposition->} (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -14732,15 +13295,14 @@ match("MESSAGE#653:00040:01", "nwparser.payload", "VPN '%{group}' from %{daddr-> dup5, ])); -var msg663 = msg("00040:01", part1113); +var msg663 = msg("00040:01", part1108); var select244 = linear_select([ msg662, msg663, ]); -var part1114 = // "Pattern{Constant('A route-map name in virtual router '), Field(node,true), Constant(' has been removed')}" -match("MESSAGE#654:00041", "nwparser.payload", "A route-map name in virtual router %{node->} has been removed", processor_chain([ +var part1109 = match("MESSAGE#654:00041", "nwparser.payload", "A route-map name in virtual router %{node->} has been removed", processor_chain([ dup1, dup2, dup3, @@ -14748,10 +13310,9 @@ match("MESSAGE#654:00041", "nwparser.payload", "A route-map name in virtual rout dup5, ])); -var msg664 = msg("00041", part1114); +var msg664 = msg("00041", part1109); -var part1115 = // "Pattern{Constant('VPN ''), Field(group,false), Constant('' from '), Field(daddr,true), Constant(' is '), Field(disposition,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#655:00041:01", "nwparser.payload", "VPN '%{group}' from %{daddr->} is %{disposition->} (%{fld1})", processor_chain([ +var part1110 = match("MESSAGE#655:00041:01", "nwparser.payload", "VPN '%{group}' from %{daddr->} is %{disposition->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -14760,15 +13321,14 @@ match("MESSAGE#655:00041:01", "nwparser.payload", "VPN '%{group}' from %{daddr-> dup5, ])); -var msg665 = msg("00041:01", part1115); +var msg665 = msg("00041:01", part1110); var select245 = linear_select([ msg664, msg665, ]); -var part1116 = // "Pattern{Constant('Replay packet detected on IPSec tunnel on '), Field(interface,true), Constant(' with tunnel ID '), Field(fld2,false), Constant('! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,false), Constant(', '), Field(info,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#656:00042", "nwparser.payload", "Replay packet detected on IPSec tunnel on %{interface->} with tunnel ID %{fld2}! From %{saddr->} to %{daddr}/%{dport}, %{info->} (%{fld1})", processor_chain([ +var part1111 = match("MESSAGE#656:00042", "nwparser.payload", "Replay packet detected on IPSec tunnel on %{interface->} with tunnel ID %{fld2}! From %{saddr->} to %{daddr}/%{dport}, %{info->} (%{fld1})", processor_chain([ dup58, dup2, dup3, @@ -14777,10 +13337,9 @@ match("MESSAGE#656:00042", "nwparser.payload", "Replay packet detected on IPSec dup5, ])); -var msg666 = msg("00042", part1116); +var msg666 = msg("00042", part1111); -var part1117 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.The attack occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#657:00042:01", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1112 = match("MESSAGE#657:00042:01", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup3, @@ -14791,15 +13350,14 @@ match("MESSAGE#657:00042:01", "nwparser.payload", "%{signame->} From %{saddr->} dup60, ])); -var msg667 = msg("00042:01", part1117); +var msg667 = msg("00042:01", part1112); var select246 = linear_select([ msg666, msg667, ]); -var part1118 = // "Pattern{Constant('Receive StopCCN_msg, remove l2tp tunnel ('), Field(fld2,false), Constant('-'), Field(fld3,false), Constant('), Result code '), Field(resultcode,true), Constant(' ('), Field(result,false), Constant('). ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#658:00043", "nwparser.payload", "Receive StopCCN_msg, remove l2tp tunnel (%{fld2}-%{fld3}), Result code %{resultcode->} (%{result}). (%{fld1})", processor_chain([ +var part1113 = match("MESSAGE#658:00043", "nwparser.payload", "Receive StopCCN_msg, remove l2tp tunnel (%{fld2}-%{fld3}), Result code %{resultcode->} (%{result}). (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -14808,27 +13366,24 @@ match("MESSAGE#658:00043", "nwparser.payload", "Receive StopCCN_msg, remove l2tp dup5, ])); -var msg668 = msg("00043", part1118); +var msg668 = msg("00043", part1113); -var part1119 = // "Pattern{Constant('access list '), Field(listnum,true), Constant(' sequence number '), Field(fld3,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#659:00044/0", "nwparser.payload", "access list %{listnum->} sequence number %{fld3->} %{p0}"); +var part1114 = match("MESSAGE#659:00044/0", "nwparser.payload", "access list %{listnum->} sequence number %{fld3->} %{p0}"); -var part1120 = // "Pattern{Constant('deny '), Field(p0,false)}" -match("MESSAGE#659:00044/1_1", "nwparser.p0", "deny %{p0}"); +var part1115 = match("MESSAGE#659:00044/1_1", "nwparser.p0", "deny %{p0}"); var select247 = linear_select([ - dup259, - part1120, + dup257, + part1115, ]); -var part1121 = // "Pattern{Constant('ip '), Field(hostip,false), Constant('/'), Field(mask,true), Constant(' '), Field(disposition,true), Constant(' in vrouter '), Field(node,false)}" -match("MESSAGE#659:00044/2", "nwparser.p0", "ip %{hostip}/%{mask->} %{disposition->} in vrouter %{node}"); +var part1116 = match("MESSAGE#659:00044/2", "nwparser.p0", "ip %{hostip}/%{mask->} %{disposition->} in vrouter %{node}"); -var all235 = all_match({ +var all230 = all_match({ processors: [ - part1119, + part1114, select247, - part1121, + part1116, ], on_success: processor_chain([ dup1, @@ -14839,10 +13394,9 @@ var all235 = all_match({ ]), }); -var msg669 = msg("00044", all235); +var msg669 = msg("00044", all230); -var part1122 = // "Pattern{Constant('access list '), Field(listnum,true), Constant(' '), Field(disposition,true), Constant(' in vrouter '), Field(node,false), Constant('.')}" -match("MESSAGE#660:00044:01", "nwparser.payload", "access list %{listnum->} %{disposition->} in vrouter %{node}.", processor_chain([ +var part1117 = match("MESSAGE#660:00044:01", "nwparser.payload", "access list %{listnum->} %{disposition->} in vrouter %{node}.", processor_chain([ dup1, dup2, dup3, @@ -14850,15 +13404,14 @@ match("MESSAGE#660:00044:01", "nwparser.payload", "access list %{listnum->} %{di dup5, ])); -var msg670 = msg("00044:01", part1122); +var msg670 = msg("00044:01", part1117); var select248 = linear_select([ msg669, msg670, ]); -var part1123 = // "Pattern{Constant('RIP instance in virtual router '), Field(node,true), Constant(' was '), Field(disposition,false), Constant('.')}" -match("MESSAGE#661:00045", "nwparser.payload", "RIP instance in virtual router %{node->} was %{disposition}.", processor_chain([ +var part1118 = match("MESSAGE#661:00045", "nwparser.payload", "RIP instance in virtual router %{node->} was %{disposition}.", processor_chain([ dup1, dup2, dup3, @@ -14866,27 +13419,24 @@ match("MESSAGE#661:00045", "nwparser.payload", "RIP instance in virtual router % dup5, ])); -var msg671 = msg("00045", part1123); +var msg671 = msg("00045", part1118); -var part1124 = // "Pattern{Constant('remove '), Field(p0,false)}" -match("MESSAGE#662:00047/1_0", "nwparser.p0", "remove %{p0}"); +var part1119 = match("MESSAGE#662:00047/1_0", "nwparser.p0", "remove %{p0}"); -var part1125 = // "Pattern{Constant('add '), Field(p0,false)}" -match("MESSAGE#662:00047/1_1", "nwparser.p0", "add %{p0}"); +var part1120 = match("MESSAGE#662:00047/1_1", "nwparser.p0", "add %{p0}"); var select249 = linear_select([ - part1124, - part1125, + part1119, + part1120, ]); -var part1126 = // "Pattern{Constant('multicast policy from '), Field(src_zone,true), Constant(' '), Field(fld4,true), Constant(' to '), Field(dst_zone,true), Constant(' '), Field(fld3,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#662:00047/2", "nwparser.p0", "multicast policy from %{src_zone->} %{fld4->} to %{dst_zone->} %{fld3->} (%{fld1})"); +var part1121 = match("MESSAGE#662:00047/2", "nwparser.p0", "multicast policy from %{src_zone->} %{fld4->} to %{dst_zone->} %{fld3->} (%{fld1})"); -var all236 = all_match({ +var all231 = all_match({ processors: [ - dup185, + dup183, select249, - part1126, + part1121, ], on_success: processor_chain([ dup1, @@ -14898,79 +13448,68 @@ var all236 = all_match({ ]), }); -var msg672 = msg("00047", all236); +var msg672 = msg("00047", all231); -var part1127 = // "Pattern{Constant('Access list entry '), Field(listnum,true), Constant(' with '), Field(p0,false)}" -match("MESSAGE#663:00048/0", "nwparser.payload", "Access list entry %{listnum->} with %{p0}"); +var part1122 = match("MESSAGE#663:00048/0", "nwparser.payload", "Access list entry %{listnum->} with %{p0}"); -var part1128 = // "Pattern{Constant('a sequence '), Field(p0,false)}" -match("MESSAGE#663:00048/1_0", "nwparser.p0", "a sequence %{p0}"); +var part1123 = match("MESSAGE#663:00048/1_0", "nwparser.p0", "a sequence %{p0}"); -var part1129 = // "Pattern{Constant('sequence '), Field(p0,false)}" -match("MESSAGE#663:00048/1_1", "nwparser.p0", "sequence %{p0}"); +var part1124 = match("MESSAGE#663:00048/1_1", "nwparser.p0", "sequence %{p0}"); var select250 = linear_select([ - part1128, - part1129, + part1123, + part1124, ]); -var part1130 = // "Pattern{Constant('number '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#663:00048/2", "nwparser.p0", "number %{fld2->} %{p0}"); +var part1125 = match("MESSAGE#663:00048/2", "nwparser.p0", "number %{fld2->} %{p0}"); -var part1131 = // "Pattern{Constant('with an action of '), Field(p0,false)}" -match("MESSAGE#663:00048/3_0", "nwparser.p0", "with an action of %{p0}"); +var part1126 = match("MESSAGE#663:00048/3_0", "nwparser.p0", "with an action of %{p0}"); var select251 = linear_select([ - part1131, + part1126, dup112, ]); -var part1132 = // "Pattern{Constant('with an IP '), Field(p0,false)}" -match("MESSAGE#663:00048/5_0", "nwparser.p0", "with an IP %{p0}"); +var part1127 = match("MESSAGE#663:00048/5_0", "nwparser.p0", "with an IP %{p0}"); var select252 = linear_select([ - part1132, + part1127, dup139, ]); -var part1133 = // "Pattern{Constant('address '), Field(p0,false)}" -match("MESSAGE#663:00048/6", "nwparser.p0", "address %{p0}"); +var part1128 = match("MESSAGE#663:00048/6", "nwparser.p0", "address %{p0}"); -var part1134 = // "Pattern{Constant('and subnetwork mask of '), Field(p0,false)}" -match("MESSAGE#663:00048/7_0", "nwparser.p0", "and subnetwork mask of %{p0}"); +var part1129 = match("MESSAGE#663:00048/7_0", "nwparser.p0", "and subnetwork mask of %{p0}"); var select253 = linear_select([ - part1134, + part1129, dup16, ]); -var part1135 = // "Pattern{Field(,true), Constant(' '), Field(fld3,false), Constant('was '), Field(p0,false)}" -match("MESSAGE#663:00048/8", "nwparser.p0", "%{} %{fld3}was %{p0}"); +var part1130 = match("MESSAGE#663:00048/8", "nwparser.p0", "%{} %{fld3}was %{p0}"); -var part1136 = // "Pattern{Constant('created on '), Field(p0,false)}" -match("MESSAGE#663:00048/9_0", "nwparser.p0", "created on %{p0}"); +var part1131 = match("MESSAGE#663:00048/9_0", "nwparser.p0", "created on %{p0}"); var select254 = linear_select([ - part1136, + part1131, dup129, ]); -var part1137 = // "Pattern{Constant('virtual router '), Field(node,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#663:00048/10", "nwparser.p0", "virtual router %{node->} (%{fld1})"); +var part1132 = match("MESSAGE#663:00048/10", "nwparser.p0", "virtual router %{node->} (%{fld1})"); -var all237 = all_match({ +var all232 = all_match({ processors: [ - part1127, + part1122, select250, - part1130, + part1125, select251, - dup259, + dup257, select252, - part1133, + part1128, select253, - part1135, + part1130, select254, - part1137, + part1132, ], on_success: processor_chain([ setc("eventcategory","1501000000"), @@ -14982,43 +13521,37 @@ var all237 = all_match({ ]), }); -var msg673 = msg("00048", all237); +var msg673 = msg("00048", all232); -var part1138 = // "Pattern{Constant('Route '), Field(p0,false)}" -match("MESSAGE#664:00048:01/0", "nwparser.payload", "Route %{p0}"); +var part1133 = match("MESSAGE#664:00048:01/0", "nwparser.payload", "Route %{p0}"); -var part1139 = // "Pattern{Constant('map entry '), Field(p0,false)}" -match("MESSAGE#664:00048:01/1_0", "nwparser.p0", "map entry %{p0}"); +var part1134 = match("MESSAGE#664:00048:01/1_0", "nwparser.p0", "map entry %{p0}"); -var part1140 = // "Pattern{Constant('entry '), Field(p0,false)}" -match("MESSAGE#664:00048:01/1_1", "nwparser.p0", "entry %{p0}"); +var part1135 = match("MESSAGE#664:00048:01/1_1", "nwparser.p0", "entry %{p0}"); var select255 = linear_select([ - part1139, - part1140, + part1134, + part1135, ]); -var part1141 = // "Pattern{Constant('with sequence number '), Field(fld2,true), Constant(' in route map binck-ospf'), Field(p0,false)}" -match("MESSAGE#664:00048:01/2", "nwparser.p0", "with sequence number %{fld2->} in route map binck-ospf%{p0}"); +var part1136 = match("MESSAGE#664:00048:01/2", "nwparser.p0", "with sequence number %{fld2->} in route map binck-ospf%{p0}"); -var part1142 = // "Pattern{Constant(' in '), Field(p0,false)}" -match("MESSAGE#664:00048:01/3_0", "nwparser.p0", " in %{p0}"); +var part1137 = match("MESSAGE#664:00048:01/3_0", "nwparser.p0", " in %{p0}"); var select256 = linear_select([ - part1142, + part1137, dup105, ]); -var part1143 = // "Pattern{Constant('virtual router '), Field(node,true), Constant(' was '), Field(disposition,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#664:00048:01/4", "nwparser.p0", "virtual router %{node->} was %{disposition->} (%{fld1})"); +var part1138 = match("MESSAGE#664:00048:01/4", "nwparser.p0", "virtual router %{node->} was %{disposition->} (%{fld1})"); -var all238 = all_match({ +var all233 = all_match({ processors: [ - part1138, + part1133, select255, - part1141, + part1136, select256, - part1143, + part1138, ], on_success: processor_chain([ dup1, @@ -15030,11 +13563,10 @@ var all238 = all_match({ ]), }); -var msg674 = msg("00048:01", all238); +var msg674 = msg("00048:01", all233); -var part1144 = // "Pattern{Field(space,false), Constant('set match interface '), Field(interface,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#665:00048:02", "nwparser.payload", "%{space}set match interface %{interface->} (%{fld1})", processor_chain([ - dup211, +var part1139 = match("MESSAGE#665:00048:02", "nwparser.payload", "%{space}set match interface %{interface->} (%{fld1})", processor_chain([ + dup209, dup2, dup3, dup9, @@ -15042,7 +13574,7 @@ match("MESSAGE#665:00048:02", "nwparser.payload", "%{space}set match interface % dup5, ])); -var msg675 = msg("00048:02", part1144); +var msg675 = msg("00048:02", part1139); var select257 = linear_select([ msg673, @@ -15050,8 +13582,7 @@ var select257 = linear_select([ msg675, ]); -var part1145 = // "Pattern{Constant('Route-lookup preference changed to '), Field(fld8,true), Constant(' ('), Field(fld2,false), Constant(') => '), Field(fld3,true), Constant(' ('), Field(fld4,false), Constant(') => '), Field(fld5,true), Constant(' ('), Field(fld6,false), Constant(') in virtual router ('), Field(node,false), Constant(')')}" -match("MESSAGE#666:00049", "nwparser.payload", "Route-lookup preference changed to %{fld8->} (%{fld2}) => %{fld3->} (%{fld4}) => %{fld5->} (%{fld6}) in virtual router (%{node})", processor_chain([ +var part1140 = match("MESSAGE#666:00049", "nwparser.payload", "Route-lookup preference changed to %{fld8->} (%{fld2}) => %{fld3->} (%{fld4}) => %{fld5->} (%{fld6}) in virtual router (%{node})", processor_chain([ dup1, dup2, dup3, @@ -15059,10 +13590,9 @@ match("MESSAGE#666:00049", "nwparser.payload", "Route-lookup preference changed dup5, ])); -var msg676 = msg("00049", part1145); +var msg676 = msg("00049", part1140); -var part1146 = // "Pattern{Constant('SIBR routing '), Field(disposition,true), Constant(' in virtual router '), Field(node,false)}" -match("MESSAGE#667:00049:01", "nwparser.payload", "SIBR routing %{disposition->} in virtual router %{node}", processor_chain([ +var part1141 = match("MESSAGE#667:00049:01", "nwparser.payload", "SIBR routing %{disposition->} in virtual router %{node}", processor_chain([ dup1, dup2, dup3, @@ -15070,10 +13600,9 @@ match("MESSAGE#667:00049:01", "nwparser.payload", "SIBR routing %{disposition->} dup5, ])); -var msg677 = msg("00049:01", part1146); +var msg677 = msg("00049:01", part1141); -var part1147 = // "Pattern{Constant('A virtual router with name '), Field(node,true), Constant(' and ID '), Field(fld2,true), Constant(' has been removed')}" -match("MESSAGE#668:00049:02", "nwparser.payload", "A virtual router with name %{node->} and ID %{fld2->} has been removed", processor_chain([ +var part1142 = match("MESSAGE#668:00049:02", "nwparser.payload", "A virtual router with name %{node->} and ID %{fld2->} has been removed", processor_chain([ dup1, dup2, dup3, @@ -15081,10 +13610,9 @@ match("MESSAGE#668:00049:02", "nwparser.payload", "A virtual router with name %{ dup5, ])); -var msg678 = msg("00049:02", part1147); +var msg678 = msg("00049:02", part1142); -var part1148 = // "Pattern{Constant('The router-id of virtual router "'), Field(node,false), Constant('" used by OSPF, BGP routing instances id has been uninitialized. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#669:00049:03", "nwparser.payload", "The router-id of virtual router \"%{node}\" used by OSPF, BGP routing instances id has been uninitialized. (%{fld1})", processor_chain([ +var part1143 = match("MESSAGE#669:00049:03", "nwparser.payload", "The router-id of virtual router \"%{node}\" used by OSPF, BGP routing instances id has been uninitialized. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -15092,10 +13620,9 @@ match("MESSAGE#669:00049:03", "nwparser.payload", "The router-id of virtual rout dup5, ])); -var msg679 = msg("00049:03", part1148); +var msg679 = msg("00049:03", part1143); -var part1149 = // "Pattern{Constant('The system default-route through virtual router "'), Field(node,false), Constant('" has been added in virtual router "'), Field(fld4,false), Constant('" ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#670:00049:04", "nwparser.payload", "The system default-route through virtual router \"%{node}\" has been added in virtual router \"%{fld4}\" (%{fld1})", processor_chain([ +var part1144 = match("MESSAGE#670:00049:04", "nwparser.payload", "The system default-route through virtual router \"%{node}\" has been added in virtual router \"%{fld4}\" (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -15103,10 +13630,9 @@ match("MESSAGE#670:00049:04", "nwparser.payload", "The system default-route thro dup5, ])); -var msg680 = msg("00049:04", part1149); +var msg680 = msg("00049:04", part1144); -var part1150 = // "Pattern{Constant('Subnetwork conflict checking for interfaces in virtual router ('), Field(node,false), Constant(') has been enabled. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#671:00049:05", "nwparser.payload", "Subnetwork conflict checking for interfaces in virtual router (%{node}) has been enabled. (%{fld1})", processor_chain([ +var part1145 = match("MESSAGE#671:00049:05", "nwparser.payload", "Subnetwork conflict checking for interfaces in virtual router (%{node}) has been enabled. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -15114,7 +13640,7 @@ match("MESSAGE#671:00049:05", "nwparser.payload", "Subnetwork conflict checking dup5, ])); -var msg681 = msg("00049:05", part1150); +var msg681 = msg("00049:05", part1145); var select258 = linear_select([ msg676, @@ -15125,8 +13651,7 @@ var select258 = linear_select([ msg681, ]); -var part1151 = // "Pattern{Constant('Track IP enabled ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#672:00050", "nwparser.payload", "Track IP enabled (%{fld1})", processor_chain([ +var part1146 = match("MESSAGE#672:00050", "nwparser.payload", "Track IP enabled (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -15135,10 +13660,9 @@ match("MESSAGE#672:00050", "nwparser.payload", "Track IP enabled (%{fld1})", pro dup5, ])); -var msg682 = msg("00050", part1151); +var msg682 = msg("00050", part1146); -var part1152 = // "Pattern{Constant('Session utilization has reached '), Field(fld2,false), Constant(', which is '), Field(fld3,true), Constant(' of the system capacity!')}" -match("MESSAGE#673:00051", "nwparser.payload", "Session utilization has reached %{fld2}, which is %{fld3->} of the system capacity!", processor_chain([ +var part1147 = match("MESSAGE#673:00051", "nwparser.payload", "Session utilization has reached %{fld2}, which is %{fld3->} of the system capacity!", processor_chain([ dup117, dup2, dup3, @@ -15146,10 +13670,9 @@ match("MESSAGE#673:00051", "nwparser.payload", "Session utilization has reached dup5, ])); -var msg683 = msg("00051", part1152); +var msg683 = msg("00051", part1147); -var part1153 = // "Pattern{Constant('AV: Suspicious client '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('->'), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' used '), Field(fld2,true), Constant(' percent of AV resources, which exceeded the max of '), Field(fld3,true), Constant(' percent.')}" -match("MESSAGE#674:00052", "nwparser.payload", "AV: Suspicious client %{saddr}:%{sport}->%{daddr}:%{dport->} used %{fld2->} percent of AV resources, which exceeded the max of %{fld3->} percent.", processor_chain([ +var part1148 = match("MESSAGE#674:00052", "nwparser.payload", "AV: Suspicious client %{saddr}:%{sport}->%{daddr}:%{dport->} used %{fld2->} percent of AV resources, which exceeded the max of %{fld3->} percent.", processor_chain([ dup117, dup2, dup3, @@ -15157,24 +13680,22 @@ match("MESSAGE#674:00052", "nwparser.payload", "AV: Suspicious client %{saddr}:% dup5, ])); -var msg684 = msg("00052", part1153); +var msg684 = msg("00052", part1148); -var part1154 = // "Pattern{Constant('router '), Field(p0,false)}" -match("MESSAGE#675:00055/1_1", "nwparser.p0", "router %{p0}"); +var part1149 = match("MESSAGE#675:00055/1_1", "nwparser.p0", "router %{p0}"); var select259 = linear_select([ - dup171, - part1154, + dup169, + part1149, ]); -var part1155 = // "Pattern{Constant('instance was '), Field(disposition,true), Constant(' on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#675:00055/2", "nwparser.p0", "instance was %{disposition->} on interface %{interface}."); +var part1150 = match("MESSAGE#675:00055/2", "nwparser.p0", "instance was %{disposition->} on interface %{interface}."); -var all239 = all_match({ +var all234 = all_match({ processors: [ - dup260, + dup258, select259, - part1155, + part1150, ], on_success: processor_chain([ dup1, @@ -15185,27 +13706,24 @@ var all239 = all_match({ ]), }); -var msg685 = msg("00055", all239); +var msg685 = msg("00055", all234); -var part1156 = // "Pattern{Constant('proxy '), Field(p0,false)}" -match("MESSAGE#676:00055:01/1_0", "nwparser.p0", "proxy %{p0}"); +var part1151 = match("MESSAGE#676:00055:01/1_0", "nwparser.p0", "proxy %{p0}"); -var part1157 = // "Pattern{Constant('function '), Field(p0,false)}" -match("MESSAGE#676:00055:01/1_1", "nwparser.p0", "function %{p0}"); +var part1152 = match("MESSAGE#676:00055:01/1_1", "nwparser.p0", "function %{p0}"); var select260 = linear_select([ - part1156, - part1157, + part1151, + part1152, ]); -var part1158 = // "Pattern{Constant('was '), Field(disposition,true), Constant(' on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#676:00055:01/2", "nwparser.p0", "was %{disposition->} on interface %{interface}."); +var part1153 = match("MESSAGE#676:00055:01/2", "nwparser.p0", "was %{disposition->} on interface %{interface}."); -var all240 = all_match({ +var all235 = all_match({ processors: [ - dup260, + dup258, select260, - part1158, + part1153, ], on_success: processor_chain([ dup1, @@ -15216,16 +13734,15 @@ var all240 = all_match({ ]), }); -var msg686 = msg("00055:01", all240); +var msg686 = msg("00055:01", all235); -var part1159 = // "Pattern{Constant('same subnet check on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#677:00055:02/2", "nwparser.p0", "same subnet check on interface %{interface}."); +var part1154 = match("MESSAGE#677:00055:02/2", "nwparser.p0", "same subnet check on interface %{interface}."); -var all241 = all_match({ +var all236 = all_match({ processors: [ - dup261, - dup392, - part1159, + dup259, + dup389, + part1154, ], on_success: processor_chain([ dup19, @@ -15236,16 +13753,15 @@ var all241 = all_match({ ]), }); -var msg687 = msg("00055:02", all241); +var msg687 = msg("00055:02", all236); -var part1160 = // "Pattern{Constant('router alert IP option check on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#678:00055:03/2", "nwparser.p0", "router alert IP option check on interface %{interface}."); +var part1155 = match("MESSAGE#678:00055:03/2", "nwparser.p0", "router alert IP option check on interface %{interface}."); -var all242 = all_match({ +var all237 = all_match({ processors: [ - dup261, - dup392, - part1160, + dup259, + dup389, + part1155, ], on_success: processor_chain([ dup44, @@ -15256,10 +13772,9 @@ var all242 = all_match({ ]), }); -var msg688 = msg("00055:03", all242); +var msg688 = msg("00055:03", all237); -var part1161 = // "Pattern{Constant('IGMP version was changed to '), Field(version,true), Constant(' on interface '), Field(interface,false)}" -match("MESSAGE#679:00055:04", "nwparser.payload", "IGMP version was changed to %{version->} on interface %{interface}", processor_chain([ +var part1156 = match("MESSAGE#679:00055:04", "nwparser.payload", "IGMP version was changed to %{version->} on interface %{interface}", processor_chain([ dup1, dup2, dup3, @@ -15267,27 +13782,24 @@ match("MESSAGE#679:00055:04", "nwparser.payload", "IGMP version was changed to % dup5, ])); -var msg689 = msg("00055:04", part1161); +var msg689 = msg("00055:04", part1156); -var part1162 = // "Pattern{Constant('IGMP query '), Field(p0,false)}" -match("MESSAGE#680:00055:05/0", "nwparser.payload", "IGMP query %{p0}"); +var part1157 = match("MESSAGE#680:00055:05/0", "nwparser.payload", "IGMP query %{p0}"); -var part1163 = // "Pattern{Constant('max response time '), Field(p0,false)}" -match("MESSAGE#680:00055:05/1_1", "nwparser.p0", "max response time %{p0}"); +var part1158 = match("MESSAGE#680:00055:05/1_1", "nwparser.p0", "max response time %{p0}"); var select261 = linear_select([ dup110, - part1163, + part1158, ]); -var part1164 = // "Pattern{Constant('was changed to '), Field(fld2,true), Constant(' on interface '), Field(interface,false)}" -match("MESSAGE#680:00055:05/2", "nwparser.p0", "was changed to %{fld2->} on interface %{interface}"); +var part1159 = match("MESSAGE#680:00055:05/2", "nwparser.p0", "was changed to %{fld2->} on interface %{interface}"); -var all243 = all_match({ +var all238 = all_match({ processors: [ - part1162, + part1157, select261, - part1164, + part1159, ], on_success: processor_chain([ dup1, @@ -15298,30 +13810,26 @@ var all243 = all_match({ ]), }); -var msg690 = msg("00055:05", all243); +var msg690 = msg("00055:05", all238); -var part1165 = // "Pattern{Constant('IGMP l'), Field(p0,false)}" -match("MESSAGE#681:00055:06/0", "nwparser.payload", "IGMP l%{p0}"); +var part1160 = match("MESSAGE#681:00055:06/0", "nwparser.payload", "IGMP l%{p0}"); -var part1166 = // "Pattern{Constant('eave '), Field(p0,false)}" -match("MESSAGE#681:00055:06/1_0", "nwparser.p0", "eave %{p0}"); +var part1161 = match("MESSAGE#681:00055:06/1_0", "nwparser.p0", "eave %{p0}"); -var part1167 = // "Pattern{Constant('ast member query '), Field(p0,false)}" -match("MESSAGE#681:00055:06/1_1", "nwparser.p0", "ast member query %{p0}"); +var part1162 = match("MESSAGE#681:00055:06/1_1", "nwparser.p0", "ast member query %{p0}"); var select262 = linear_select([ - part1166, - part1167, + part1161, + part1162, ]); -var part1168 = // "Pattern{Constant('interval was changed to '), Field(fld2,true), Constant(' on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#681:00055:06/2", "nwparser.p0", "interval was changed to %{fld2->} on interface %{interface}."); +var part1163 = match("MESSAGE#681:00055:06/2", "nwparser.p0", "interval was changed to %{fld2->} on interface %{interface}."); -var all244 = all_match({ +var all239 = all_match({ processors: [ - part1165, + part1160, select262, - part1168, + part1163, ], on_success: processor_chain([ dup1, @@ -15332,31 +13840,27 @@ var all244 = all_match({ ]), }); -var msg691 = msg("00055:06", all244); +var msg691 = msg("00055:06", all239); -var part1169 = // "Pattern{Constant('routers '), Field(p0,false)}" -match("MESSAGE#682:00055:07/1_0", "nwparser.p0", "routers %{p0}"); +var part1164 = match("MESSAGE#682:00055:07/1_0", "nwparser.p0", "routers %{p0}"); -var part1170 = // "Pattern{Constant('hosts '), Field(p0,false)}" -match("MESSAGE#682:00055:07/1_1", "nwparser.p0", "hosts %{p0}"); +var part1165 = match("MESSAGE#682:00055:07/1_1", "nwparser.p0", "hosts %{p0}"); -var part1171 = // "Pattern{Constant('groups '), Field(p0,false)}" -match("MESSAGE#682:00055:07/1_2", "nwparser.p0", "groups %{p0}"); +var part1166 = match("MESSAGE#682:00055:07/1_2", "nwparser.p0", "groups %{p0}"); var select263 = linear_select([ - part1169, - part1170, - part1171, + part1164, + part1165, + part1166, ]); -var part1172 = // "Pattern{Constant('accept list ID was changed to '), Field(fld2,true), Constant(' on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#682:00055:07/2", "nwparser.p0", "accept list ID was changed to %{fld2->} on interface %{interface}."); +var part1167 = match("MESSAGE#682:00055:07/2", "nwparser.p0", "accept list ID was changed to %{fld2->} on interface %{interface}."); -var all245 = all_match({ +var all240 = all_match({ processors: [ - dup260, + dup258, select263, - part1172, + part1167, ], on_success: processor_chain([ dup1, @@ -15367,27 +13871,24 @@ var all245 = all_match({ ]), }); -var msg692 = msg("00055:07", all245); +var msg692 = msg("00055:07", all240); -var part1173 = // "Pattern{Constant('all groups '), Field(p0,false)}" -match("MESSAGE#683:00055:08/1_0", "nwparser.p0", "all groups %{p0}"); +var part1168 = match("MESSAGE#683:00055:08/1_0", "nwparser.p0", "all groups %{p0}"); -var part1174 = // "Pattern{Constant('group '), Field(p0,false)}" -match("MESSAGE#683:00055:08/1_1", "nwparser.p0", "group %{p0}"); +var part1169 = match("MESSAGE#683:00055:08/1_1", "nwparser.p0", "group %{p0}"); var select264 = linear_select([ - part1173, - part1174, + part1168, + part1169, ]); -var part1175 = // "Pattern{Constant(''), Field(group,true), Constant(' static flag was '), Field(disposition,true), Constant(' on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#683:00055:08/2", "nwparser.p0", "%{group->} static flag was %{disposition->} on interface %{interface}."); +var part1170 = match("MESSAGE#683:00055:08/2", "nwparser.p0", "%{group->} static flag was %{disposition->} on interface %{interface}."); -var all246 = all_match({ +var all241 = all_match({ processors: [ - dup260, + dup258, select264, - part1175, + part1170, ], on_success: processor_chain([ dup1, @@ -15398,29 +13899,27 @@ var all246 = all_match({ ]), }); -var msg693 = msg("00055:08", all246); +var msg693 = msg("00055:08", all241); -var part1176 = // "Pattern{Constant('IGMP static group '), Field(group,true), Constant(' was added on interface '), Field(interface,false)}" -match("MESSAGE#684:00055:09", "nwparser.payload", "IGMP static group %{group->} was added on interface %{interface}", processor_chain([ - dup211, +var part1171 = match("MESSAGE#684:00055:09", "nwparser.payload", "IGMP static group %{group->} was added on interface %{interface}", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg694 = msg("00055:09", part1176); +var msg694 = msg("00055:09", part1171); -var part1177 = // "Pattern{Constant('IGMP proxy always is '), Field(disposition,true), Constant(' on interface '), Field(interface,false), Constant('.')}" -match("MESSAGE#685:00055:10", "nwparser.payload", "IGMP proxy always is %{disposition->} on interface %{interface}.", processor_chain([ - dup211, +var part1172 = match("MESSAGE#685:00055:10", "nwparser.payload", "IGMP proxy always is %{disposition->} on interface %{interface}.", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg695 = msg("00055:10", part1177); +var msg695 = msg("00055:10", part1172); var select265 = linear_select([ msg685, @@ -15436,8 +13935,7 @@ var select265 = linear_select([ msg695, ]); -var part1178 = // "Pattern{Constant('Remove multicast policy from '), Field(src_zone,true), Constant(' '), Field(saddr,true), Constant(' to '), Field(dst_zone,true), Constant(' '), Field(daddr,false)}" -match("MESSAGE#686:00056", "nwparser.payload", "Remove multicast policy from %{src_zone->} %{saddr->} to %{dst_zone->} %{daddr}", processor_chain([ +var part1173 = match("MESSAGE#686:00056", "nwparser.payload", "Remove multicast policy from %{src_zone->} %{saddr->} to %{dst_zone->} %{daddr}", processor_chain([ dup1, dup2, dup3, @@ -15445,10 +13943,9 @@ match("MESSAGE#686:00056", "nwparser.payload", "Remove multicast policy from %{s dup5, ])); -var msg696 = msg("00056", part1178); +var msg696 = msg("00056", part1173); -var part1179 = // "Pattern{Field(fld2,false), Constant(': static multicast route src='), Field(saddr,false), Constant(', grp='), Field(group,true), Constant(' input ifp = '), Field(sinterface,true), Constant(' output ifp = '), Field(dinterface,true), Constant(' added')}" -match("MESSAGE#687:00057", "nwparser.payload", "%{fld2}: static multicast route src=%{saddr}, grp=%{group->} input ifp = %{sinterface->} output ifp = %{dinterface->} added", processor_chain([ +var part1174 = match("MESSAGE#687:00057", "nwparser.payload", "%{fld2}: static multicast route src=%{saddr}, grp=%{group->} input ifp = %{sinterface->} output ifp = %{dinterface->} added", processor_chain([ dup1, dup2, dup3, @@ -15456,10 +13953,9 @@ match("MESSAGE#687:00057", "nwparser.payload", "%{fld2}: static multicast route dup5, ])); -var msg697 = msg("00057", part1179); +var msg697 = msg("00057", part1174); -var part1180 = // "Pattern{Constant('PIMSM protocol configured on interface '), Field(interface,false)}" -match("MESSAGE#688:00058", "nwparser.payload", "PIMSM protocol configured on interface %{interface}", processor_chain([ +var part1175 = match("MESSAGE#688:00058", "nwparser.payload", "PIMSM protocol configured on interface %{interface}", processor_chain([ dup19, dup2, dup3, @@ -15467,29 +13963,27 @@ match("MESSAGE#688:00058", "nwparser.payload", "PIMSM protocol configured on int dup5, ])); -var msg698 = msg("00058", part1180); +var msg698 = msg("00058", part1175); -var part1181 = // "Pattern{Constant('DDNS module is '), Field(p0,false)}" -match("MESSAGE#689:00059/0", "nwparser.payload", "DDNS module is %{p0}"); +var part1176 = match("MESSAGE#689:00059/0", "nwparser.payload", "DDNS module is %{p0}"); -var part1182 = // "Pattern{Constant('initialized '), Field(p0,false)}" -match("MESSAGE#689:00059/1_0", "nwparser.p0", "initialized %{p0}"); +var part1177 = match("MESSAGE#689:00059/1_0", "nwparser.p0", "initialized %{p0}"); var select266 = linear_select([ - part1182, - dup264, + part1177, + dup262, dup157, dup156, ]); -var all247 = all_match({ +var all242 = all_match({ processors: [ - part1181, + part1176, select266, dup116, ], on_success: processor_chain([ - dup211, + dup209, dup2, dup3, dup4, @@ -15497,33 +13991,29 @@ var all247 = all_match({ ]), }); -var msg699 = msg("00059", all247); +var msg699 = msg("00059", all242); -var part1183 = // "Pattern{Constant('DDNS entry with id '), Field(fld2,true), Constant(' is configured with server type "'), Field(fld3,false), Constant('" name "'), Field(hostname,false), Constant('" refresh-interval '), Field(fld5,true), Constant(' hours minimum update interval '), Field(fld6,true), Constant(' minutes with '), Field(p0,false)}" -match("MESSAGE#690:00059:02/0", "nwparser.payload", "DDNS entry with id %{fld2->} is configured with server type \"%{fld3}\" name \"%{hostname}\" refresh-interval %{fld5->} hours minimum update interval %{fld6->} minutes with %{p0}"); +var part1178 = match("MESSAGE#690:00059:02/0", "nwparser.payload", "DDNS entry with id %{fld2->} is configured with server type \"%{fld3}\" name \"%{hostname}\" refresh-interval %{fld5->} hours minimum update interval %{fld6->} minutes with %{p0}"); -var part1184 = // "Pattern{Constant('secure '), Field(p0,false)}" -match("MESSAGE#690:00059:02/1_0", "nwparser.p0", "secure %{p0}"); +var part1179 = match("MESSAGE#690:00059:02/1_0", "nwparser.p0", "secure %{p0}"); -var part1185 = // "Pattern{Constant('clear-text '), Field(p0,false)}" -match("MESSAGE#690:00059:02/1_1", "nwparser.p0", "clear-text %{p0}"); +var part1180 = match("MESSAGE#690:00059:02/1_1", "nwparser.p0", "clear-text %{p0}"); var select267 = linear_select([ - part1184, - part1185, + part1179, + part1180, ]); -var part1186 = // "Pattern{Constant('secure connection.'), Field(,false)}" -match("MESSAGE#690:00059:02/2", "nwparser.p0", "secure connection.%{}"); +var part1181 = match("MESSAGE#690:00059:02/2", "nwparser.p0", "secure connection.%{}"); -var all248 = all_match({ +var all243 = all_match({ processors: [ - part1183, + part1178, select267, - part1186, + part1181, ], on_success: processor_chain([ - dup211, + dup209, dup2, dup3, dup4, @@ -15531,59 +14021,52 @@ var all248 = all_match({ ]), }); -var msg700 = msg("00059:02", all248); +var msg700 = msg("00059:02", all243); -var part1187 = // "Pattern{Constant('DDNS entry with id '), Field(fld2,true), Constant(' is configured with user name "'), Field(username,false), Constant('" agent "'), Field(fld3,false), Constant('"')}" -match("MESSAGE#691:00059:03", "nwparser.payload", "DDNS entry with id %{fld2->} is configured with user name \"%{username}\" agent \"%{fld3}\"", processor_chain([ - dup211, +var part1182 = match("MESSAGE#691:00059:03", "nwparser.payload", "DDNS entry with id %{fld2->} is configured with user name \"%{username}\" agent \"%{fld3}\"", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg701 = msg("00059:03", part1187); +var msg701 = msg("00059:03", part1182); -var part1188 = // "Pattern{Constant('DDNS entry with id '), Field(fld2,true), Constant(' is configured with interface "'), Field(interface,false), Constant('" host-name "'), Field(hostname,false), Constant('"')}" -match("MESSAGE#692:00059:04", "nwparser.payload", "DDNS entry with id %{fld2->} is configured with interface \"%{interface}\" host-name \"%{hostname}\"", processor_chain([ - dup211, +var part1183 = match("MESSAGE#692:00059:04", "nwparser.payload", "DDNS entry with id %{fld2->} is configured with interface \"%{interface}\" host-name \"%{hostname}\"", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg702 = msg("00059:04", part1188); +var msg702 = msg("00059:04", part1183); -var part1189 = // "Pattern{Constant('Hostname '), Field(p0,false)}" -match("MESSAGE#693:00059:05/0_0", "nwparser.payload", "Hostname %{p0}"); +var part1184 = match("MESSAGE#693:00059:05/0_0", "nwparser.payload", "Hostname %{p0}"); -var part1190 = // "Pattern{Constant('Source interface '), Field(p0,false)}" -match("MESSAGE#693:00059:05/0_1", "nwparser.payload", "Source interface %{p0}"); +var part1185 = match("MESSAGE#693:00059:05/0_1", "nwparser.payload", "Source interface %{p0}"); -var part1191 = // "Pattern{Constant('Username and password '), Field(p0,false)}" -match("MESSAGE#693:00059:05/0_2", "nwparser.payload", "Username and password %{p0}"); +var part1186 = match("MESSAGE#693:00059:05/0_2", "nwparser.payload", "Username and password %{p0}"); -var part1192 = // "Pattern{Constant('Server '), Field(p0,false)}" -match("MESSAGE#693:00059:05/0_3", "nwparser.payload", "Server %{p0}"); +var part1187 = match("MESSAGE#693:00059:05/0_3", "nwparser.payload", "Server %{p0}"); var select268 = linear_select([ - part1189, - part1190, - part1191, - part1192, + part1184, + part1185, + part1186, + part1187, ]); -var part1193 = // "Pattern{Constant('of DDNS entry with id '), Field(fld2,true), Constant(' is cleared.')}" -match("MESSAGE#693:00059:05/1", "nwparser.p0", "of DDNS entry with id %{fld2->} is cleared."); +var part1188 = match("MESSAGE#693:00059:05/1", "nwparser.p0", "of DDNS entry with id %{fld2->} is cleared."); -var all249 = all_match({ +var all244 = all_match({ processors: [ select268, - part1193, + part1188, ], on_success: processor_chain([ - dup211, + dup209, dup2, dup3, dup4, @@ -15591,51 +14074,46 @@ var all249 = all_match({ ]), }); -var msg703 = msg("00059:05", all249); +var msg703 = msg("00059:05", all244); -var part1194 = // "Pattern{Constant('Agent of DDNS entry with id '), Field(fld2,true), Constant(' is reset to its default value.')}" -match("MESSAGE#694:00059:06", "nwparser.payload", "Agent of DDNS entry with id %{fld2->} is reset to its default value.", processor_chain([ - dup211, +var part1189 = match("MESSAGE#694:00059:06", "nwparser.payload", "Agent of DDNS entry with id %{fld2->} is reset to its default value.", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg704 = msg("00059:06", part1194); +var msg704 = msg("00059:06", part1189); -var part1195 = // "Pattern{Constant('Updates for DDNS entry with id '), Field(fld2,true), Constant(' are set to be sent in secure ('), Field(protocol,false), Constant(') mode.')}" -match("MESSAGE#695:00059:07", "nwparser.payload", "Updates for DDNS entry with id %{fld2->} are set to be sent in secure (%{protocol}) mode.", processor_chain([ - dup211, +var part1190 = match("MESSAGE#695:00059:07", "nwparser.payload", "Updates for DDNS entry with id %{fld2->} are set to be sent in secure (%{protocol}) mode.", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg705 = msg("00059:07", part1195); +var msg705 = msg("00059:07", part1190); -var part1196 = // "Pattern{Constant('Refresh '), Field(p0,false)}" -match("MESSAGE#696:00059:08/0_0", "nwparser.payload", "Refresh %{p0}"); +var part1191 = match("MESSAGE#696:00059:08/0_0", "nwparser.payload", "Refresh %{p0}"); -var part1197 = // "Pattern{Constant('Minimum update '), Field(p0,false)}" -match("MESSAGE#696:00059:08/0_1", "nwparser.payload", "Minimum update %{p0}"); +var part1192 = match("MESSAGE#696:00059:08/0_1", "nwparser.payload", "Minimum update %{p0}"); var select269 = linear_select([ - part1196, - part1197, + part1191, + part1192, ]); -var part1198 = // "Pattern{Constant('interval of DDNS entry with id '), Field(fld2,true), Constant(' is set to default value ('), Field(fld3,false), Constant(').')}" -match("MESSAGE#696:00059:08/1", "nwparser.p0", "interval of DDNS entry with id %{fld2->} is set to default value (%{fld3})."); +var part1193 = match("MESSAGE#696:00059:08/1", "nwparser.p0", "interval of DDNS entry with id %{fld2->} is set to default value (%{fld3})."); -var all250 = all_match({ +var all245 = all_match({ processors: [ select269, - part1198, + part1193, ], on_success: processor_chain([ - dup211, + dup209, dup2, dup3, dup4, @@ -15643,43 +14121,38 @@ var all250 = all_match({ ]), }); -var msg706 = msg("00059:08", all250); +var msg706 = msg("00059:08", all245); -var part1199 = // "Pattern{Constant('No-Change '), Field(p0,false)}" -match("MESSAGE#697:00059:09/1_0", "nwparser.p0", "No-Change %{p0}"); +var part1194 = match("MESSAGE#697:00059:09/1_0", "nwparser.p0", "No-Change %{p0}"); -var part1200 = // "Pattern{Constant('Error '), Field(p0,false)}" -match("MESSAGE#697:00059:09/1_1", "nwparser.p0", "Error %{p0}"); +var part1195 = match("MESSAGE#697:00059:09/1_1", "nwparser.p0", "Error %{p0}"); var select270 = linear_select([ - part1199, - part1200, + part1194, + part1195, ]); -var part1201 = // "Pattern{Constant('response received for DDNS entry update for id '), Field(fld2,true), Constant(' user "'), Field(username,false), Constant('" domain "'), Field(domain,false), Constant('" server type " d'), Field(p0,false)}" -match("MESSAGE#697:00059:09/2", "nwparser.p0", "response received for DDNS entry update for id %{fld2->} user \"%{username}\" domain \"%{domain}\" server type \" d%{p0}"); +var part1196 = match("MESSAGE#697:00059:09/2", "nwparser.p0", "response received for DDNS entry update for id %{fld2->} user \"%{username}\" domain \"%{domain}\" server type \" d%{p0}"); -var part1202 = // "Pattern{Constant('yndns '), Field(p0,false)}" -match("MESSAGE#697:00059:09/3_1", "nwparser.p0", "yndns %{p0}"); +var part1197 = match("MESSAGE#697:00059:09/3_1", "nwparser.p0", "yndns %{p0}"); var select271 = linear_select([ - dup263, - part1202, + dup261, + part1197, ]); -var part1203 = // "Pattern{Constant('", server name "'), Field(hostname,false), Constant('"')}" -match("MESSAGE#697:00059:09/4", "nwparser.p0", "\", server name \"%{hostname}\""); +var part1198 = match("MESSAGE#697:00059:09/4", "nwparser.p0", "\", server name \"%{hostname}\""); -var all251 = all_match({ +var all246 = all_match({ processors: [ - dup162, + dup160, select270, - part1201, + part1196, select271, - part1203, + part1198, ], on_success: processor_chain([ - dup211, + dup209, dup2, dup3, dup4, @@ -15687,18 +14160,17 @@ var all251 = all_match({ ]), }); -var msg707 = msg("00059:09", all251); +var msg707 = msg("00059:09", all246); -var part1204 = // "Pattern{Constant('DDNS entry with id '), Field(fld2,true), Constant(' is '), Field(disposition,false), Constant('.')}" -match("MESSAGE#698:00059:01", "nwparser.payload", "DDNS entry with id %{fld2->} is %{disposition}.", processor_chain([ - dup211, +var part1199 = match("MESSAGE#698:00059:01", "nwparser.payload", "DDNS entry with id %{fld2->} is %{disposition}.", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg708 = msg("00059:01", part1204); +var msg708 = msg("00059:01", part1199); var select272 = linear_select([ msg699, @@ -15713,8 +14185,7 @@ var select272 = linear_select([ msg708, ]); -var part1205 = // "Pattern{Constant('Track IP IP address '), Field(hostip,true), Constant(' failed. ('), Field(event_time_string,false), Constant(')')}" -match("MESSAGE#699:00062:01", "nwparser.payload", "Track IP IP address %{hostip->} failed. (%{event_time_string})", processor_chain([ +var part1200 = match("MESSAGE#699:00062:01", "nwparser.payload", "Track IP IP address %{hostip->} failed. (%{event_time_string})", processor_chain([ dup19, dup2, dup3, @@ -15723,10 +14194,9 @@ match("MESSAGE#699:00062:01", "nwparser.payload", "Track IP IP address %{hostip- setc("event_description","Track IP failed"), ])); -var msg709 = msg("00062:01", part1205); +var msg709 = msg("00062:01", part1200); -var part1206 = // "Pattern{Constant('Track IP failure reached threshold. ('), Field(event_time_string,false), Constant(')')}" -match("MESSAGE#700:00062:02", "nwparser.payload", "Track IP failure reached threshold. (%{event_time_string})", processor_chain([ +var part1201 = match("MESSAGE#700:00062:02", "nwparser.payload", "Track IP failure reached threshold. (%{event_time_string})", processor_chain([ dup19, dup2, dup3, @@ -15735,10 +14205,9 @@ match("MESSAGE#700:00062:02", "nwparser.payload", "Track IP failure reached thre setc("event_description","Track IP failure reached threshold"), ])); -var msg710 = msg("00062:02", part1206); +var msg710 = msg("00062:02", part1201); -var part1207 = // "Pattern{Constant('Track IP IP address '), Field(hostip,true), Constant(' succeeded. ('), Field(event_time_string,false), Constant(')')}" -match("MESSAGE#701:00062:03", "nwparser.payload", "Track IP IP address %{hostip->} succeeded. (%{event_time_string})", processor_chain([ +var part1202 = match("MESSAGE#701:00062:03", "nwparser.payload", "Track IP IP address %{hostip->} succeeded. (%{event_time_string})", processor_chain([ dup44, dup2, dup3, @@ -15747,10 +14216,9 @@ match("MESSAGE#701:00062:03", "nwparser.payload", "Track IP IP address %{hostip- setc("event_description","Track IP succeeded"), ])); -var msg711 = msg("00062:03", part1207); +var msg711 = msg("00062:03", part1202); -var part1208 = // "Pattern{Constant('HA linkdown'), Field(,false)}" -match("MESSAGE#702:00062", "nwparser.payload", "HA linkdown%{}", processor_chain([ +var part1203 = match("MESSAGE#702:00062", "nwparser.payload", "HA linkdown%{}", processor_chain([ dup86, dup2, dup3, @@ -15758,7 +14226,7 @@ match("MESSAGE#702:00062", "nwparser.payload", "HA linkdown%{}", processor_chain dup5, ])); -var msg712 = msg("00062", part1208); +var msg712 = msg("00062", part1203); var select273 = linear_select([ msg709, @@ -15767,8 +14235,7 @@ var select273 = linear_select([ msg712, ]); -var part1209 = // "Pattern{Constant('nsrp track-ip ip '), Field(hostip,true), Constant(' '), Field(disposition,false), Constant('!')}" -match("MESSAGE#703:00063", "nwparser.payload", "nsrp track-ip ip %{hostip->} %{disposition}!", processor_chain([ +var part1204 = match("MESSAGE#703:00063", "nwparser.payload", "nsrp track-ip ip %{hostip->} %{disposition}!", processor_chain([ dup86, dup2, dup3, @@ -15776,10 +14243,9 @@ match("MESSAGE#703:00063", "nwparser.payload", "nsrp track-ip ip %{hostip->} %{d dup5, ])); -var msg713 = msg("00063", part1209); +var msg713 = msg("00063", part1204); -var part1210 = // "Pattern{Constant('Can not create track-ip list'), Field(,false)}" -match("MESSAGE#704:00064", "nwparser.payload", "Can not create track-ip list%{}", processor_chain([ +var part1205 = match("MESSAGE#704:00064", "nwparser.payload", "Can not create track-ip list%{}", processor_chain([ dup86, dup2, dup3, @@ -15787,10 +14253,9 @@ match("MESSAGE#704:00064", "nwparser.payload", "Can not create track-ip list%{}" dup5, ])); -var msg714 = msg("00064", part1210); +var msg714 = msg("00064", part1205); -var part1211 = // "Pattern{Constant('track ip fail reaches threshold system may fail over!'), Field(,false)}" -match("MESSAGE#705:00064:01", "nwparser.payload", "track ip fail reaches threshold system may fail over!%{}", processor_chain([ +var part1206 = match("MESSAGE#705:00064:01", "nwparser.payload", "track ip fail reaches threshold system may fail over!%{}", processor_chain([ dup86, dup2, dup3, @@ -15798,10 +14263,9 @@ match("MESSAGE#705:00064:01", "nwparser.payload", "track ip fail reaches thresho dup5, ])); -var msg715 = msg("00064:01", part1211); +var msg715 = msg("00064:01", part1206); -var part1212 = // "Pattern{Constant('Anti-Spam is detached from policy ID '), Field(policy_id,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#706:00064:02", "nwparser.payload", "Anti-Spam is detached from policy ID %{policy_id}. (%{fld1})", processor_chain([ +var part1207 = match("MESSAGE#706:00064:02", "nwparser.payload", "Anti-Spam is detached from policy ID %{policy_id}. (%{fld1})", processor_chain([ dup17, dup2, dup3, @@ -15810,7 +14274,7 @@ match("MESSAGE#706:00064:02", "nwparser.payload", "Anti-Spam is detached from po dup5, ])); -var msg716 = msg("00064:02", part1212); +var msg716 = msg("00064:02", part1207); var select274 = linear_select([ msg714, @@ -15818,27 +14282,24 @@ var select274 = linear_select([ msg716, ]); -var msg717 = msg("00070", dup414); +var msg717 = msg("00070", dup411); -var part1213 = // "Pattern{Field(,false), Constant('Device group '), Field(group,true), Constant(' changed state from '), Field(fld3,true), Constant(' to '), Field(p0,false)}" -match("MESSAGE#708:00070:01/2", "nwparser.p0", "%{}Device group %{group->} changed state from %{fld3->} to %{p0}"); +var part1208 = match("MESSAGE#708:00070:01/2", "nwparser.p0", "%{}Device group %{group->} changed state from %{fld3->} to %{p0}"); -var part1214 = // "Pattern{Constant('Init'), Field(,false)}" -match("MESSAGE#708:00070:01/3_0", "nwparser.p0", "Init%{}"); +var part1209 = match("MESSAGE#708:00070:01/3_0", "nwparser.p0", "Init%{}"); -var part1215 = // "Pattern{Constant('init. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#708:00070:01/3_1", "nwparser.p0", "init. (%{fld1})"); +var part1210 = match("MESSAGE#708:00070:01/3_1", "nwparser.p0", "init. (%{fld1})"); var select275 = linear_select([ - part1214, - part1215, + part1209, + part1210, ]); -var all252 = all_match({ +var all247 = all_match({ processors: [ - dup269, - dup394, - part1213, + dup267, + dup391, + part1208, select275, ], on_success: processor_chain([ @@ -15851,10 +14312,9 @@ var all252 = all_match({ ]), }); -var msg718 = msg("00070:01", all252); +var msg718 = msg("00070:01", all247); -var part1216 = // "Pattern{Constant('NSRP: nsrp control channel change to '), Field(interface,false)}" -match("MESSAGE#709:00070:02", "nwparser.payload", "NSRP: nsrp control channel change to %{interface}", processor_chain([ +var part1211 = match("MESSAGE#709:00070:02", "nwparser.payload", "NSRP: nsrp control channel change to %{interface}", processor_chain([ dup1, dup2, dup3, @@ -15862,7 +14322,7 @@ match("MESSAGE#709:00070:02", "nwparser.payload", "NSRP: nsrp control channel ch dup5, ])); -var msg719 = msg("00070:02", part1216); +var msg719 = msg("00070:02", part1211); var select276 = linear_select([ msg717, @@ -15870,10 +14330,9 @@ var select276 = linear_select([ msg719, ]); -var msg720 = msg("00071", dup414); +var msg720 = msg("00071", dup411); -var part1217 = // "Pattern{Constant('The local device '), Field(fld1,true), Constant(' in the Virtual Security Device group '), Field(group,true), Constant(' changed state')}" -match("MESSAGE#711:00071:01", "nwparser.payload", "The local device %{fld1->} in the Virtual Security Device group %{group->} changed state", processor_chain([ +var part1212 = match("MESSAGE#711:00071:01", "nwparser.payload", "The local device %{fld1->} in the Virtual Security Device group %{group->} changed state", processor_chain([ dup1, dup2, dup3, @@ -15881,38 +14340,38 @@ match("MESSAGE#711:00071:01", "nwparser.payload", "The local device %{fld1->} in dup5, ])); -var msg721 = msg("00071:01", part1217); +var msg721 = msg("00071:01", part1212); var select277 = linear_select([ msg720, msg721, ]); -var msg722 = msg("00072", dup414); +var msg722 = msg("00072", dup411); -var msg723 = msg("00072:01", dup415); +var msg723 = msg("00072:01", dup412); var select278 = linear_select([ msg722, msg723, ]); -var msg724 = msg("00073", dup414); +var msg724 = msg("00073", dup411); -var msg725 = msg("00073:01", dup415); +var msg725 = msg("00073:01", dup412); var select279 = linear_select([ msg724, msg725, ]); -var msg726 = msg("00074", dup395); +var msg726 = msg("00074", dup392); -var all253 = all_match({ +var all248 = all_match({ processors: [ - dup265, - dup393, - dup273, + dup263, + dup390, + dup271, ], on_success: processor_chain([ dup1, @@ -15923,10 +14382,9 @@ var all253 = all_match({ ]), }); -var msg727 = msg("00075", all253); +var msg727 = msg("00075", all248); -var part1218 = // "Pattern{Constant('The local device '), Field(hardware_id,true), Constant(' in the Virtual Security Device group '), Field(group,true), Constant(' changed state from '), Field(event_state,true), Constant(' to inoperable. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#718:00075:02", "nwparser.payload", "The local device %{hardware_id->} in the Virtual Security Device group %{group->} changed state from %{event_state->} to inoperable. (%{fld1})", processor_chain([ +var part1213 = match("MESSAGE#718:00075:02", "nwparser.payload", "The local device %{hardware_id->} in the Virtual Security Device group %{group->} changed state from %{event_state->} to inoperable. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -15936,10 +14394,9 @@ match("MESSAGE#718:00075:02", "nwparser.payload", "The local device %{hardware_i setc("event_description","local device in the Virtual Security Device group changed state to inoperable"), ])); -var msg728 = msg("00075:02", part1218); +var msg728 = msg("00075:02", part1213); -var part1219 = // "Pattern{Constant('The local device '), Field(hardware_id,true), Constant(' in the Virtual Security Device group '), Field(group,true), Constant(' '), Field(info,false)}" -match("MESSAGE#719:00075:01", "nwparser.payload", "The local device %{hardware_id->} in the Virtual Security Device group %{group->} %{info}", processor_chain([ +var part1214 = match("MESSAGE#719:00075:01", "nwparser.payload", "The local device %{hardware_id->} in the Virtual Security Device group %{group->} %{info}", processor_chain([ dup1, dup2, dup3, @@ -15947,7 +14404,7 @@ match("MESSAGE#719:00075:01", "nwparser.payload", "The local device %{hardware_i dup5, ])); -var msg729 = msg("00075:01", part1219); +var msg729 = msg("00075:01", part1214); var select280 = linear_select([ msg727, @@ -15955,16 +14412,15 @@ var select280 = linear_select([ msg729, ]); -var msg730 = msg("00076", dup395); +var msg730 = msg("00076", dup392); -var part1220 = // "Pattern{Field(fld2,true), Constant(' of VSD group '), Field(group,true), Constant(' send 2nd path request to unit='), Field(fld3,false)}" -match("MESSAGE#721:00076:01/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} send 2nd path request to unit=%{fld3}"); +var part1215 = match("MESSAGE#721:00076:01/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} send 2nd path request to unit=%{fld3}"); -var all254 = all_match({ +var all249 = all_match({ processors: [ - dup265, - dup393, - part1220, + dup263, + dup390, + part1215, ], on_success: processor_chain([ dup44, @@ -15975,15 +14431,14 @@ var all254 = all_match({ ]), }); -var msg731 = msg("00076:01", all254); +var msg731 = msg("00076:01", all249); var select281 = linear_select([ msg730, msg731, ]); -var part1221 = // "Pattern{Constant('HA link disconnect. Begin to use second path of HA'), Field(,false)}" -match("MESSAGE#722:00077", "nwparser.payload", "HA link disconnect. Begin to use second path of HA%{}", processor_chain([ +var part1216 = match("MESSAGE#722:00077", "nwparser.payload", "HA link disconnect. Begin to use second path of HA%{}", processor_chain([ dup144, dup2, dup3, @@ -15991,13 +14446,13 @@ match("MESSAGE#722:00077", "nwparser.payload", "HA link disconnect. Begin to use dup5, ])); -var msg732 = msg("00077", part1221); +var msg732 = msg("00077", part1216); -var all255 = all_match({ +var all250 = all_match({ processors: [ - dup265, - dup393, - dup273, + dup263, + dup390, + dup271, ], on_success: processor_chain([ dup44, @@ -16008,10 +14463,9 @@ var all255 = all_match({ ]), }); -var msg733 = msg("00077:01", all255); +var msg733 = msg("00077:01", all250); -var part1222 = // "Pattern{Constant('The local device '), Field(fld2,true), Constant(' in the Virtual Security Device group '), Field(group,false)}" -match("MESSAGE#724:00077:02", "nwparser.payload", "The local device %{fld2->} in the Virtual Security Device group %{group}", processor_chain([ +var part1217 = match("MESSAGE#724:00077:02", "nwparser.payload", "The local device %{fld2->} in the Virtual Security Device group %{group}", processor_chain([ setc("eventcategory","1607000000"), dup2, dup3, @@ -16019,7 +14473,7 @@ match("MESSAGE#724:00077:02", "nwparser.payload", "The local device %{fld2->} in dup5, ])); -var msg734 = msg("00077:02", part1222); +var msg734 = msg("00077:02", part1217); var select282 = linear_select([ msg732, @@ -16027,37 +14481,33 @@ var select282 = linear_select([ msg734, ]); -var part1223 = // "Pattern{Constant('RTSYNC: NSRP route synchronization is '), Field(disposition,false)}" -match("MESSAGE#725:00084", "nwparser.payload", "RTSYNC: NSRP route synchronization is %{disposition}", processor_chain([ - dup274, +var part1218 = match("MESSAGE#725:00084", "nwparser.payload", "RTSYNC: NSRP route synchronization is %{disposition}", processor_chain([ + dup272, dup2, dup3, dup4, dup5, ])); -var msg735 = msg("00084", part1223); +var msg735 = msg("00084", part1218); -var part1224 = // "Pattern{Constant('Failover '), Field(p0,false)}" -match("MESSAGE#726:00090/0_0", "nwparser.payload", "Failover %{p0}"); +var part1219 = match("MESSAGE#726:00090/0_0", "nwparser.payload", "Failover %{p0}"); -var part1225 = // "Pattern{Constant('Recovery '), Field(p0,false)}" -match("MESSAGE#726:00090/0_1", "nwparser.payload", "Recovery %{p0}"); +var part1220 = match("MESSAGE#726:00090/0_1", "nwparser.payload", "Recovery %{p0}"); var select283 = linear_select([ - part1224, - part1225, + part1219, + part1220, ]); -var part1226 = // "Pattern{Constant('untrust interface occurred.'), Field(,false)}" -match("MESSAGE#726:00090/3", "nwparser.p0", "untrust interface occurred.%{}"); +var part1221 = match("MESSAGE#726:00090/3", "nwparser.p0", "untrust interface occurred.%{}"); -var all256 = all_match({ +var all251 = all_match({ processors: [ select283, dup103, - dup372, - part1226, + dup369, + part1221, ], on_success: processor_chain([ dup44, @@ -16068,10 +14518,9 @@ var all256 = all_match({ ]), }); -var msg736 = msg("00090", all256); +var msg736 = msg("00090", all251); -var part1227 = // "Pattern{Constant('A new route cannot be added to the device because the maximum number of system route entries '), Field(fld2,true), Constant(' has been exceeded')}" -match("MESSAGE#727:00200", "nwparser.payload", "A new route cannot be added to the device because the maximum number of system route entries %{fld2->} has been exceeded", processor_chain([ +var part1222 = match("MESSAGE#727:00200", "nwparser.payload", "A new route cannot be added to the device because the maximum number of system route entries %{fld2->} has been exceeded", processor_chain([ dup117, dup2, dup3, @@ -16079,10 +14528,9 @@ match("MESSAGE#727:00200", "nwparser.payload", "A new route cannot be added to t dup5, ])); -var msg737 = msg("00200", part1227); +var msg737 = msg("00200", part1222); -var part1228 = // "Pattern{Constant('A route '), Field(hostip,false), Constant('/'), Field(fld2,true), Constant(' cannot be added to the virtual router '), Field(node,true), Constant(' because the number of route entries in the virtual router exceeds the maximum number of routes '), Field(fld3,true), Constant(' allowed')}" -match("MESSAGE#728:00201", "nwparser.payload", "A route %{hostip}/%{fld2->} cannot be added to the virtual router %{node->} because the number of route entries in the virtual router exceeds the maximum number of routes %{fld3->} allowed", processor_chain([ +var part1223 = match("MESSAGE#728:00201", "nwparser.payload", "A route %{hostip}/%{fld2->} cannot be added to the virtual router %{node->} because the number of route entries in the virtual router exceeds the maximum number of routes %{fld3->} allowed", processor_chain([ dup117, dup2, dup3, @@ -16090,55 +14538,49 @@ match("MESSAGE#728:00201", "nwparser.payload", "A route %{hostip}/%{fld2->} cann dup5, ])); -var msg738 = msg("00201", part1228); +var msg738 = msg("00201", part1223); -var part1229 = // "Pattern{Field(fld2,true), Constant(' hello-packet flood from neighbor (ip = '), Field(hostip,true), Constant(' router-id = '), Field(fld3,false), Constant(') on interface '), Field(interface,true), Constant(' packet is dropped')}" -match("MESSAGE#729:00202", "nwparser.payload", "%{fld2->} hello-packet flood from neighbor (ip = %{hostip->} router-id = %{fld3}) on interface %{interface->} packet is dropped", processor_chain([ - dup274, +var part1224 = match("MESSAGE#729:00202", "nwparser.payload", "%{fld2->} hello-packet flood from neighbor (ip = %{hostip->} router-id = %{fld3}) on interface %{interface->} packet is dropped", processor_chain([ + dup272, dup2, dup4, dup5, dup3, ])); -var msg739 = msg("00202", part1229); +var msg739 = msg("00202", part1224); -var part1230 = // "Pattern{Field(fld2,true), Constant(' lsa flood on interface '), Field(interface,true), Constant(' has dropped a packet.')}" -match("MESSAGE#730:00203", "nwparser.payload", "%{fld2->} lsa flood on interface %{interface->} has dropped a packet.", processor_chain([ - dup274, +var part1225 = match("MESSAGE#730:00203", "nwparser.payload", "%{fld2->} lsa flood on interface %{interface->} has dropped a packet.", processor_chain([ + dup272, dup2, dup4, dup5, dup3, ])); -var msg740 = msg("00203", part1230); +var msg740 = msg("00203", part1225); -var part1231 = // "Pattern{Constant('The total number of redistributed routes into '), Field(p0,false)}" -match("MESSAGE#731:00206/0", "nwparser.payload", "The total number of redistributed routes into %{p0}"); +var part1226 = match("MESSAGE#731:00206/0", "nwparser.payload", "The total number of redistributed routes into %{p0}"); -var part1232 = // "Pattern{Constant('BGP '), Field(p0,false)}" -match("MESSAGE#731:00206/1_0", "nwparser.p0", "BGP %{p0}"); +var part1227 = match("MESSAGE#731:00206/1_0", "nwparser.p0", "BGP %{p0}"); -var part1233 = // "Pattern{Constant('OSPF '), Field(p0,false)}" -match("MESSAGE#731:00206/1_1", "nwparser.p0", "OSPF %{p0}"); +var part1228 = match("MESSAGE#731:00206/1_1", "nwparser.p0", "OSPF %{p0}"); var select284 = linear_select([ - part1232, - part1233, + part1227, + part1228, ]); -var part1234 = // "Pattern{Constant('in vrouter '), Field(node,true), Constant(' exceeded system limit ('), Field(fld2,false), Constant(')')}" -match("MESSAGE#731:00206/2", "nwparser.p0", "in vrouter %{node->} exceeded system limit (%{fld2})"); +var part1229 = match("MESSAGE#731:00206/2", "nwparser.p0", "in vrouter %{node->} exceeded system limit (%{fld2})"); -var all257 = all_match({ +var all252 = all_match({ processors: [ - part1231, + part1226, select284, - part1234, + part1229, ], on_success: processor_chain([ - dup274, + dup272, dup2, dup3, dup4, @@ -16146,22 +14588,20 @@ var all257 = all_match({ ]), }); -var msg741 = msg("00206", all257); +var msg741 = msg("00206", all252); -var part1235 = // "Pattern{Constant('LSA flood in OSPF with router-id '), Field(fld2,true), Constant(' on '), Field(p0,false)}" -match("MESSAGE#732:00206:01/0", "nwparser.payload", "LSA flood in OSPF with router-id %{fld2->} on %{p0}"); +var part1230 = match("MESSAGE#732:00206:01/0", "nwparser.payload", "LSA flood in OSPF with router-id %{fld2->} on %{p0}"); -var part1236 = // "Pattern{Constant(''), Field(interface,true), Constant(' forced the interface to drop a packet.')}" -match("MESSAGE#732:00206:01/2", "nwparser.p0", "%{interface->} forced the interface to drop a packet."); +var part1231 = match("MESSAGE#732:00206:01/2", "nwparser.p0", "%{interface->} forced the interface to drop a packet."); -var all258 = all_match({ +var all253 = all_match({ processors: [ - part1235, - dup354, - part1236, + part1230, + dup352, + part1231, ], on_success: processor_chain([ - dup275, + dup273, dup2, dup3, dup4, @@ -16169,22 +14609,20 @@ var all258 = all_match({ ]), }); -var msg742 = msg("00206:01", all258); +var msg742 = msg("00206:01", all253); -var part1237 = // "Pattern{Constant('OSPF instance with router-id '), Field(fld3,true), Constant(' received a Hello packet flood from neighbor (IP address '), Field(hostip,false), Constant(', router ID '), Field(fld2,false), Constant(') on '), Field(p0,false)}" -match("MESSAGE#733:00206:02/0", "nwparser.payload", "OSPF instance with router-id %{fld3->} received a Hello packet flood from neighbor (IP address %{hostip}, router ID %{fld2}) on %{p0}"); +var part1232 = match("MESSAGE#733:00206:02/0", "nwparser.payload", "OSPF instance with router-id %{fld3->} received a Hello packet flood from neighbor (IP address %{hostip}, router ID %{fld2}) on %{p0}"); -var part1238 = // "Pattern{Constant(''), Field(interface,true), Constant(' forcing the interface to drop the packet.')}" -match("MESSAGE#733:00206:02/2", "nwparser.p0", "%{interface->} forcing the interface to drop the packet."); +var part1233 = match("MESSAGE#733:00206:02/2", "nwparser.p0", "%{interface->} forcing the interface to drop the packet."); -var all259 = all_match({ +var all254 = all_match({ processors: [ - part1237, - dup354, - part1238, + part1232, + dup352, + part1233, ], on_success: processor_chain([ - dup275, + dup273, dup2, dup3, dup4, @@ -16192,29 +14630,27 @@ var all259 = all_match({ ]), }); -var msg743 = msg("00206:02", all259); +var msg743 = msg("00206:02", all254); -var part1239 = // "Pattern{Constant('Link State Advertisement Id '), Field(fld2,false), Constant(', router ID '), Field(fld3,false), Constant(', type '), Field(fld4,true), Constant(' cannot be deleted from the real-time database in area '), Field(fld5,false)}" -match("MESSAGE#734:00206:03", "nwparser.payload", "Link State Advertisement Id %{fld2}, router ID %{fld3}, type %{fld4->} cannot be deleted from the real-time database in area %{fld5}", processor_chain([ - dup275, +var part1234 = match("MESSAGE#734:00206:03", "nwparser.payload", "Link State Advertisement Id %{fld2}, router ID %{fld3}, type %{fld4->} cannot be deleted from the real-time database in area %{fld5}", processor_chain([ + dup273, dup2, dup3, dup4, dup5, ])); -var msg744 = msg("00206:03", part1239); +var msg744 = msg("00206:03", part1234); -var part1240 = // "Pattern{Constant('Reject second OSPF neighbor ('), Field(fld2,false), Constant(') on interface ('), Field(interface,false), Constant(') since it_s configured as point-to-point interface')}" -match("MESSAGE#735:00206:04", "nwparser.payload", "Reject second OSPF neighbor (%{fld2}) on interface (%{interface}) since it_s configured as point-to-point interface", processor_chain([ - dup275, +var part1235 = match("MESSAGE#735:00206:04", "nwparser.payload", "Reject second OSPF neighbor (%{fld2}) on interface (%{interface}) since it_s configured as point-to-point interface", processor_chain([ + dup273, dup2, dup3, dup4, dup5, ])); -var msg745 = msg("00206:04", part1240); +var msg745 = msg("00206:04", part1235); var select285 = linear_select([ msg741, @@ -16224,49 +14660,45 @@ var select285 = linear_select([ msg745, ]); -var part1241 = // "Pattern{Constant('System wide RIP route limit exceeded, RIP route dropped.'), Field(,false)}" -match("MESSAGE#736:00207", "nwparser.payload", "System wide RIP route limit exceeded, RIP route dropped.%{}", processor_chain([ - dup275, +var part1236 = match("MESSAGE#736:00207", "nwparser.payload", "System wide RIP route limit exceeded, RIP route dropped.%{}", processor_chain([ + dup273, dup2, dup3, dup4, dup5, ])); -var msg746 = msg("00207", part1241); +var msg746 = msg("00207", part1236); -var part1242 = // "Pattern{Field(fld2,true), Constant(' RIP routes dropped from last system wide RIP route limit exceed.')}" -match("MESSAGE#737:00207:01", "nwparser.payload", "%{fld2->} RIP routes dropped from last system wide RIP route limit exceed.", processor_chain([ - dup275, +var part1237 = match("MESSAGE#737:00207:01", "nwparser.payload", "%{fld2->} RIP routes dropped from last system wide RIP route limit exceed.", processor_chain([ + dup273, dup2, dup3, dup4, dup5, ])); -var msg747 = msg("00207:01", part1242); +var msg747 = msg("00207:01", part1237); -var part1243 = // "Pattern{Constant('RIP database size limit exceeded for '), Field(fld2,false), Constant(', RIP route dropped.')}" -match("MESSAGE#738:00207:02", "nwparser.payload", "RIP database size limit exceeded for %{fld2}, RIP route dropped.", processor_chain([ - dup275, +var part1238 = match("MESSAGE#738:00207:02", "nwparser.payload", "RIP database size limit exceeded for %{fld2}, RIP route dropped.", processor_chain([ + dup273, dup2, dup3, dup4, dup5, ])); -var msg748 = msg("00207:02", part1243); +var msg748 = msg("00207:02", part1238); -var part1244 = // "Pattern{Field(fld2,true), Constant(' RIP routes dropped from the last database size exceed in vr '), Field(fld3,false), Constant('.')}" -match("MESSAGE#739:00207:03", "nwparser.payload", "%{fld2->} RIP routes dropped from the last database size exceed in vr %{fld3}.", processor_chain([ - dup275, +var part1239 = match("MESSAGE#739:00207:03", "nwparser.payload", "%{fld2->} RIP routes dropped from the last database size exceed in vr %{fld3}.", processor_chain([ + dup273, dup2, dup3, dup4, dup5, ])); -var msg749 = msg("00207:03", part1244); +var msg749 = msg("00207:03", part1239); var select286 = linear_select([ msg746, @@ -16275,423 +14707,396 @@ var select286 = linear_select([ msg749, ]); -var part1245 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction=outgoing action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' translated ip='), Field(stransaddr,true), Constant(' port='), Field(stransport,false)}" -match("MESSAGE#740:00257", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=outgoing action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{stransaddr->} port=%{stransport}", processor_chain([ - dup187, +var part1240 = match("MESSAGE#740:00257", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=outgoing action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{stransaddr->} port=%{stransport}", processor_chain([ + dup185, dup2, dup4, dup5, dup3, + dup274, + dup275, + dup61, dup276, dup277, - dup61, dup278, - dup279, - dup280, ])); -var msg750 = msg("00257", part1245); +var msg750 = msg("00257", part1240); -var part1246 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction=incoming action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' translated ip='), Field(dtransaddr,true), Constant(' port='), Field(dtransport,false)}" -match("MESSAGE#741:00257:14", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=incoming action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{dtransaddr->} port=%{dtransport}", processor_chain([ - dup187, +var part1241 = match("MESSAGE#741:00257:14", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=incoming action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{dtransaddr->} port=%{dtransport}", processor_chain([ + dup185, dup2, dup4, dup5, dup3, + dup274, + dup275, + dup279, dup276, dup277, - dup281, - dup278, - dup279, - dup282, + dup280, ])); -var msg751 = msg("00257:14", part1246); +var msg751 = msg("00257:14", part1241); -var part1247 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction=outgoing action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' translated ip='), Field(stransaddr,true), Constant(' port='), Field(stransport,false)}" -match("MESSAGE#742:00257:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=outgoing action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{stransaddr->} port=%{stransport}", processor_chain([ - dup283, +var part1242 = match("MESSAGE#742:00257:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=outgoing action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{stransaddr->} port=%{stransport}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup61, - dup284, - dup280, + dup282, + dup278, ])); -var msg752 = msg("00257:01", part1247); +var msg752 = msg("00257:01", part1242); -var part1248 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction=incoming action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' translated ip='), Field(dtransaddr,true), Constant(' port='), Field(dtransport,false)}" -match("MESSAGE#743:00257:15", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=incoming action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{dtransaddr->} port=%{dtransport}", processor_chain([ - dup283, +var part1243 = match("MESSAGE#743:00257:15", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=incoming action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} translated ip=%{dtransaddr->} port=%{dtransport}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, - dup281, - dup284, + dup274, + dup275, + dup279, dup282, + dup280, ])); -var msg753 = msg("00257:15", part1248); +var msg753 = msg("00257:15", part1243); -var part1249 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#744:00257:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup187, +var part1244 = match("MESSAGE#744:00257:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup185, dup2, dup4, dup5, dup3, + dup274, + dup275, + dup61, dup276, dup277, - dup61, - dup278, - dup279, ])); -var msg754 = msg("00257:02", part1249); +var msg754 = msg("00257:02", part1244); -var part1250 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#745:00257:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup283, +var part1245 = match("MESSAGE#745:00257:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup61, - dup284, + dup282, ])); -var msg755 = msg("00257:03", part1250); +var msg755 = msg("00257:03", part1245); -var part1251 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' src-xlated ip='), Field(stransaddr,true), Constant(' port='), Field(stransport,false)}" -match("MESSAGE#746:00257:04", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport}", processor_chain([ - dup187, +var part1246 = match("MESSAGE#746:00257:04", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport}", processor_chain([ + dup185, dup2, dup4, dup5, dup3, + dup274, + dup275, + dup61, dup276, dup277, - dup61, - dup278, - dup279, ])); -var msg756 = msg("00257:04", part1251); +var msg756 = msg("00257:04", part1246); -var part1252 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' src-xlated ip='), Field(stransaddr,true), Constant(' port='), Field(stransport,true), Constant(' dst-xlated ip='), Field(dtransaddr,true), Constant(' port='), Field(dtransport,true), Constant(' session_id='), Field(sessionid,true), Constant(' reason='), Field(result,false)}" -match("MESSAGE#747:00257:05", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport->} dst-xlated ip=%{dtransaddr->} port=%{dtransport->} session_id=%{sessionid->} reason=%{result}", processor_chain([ - dup283, +var part1247 = match("MESSAGE#747:00257:05", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport->} dst-xlated ip=%{dtransaddr->} port=%{dtransport->} session_id=%{sessionid->} reason=%{result}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup61, - dup284, + dup282, ])); -var msg757 = msg("00257:05", part1252); +var msg757 = msg("00257:05", part1247); -var part1253 = // "Pattern{Field(,false), Constant('duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,true), Constant(' icmp code='), Field(icmpcode,true), Constant(' src-xlated ip='), Field(stransaddr,true), Constant(' dst-xlated ip='), Field(dtransaddr,true), Constant(' session_id='), Field(sessionid,true), Constant(' reason='), Field(result,false)}" -match("MESSAGE#748:00257:19/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype->} icmp code=%{icmpcode->} src-xlated ip=%{stransaddr->} dst-xlated ip=%{dtransaddr->} session_id=%{sessionid->} reason=%{result}"); +var part1248 = match("MESSAGE#748:00257:19/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype->} icmp code=%{icmpcode->} src-xlated ip=%{stransaddr->} dst-xlated ip=%{dtransaddr->} session_id=%{sessionid->} reason=%{result}"); -var all260 = all_match({ +var all255 = all_match({ processors: [ - dup285, - dup396, - part1253, + dup283, + dup393, + part1248, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup60, - dup284, + dup282, ]), }); -var msg758 = msg("00257:19", all260); +var msg758 = msg("00257:19", all255); -var part1254 = // "Pattern{Field(,false), Constant('duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,true), Constant(' src-xlated ip='), Field(stransaddr,true), Constant(' dst-xlated ip='), Field(dtransaddr,true), Constant(' session_id='), Field(sessionid,false)}" -match("MESSAGE#749:00257:16/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype->} src-xlated ip=%{stransaddr->} dst-xlated ip=%{dtransaddr->} session_id=%{sessionid}"); +var part1249 = match("MESSAGE#749:00257:16/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype->} src-xlated ip=%{stransaddr->} dst-xlated ip=%{dtransaddr->} session_id=%{sessionid}"); -var all261 = all_match({ +var all256 = all_match({ processors: [ - dup285, - dup396, - part1254, + dup283, + dup393, + part1249, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup60, - dup284, + dup282, ]), }); -var msg759 = msg("00257:16", all261); +var msg759 = msg("00257:16", all256); -var part1255 = // "Pattern{Field(,false), Constant('duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' src-xlated ip='), Field(stransaddr,true), Constant(' port='), Field(stransport,true), Constant(' dst-xlated ip='), Field(dtransaddr,true), Constant(' port='), Field(dtransport,true), Constant(' session_id='), Field(sessionid,false)}" -match("MESSAGE#750:00257:17/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport->} dst-xlated ip=%{dtransaddr->} port=%{dtransport->} session_id=%{sessionid}"); +var part1250 = match("MESSAGE#750:00257:17/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport->} dst-xlated ip=%{dtransaddr->} port=%{dtransport->} session_id=%{sessionid}"); -var all262 = all_match({ +var all257 = all_match({ processors: [ - dup285, - dup396, - part1255, + dup283, + dup393, + part1250, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup61, - dup284, + dup282, ]), }); -var msg760 = msg("00257:17", all262); +var msg760 = msg("00257:17", all257); -var part1256 = // "Pattern{Field(,false), Constant('duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,true), Constant(' src-xlated ip='), Field(stransaddr,true), Constant(' port='), Field(stransport,true), Constant(' session_id='), Field(sessionid,false)}" -match("MESSAGE#751:00257:18/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport->} session_id=%{sessionid}"); +var part1251 = match("MESSAGE#751:00257:18/2", "nwparser.p0", "%{}duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport->} src-xlated ip=%{stransaddr->} port=%{stransport->} session_id=%{sessionid}"); -var all263 = all_match({ +var all258 = all_match({ processors: [ - dup285, - dup396, - part1256, + dup283, + dup393, + part1251, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup61, - dup284, + dup282, ]), }); -var msg761 = msg("00257:18", all263); +var msg761 = msg("00257:18", all258); -var part1257 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(p0,false)}" -match("MESSAGE#752:00257:06/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{p0}"); +var part1252 = match("MESSAGE#752:00257:06/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{p0}"); -var part1258 = // "Pattern{Field(dport,true), Constant(' session_id='), Field(sessionid,false)}" -match("MESSAGE#752:00257:06/1_0", "nwparser.p0", "%{dport->} session_id=%{sessionid}"); +var part1253 = match("MESSAGE#752:00257:06/1_0", "nwparser.p0", "%{dport->} session_id=%{sessionid}"); -var part1259 = // "Pattern{Field(dport,false)}" -match_copy("MESSAGE#752:00257:06/1_1", "nwparser.p0", "dport"); +var part1254 = match_copy("MESSAGE#752:00257:06/1_1", "nwparser.p0", "dport"); var select287 = linear_select([ - part1258, - part1259, + part1253, + part1254, ]); -var all264 = all_match({ +var all259 = all_match({ processors: [ - part1257, + part1252, select287, ], on_success: processor_chain([ - dup187, + dup185, dup2, dup4, dup5, dup3, + dup274, + dup275, + dup61, dup276, dup277, - dup61, - dup278, - dup279, ]), }); -var msg762 = msg("00257:06", all264); +var msg762 = msg("00257:06", all259); -var part1260 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#753:00257:07", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup283, +var part1255 = match("MESSAGE#753:00257:07", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup61, - dup284, + dup282, ])); -var msg763 = msg("00257:07", part1260); +var msg763 = msg("00257:07", part1255); -var part1261 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' tcp='), Field(icmptype,false)}" -match("MESSAGE#754:00257:08", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} tcp=%{icmptype}", processor_chain([ - dup187, +var part1256 = match("MESSAGE#754:00257:08", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} tcp=%{icmptype}", processor_chain([ + dup185, dup2, dup4, dup5, dup3, + dup274, + dup275, + dup60, dup276, dup277, - dup60, - dup278, - dup279, ])); -var msg764 = msg("00257:08", part1261); +var msg764 = msg("00257:08", part1256); -var part1262 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(p0,false)}" -match("MESSAGE#755:00257:09/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{p0}"); +var part1257 = match("MESSAGE#755:00257:09/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{p0}"); -var part1263 = // "Pattern{Field(icmptype,true), Constant(' icmp code='), Field(icmpcode,true), Constant(' session_id='), Field(sessionid,true), Constant(' reason='), Field(result,false)}" -match("MESSAGE#755:00257:09/1_0", "nwparser.p0", "%{icmptype->} icmp code=%{icmpcode->} session_id=%{sessionid->} reason=%{result}"); +var part1258 = match("MESSAGE#755:00257:09/1_0", "nwparser.p0", "%{icmptype->} icmp code=%{icmpcode->} session_id=%{sessionid->} reason=%{result}"); -var part1264 = // "Pattern{Field(icmptype,true), Constant(' session_id='), Field(sessionid,false)}" -match("MESSAGE#755:00257:09/1_1", "nwparser.p0", "%{icmptype->} session_id=%{sessionid}"); +var part1259 = match("MESSAGE#755:00257:09/1_1", "nwparser.p0", "%{icmptype->} session_id=%{sessionid}"); -var part1265 = // "Pattern{Field(icmptype,false)}" -match_copy("MESSAGE#755:00257:09/1_2", "nwparser.p0", "icmptype"); +var part1260 = match_copy("MESSAGE#755:00257:09/1_2", "nwparser.p0", "icmptype"); var select288 = linear_select([ - part1263, - part1264, - part1265, + part1258, + part1259, + part1260, ]); -var all265 = all_match({ +var all260 = all_match({ processors: [ - part1262, + part1257, select288, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup60, - dup284, + dup282, ]), }); -var msg765 = msg("00257:09", all265); +var msg765 = msg("00257:09", all260); -var part1266 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(p0,false)}" -match("MESSAGE#756:00257:10/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{p0}"); +var part1261 = match("MESSAGE#756:00257:10/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{p0}"); -var part1267 = // "Pattern{Field(daddr,true), Constant(' session_id='), Field(sessionid,false)}" -match("MESSAGE#756:00257:10/1_0", "nwparser.p0", "%{daddr->} session_id=%{sessionid}"); +var part1262 = match("MESSAGE#756:00257:10/1_0", "nwparser.p0", "%{daddr->} session_id=%{sessionid}"); var select289 = linear_select([ - part1267, - dup288, + part1262, + dup286, ]); -var all266 = all_match({ +var all261 = all_match({ processors: [ - part1266, + part1261, select289, ], on_success: processor_chain([ - dup187, + dup185, dup2, dup4, dup5, dup3, + dup274, + dup275, + dup60, dup276, dup277, - dup60, - dup278, - dup279, ]), }); -var msg766 = msg("00257:10", all266); +var msg766 = msg("00257:10", all261); -var part1268 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(p0,false)}" -match("MESSAGE#757:00257:11/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{p0}"); +var part1263 = match("MESSAGE#757:00257:11/0", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{p0}"); -var part1269 = // "Pattern{Field(daddr,true), Constant(' session_id='), Field(sessionid,true), Constant(' reason='), Field(result,false)}" -match("MESSAGE#757:00257:11/1_0", "nwparser.p0", "%{daddr->} session_id=%{sessionid->} reason=%{result}"); +var part1264 = match("MESSAGE#757:00257:11/1_0", "nwparser.p0", "%{daddr->} session_id=%{sessionid->} reason=%{result}"); var select290 = linear_select([ - part1269, - dup288, + part1264, + dup286, ]); -var all267 = all_match({ +var all262 = all_match({ processors: [ - part1268, + part1263, select290, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup60, - dup284, + dup282, ]), }); -var msg767 = msg("00257:11", all267); +var msg767 = msg("00257:11", all262); -var part1270 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' type='), Field(fld3,false)}" -match("MESSAGE#758:00257:12", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} type=%{fld3}", processor_chain([ - dup283, +var part1265 = match("MESSAGE#758:00257:12", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} type=%{fld3}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, - dup276, - dup277, + dup274, + dup275, dup60, - dup284, + dup282, ])); -var msg768 = msg("00257:12", part1270); +var msg768 = msg("00257:12", part1265); -var part1271 = // "Pattern{Constant('start_time="'), Field(fld2,false)}" -match("MESSAGE#759:00257:13", "nwparser.payload", "start_time=\"%{fld2}", processor_chain([ - dup283, +var part1266 = match("MESSAGE#759:00257:13", "nwparser.payload", "start_time=\"%{fld2}", processor_chain([ + dup281, dup2, dup3, - dup276, + dup274, dup4, dup5, ])); -var msg769 = msg("00257:13", part1271); +var msg769 = msg("00257:13", part1266); var select291 = linear_select([ msg750, @@ -16716,27 +15121,24 @@ var select291 = linear_select([ msg769, ]); -var part1272 = // "Pattern{Constant('user '), Field(username,true), Constant(' has logged on via '), Field(p0,false)}" -match("MESSAGE#760:00259/1", "nwparser.p0", "user %{username->} has logged on via %{p0}"); +var part1267 = match("MESSAGE#760:00259/1", "nwparser.p0", "user %{username->} has logged on via %{p0}"); -var part1273 = // "Pattern{Constant('the console '), Field(p0,false)}" -match("MESSAGE#760:00259/2_0", "nwparser.p0", "the console %{p0}"); +var part1268 = match("MESSAGE#760:00259/2_0", "nwparser.p0", "the console %{p0}"); var select292 = linear_select([ - part1273, - dup291, - dup243, + part1268, + dup289, + dup241, ]); -var part1274 = // "Pattern{Constant('from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#760:00259/3", "nwparser.p0", "from %{saddr}:%{sport}"); +var part1269 = match("MESSAGE#760:00259/3", "nwparser.p0", "from %{saddr}:%{sport}"); -var all268 = all_match({ +var all263 = all_match({ processors: [ - dup397, - part1272, + dup394, + part1267, select292, - part1274, + part1269, ], on_success: processor_chain([ dup28, @@ -16751,15 +15153,14 @@ var all268 = all_match({ ]), }); -var msg770 = msg("00259", all268); +var msg770 = msg("00259", all263); -var part1275 = // "Pattern{Constant('user '), Field(administrator,true), Constant(' has logged out via '), Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#761:00259:07/1", "nwparser.p0", "user %{administrator->} has logged out via %{logon_type->} from %{saddr}:%{sport}"); +var part1270 = match("MESSAGE#761:00259:07/1", "nwparser.p0", "user %{administrator->} has logged out via %{logon_type->} from %{saddr}:%{sport}"); -var all269 = all_match({ +var all264 = all_match({ processors: [ - dup397, - part1275, + dup394, + part1270, ], on_success: processor_chain([ dup33, @@ -16772,33 +15173,30 @@ var all269 = all_match({ ]), }); -var msg771 = msg("00259:07", all269); +var msg771 = msg("00259:07", all264); -var part1276 = // "Pattern{Constant('Management session via '), Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' for [vsys] admin '), Field(administrator,true), Constant(' has timed out')}" -match("MESSAGE#762:00259:01", "nwparser.payload", "Management session via %{logon_type->} from %{saddr}:%{sport->} for [vsys] admin %{administrator->} has timed out", processor_chain([ - dup292, +var part1271 = match("MESSAGE#762:00259:01", "nwparser.payload", "Management session via %{logon_type->} from %{saddr}:%{sport->} for [vsys] admin %{administrator->} has timed out", processor_chain([ + dup290, dup2, dup3, dup4, dup5, ])); -var msg772 = msg("00259:01", part1276); +var msg772 = msg("00259:01", part1271); -var part1277 = // "Pattern{Constant('Management session via '), Field(logon_type,true), Constant(' for [ vsys ] admin '), Field(administrator,true), Constant(' has timed out')}" -match("MESSAGE#763:00259:02", "nwparser.payload", "Management session via %{logon_type->} for [ vsys ] admin %{administrator->} has timed out", processor_chain([ - dup292, +var part1272 = match("MESSAGE#763:00259:02", "nwparser.payload", "Management session via %{logon_type->} for [ vsys ] admin %{administrator->} has timed out", processor_chain([ + dup290, dup2, dup3, dup4, dup5, ])); -var msg773 = msg("00259:02", part1277); +var msg773 = msg("00259:02", part1272); -var part1278 = // "Pattern{Constant('Login attempt to system by admin '), Field(administrator,true), Constant(' via the '), Field(logon_type,true), Constant(' has failed')}" -match("MESSAGE#764:00259:03", "nwparser.payload", "Login attempt to system by admin %{administrator->} via the %{logon_type->} has failed", processor_chain([ - dup208, +var part1273 = match("MESSAGE#764:00259:03", "nwparser.payload", "Login attempt to system by admin %{administrator->} via the %{logon_type->} has failed", processor_chain([ + dup206, dup29, dup30, dup31, @@ -16809,11 +15207,10 @@ match("MESSAGE#764:00259:03", "nwparser.payload", "Login attempt to system by ad dup5, ])); -var msg774 = msg("00259:03", part1278); +var msg774 = msg("00259:03", part1273); -var part1279 = // "Pattern{Constant('Login attempt to system by admin '), Field(administrator,true), Constant(' via '), Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has failed')}" -match("MESSAGE#765:00259:04", "nwparser.payload", "Login attempt to system by admin %{administrator->} via %{logon_type->} from %{saddr}:%{sport->} has failed", processor_chain([ - dup208, +var part1274 = match("MESSAGE#765:00259:04", "nwparser.payload", "Login attempt to system by admin %{administrator->} via %{logon_type->} from %{saddr}:%{sport->} has failed", processor_chain([ + dup206, dup29, dup30, dup31, @@ -16824,31 +15221,28 @@ match("MESSAGE#765:00259:04", "nwparser.payload", "Login attempt to system by ad dup5, ])); -var msg775 = msg("00259:04", part1279); +var msg775 = msg("00259:04", part1274); -var part1280 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' has been forced to log out of the '), Field(p0,false)}" -match("MESSAGE#766:00259:05/0", "nwparser.payload", "Admin user %{administrator->} has been forced to log out of the %{p0}"); +var part1275 = match("MESSAGE#766:00259:05/0", "nwparser.payload", "Admin user %{administrator->} has been forced to log out of the %{p0}"); -var part1281 = // "Pattern{Constant('Web '), Field(p0,false)}" -match("MESSAGE#766:00259:05/1_2", "nwparser.p0", "Web %{p0}"); +var part1276 = match("MESSAGE#766:00259:05/1_2", "nwparser.p0", "Web %{p0}"); var select293 = linear_select([ - dup243, - dup291, - part1281, + dup241, + dup289, + part1276, ]); -var part1282 = // "Pattern{Constant('session on host '), Field(daddr,false), Constant(':'), Field(dport,false)}" -match("MESSAGE#766:00259:05/2", "nwparser.p0", "session on host %{daddr}:%{dport}"); +var part1277 = match("MESSAGE#766:00259:05/2", "nwparser.p0", "session on host %{daddr}:%{dport}"); -var all270 = all_match({ +var all265 = all_match({ processors: [ - part1280, + part1275, select293, - part1282, + part1277, ], on_success: processor_chain([ - dup292, + dup290, dup2, dup3, dup4, @@ -16856,18 +15250,17 @@ var all270 = all_match({ ]), }); -var msg776 = msg("00259:05", all270); +var msg776 = msg("00259:05", all265); -var part1283 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' has been forced to log out of the serial console session.')}" -match("MESSAGE#767:00259:06", "nwparser.payload", "Admin user %{administrator->} has been forced to log out of the serial console session.", processor_chain([ - dup292, +var part1278 = match("MESSAGE#767:00259:06", "nwparser.payload", "Admin user %{administrator->} has been forced to log out of the serial console session.", processor_chain([ + dup290, dup2, dup3, dup4, dup5, ])); -var msg777 = msg("00259:06", part1283); +var msg777 = msg("00259:06", part1278); var select294 = linear_select([ msg770, @@ -16880,19 +15273,17 @@ var select294 = linear_select([ msg777, ]); -var part1284 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' has been rejected via the '), Field(logon_type,true), Constant(' server at '), Field(hostip,false)}" -match("MESSAGE#768:00262", "nwparser.payload", "Admin user %{administrator->} has been rejected via the %{logon_type->} server at %{hostip}", processor_chain([ - dup292, +var part1279 = match("MESSAGE#768:00262", "nwparser.payload", "Admin user %{administrator->} has been rejected via the %{logon_type->} server at %{hostip}", processor_chain([ + dup290, dup2, dup3, dup4, dup5, ])); -var msg778 = msg("00262", part1284); +var msg778 = msg("00262", part1279); -var part1285 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' has been accepted via the '), Field(logon_type,true), Constant(' server at '), Field(hostip,false)}" -match("MESSAGE#769:00263", "nwparser.payload", "Admin user %{administrator->} has been accepted via the %{logon_type->} server at %{hostip}", processor_chain([ +var part1280 = match("MESSAGE#769:00263", "nwparser.payload", "Admin user %{administrator->} has been accepted via the %{logon_type->} server at %{hostip}", processor_chain([ setc("eventcategory","1401050100"), dup2, dup3, @@ -16900,34 +15291,29 @@ match("MESSAGE#769:00263", "nwparser.payload", "Admin user %{administrator->} ha dup5, ])); -var msg779 = msg("00263", part1285); +var msg779 = msg("00263", part1280); -var part1286 = // "Pattern{Constant('ActiveX control '), Field(p0,false)}" -match("MESSAGE#770:00400/0_0", "nwparser.payload", "ActiveX control %{p0}"); +var part1281 = match("MESSAGE#770:00400/0_0", "nwparser.payload", "ActiveX control %{p0}"); -var part1287 = // "Pattern{Constant('JAVA applet '), Field(p0,false)}" -match("MESSAGE#770:00400/0_1", "nwparser.payload", "JAVA applet %{p0}"); +var part1282 = match("MESSAGE#770:00400/0_1", "nwparser.payload", "JAVA applet %{p0}"); -var part1288 = // "Pattern{Constant('EXE file '), Field(p0,false)}" -match("MESSAGE#770:00400/0_2", "nwparser.payload", "EXE file %{p0}"); +var part1283 = match("MESSAGE#770:00400/0_2", "nwparser.payload", "EXE file %{p0}"); -var part1289 = // "Pattern{Constant('ZIP file '), Field(p0,false)}" -match("MESSAGE#770:00400/0_3", "nwparser.payload", "ZIP file %{p0}"); +var part1284 = match("MESSAGE#770:00400/0_3", "nwparser.payload", "ZIP file %{p0}"); var select295 = linear_select([ - part1286, - part1287, - part1288, - part1289, + part1281, + part1282, + part1283, + part1284, ]); -var part1290 = // "Pattern{Constant('has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('. '), Field(info,false)}" -match("MESSAGE#770:00400/1", "nwparser.p0", "has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{dinterface->} in zone %{dst_zone}. %{info}"); +var part1285 = match("MESSAGE#770:00400/1", "nwparser.p0", "has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{dinterface->} in zone %{dst_zone}. %{info}"); -var all271 = all_match({ +var all266 = all_match({ processors: [ select295, - part1290, + part1285, ], on_success: processor_chain([ setc("eventcategory","1003000000"), @@ -16939,43 +15325,39 @@ var all271 = all_match({ ]), }); -var msg780 = msg("00400", all271); +var msg780 = msg("00400", all266); -var part1291 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,false), Constant(', int '), Field(interface,false), Constant('). '), Field(info,false)}" -match("MESSAGE#771:00401", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ +var part1286 = match("MESSAGE#771:00401", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ dup85, dup2, dup4, dup5, dup3, - dup293, + dup291, ])); -var msg781 = msg("00401", part1291); +var msg781 = msg("00401", part1286); -var part1292 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,false), Constant(', int '), Field(interface,false), Constant('). '), Field(info,false)}" -match("MESSAGE#772:00402", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ +var part1287 = match("MESSAGE#772:00402", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ dup85, dup2, dup4, dup5, dup3, - dup294, + dup292, ])); -var msg782 = msg("00402", part1292); +var msg782 = msg("00402", part1287); -var part1293 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at '), Field(p0,false)}" -match("MESSAGE#773:00402:01/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at %{p0}"); +var part1288 = match("MESSAGE#773:00402:01/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at %{p0}"); -var part1294 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' in zone '), Field(zone,false), Constant('. '), Field(info,false)}" -match("MESSAGE#773:00402:01/2", "nwparser.p0", "%{} %{interface->} in zone %{zone}. %{info}"); +var part1289 = match("MESSAGE#773:00402:01/2", "nwparser.p0", "%{} %{interface->} in zone %{zone}. %{info}"); -var all272 = all_match({ +var all267 = all_match({ processors: [ - part1293, - dup339, - part1294, + part1288, + dup337, + part1289, ], on_success: processor_chain([ dup85, @@ -16983,31 +15365,29 @@ var all272 = all_match({ dup4, dup5, dup3, - dup294, + dup292, ]), }); -var msg783 = msg("00402:01", all272); +var msg783 = msg("00402:01", all267); var select296 = linear_select([ msg782, msg783, ]); -var part1295 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,false), Constant(', int '), Field(interface,false), Constant('). '), Field(info,false)}" -match("MESSAGE#774:00403", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ +var part1290 = match("MESSAGE#774:00403", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ dup85, dup2, dup4, dup5, dup3, - dup293, + dup291, ])); -var msg784 = msg("00403", part1295); +var msg784 = msg("00403", part1290); -var part1296 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,false), Constant(', int '), Field(interface,false), Constant('). '), Field(info,false)}" -match("MESSAGE#775:00404", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ +var part1291 = match("MESSAGE#775:00404", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ dup147, dup148, dup149, @@ -17016,34 +15396,33 @@ match("MESSAGE#775:00404", "nwparser.payload", "%{signame}! From %{saddr}:%{spor dup4, dup5, dup3, - dup294, + dup292, ])); -var msg785 = msg("00404", part1296); +var msg785 = msg("00404", part1291); -var part1297 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,false), Constant(', int '), Field(interface,false), Constant('). '), Field(info,false)}" -match("MESSAGE#776:00405", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ +var part1292 = match("MESSAGE#776:00405", "nwparser.payload", "%{signame}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}, int %{interface}). %{info}", processor_chain([ dup147, dup2, dup4, dup5, dup3, - dup293, + dup291, ])); -var msg786 = msg("00405", part1297); +var msg786 = msg("00405", part1292); -var msg787 = msg("00406", dup416); +var msg787 = msg("00406", dup413); -var msg788 = msg("00407", dup416); +var msg788 = msg("00407", dup413); -var msg789 = msg("00408", dup416); +var msg789 = msg("00408", dup413); -var all273 = all_match({ +var all268 = all_match({ processors: [ dup132, - dup345, - dup295, + dup343, + dup293, ], on_success: processor_chain([ dup58, @@ -17056,12 +15435,11 @@ var all273 = all_match({ ]), }); -var msg790 = msg("00409", all273); +var msg790 = msg("00409", all268); -var msg791 = msg("00410", dup416); +var msg791 = msg("00410", dup413); -var part1298 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#782:00410:01", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ +var part1293 = match("MESSAGE#782:00410:01", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ dup58, dup2, dup3, @@ -17071,21 +15449,20 @@ match("MESSAGE#782:00410:01", "nwparser.payload", "%{signame->} From %{saddr->} dup60, ])); -var msg792 = msg("00410:01", part1298); +var msg792 = msg("00410:01", part1293); var select297 = linear_select([ msg791, msg792, ]); -var part1299 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto TCP (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#783:00411/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto TCP (zone %{zone->} %{p0}"); +var part1294 = match("MESSAGE#783:00411/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto TCP (zone %{zone->} %{p0}"); -var all274 = all_match({ +var all269 = all_match({ processors: [ - part1299, - dup345, - dup295, + part1294, + dup343, + dup293, ], on_success: processor_chain([ dup58, @@ -17098,19 +15475,17 @@ var all274 = all_match({ ]), }); -var msg793 = msg("00411", all274); +var msg793 = msg("00411", all269); -var part1300 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' and arriving at '), Field(p0,false)}" -match("MESSAGE#784:00413/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at %{p0}"); +var part1295 = match("MESSAGE#784:00413/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at %{p0}"); -var part1301 = // "Pattern{Field(,true), Constant(' '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#784:00413/2", "nwparser.p0", "%{} %{interface}.%{space}The attack occurred %{dclass_counter1->} times"); +var part1296 = match("MESSAGE#784:00413/2", "nwparser.p0", "%{} %{interface}.%{space}The attack occurred %{dclass_counter1->} times"); -var all275 = all_match({ +var all270 = all_match({ processors: [ - part1300, - dup339, - part1301, + part1295, + dup337, + part1296, ], on_success: processor_chain([ dup58, @@ -17123,15 +15498,14 @@ var all275 = all_match({ ]), }); -var msg794 = msg("00413", all275); +var msg794 = msg("00413", all270); -var part1302 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,false), Constant('(zone '), Field(group,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#785:00413:01/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol}(zone %{group->} %{p0}"); +var part1297 = match("MESSAGE#785:00413:01/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol}(zone %{group->} %{p0}"); -var all276 = all_match({ +var all271 = all_match({ processors: [ - part1302, - dup345, + part1297, + dup343, dup83, ], on_success: processor_chain([ @@ -17146,10 +15520,9 @@ var all276 = all_match({ ]), }); -var msg795 = msg("00413:01", all276); +var msg795 = msg("00413:01", all271); -var part1303 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.The attack occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#786:00413:02", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1298 = match("MESSAGE#786:00413:02", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup3, @@ -17159,7 +15532,7 @@ match("MESSAGE#786:00413:02", "nwparser.payload", "%{signame->} From %{saddr}:%{ dup9, ])); -var msg796 = msg("00413:02", part1303); +var msg796 = msg("00413:02", part1298); var select298 = linear_select([ msg794, @@ -17167,8 +15540,7 @@ var select298 = linear_select([ msg796, ]); -var part1304 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,false), Constant(', int '), Field(interface,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#787:00414", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}, int %{interface}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1299 = match("MESSAGE#787:00414", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}, int %{interface}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup59, @@ -17178,10 +15550,9 @@ match("MESSAGE#787:00414", "nwparser.payload", "%{signame->} From %{saddr->} to dup9, ])); -var msg797 = msg("00414", part1304); +var msg797 = msg("00414", part1299); -var part1305 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.The attack occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#788:00414:01", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1300 = match("MESSAGE#788:00414:01", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup3, @@ -17191,15 +15562,14 @@ match("MESSAGE#788:00414:01", "nwparser.payload", "%{signame->} From %{saddr->} dup9, ])); -var msg798 = msg("00414:01", part1305); +var msg798 = msg("00414:01", part1300); var select299 = linear_select([ msg797, msg798, ]); -var part1306 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' and arriving at interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#789:00415", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part1301 = match("MESSAGE#789:00415", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup59, @@ -17209,13 +15579,13 @@ match("MESSAGE#789:00415", "nwparser.payload", "%{signame->} From %{saddr}:%{spo dup61, ])); -var msg799 = msg("00415", part1306); +var msg799 = msg("00415", part1301); -var all277 = all_match({ +var all272 = all_match({ processors: [ dup132, - dup345, - dup296, + dup343, + dup294, ], on_success: processor_chain([ dup58, @@ -17228,12 +15598,12 @@ var all277 = all_match({ ]), }); -var msg800 = msg("00423", all277); +var msg800 = msg("00423", all272); -var all278 = all_match({ +var all273 = all_match({ processors: [ dup80, - dup345, + dup343, dup83, ], on_success: processor_chain([ @@ -17248,12 +15618,12 @@ var all278 = all_match({ ]), }); -var msg801 = msg("00429", all278); +var msg801 = msg("00429", all273); -var all279 = all_match({ +var all274 = all_match({ processors: [ dup132, - dup345, + dup343, dup83, ], on_success: processor_chain([ @@ -17268,19 +15638,19 @@ var all279 = all_match({ ]), }); -var msg802 = msg("00429:01", all279); +var msg802 = msg("00429:01", all274); var select300 = linear_select([ msg801, msg802, ]); -var all280 = all_match({ +var all275 = all_match({ processors: [ dup80, - dup345, - dup297, - dup353, + dup343, + dup295, + dup351, ], on_success: processor_chain([ dup85, @@ -17294,14 +15664,14 @@ var all280 = all_match({ ]), }); -var msg803 = msg("00430", all280); +var msg803 = msg("00430", all275); -var all281 = all_match({ +var all276 = all_match({ processors: [ dup132, - dup345, - dup297, - dup353, + dup343, + dup295, + dup351, ], on_success: processor_chain([ dup85, @@ -17315,28 +15685,28 @@ var all281 = all_match({ ]), }); -var msg804 = msg("00430:01", all281); +var msg804 = msg("00430:01", all276); var select301 = linear_select([ msg803, msg804, ]); -var msg805 = msg("00431", dup417); +var msg805 = msg("00431", dup414); -var msg806 = msg("00432", dup417); +var msg806 = msg("00432", dup414); -var msg807 = msg("00433", dup418); +var msg807 = msg("00433", dup415); -var msg808 = msg("00434", dup418); +var msg808 = msg("00434", dup415); -var msg809 = msg("00435", dup398); +var msg809 = msg("00435", dup395); -var all282 = all_match({ +var all277 = all_match({ processors: [ dup132, - dup345, - dup296, + dup343, + dup294, ], on_success: processor_chain([ dup58, @@ -17349,19 +15719,19 @@ var all282 = all_match({ ]), }); -var msg810 = msg("00435:01", all282); +var msg810 = msg("00435:01", all277); var select302 = linear_select([ msg809, msg810, ]); -var msg811 = msg("00436", dup398); +var msg811 = msg("00436", dup395); -var all283 = all_match({ +var all278 = all_match({ processors: [ dup64, - dup340, + dup338, dup67, ], on_success: processor_chain([ @@ -17376,15 +15746,14 @@ var all283 = all_match({ ]), }); -var msg812 = msg("00436:01", all283); +var msg812 = msg("00436:01", all278); var select303 = linear_select([ msg811, msg812, ]); -var part1307 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#803:00437", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part1302 = match("MESSAGE#803:00437", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup59, @@ -17394,12 +15763,12 @@ match("MESSAGE#803:00437", "nwparser.payload", "%{signame->} has been detected! dup61, ])); -var msg813 = msg("00437", part1307); +var msg813 = msg("00437", part1302); -var all284 = all_match({ +var all279 = all_match({ processors: [ - dup301, - dup340, + dup299, + dup338, dup67, ], on_success: processor_chain([ @@ -17414,10 +15783,9 @@ var all284 = all_match({ ]), }); -var msg814 = msg("00437:01", all284); +var msg814 = msg("00437:01", all279); -var part1308 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.The attack occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#805:00437:02", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1303 = match("MESSAGE#805:00437:02", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup59, @@ -17428,7 +15796,7 @@ match("MESSAGE#805:00437:02", "nwparser.payload", "%{signame->} From %{saddr}:%{ dup9, ])); -var msg815 = msg("00437:02", part1308); +var msg815 = msg("00437:02", part1303); var select304 = linear_select([ msg813, @@ -17436,8 +15804,7 @@ var select304 = linear_select([ msg815, ]); -var part1309 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' using protocol '), Field(protocol,true), Constant(' and arriving at interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times')}" -match("MESSAGE#806:00438", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ +var part1304 = match("MESSAGE#806:00438", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport->} using protocol %{protocol->} and arriving at interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times", processor_chain([ dup58, dup2, dup59, @@ -17447,10 +15814,9 @@ match("MESSAGE#806:00438", "nwparser.payload", "%{signame->} has been detected! dup61, ])); -var msg816 = msg("00438", part1309); +var msg816 = msg("00438", part1304); -var part1310 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', on zone '), Field(zone,true), Constant(' interface '), Field(interface,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#807:00438:01", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ +var part1305 = match("MESSAGE#807:00438:01", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, on zone %{zone->} interface %{interface}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ dup58, dup2, dup59, @@ -17460,12 +15826,12 @@ match("MESSAGE#807:00438:01", "nwparser.payload", "%{signame->} From %{saddr}:%{ dup61, ])); -var msg817 = msg("00438:01", part1310); +var msg817 = msg("00438:01", part1305); -var all285 = all_match({ +var all280 = all_match({ processors: [ - dup301, - dup340, + dup299, + dup338, dup67, ], on_success: processor_chain([ @@ -17480,7 +15846,7 @@ var all285 = all_match({ ]), }); -var msg818 = msg("00438:02", all285); +var msg818 = msg("00438:02", all280); var select305 = linear_select([ msg816, @@ -17488,8 +15854,7 @@ var select305 = linear_select([ msg818, ]); -var part1311 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#809:00440", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1306 = match("MESSAGE#809:00440", "nwparser.payload", "%{signame->} has been detected! From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup59, @@ -17500,10 +15865,9 @@ match("MESSAGE#809:00440", "nwparser.payload", "%{signame->} has been detected! dup60, ])); -var msg819 = msg("00440", part1311); +var msg819 = msg("00440", part1306); -var part1312 = // "Pattern{Field(signame,true), Constant(' has been detected! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#810:00440:02", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ +var part1307 = match("MESSAGE#810:00440:02", "nwparser.payload", "%{signame->} has been detected! From %{saddr}:%{sport->} to %{daddr}:%{dport}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ dup58, dup2, dup59, @@ -17513,12 +15877,12 @@ match("MESSAGE#810:00440:02", "nwparser.payload", "%{signame->} has been detecte dup61, ])); -var msg820 = msg("00440:02", part1312); +var msg820 = msg("00440:02", part1307); -var all286 = all_match({ +var all281 = all_match({ processors: [ - dup241, - dup345, + dup239, + dup343, dup83, ], on_success: processor_chain([ @@ -17533,15 +15897,14 @@ var all286 = all_match({ ]), }); -var msg821 = msg("00440:01", all286); +var msg821 = msg("00440:01", all281); -var part1313 = // "Pattern{Constant('Fragmented traffic! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(group,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#812:00440:03/0", "nwparser.payload", "Fragmented traffic! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{group->} %{p0}"); +var part1308 = match("MESSAGE#812:00440:03/0", "nwparser.payload", "Fragmented traffic! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{group->} %{p0}"); -var all287 = all_match({ +var all282 = all_match({ processors: [ - part1313, - dup345, + part1308, + dup343, dup83, ], on_success: processor_chain([ @@ -17556,7 +15919,7 @@ var all287 = all_match({ ]), }); -var msg822 = msg("00440:03", all287); +var msg822 = msg("00440:03", all282); var select306 = linear_select([ msg819, @@ -17565,8 +15928,7 @@ var select306 = linear_select([ msg822, ]); -var part1314 = // "Pattern{Field(signame,true), Constant(' id='), Field(fld2,false), Constant('! From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#813:00441", "nwparser.payload", "%{signame->} id=%{fld2}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1309 = match("MESSAGE#813:00441", "nwparser.payload", "%{signame->} id=%{fld2}! From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup4, dup59, @@ -17577,14 +15939,13 @@ match("MESSAGE#813:00441", "nwparser.payload", "%{signame->} id=%{fld2}! From %{ dup60, ])); -var msg823 = msg("00441", part1314); +var msg823 = msg("00441", part1309); -var msg824 = msg("00442", dup399); +var msg824 = msg("00442", dup396); -var msg825 = msg("00443", dup399); +var msg825 = msg("00443", dup396); -var part1315 = // "Pattern{Constant('admin '), Field(administrator,true), Constant(' issued command '), Field(fld2,true), Constant(' to redirect output.')}" -match("MESSAGE#816:00511", "nwparser.payload", "admin %{administrator->} issued command %{fld2->} to redirect output.", processor_chain([ +var part1310 = match("MESSAGE#816:00511", "nwparser.payload", "admin %{administrator->} issued command %{fld2->} to redirect output.", processor_chain([ dup1, dup2, dup3, @@ -17592,15 +15953,14 @@ match("MESSAGE#816:00511", "nwparser.payload", "admin %{administrator->} issued dup5, ])); -var msg826 = msg("00511", part1315); +var msg826 = msg("00511", part1310); -var part1316 = // "Pattern{Constant('All System Config saved by admin '), Field(p0,false)}" -match("MESSAGE#817:00511:01/0", "nwparser.payload", "All System Config saved by admin %{p0}"); +var part1311 = match("MESSAGE#817:00511:01/0", "nwparser.payload", "All System Config saved by admin %{p0}"); -var all288 = all_match({ +var all283 = all_match({ processors: [ - part1316, - dup400, + part1311, + dup397, ], on_success: processor_chain([ dup1, @@ -17612,10 +15972,9 @@ var all288 = all_match({ ]), }); -var msg827 = msg("00511:01", all288); +var msg827 = msg("00511:01", all283); -var part1317 = // "Pattern{Constant('All logged events or alarms are cleared by admin '), Field(administrator,false), Constant('.')}" -match("MESSAGE#818:00511:02", "nwparser.payload", "All logged events or alarms are cleared by admin %{administrator}.", processor_chain([ +var part1312 = match("MESSAGE#818:00511:02", "nwparser.payload", "All logged events or alarms are cleared by admin %{administrator}.", processor_chain([ dup1, dup2, dup3, @@ -17623,15 +15982,14 @@ match("MESSAGE#818:00511:02", "nwparser.payload", "All logged events or alarms a dup5, ])); -var msg828 = msg("00511:02", part1317); +var msg828 = msg("00511:02", part1312); -var part1318 = // "Pattern{Constant('Get new software from flash to slot (file: '), Field(fld2,false), Constant(') by admin '), Field(p0,false)}" -match("MESSAGE#819:00511:03/0", "nwparser.payload", "Get new software from flash to slot (file: %{fld2}) by admin %{p0}"); +var part1313 = match("MESSAGE#819:00511:03/0", "nwparser.payload", "Get new software from flash to slot (file: %{fld2}) by admin %{p0}"); -var all289 = all_match({ +var all284 = all_match({ processors: [ - part1318, - dup400, + part1313, + dup397, ], on_success: processor_chain([ dup1, @@ -17643,15 +16001,14 @@ var all289 = all_match({ ]), }); -var msg829 = msg("00511:03", all289); +var msg829 = msg("00511:03", all284); -var part1319 = // "Pattern{Constant('Get new software from '), Field(hostip,true), Constant(' (file: '), Field(fld2,false), Constant(') to slot (file: '), Field(fld3,false), Constant(') by admin '), Field(p0,false)}" -match("MESSAGE#820:00511:04/0", "nwparser.payload", "Get new software from %{hostip->} (file: %{fld2}) to slot (file: %{fld3}) by admin %{p0}"); +var part1314 = match("MESSAGE#820:00511:04/0", "nwparser.payload", "Get new software from %{hostip->} (file: %{fld2}) to slot (file: %{fld3}) by admin %{p0}"); -var all290 = all_match({ +var all285 = all_match({ processors: [ - part1319, - dup400, + part1314, + dup397, ], on_success: processor_chain([ dup1, @@ -17663,15 +16020,14 @@ var all290 = all_match({ ]), }); -var msg830 = msg("00511:04", all290); +var msg830 = msg("00511:04", all285); -var part1320 = // "Pattern{Constant('Get new software to '), Field(hostip,true), Constant(' (file: '), Field(fld2,false), Constant(') by admin '), Field(p0,false)}" -match("MESSAGE#821:00511:05/0", "nwparser.payload", "Get new software to %{hostip->} (file: %{fld2}) by admin %{p0}"); +var part1315 = match("MESSAGE#821:00511:05/0", "nwparser.payload", "Get new software to %{hostip->} (file: %{fld2}) by admin %{p0}"); -var all291 = all_match({ +var all286 = all_match({ processors: [ - part1320, - dup400, + part1315, + dup397, ], on_success: processor_chain([ dup1, @@ -17683,15 +16039,14 @@ var all291 = all_match({ ]), }); -var msg831 = msg("00511:05", all291); +var msg831 = msg("00511:05", all286); -var part1321 = // "Pattern{Constant('Log setting is modified by admin '), Field(p0,false)}" -match("MESSAGE#822:00511:06/0", "nwparser.payload", "Log setting is modified by admin %{p0}"); +var part1316 = match("MESSAGE#822:00511:06/0", "nwparser.payload", "Log setting is modified by admin %{p0}"); -var all292 = all_match({ +var all287 = all_match({ processors: [ - part1321, - dup400, + part1316, + dup397, ], on_success: processor_chain([ dup1, @@ -17703,15 +16058,14 @@ var all292 = all_match({ ]), }); -var msg832 = msg("00511:06", all292); +var msg832 = msg("00511:06", all287); -var part1322 = // "Pattern{Constant('Save configuration to '), Field(hostip,true), Constant(' (file: '), Field(fld2,false), Constant(') by admin '), Field(p0,false)}" -match("MESSAGE#823:00511:07/0", "nwparser.payload", "Save configuration to %{hostip->} (file: %{fld2}) by admin %{p0}"); +var part1317 = match("MESSAGE#823:00511:07/0", "nwparser.payload", "Save configuration to %{hostip->} (file: %{fld2}) by admin %{p0}"); -var all293 = all_match({ +var all288 = all_match({ processors: [ - part1322, - dup400, + part1317, + dup397, ], on_success: processor_chain([ dup1, @@ -17723,15 +16077,14 @@ var all293 = all_match({ ]), }); -var msg833 = msg("00511:07", all293); +var msg833 = msg("00511:07", all288); -var part1323 = // "Pattern{Constant('Save new software from slot (file: '), Field(fld2,false), Constant(') to flash by admin '), Field(p0,false)}" -match("MESSAGE#824:00511:08/0", "nwparser.payload", "Save new software from slot (file: %{fld2}) to flash by admin %{p0}"); +var part1318 = match("MESSAGE#824:00511:08/0", "nwparser.payload", "Save new software from slot (file: %{fld2}) to flash by admin %{p0}"); -var all294 = all_match({ +var all289 = all_match({ processors: [ - part1323, - dup400, + part1318, + dup397, ], on_success: processor_chain([ dup1, @@ -17743,15 +16096,14 @@ var all294 = all_match({ ]), }); -var msg834 = msg("00511:08", all294); +var msg834 = msg("00511:08", all289); -var part1324 = // "Pattern{Constant('Save new software from '), Field(hostip,true), Constant(' (file: '), Field(result,false), Constant(') to flash by admin '), Field(p0,false)}" -match("MESSAGE#825:00511:09/0", "nwparser.payload", "Save new software from %{hostip->} (file: %{result}) to flash by admin %{p0}"); +var part1319 = match("MESSAGE#825:00511:09/0", "nwparser.payload", "Save new software from %{hostip->} (file: %{result}) to flash by admin %{p0}"); -var all295 = all_match({ +var all290 = all_match({ processors: [ - part1324, - dup400, + part1319, + dup397, ], on_success: processor_chain([ dup1, @@ -17763,15 +16115,14 @@ var all295 = all_match({ ]), }); -var msg835 = msg("00511:09", all295); +var msg835 = msg("00511:09", all290); -var part1325 = // "Pattern{Constant('System Config from flash to slot - '), Field(fld2,true), Constant(' by admin '), Field(p0,false)}" -match("MESSAGE#826:00511:10/0", "nwparser.payload", "System Config from flash to slot - %{fld2->} by admin %{p0}"); +var part1320 = match("MESSAGE#826:00511:10/0", "nwparser.payload", "System Config from flash to slot - %{fld2->} by admin %{p0}"); -var all296 = all_match({ +var all291 = all_match({ processors: [ - part1325, - dup400, + part1320, + dup397, ], on_success: processor_chain([ dup1, @@ -17783,15 +16134,14 @@ var all296 = all_match({ ]), }); -var msg836 = msg("00511:10", all296); +var msg836 = msg("00511:10", all291); -var part1326 = // "Pattern{Constant('System Config load from '), Field(hostip,true), Constant(' (file '), Field(fld2,false), Constant(') to slot - '), Field(fld3,true), Constant(' by admin '), Field(p0,false)}" -match("MESSAGE#827:00511:11/0", "nwparser.payload", "System Config load from %{hostip->} (file %{fld2}) to slot - %{fld3->} by admin %{p0}"); +var part1321 = match("MESSAGE#827:00511:11/0", "nwparser.payload", "System Config load from %{hostip->} (file %{fld2}) to slot - %{fld3->} by admin %{p0}"); -var all297 = all_match({ +var all292 = all_match({ processors: [ - part1326, - dup400, + part1321, + dup397, ], on_success: processor_chain([ dup1, @@ -17803,15 +16153,14 @@ var all297 = all_match({ ]), }); -var msg837 = msg("00511:11", all297); +var msg837 = msg("00511:11", all292); -var part1327 = // "Pattern{Constant('System Config load from '), Field(hostip,true), Constant(' (file '), Field(fld2,false), Constant(') by admin '), Field(p0,false)}" -match("MESSAGE#828:00511:12/0", "nwparser.payload", "System Config load from %{hostip->} (file %{fld2}) by admin %{p0}"); +var part1322 = match("MESSAGE#828:00511:12/0", "nwparser.payload", "System Config load from %{hostip->} (file %{fld2}) by admin %{p0}"); -var all298 = all_match({ +var all293 = all_match({ processors: [ - part1327, - dup400, + part1322, + dup397, ], on_success: processor_chain([ dup1, @@ -17823,15 +16172,14 @@ var all298 = all_match({ ]), }); -var msg838 = msg("00511:12", all298); +var msg838 = msg("00511:12", all293); -var part1328 = // "Pattern{Constant('The system configuration was loaded from the slot by admin '), Field(p0,false)}" -match("MESSAGE#829:00511:13/0", "nwparser.payload", "The system configuration was loaded from the slot by admin %{p0}"); +var part1323 = match("MESSAGE#829:00511:13/0", "nwparser.payload", "The system configuration was loaded from the slot by admin %{p0}"); -var all299 = all_match({ +var all294 = all_match({ processors: [ - part1328, - dup400, + part1323, + dup397, ], on_success: processor_chain([ dup1, @@ -17843,10 +16191,9 @@ var all299 = all_match({ ]), }); -var msg839 = msg("00511:13", all299); +var msg839 = msg("00511:13", all294); -var part1329 = // "Pattern{Constant('FIPS: Attempt to set RADIUS shared secret with invalid length '), Field(fld2,false)}" -match("MESSAGE#830:00511:14", "nwparser.payload", "FIPS: Attempt to set RADIUS shared secret with invalid length %{fld2}", processor_chain([ +var part1324 = match("MESSAGE#830:00511:14", "nwparser.payload", "FIPS: Attempt to set RADIUS shared secret with invalid length %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -17854,7 +16201,7 @@ match("MESSAGE#830:00511:14", "nwparser.payload", "FIPS: Attempt to set RADIUS s dup5, ])); -var msg840 = msg("00511:14", part1329); +var msg840 = msg("00511:14", part1324); var select307 = linear_select([ msg826, @@ -17874,37 +16221,32 @@ var select307 = linear_select([ msg840, ]); -var part1330 = // "Pattern{Constant('The physical state of '), Field(p0,false)}" -match("MESSAGE#831:00513/0", "nwparser.payload", "The physical state of %{p0}"); +var part1325 = match("MESSAGE#831:00513/0", "nwparser.payload", "The physical state of %{p0}"); -var part1331 = // "Pattern{Constant('the Interface '), Field(p0,false)}" -match("MESSAGE#831:00513/1_1", "nwparser.p0", "the Interface %{p0}"); +var part1326 = match("MESSAGE#831:00513/1_1", "nwparser.p0", "the Interface %{p0}"); var select308 = linear_select([ dup123, - part1331, + part1326, dup122, ]); -var part1332 = // "Pattern{Constant(''), Field(interface,true), Constant(' has changed to '), Field(p0,false)}" -match("MESSAGE#831:00513/2", "nwparser.p0", "%{interface->} has changed to %{p0}"); +var part1327 = match("MESSAGE#831:00513/2", "nwparser.p0", "%{interface->} has changed to %{p0}"); -var part1333 = // "Pattern{Field(result,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#831:00513/3_0", "nwparser.p0", "%{result}. (%{fld1})"); +var part1328 = match("MESSAGE#831:00513/3_0", "nwparser.p0", "%{result}. (%{fld1})"); -var part1334 = // "Pattern{Field(result,false)}" -match_copy("MESSAGE#831:00513/3_1", "nwparser.p0", "result"); +var part1329 = match_copy("MESSAGE#831:00513/3_1", "nwparser.p0", "result"); var select309 = linear_select([ - part1333, - part1334, + part1328, + part1329, ]); -var all300 = all_match({ +var all295 = all_match({ processors: [ - part1330, + part1325, select308, - part1332, + part1327, select309, ], on_success: processor_chain([ @@ -17917,39 +16259,35 @@ var all300 = all_match({ ]), }); -var msg841 = msg("00513", all300); +var msg841 = msg("00513", all295); -var part1335 = // "Pattern{Constant('Vsys Admin '), Field(p0,false)}" -match("MESSAGE#832:00515/0_0", "nwparser.payload", "Vsys Admin %{p0}"); +var part1330 = match("MESSAGE#832:00515/0_0", "nwparser.payload", "Vsys Admin %{p0}"); var select310 = linear_select([ - part1335, - dup289, + part1330, + dup287, ]); -var part1336 = // "Pattern{Constant(''), Field(administrator,true), Constant(' has logged on via the '), Field(logon_type,true), Constant(' ( HTTP'), Field(p0,false)}" -match("MESSAGE#832:00515/1", "nwparser.p0", "%{administrator->} has logged on via the %{logon_type->} ( HTTP%{p0}"); +var part1331 = match("MESSAGE#832:00515/1", "nwparser.p0", "%{administrator->} has logged on via the %{logon_type->} ( HTTP%{p0}"); -var part1337 = // "Pattern{Constant('S'), Field(p0,false)}" -match("MESSAGE#832:00515/2_1", "nwparser.p0", "S%{p0}"); +var part1332 = match("MESSAGE#832:00515/2_1", "nwparser.p0", "S%{p0}"); var select311 = linear_select([ dup96, - part1337, + part1332, ]); -var part1338 = // "Pattern{Field(,false), Constant(') to port '), Field(interface,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#832:00515/3", "nwparser.p0", "%{}) to port %{interface->} from %{saddr}:%{sport}"); +var part1333 = match("MESSAGE#832:00515/3", "nwparser.p0", "%{}) to port %{interface->} from %{saddr}:%{sport}"); -var all301 = all_match({ +var all296 = all_match({ processors: [ select310, - part1336, + part1331, select311, - part1338, + part1333, ], on_success: processor_chain([ - dup303, + dup301, dup2, dup3, dup4, @@ -17957,33 +16295,29 @@ var all301 = all_match({ ]), }); -var msg842 = msg("00515", all301); +var msg842 = msg("00515", all296); -var part1339 = // "Pattern{Constant('Login attempt to system by admin '), Field(administrator,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#833:00515:01/0", "nwparser.payload", "Login attempt to system by admin %{administrator->} via %{p0}"); +var part1334 = match("MESSAGE#833:00515:01/0", "nwparser.payload", "Login attempt to system by admin %{administrator->} via %{p0}"); -var part1340 = // "Pattern{Constant('the '), Field(logon_type,true), Constant(' has failed '), Field(p0,false)}" -match("MESSAGE#833:00515:01/1_0", "nwparser.p0", "the %{logon_type->} has failed %{p0}"); +var part1335 = match("MESSAGE#833:00515:01/1_0", "nwparser.p0", "the %{logon_type->} has failed %{p0}"); -var part1341 = // "Pattern{Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has failed '), Field(p0,false)}" -match("MESSAGE#833:00515:01/1_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} has failed %{p0}"); +var part1336 = match("MESSAGE#833:00515:01/1_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} has failed %{p0}"); var select312 = linear_select([ - part1340, - part1341, + part1335, + part1336, ]); -var part1342 = // "Pattern{Field(fld2,false)}" -match_copy("MESSAGE#833:00515:01/2", "nwparser.p0", "fld2"); +var part1337 = match_copy("MESSAGE#833:00515:01/2", "nwparser.p0", "fld2"); -var all302 = all_match({ +var all297 = all_match({ processors: [ - part1339, + part1334, select312, - part1342, + part1337, ], on_success: processor_chain([ - dup208, + dup206, dup29, dup30, dup31, @@ -17991,48 +16325,42 @@ var all302 = all_match({ dup2, dup4, dup5, - dup304, + dup302, dup3, ]), }); -var msg843 = msg("00515:01", all302); +var msg843 = msg("00515:01", all297); -var part1343 = // "Pattern{Constant('Management session via '), Field(p0,false)}" -match("MESSAGE#834:00515:02/0", "nwparser.payload", "Management session via %{p0}"); +var part1338 = match("MESSAGE#834:00515:02/0", "nwparser.payload", "Management session via %{p0}"); -var part1344 = // "Pattern{Constant('the '), Field(logon_type,true), Constant(' for '), Field(p0,false)}" -match("MESSAGE#834:00515:02/1_0", "nwparser.p0", "the %{logon_type->} for %{p0}"); +var part1339 = match("MESSAGE#834:00515:02/1_0", "nwparser.p0", "the %{logon_type->} for %{p0}"); -var part1345 = // "Pattern{Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' for '), Field(p0,false)}" -match("MESSAGE#834:00515:02/1_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} for %{p0}"); +var part1340 = match("MESSAGE#834:00515:02/1_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} for %{p0}"); var select313 = linear_select([ - part1344, - part1345, + part1339, + part1340, ]); -var part1346 = // "Pattern{Constant('[vsys] admin '), Field(p0,false)}" -match("MESSAGE#834:00515:02/2_0", "nwparser.p0", "[vsys] admin %{p0}"); +var part1341 = match("MESSAGE#834:00515:02/2_0", "nwparser.p0", "[vsys] admin %{p0}"); -var part1347 = // "Pattern{Constant('vsys admin '), Field(p0,false)}" -match("MESSAGE#834:00515:02/2_1", "nwparser.p0", "vsys admin %{p0}"); +var part1342 = match("MESSAGE#834:00515:02/2_1", "nwparser.p0", "vsys admin %{p0}"); var select314 = linear_select([ - part1346, - part1347, + part1341, + part1342, dup15, ]); -var part1348 = // "Pattern{Constant(''), Field(administrator,true), Constant(' has timed out')}" -match("MESSAGE#834:00515:02/3", "nwparser.p0", "%{administrator->} has timed out"); +var part1343 = match("MESSAGE#834:00515:02/3", "nwparser.p0", "%{administrator->} has timed out"); -var all303 = all_match({ +var all298 = all_match({ processors: [ - part1343, + part1338, select313, select314, - part1348, + part1343, ], on_success: processor_chain([ dup27, @@ -18043,40 +16371,36 @@ var all303 = all_match({ ]), }); -var msg844 = msg("00515:02", all303); +var msg844 = msg("00515:02", all298); -var part1349 = // "Pattern{Constant('[Vsys] '), Field(p0,false)}" -match("MESSAGE#835:00515:04/0_0", "nwparser.payload", "[Vsys] %{p0}"); +var part1344 = match("MESSAGE#835:00515:04/0_0", "nwparser.payload", "[Vsys] %{p0}"); -var part1350 = // "Pattern{Constant('Vsys '), Field(p0,false)}" -match("MESSAGE#835:00515:04/0_1", "nwparser.payload", "Vsys %{p0}"); +var part1345 = match("MESSAGE#835:00515:04/0_1", "nwparser.payload", "Vsys %{p0}"); var select315 = linear_select([ - part1349, - part1350, + part1344, + part1345, ]); -var part1351 = // "Pattern{Constant('Admin '), Field(administrator,true), Constant(' has logged o'), Field(p0,false)}" -match("MESSAGE#835:00515:04/1", "nwparser.p0", "Admin %{administrator->} has logged o%{p0}"); +var part1346 = match("MESSAGE#835:00515:04/1", "nwparser.p0", "Admin %{administrator->} has logged o%{p0}"); -var part1352 = // "Pattern{Field(logon_type,false)}" -match_copy("MESSAGE#835:00515:04/4_1", "nwparser.p0", "logon_type"); +var part1347 = match_copy("MESSAGE#835:00515:04/4_1", "nwparser.p0", "logon_type"); var select316 = linear_select([ - dup306, - part1352, + dup304, + part1347, ]); -var all304 = all_match({ +var all299 = all_match({ processors: [ select315, - part1351, - dup401, + part1346, + dup398, dup40, select316, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -18084,50 +16408,46 @@ var all304 = all_match({ ]), }); -var msg845 = msg("00515:04", all304); +var msg845 = msg("00515:04", all299); -var part1353 = // "Pattern{Constant('Admin User '), Field(administrator,true), Constant(' has logged on via '), Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#836:00515:06", "nwparser.payload", "Admin User %{administrator->} has logged on via %{logon_type->} from %{saddr}:%{sport}", processor_chain([ - dup242, +var part1348 = match("MESSAGE#836:00515:06", "nwparser.payload", "Admin User %{administrator->} has logged on via %{logon_type->} from %{saddr}:%{sport}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg846 = msg("00515:06", part1353); +var msg846 = msg("00515:06", part1348); -var part1354 = // "Pattern{Field(,false), Constant('Admin '), Field(p0,false)}" -match("MESSAGE#837:00515:05/0", "nwparser.payload", "%{}Admin %{p0}"); +var part1349 = match("MESSAGE#837:00515:05/0", "nwparser.payload", "%{}Admin %{p0}"); var select317 = linear_select([ - dup307, + dup305, dup16, ]); -var part1355 = // "Pattern{Constant(''), Field(administrator,true), Constant(' has logged o'), Field(p0,false)}" -match("MESSAGE#837:00515:05/2", "nwparser.p0", "%{administrator->} has logged o%{p0}"); +var part1350 = match("MESSAGE#837:00515:05/2", "nwparser.p0", "%{administrator->} has logged o%{p0}"); -var part1356 = // "Pattern{Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(fld2,false), Constant(')')}" -match("MESSAGE#837:00515:05/5_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} (%{fld2})"); +var part1351 = match("MESSAGE#837:00515:05/5_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} (%{fld2})"); var select318 = linear_select([ - dup308, - part1356, dup306, + part1351, + dup304, ]); -var all305 = all_match({ +var all300 = all_match({ processors: [ - part1354, + part1349, select317, - part1355, - dup401, + part1350, + dup398, dup40, select318, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -18135,44 +16455,39 @@ var all305 = all_match({ ]), }); -var msg847 = msg("00515:05", all305); +var msg847 = msg("00515:05", all300); -var part1357 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' login attempt for '), Field(logon_type,false), Constant('(http) management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' '), Field(disposition,false)}" -match("MESSAGE#838:00515:07", "nwparser.payload", "Admin user %{administrator->} login attempt for %{logon_type}(http) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}", processor_chain([ - dup242, +var part1352 = match("MESSAGE#838:00515:07", "nwparser.payload", "Admin user %{administrator->} login attempt for %{logon_type}(http) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg848 = msg("00515:07", part1357); +var msg848 = msg("00515:07", part1352); -var part1358 = // "Pattern{Field(fld2,true), Constant(' Admin User "'), Field(administrator,false), Constant('" logged in for '), Field(logon_type,false), Constant('(http'), Field(p0,false)}" -match("MESSAGE#839:00515:08/0", "nwparser.payload", "%{fld2->} Admin User \"%{administrator}\" logged in for %{logon_type}(http%{p0}"); +var part1353 = match("MESSAGE#839:00515:08/0", "nwparser.payload", "%{fld2->} Admin User \"%{administrator}\" logged in for %{logon_type}(http%{p0}"); -var part1359 = // "Pattern{Constant(') '), Field(p0,false)}" -match("MESSAGE#839:00515:08/1_0", "nwparser.p0", ") %{p0}"); +var part1354 = match("MESSAGE#839:00515:08/1_0", "nwparser.p0", ") %{p0}"); -var part1360 = // "Pattern{Constant('s) '), Field(p0,false)}" -match("MESSAGE#839:00515:08/1_1", "nwparser.p0", "s) %{p0}"); +var part1355 = match("MESSAGE#839:00515:08/1_1", "nwparser.p0", "s) %{p0}"); var select319 = linear_select([ - part1359, - part1360, + part1354, + part1355, ]); -var part1361 = // "Pattern{Constant('management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#839:00515:08/2", "nwparser.p0", "management (port %{network_port}) from %{saddr}:%{sport}"); +var part1356 = match("MESSAGE#839:00515:08/2", "nwparser.p0", "management (port %{network_port}) from %{saddr}:%{sport}"); -var all306 = all_match({ +var all301 = all_match({ processors: [ - part1358, + part1353, select319, - part1361, + part1356, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -18180,32 +16495,29 @@ var all306 = all_match({ ]), }); -var msg849 = msg("00515:08", all306); +var msg849 = msg("00515:08", all301); -var part1362 = // "Pattern{Constant('User '), Field(username,true), Constant(' telnet management session from ('), Field(saddr,false), Constant(':'), Field(sport,false), Constant(') timed out')}" -match("MESSAGE#840:00515:09", "nwparser.payload", "User %{username->} telnet management session from (%{saddr}:%{sport}) timed out", processor_chain([ - dup242, +var part1357 = match("MESSAGE#840:00515:09", "nwparser.payload", "User %{username->} telnet management session from (%{saddr}:%{sport}) timed out", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg850 = msg("00515:09", part1362); +var msg850 = msg("00515:09", part1357); -var part1363 = // "Pattern{Constant('User '), Field(username,true), Constant(' logged out of telnet session from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#841:00515:10", "nwparser.payload", "User %{username->} logged out of telnet session from %{saddr}:%{sport}", processor_chain([ - dup242, +var part1358 = match("MESSAGE#841:00515:10", "nwparser.payload", "User %{username->} logged out of telnet session from %{saddr}:%{sport}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg851 = msg("00515:10", part1363); +var msg851 = msg("00515:10", part1358); -var part1364 = // "Pattern{Constant('The session limit threshold has been set to '), Field(trigger_val,true), Constant(' on zone '), Field(zone,false), Constant('.')}" -match("MESSAGE#842:00515:11", "nwparser.payload", "The session limit threshold has been set to %{trigger_val->} on zone %{zone}.", processor_chain([ +var part1359 = match("MESSAGE#842:00515:11", "nwparser.payload", "The session limit threshold has been set to %{trigger_val->} on zone %{zone}.", processor_chain([ dup1, dup2, dup3, @@ -18213,22 +16525,20 @@ match("MESSAGE#842:00515:11", "nwparser.payload", "The session limit threshold h dup5, ])); -var msg852 = msg("00515:11", part1364); +var msg852 = msg("00515:11", part1359); -var part1365 = // "Pattern{Constant('[ Vsys ] Admin User "'), Field(administrator,false), Constant('" logged in for Web( http'), Field(p0,false)}" -match("MESSAGE#843:00515:12/0", "nwparser.payload", "[ Vsys ] Admin User \"%{administrator}\" logged in for Web( http%{p0}"); +var part1360 = match("MESSAGE#843:00515:12/0", "nwparser.payload", "[ Vsys ] Admin User \"%{administrator}\" logged in for Web( http%{p0}"); -var part1366 = // "Pattern{Constant(') management (port '), Field(network_port,false), Constant(')')}" -match("MESSAGE#843:00515:12/2", "nwparser.p0", ") management (port %{network_port})"); +var part1361 = match("MESSAGE#843:00515:12/2", "nwparser.p0", ") management (port %{network_port})"); -var all307 = all_match({ +var all302 = all_match({ processors: [ - part1365, - dup402, - part1366, + part1360, + dup399, + part1361, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -18236,31 +16546,30 @@ var all307 = all_match({ ]), }); -var msg853 = msg("00515:12", all307); +var msg853 = msg("00515:12", all302); var select320 = linear_select([ - dup290, - dup289, + dup288, + dup287, ]); -var part1367 = // "Pattern{Constant('user '), Field(administrator,true), Constant(' has logged o'), Field(p0,false)}" -match("MESSAGE#844:00515:13/1", "nwparser.p0", "user %{administrator->} has logged o%{p0}"); +var part1362 = match("MESSAGE#844:00515:13/1", "nwparser.p0", "user %{administrator->} has logged o%{p0}"); var select321 = linear_select([ - dup308, dup306, + dup304, ]); -var all308 = all_match({ +var all303 = all_match({ processors: [ select320, - part1367, - dup401, + part1362, + dup398, dup40, select321, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -18268,46 +16577,40 @@ var all308 = all_match({ ]), }); -var msg854 = msg("00515:13", all308); +var msg854 = msg("00515:13", all303); -var part1368 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' has been forced to log o'), Field(p0,false)}" -match("MESSAGE#845:00515:14/0_0", "nwparser.payload", "Admin user %{administrator->} has been forced to log o%{p0}"); +var part1363 = match("MESSAGE#845:00515:14/0_0", "nwparser.payload", "Admin user %{administrator->} has been forced to log o%{p0}"); -var part1369 = // "Pattern{Field(username,true), Constant(' '), Field(fld1,true), Constant(' has been forced to log o'), Field(p0,false)}" -match("MESSAGE#845:00515:14/0_1", "nwparser.payload", "%{username->} %{fld1->} has been forced to log o%{p0}"); +var part1364 = match("MESSAGE#845:00515:14/0_1", "nwparser.payload", "%{username->} %{fld1->} has been forced to log o%{p0}"); var select322 = linear_select([ - part1368, - part1369, + part1363, + part1364, ]); -var part1370 = // "Pattern{Constant('of the '), Field(p0,false)}" -match("MESSAGE#845:00515:14/2", "nwparser.p0", "of the %{p0}"); +var part1365 = match("MESSAGE#845:00515:14/2", "nwparser.p0", "of the %{p0}"); -var part1371 = // "Pattern{Constant('serial '), Field(logon_type,true), Constant(' session.')}" -match("MESSAGE#845:00515:14/3_0", "nwparser.p0", "serial %{logon_type->} session."); +var part1366 = match("MESSAGE#845:00515:14/3_0", "nwparser.p0", "serial %{logon_type->} session."); -var part1372 = // "Pattern{Field(logon_type,true), Constant(' session on host '), Field(hostip,false), Constant(':'), Field(network_port,true), Constant(' ('), Field(event_time,false), Constant(')')}" -match("MESSAGE#845:00515:14/3_1", "nwparser.p0", "%{logon_type->} session on host %{hostip}:%{network_port->} (%{event_time})"); +var part1367 = match("MESSAGE#845:00515:14/3_1", "nwparser.p0", "%{logon_type->} session on host %{hostip}:%{network_port->} (%{event_time})"); -var part1373 = // "Pattern{Field(logon_type,true), Constant(' session on host '), Field(hostip,false), Constant(':'), Field(network_port,false)}" -match("MESSAGE#845:00515:14/3_2", "nwparser.p0", "%{logon_type->} session on host %{hostip}:%{network_port}"); +var part1368 = match("MESSAGE#845:00515:14/3_2", "nwparser.p0", "%{logon_type->} session on host %{hostip}:%{network_port}"); var select323 = linear_select([ - part1371, - part1372, - part1373, + part1366, + part1367, + part1368, ]); -var all309 = all_match({ +var all304 = all_match({ processors: [ select322, - dup401, - part1370, + dup398, + part1365, select323, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -18315,32 +16618,29 @@ var all309 = all_match({ ]), }); -var msg855 = msg("00515:14", all309); +var msg855 = msg("00515:14", all304); -var part1374 = // "Pattern{Field(fld2,false), Constant(': Admin User '), Field(administrator,true), Constant(' has logged o'), Field(p0,false)}" -match("MESSAGE#846:00515:15/0", "nwparser.payload", "%{fld2}: Admin User %{administrator->} has logged o%{p0}"); +var part1369 = match("MESSAGE#846:00515:15/0", "nwparser.payload", "%{fld2}: Admin User %{administrator->} has logged o%{p0}"); -var part1375 = // "Pattern{Constant('the '), Field(logon_type,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#846:00515:15/3_0", "nwparser.p0", "the %{logon_type->} (%{p0}"); +var part1370 = match("MESSAGE#846:00515:15/3_0", "nwparser.p0", "the %{logon_type->} (%{p0}"); -var part1376 = // "Pattern{Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#846:00515:15/3_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} (%{p0}"); +var part1371 = match("MESSAGE#846:00515:15/3_1", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport->} (%{p0}"); var select324 = linear_select([ - part1375, - part1376, + part1370, + part1371, ]); -var all310 = all_match({ +var all305 = all_match({ processors: [ - part1374, - dup401, + part1369, + dup398, dup40, select324, dup41, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup9, @@ -18349,31 +16649,28 @@ var all310 = all_match({ ]), }); -var msg856 = msg("00515:15", all310); +var msg856 = msg("00515:15", all305); -var part1377 = // "Pattern{Field(fld2,false), Constant(': Admin '), Field(p0,false)}" -match("MESSAGE#847:00515:16/0_0", "nwparser.payload", "%{fld2}: Admin %{p0}"); +var part1372 = match("MESSAGE#847:00515:16/0_0", "nwparser.payload", "%{fld2}: Admin %{p0}"); var select325 = linear_select([ - part1377, - dup289, + part1372, + dup287, ]); -var part1378 = // "Pattern{Constant('user '), Field(administrator,true), Constant(' attempt access to '), Field(url,true), Constant(' illegal from '), Field(logon_type,false), Constant('( http'), Field(p0,false)}" -match("MESSAGE#847:00515:16/1", "nwparser.p0", "user %{administrator->} attempt access to %{url->} illegal from %{logon_type}( http%{p0}"); +var part1373 = match("MESSAGE#847:00515:16/1", "nwparser.p0", "user %{administrator->} attempt access to %{url->} illegal from %{logon_type}( http%{p0}"); -var part1379 = // "Pattern{Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#847:00515:16/3", "nwparser.p0", ") management (port %{network_port}) from %{saddr}:%{sport}. (%{fld1})"); +var part1374 = match("MESSAGE#847:00515:16/3", "nwparser.p0", ") management (port %{network_port}) from %{saddr}:%{sport}. (%{fld1})"); -var all311 = all_match({ +var all306 = all_match({ processors: [ select325, - part1378, - dup402, - part1379, + part1373, + dup399, + part1374, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup9, @@ -18382,33 +16679,29 @@ var all311 = all_match({ ]), }); -var msg857 = msg("00515:16", all311); +var msg857 = msg("00515:16", all306); -var part1380 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" logged out for '), Field(logon_type,false), Constant('('), Field(p0,false)}" -match("MESSAGE#848:00515:17/0", "nwparser.payload", "Admin user \"%{administrator}\" logged out for %{logon_type}(%{p0}"); +var part1375 = match("MESSAGE#848:00515:17/0", "nwparser.payload", "Admin user \"%{administrator}\" logged out for %{logon_type}(%{p0}"); -var part1381 = // "Pattern{Constant('https '), Field(p0,false)}" -match("MESSAGE#848:00515:17/1_0", "nwparser.p0", "https %{p0}"); +var part1376 = match("MESSAGE#848:00515:17/1_0", "nwparser.p0", "https %{p0}"); -var part1382 = // "Pattern{Constant(' http '), Field(p0,false)}" -match("MESSAGE#848:00515:17/1_1", "nwparser.p0", " http %{p0}"); +var part1377 = match("MESSAGE#848:00515:17/1_1", "nwparser.p0", " http %{p0}"); var select326 = linear_select([ - part1381, - part1382, + part1376, + part1377, ]); -var part1383 = // "Pattern{Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#848:00515:17/2", "nwparser.p0", ") management (port %{network_port}) from %{saddr}:%{sport}"); +var part1378 = match("MESSAGE#848:00515:17/2", "nwparser.p0", ") management (port %{network_port}) from %{saddr}:%{sport}"); -var all312 = all_match({ +var all307 = all_match({ processors: [ - part1380, + part1375, select326, - part1383, + part1378, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup4, @@ -18416,11 +16709,10 @@ var all312 = all_match({ ]), }); -var msg858 = msg("00515:17", all312); +var msg858 = msg("00515:17", all307); -var part1384 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' login attempt for '), Field(logon_type,false), Constant('(https) management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#849:00515:18", "nwparser.payload", "Admin user %{administrator->} login attempt for %{logon_type}(https) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}. (%{fld1})", processor_chain([ - dup242, +var part1379 = match("MESSAGE#849:00515:18", "nwparser.payload", "Admin user %{administrator->} login attempt for %{logon_type}(https) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}. (%{fld1})", processor_chain([ + dup240, dup2, dup3, dup9, @@ -18428,30 +16720,27 @@ match("MESSAGE#849:00515:18", "nwparser.payload", "Admin user %{administrator->} dup5, ])); -var msg859 = msg("00515:18", part1384); +var msg859 = msg("00515:18", part1379); -var part1385 = // "Pattern{Constant('Vsys admin user '), Field(administrator,true), Constant(' logged on via '), Field(p0,false)}" -match("MESSAGE#850:00515:19/0", "nwparser.payload", "Vsys admin user %{administrator->} logged on via %{p0}"); +var part1380 = match("MESSAGE#850:00515:19/0", "nwparser.payload", "Vsys admin user %{administrator->} logged on via %{p0}"); -var part1386 = // "Pattern{Field(logon_type,true), Constant(' from remote IP address '), Field(saddr,true), Constant(' using port '), Field(sport,false), Constant('. ('), Field(p0,false)}" -match("MESSAGE#850:00515:19/1_0", "nwparser.p0", "%{logon_type->} from remote IP address %{saddr->} using port %{sport}. (%{p0}"); +var part1381 = match("MESSAGE#850:00515:19/1_0", "nwparser.p0", "%{logon_type->} from remote IP address %{saddr->} using port %{sport}. (%{p0}"); -var part1387 = // "Pattern{Constant('the console. ('), Field(p0,false)}" -match("MESSAGE#850:00515:19/1_1", "nwparser.p0", "the console. (%{p0}"); +var part1382 = match("MESSAGE#850:00515:19/1_1", "nwparser.p0", "the console. (%{p0}"); var select327 = linear_select([ - part1386, - part1387, + part1381, + part1382, ]); -var all313 = all_match({ +var all308 = all_match({ processors: [ - part1385, + part1380, select327, dup41, ], on_success: processor_chain([ - dup242, + dup240, dup2, dup3, dup9, @@ -18460,11 +16749,10 @@ var all313 = all_match({ ]), }); -var msg860 = msg("00515:19", all313); +var msg860 = msg("00515:19", all308); -var part1388 = // "Pattern{Constant('netscreen: Management session via SCS from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' for admin netscreen has timed out ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#851:00515:20", "nwparser.payload", "netscreen: Management session via SCS from %{saddr}:%{sport->} for admin netscreen has timed out (%{fld1})", processor_chain([ - dup242, +var part1383 = match("MESSAGE#851:00515:20", "nwparser.payload", "netscreen: Management session via SCS from %{saddr}:%{sport->} for admin netscreen has timed out (%{fld1})", processor_chain([ + dup240, dup2, dup3, dup9, @@ -18472,7 +16760,7 @@ match("MESSAGE#851:00515:20", "nwparser.payload", "netscreen: Management session dup5, ])); -var msg861 = msg("00515:20", part1388); +var msg861 = msg("00515:20", part1383); var select328 = linear_select([ msg842, @@ -18497,85 +16785,77 @@ var select328 = linear_select([ msg861, ]); -var part1389 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' '), Field(fld1,false), Constant('at '), Field(saddr,true), Constant(' has been '), Field(disposition,true), Constant(' via the '), Field(logon_type,true), Constant(' server at '), Field(hostip,false)}" -match("MESSAGE#852:00518", "nwparser.payload", "Admin user %{administrator->} %{fld1}at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ - dup283, +var part1384 = match("MESSAGE#852:00518", "nwparser.payload", "Admin user %{administrator->} %{fld1}at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg862 = msg("00518", part1389); +var msg862 = msg("00518", part1384); -var part1390 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' has been '), Field(disposition,true), Constant(' via the '), Field(logon_type,true), Constant(' server at '), Field(hostip,false)}" -match("MESSAGE#853:00518:17", "nwparser.payload", "Admin user %{administrator->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ - dup283, +var part1385 = match("MESSAGE#853:00518:17", "nwparser.payload", "Admin user %{administrator->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg863 = msg("00518:17", part1390); +var msg863 = msg("00518:17", part1385); -var part1391 = // "Pattern{Constant('Local authentication for WebAuth user '), Field(username,true), Constant(' was '), Field(disposition,false)}" -match("MESSAGE#854:00518:01", "nwparser.payload", "Local authentication for WebAuth user %{username->} was %{disposition}", processor_chain([ - dup283, +var part1386 = match("MESSAGE#854:00518:01", "nwparser.payload", "Local authentication for WebAuth user %{username->} was %{disposition}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg864 = msg("00518:01", part1391); +var msg864 = msg("00518:01", part1386); -var part1392 = // "Pattern{Constant('Local authentication for user '), Field(username,true), Constant(' was '), Field(disposition,false)}" -match("MESSAGE#855:00518:02", "nwparser.payload", "Local authentication for user %{username->} was %{disposition}", processor_chain([ - dup283, +var part1387 = match("MESSAGE#855:00518:02", "nwparser.payload", "Local authentication for user %{username->} was %{disposition}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg865 = msg("00518:02", part1392); +var msg865 = msg("00518:02", part1387); -var part1393 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' must enter "Next Code" for SecurID '), Field(hostip,false)}" -match("MESSAGE#856:00518:03", "nwparser.payload", "User %{username->} at %{saddr->} must enter \"Next Code\" for SecurID %{hostip}", processor_chain([ - dup205, +var part1388 = match("MESSAGE#856:00518:03", "nwparser.payload", "User %{username->} at %{saddr->} must enter \"Next Code\" for SecurID %{hostip}", processor_chain([ + dup203, dup2, dup3, dup4, dup5, ])); -var msg866 = msg("00518:03", part1393); +var msg866 = msg("00518:03", part1388); -var part1394 = // "Pattern{Constant('WebAuth user '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' has been '), Field(disposition,true), Constant(' via the '), Field(logon_type,true), Constant(' server at '), Field(hostip,false)}" -match("MESSAGE#857:00518:04", "nwparser.payload", "WebAuth user %{username->} at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ - dup205, +var part1389 = match("MESSAGE#857:00518:04", "nwparser.payload", "WebAuth user %{username->} at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ + dup203, dup2, dup4, dup5, dup3, ])); -var msg867 = msg("00518:04", part1394); +var msg867 = msg("00518:04", part1389); -var part1395 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' has been challenged via the '), Field(authmethod,true), Constant(' server at '), Field(hostip,true), Constant(' (Rejected since challenge is not supported for '), Field(logon_type,false), Constant(')')}" -match("MESSAGE#858:00518:05", "nwparser.payload", "User %{username->} at %{saddr->} has been challenged via the %{authmethod->} server at %{hostip->} (Rejected since challenge is not supported for %{logon_type})", processor_chain([ - dup205, +var part1390 = match("MESSAGE#858:00518:05", "nwparser.payload", "User %{username->} at %{saddr->} has been challenged via the %{authmethod->} server at %{hostip->} (Rejected since challenge is not supported for %{logon_type})", processor_chain([ + dup203, dup2, dup4, dup5, dup3, ])); -var msg868 = msg("00518:05", part1395); +var msg868 = msg("00518:05", part1390); -var part1396 = // "Pattern{Constant('Error in authentication for WebAuth user '), Field(username,false)}" -match("MESSAGE#859:00518:06", "nwparser.payload", "Error in authentication for WebAuth user %{username}", processor_chain([ +var part1391 = match("MESSAGE#859:00518:06", "nwparser.payload", "Error in authentication for WebAuth user %{username}", processor_chain([ dup35, dup29, dup31, @@ -18586,27 +16866,24 @@ match("MESSAGE#859:00518:06", "nwparser.payload", "Error in authentication for W dup3, ])); -var msg869 = msg("00518:06", part1396); +var msg869 = msg("00518:06", part1391); -var part1397 = // "Pattern{Constant('Authentication for user '), Field(username,true), Constant(' was denied (long '), Field(p0,false)}" -match("MESSAGE#860:00518:07/0", "nwparser.payload", "Authentication for user %{username->} was denied (long %{p0}"); +var part1392 = match("MESSAGE#860:00518:07/0", "nwparser.payload", "Authentication for user %{username->} was denied (long %{p0}"); -var part1398 = // "Pattern{Constant('username '), Field(p0,false)}" -match("MESSAGE#860:00518:07/1_1", "nwparser.p0", "username %{p0}"); +var part1393 = match("MESSAGE#860:00518:07/1_1", "nwparser.p0", "username %{p0}"); var select329 = linear_select([ dup24, - part1398, + part1393, ]); -var part1399 = // "Pattern{Constant(')'), Field(,false)}" -match("MESSAGE#860:00518:07/2", "nwparser.p0", ")%{}"); +var part1394 = match("MESSAGE#860:00518:07/2", "nwparser.p0", ")%{}"); -var all314 = all_match({ +var all309 = all_match({ processors: [ - part1397, + part1392, select329, - part1399, + part1394, ], on_success: processor_chain([ dup53, @@ -18620,10 +16897,9 @@ var all314 = all_match({ ]), }); -var msg870 = msg("00518:07", all314); +var msg870 = msg("00518:07", all309); -var part1400 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' '), Field(authmethod,true), Constant(' authentication attempt has timed out')}" -match("MESSAGE#861:00518:08", "nwparser.payload", "User %{username->} at %{saddr->} %{authmethod->} authentication attempt has timed out", processor_chain([ +var part1395 = match("MESSAGE#861:00518:08", "nwparser.payload", "User %{username->} at %{saddr->} %{authmethod->} authentication attempt has timed out", processor_chain([ dup35, dup29, dup31, @@ -18634,22 +16910,20 @@ match("MESSAGE#861:00518:08", "nwparser.payload", "User %{username->} at %{saddr dup3, ])); -var msg871 = msg("00518:08", part1400); +var msg871 = msg("00518:08", part1395); -var part1401 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' has been '), Field(disposition,true), Constant(' via the '), Field(logon_type,true), Constant(' server at '), Field(hostip,false)}" -match("MESSAGE#862:00518:09", "nwparser.payload", "User %{username->} at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ - dup205, +var part1396 = match("MESSAGE#862:00518:09", "nwparser.payload", "User %{username->} at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}", processor_chain([ + dup203, dup2, dup4, dup5, dup3, ])); -var msg872 = msg("00518:09", part1401); +var msg872 = msg("00518:09", part1396); -var part1402 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" login attempt for '), Field(logon_type,true), Constant(' ('), Field(network_service,false), Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' failed due to '), Field(result,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#863:00518:10", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type->} (%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} failed due to %{result}. (%{fld1})", processor_chain([ - dup208, +var part1397 = match("MESSAGE#863:00518:10", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type->} (%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} failed due to %{result}. (%{fld1})", processor_chain([ + dup206, dup29, dup30, dup31, @@ -18659,36 +16933,32 @@ match("MESSAGE#863:00518:10", "nwparser.payload", "Admin user \"%{administrator} dup9, dup5, dup3, - dup304, + dup302, ])); -var msg873 = msg("00518:10", part1402); +var msg873 = msg("00518:10", part1397); -var part1403 = // "Pattern{Constant('ADM: Local admin authentication failed for login name '), Field(p0,false)}" -match("MESSAGE#864:00518:11/0", "nwparser.payload", "ADM: Local admin authentication failed for login name %{p0}"); +var part1398 = match("MESSAGE#864:00518:11/0", "nwparser.payload", "ADM: Local admin authentication failed for login name %{p0}"); -var part1404 = // "Pattern{Constant('''), Field(username,false), Constant('': '), Field(p0,false)}" -match("MESSAGE#864:00518:11/1_0", "nwparser.p0", "'%{username}': %{p0}"); +var part1399 = match("MESSAGE#864:00518:11/1_0", "nwparser.p0", "'%{username}': %{p0}"); -var part1405 = // "Pattern{Field(username,false), Constant(': '), Field(p0,false)}" -match("MESSAGE#864:00518:11/1_1", "nwparser.p0", "%{username}: %{p0}"); +var part1400 = match("MESSAGE#864:00518:11/1_1", "nwparser.p0", "%{username}: %{p0}"); var select330 = linear_select([ - part1404, - part1405, + part1399, + part1400, ]); -var part1406 = // "Pattern{Field(result,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#864:00518:11/2", "nwparser.p0", "%{result->} (%{fld1})"); +var part1401 = match("MESSAGE#864:00518:11/2", "nwparser.p0", "%{result->} (%{fld1})"); -var all315 = all_match({ +var all310 = all_match({ processors: [ - part1403, + part1398, select330, - part1406, + part1401, ], on_success: processor_chain([ - dup208, + dup206, dup29, dup30, dup31, @@ -18701,11 +16971,10 @@ var all315 = all_match({ ]), }); -var msg874 = msg("00518:11", all315); +var msg874 = msg("00518:11", all310); -var part1407 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" login attempt for '), Field(logon_type,false), Constant('('), Field(network_service,false), Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#865:00518:12", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}. (%{fld1})", processor_chain([ - dup242, +var part1402 = match("MESSAGE#865:00518:12", "nwparser.payload", "Admin user \"%{administrator}\" login attempt for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} %{disposition}. (%{fld1})", processor_chain([ + dup240, dup2, dup4, dup9, @@ -18713,11 +16982,10 @@ match("MESSAGE#865:00518:12", "nwparser.payload", "Admin user \"%{administrator} dup3, ])); -var msg875 = msg("00518:12", part1407); +var msg875 = msg("00518:12", part1402); -var part1408 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' is rejected by the Radius server at '), Field(hostip,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#866:00518:13", "nwparser.payload", "User %{username->} at %{saddr->} is rejected by the Radius server at %{hostip}. (%{fld1})", processor_chain([ - dup292, +var part1403 = match("MESSAGE#866:00518:13", "nwparser.payload", "User %{username->} at %{saddr->} is rejected by the Radius server at %{hostip}. (%{fld1})", processor_chain([ + dup290, dup2, dup3, dup4, @@ -18725,18 +16993,17 @@ match("MESSAGE#866:00518:13", "nwparser.payload", "User %{username->} at %{saddr dup5, ])); -var msg876 = msg("00518:13", part1408); +var msg876 = msg("00518:13", part1403); -var part1409 = // "Pattern{Field(fld2,false), Constant(': Admin user has been rejected via the Radius server at '), Field(hostip,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#867:00518:14", "nwparser.payload", "%{fld2}: Admin user has been rejected via the Radius server at %{hostip->} (%{fld1})", processor_chain([ - dup292, +var part1404 = match("MESSAGE#867:00518:14", "nwparser.payload", "%{fld2}: Admin user has been rejected via the Radius server at %{hostip->} (%{fld1})", processor_chain([ + dup290, dup2, dup4, dup5, dup9, ])); -var msg877 = msg("00518:14", part1409); +var msg877 = msg("00518:14", part1404); var select331 = linear_select([ msg862, @@ -18757,45 +17024,39 @@ var select331 = linear_select([ msg877, ]); -var part1410 = // "Pattern{Constant('Admin user '), Field(administrator,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#868:00519/0", "nwparser.payload", "Admin user %{administrator->} %{p0}"); +var part1405 = match("MESSAGE#868:00519/0", "nwparser.payload", "Admin user %{administrator->} %{p0}"); -var part1411 = // "Pattern{Constant('of group '), Field(group,true), Constant(' at '), Field(saddr,true), Constant(' has '), Field(p0,false)}" -match("MESSAGE#868:00519/1_1", "nwparser.p0", "of group %{group->} at %{saddr->} has %{p0}"); +var part1406 = match("MESSAGE#868:00519/1_1", "nwparser.p0", "of group %{group->} at %{saddr->} has %{p0}"); -var part1412 = // "Pattern{Field(group,true), Constant(' at '), Field(saddr,true), Constant(' has '), Field(p0,false)}" -match("MESSAGE#868:00519/1_2", "nwparser.p0", "%{group->} at %{saddr->} has %{p0}"); +var part1407 = match("MESSAGE#868:00519/1_2", "nwparser.p0", "%{group->} at %{saddr->} has %{p0}"); var select332 = linear_select([ - dup196, - part1411, - part1412, + dup194, + part1406, + part1407, ]); -var part1413 = // "Pattern{Constant('been '), Field(disposition,true), Constant(' via the '), Field(logon_type,true), Constant(' server '), Field(p0,false)}" -match("MESSAGE#868:00519/2", "nwparser.p0", "been %{disposition->} via the %{logon_type->} server %{p0}"); +var part1408 = match("MESSAGE#868:00519/2", "nwparser.p0", "been %{disposition->} via the %{logon_type->} server %{p0}"); -var part1414 = // "Pattern{Constant('at '), Field(p0,false)}" -match("MESSAGE#868:00519/3_0", "nwparser.p0", "at %{p0}"); +var part1409 = match("MESSAGE#868:00519/3_0", "nwparser.p0", "at %{p0}"); var select333 = linear_select([ - part1414, + part1409, dup16, ]); -var part1415 = // "Pattern{Constant(''), Field(hostip,false)}" -match("MESSAGE#868:00519/4", "nwparser.p0", "%{hostip}"); +var part1410 = match("MESSAGE#868:00519/4", "nwparser.p0", "%{hostip}"); -var all316 = all_match({ +var all311 = all_match({ processors: [ - part1410, + part1405, select332, - part1413, + part1408, select333, - part1415, + part1410, ], on_success: processor_chain([ - dup205, + dup203, dup2, dup3, dup4, @@ -18803,27 +17064,25 @@ var all316 = all_match({ ]), }); -var msg878 = msg("00519", all316); +var msg878 = msg("00519", all311); -var part1416 = // "Pattern{Constant('Local authentication for '), Field(p0,false)}" -match("MESSAGE#869:00519:01/0", "nwparser.payload", "Local authentication for %{p0}"); +var part1411 = match("MESSAGE#869:00519:01/0", "nwparser.payload", "Local authentication for %{p0}"); var select334 = linear_select([ - dup309, dup307, + dup305, ]); -var part1417 = // "Pattern{Constant(''), Field(username,true), Constant(' was '), Field(disposition,false)}" -match("MESSAGE#869:00519:01/2", "nwparser.p0", "%{username->} was %{disposition}"); +var part1412 = match("MESSAGE#869:00519:01/2", "nwparser.p0", "%{username->} was %{disposition}"); -var all317 = all_match({ +var all312 = all_match({ processors: [ - part1416, + part1411, select334, - part1417, + part1412, ], on_success: processor_chain([ - dup205, + dup203, dup2, dup3, dup4, @@ -18831,27 +17090,25 @@ var all317 = all_match({ ]), }); -var msg879 = msg("00519:01", all317); +var msg879 = msg("00519:01", all312); -var part1418 = // "Pattern{Constant('User '), Field(p0,false)}" -match("MESSAGE#870:00519:02/1_1", "nwparser.p0", "User %{p0}"); +var part1413 = match("MESSAGE#870:00519:02/1_1", "nwparser.p0", "User %{p0}"); var select335 = linear_select([ - dup309, - part1418, + dup307, + part1413, ]); -var part1419 = // "Pattern{Constant(''), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' has been '), Field(disposition,true), Constant(' via the '), Field(logon_type,true), Constant(' server at '), Field(hostip,false)}" -match("MESSAGE#870:00519:02/2", "nwparser.p0", "%{username->} at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}"); +var part1414 = match("MESSAGE#870:00519:02/2", "nwparser.p0", "%{username->} at %{saddr->} has been %{disposition->} via the %{logon_type->} server at %{hostip}"); -var all318 = all_match({ +var all313 = all_match({ processors: [ - dup162, + dup160, select335, - part1419, + part1414, ], on_success: processor_chain([ - dup205, + dup203, dup2, dup3, dup4, @@ -18859,40 +17116,37 @@ var all318 = all_match({ ]), }); -var msg880 = msg("00519:02", all318); +var msg880 = msg("00519:02", all313); -var part1420 = // "Pattern{Constant('Admin user "'), Field(administrator,false), Constant('" logged in for '), Field(logon_type,false), Constant('('), Field(network_service,false), Constant(') management (port '), Field(network_port,false), Constant(') from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' '), Field(fld4,false)}" -match("MESSAGE#871:00519:03", "nwparser.payload", "Admin user \"%{administrator}\" logged in for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} %{fld4}", processor_chain([ - dup242, +var part1415 = match("MESSAGE#871:00519:03", "nwparser.payload", "Admin user \"%{administrator}\" logged in for %{logon_type}(%{network_service}) management (port %{network_port}) from %{saddr}:%{sport->} %{fld4}", processor_chain([ + dup240, dup2, dup3, dup4, dup5, ])); -var msg881 = msg("00519:03", part1420); +var msg881 = msg("00519:03", part1415); -var part1421 = // "Pattern{Constant('ADM: Local admin authentication successful for login name '), Field(username,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#872:00519:04", "nwparser.payload", "ADM: Local admin authentication successful for login name %{username->} (%{fld1})", processor_chain([ - dup242, +var part1416 = match("MESSAGE#872:00519:04", "nwparser.payload", "ADM: Local admin authentication successful for login name %{username->} (%{fld1})", processor_chain([ + dup240, dup2, dup4, dup5, dup9, ])); -var msg882 = msg("00519:04", part1421); +var msg882 = msg("00519:04", part1416); -var part1422 = // "Pattern{Field(fld2,false), Constant('Admin user '), Field(administrator,true), Constant(' has been accepted via the Radius server at '), Field(hostip,false), Constant('('), Field(fld1,false), Constant(')')}" -match("MESSAGE#873:00519:05", "nwparser.payload", "%{fld2}Admin user %{administrator->} has been accepted via the Radius server at %{hostip}(%{fld1})", processor_chain([ - dup242, +var part1417 = match("MESSAGE#873:00519:05", "nwparser.payload", "%{fld2}Admin user %{administrator->} has been accepted via the Radius server at %{hostip}(%{fld1})", processor_chain([ + dup240, dup2, dup4, dup5, dup9, ])); -var msg883 = msg("00519:05", part1422); +var msg883 = msg("00519:05", part1417); var select336 = linear_select([ msg878, @@ -18903,8 +17157,7 @@ var select336 = linear_select([ msg883, ]); -var part1423 = // "Pattern{Field(hostname,true), Constant(' user authentication attempt has timed out')}" -match("MESSAGE#874:00520", "nwparser.payload", "%{hostname->} user authentication attempt has timed out", processor_chain([ +var part1418 = match("MESSAGE#874:00520", "nwparser.payload", "%{hostname->} user authentication attempt has timed out", processor_chain([ dup35, dup31, dup39, @@ -18914,38 +17167,32 @@ match("MESSAGE#874:00520", "nwparser.payload", "%{hostname->} user authenticatio dup5, ])); -var msg884 = msg("00520", part1423); +var msg884 = msg("00520", part1418); -var part1424 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(hostip,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#875:00520:01/0", "nwparser.payload", "User %{username->} at %{hostip->} %{p0}"); +var part1419 = match("MESSAGE#875:00520:01/0", "nwparser.payload", "User %{username->} at %{hostip->} %{p0}"); -var part1425 = // "Pattern{Constant('RADIUS '), Field(p0,false)}" -match("MESSAGE#875:00520:01/1_0", "nwparser.p0", "RADIUS %{p0}"); +var part1420 = match("MESSAGE#875:00520:01/1_0", "nwparser.p0", "RADIUS %{p0}"); -var part1426 = // "Pattern{Constant('SecurID '), Field(p0,false)}" -match("MESSAGE#875:00520:01/1_1", "nwparser.p0", "SecurID %{p0}"); +var part1421 = match("MESSAGE#875:00520:01/1_1", "nwparser.p0", "SecurID %{p0}"); -var part1427 = // "Pattern{Constant('LDAP '), Field(p0,false)}" -match("MESSAGE#875:00520:01/1_2", "nwparser.p0", "LDAP %{p0}"); +var part1422 = match("MESSAGE#875:00520:01/1_2", "nwparser.p0", "LDAP %{p0}"); -var part1428 = // "Pattern{Constant('Local '), Field(p0,false)}" -match("MESSAGE#875:00520:01/1_3", "nwparser.p0", "Local %{p0}"); +var part1423 = match("MESSAGE#875:00520:01/1_3", "nwparser.p0", "Local %{p0}"); var select337 = linear_select([ - part1425, - part1426, - part1427, - part1428, + part1420, + part1421, + part1422, + part1423, ]); -var part1429 = // "Pattern{Constant('authentication attempt has timed out'), Field(,false)}" -match("MESSAGE#875:00520:01/2", "nwparser.p0", "authentication attempt has timed out%{}"); +var part1424 = match("MESSAGE#875:00520:01/2", "nwparser.p0", "authentication attempt has timed out%{}"); -var all319 = all_match({ +var all314 = all_match({ processors: [ - part1424, + part1419, select337, - part1429, + part1424, ], on_success: processor_chain([ dup35, @@ -18958,19 +17205,17 @@ var all319 = all_match({ ]), }); -var msg885 = msg("00520:01", all319); +var msg885 = msg("00520:01", all314); -var part1430 = // "Pattern{Constant('Trying '), Field(p0,false)}" -match("MESSAGE#876:00520:02/0", "nwparser.payload", "Trying %{p0}"); +var part1425 = match("MESSAGE#876:00520:02/0", "nwparser.payload", "Trying %{p0}"); -var part1431 = // "Pattern{Constant('server '), Field(fld2,false)}" -match("MESSAGE#876:00520:02/2", "nwparser.p0", "server %{fld2}"); +var part1426 = match("MESSAGE#876:00520:02/2", "nwparser.p0", "server %{fld2}"); -var all320 = all_match({ +var all315 = all_match({ processors: [ - part1430, - dup403, - part1431, + part1425, + dup400, + part1426, ], on_success: processor_chain([ dup44, @@ -18981,41 +17226,35 @@ var all320 = all_match({ ]), }); -var msg886 = msg("00520:02", all320); +var msg886 = msg("00520:02", all315); -var part1432 = // "Pattern{Constant('Primary '), Field(p0,false)}" -match("MESSAGE#877:00520:03/1_0", "nwparser.p0", "Primary %{p0}"); +var part1427 = match("MESSAGE#877:00520:03/1_0", "nwparser.p0", "Primary %{p0}"); -var part1433 = // "Pattern{Constant('Backup1 '), Field(p0,false)}" -match("MESSAGE#877:00520:03/1_1", "nwparser.p0", "Backup1 %{p0}"); +var part1428 = match("MESSAGE#877:00520:03/1_1", "nwparser.p0", "Backup1 %{p0}"); -var part1434 = // "Pattern{Constant('Backup2 '), Field(p0,false)}" -match("MESSAGE#877:00520:03/1_2", "nwparser.p0", "Backup2 %{p0}"); +var part1429 = match("MESSAGE#877:00520:03/1_2", "nwparser.p0", "Backup2 %{p0}"); var select338 = linear_select([ - part1432, - part1433, - part1434, + part1427, + part1428, + part1429, ]); -var part1435 = // "Pattern{Constant(''), Field(fld2,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#877:00520:03/2", "nwparser.p0", "%{fld2}, %{p0}"); +var part1430 = match("MESSAGE#877:00520:03/2", "nwparser.p0", "%{fld2}, %{p0}"); -var part1436 = // "Pattern{Constant(''), Field(fld3,false), Constant(', and '), Field(p0,false)}" -match("MESSAGE#877:00520:03/4", "nwparser.p0", "%{fld3}, and %{p0}"); +var part1431 = match("MESSAGE#877:00520:03/4", "nwparser.p0", "%{fld3}, and %{p0}"); -var part1437 = // "Pattern{Constant(''), Field(fld4,true), Constant(' servers failed')}" -match("MESSAGE#877:00520:03/6", "nwparser.p0", "%{fld4->} servers failed"); +var part1432 = match("MESSAGE#877:00520:03/6", "nwparser.p0", "%{fld4->} servers failed"); -var all321 = all_match({ +var all316 = all_match({ processors: [ - dup162, + dup160, select338, - part1435, - dup403, - part1436, - dup403, - part1437, + part1430, + dup400, + part1431, + dup400, + part1432, ], on_success: processor_chain([ dup19, @@ -19026,10 +17265,9 @@ var all321 = all_match({ ]), }); -var msg887 = msg("00520:03", all321); +var msg887 = msg("00520:03", all316); -var part1438 = // "Pattern{Constant('Trying '), Field(fld2,true), Constant(' Server '), Field(hostip,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#878:00520:04", "nwparser.payload", "Trying %{fld2->} Server %{hostip->} (%{fld1})", processor_chain([ +var part1433 = match("MESSAGE#878:00520:04", "nwparser.payload", "Trying %{fld2->} Server %{hostip->} (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -19037,10 +17275,9 @@ match("MESSAGE#878:00520:04", "nwparser.payload", "Trying %{fld2->} Server %{hos dup9, ])); -var msg888 = msg("00520:04", part1438); +var msg888 = msg("00520:04", part1433); -var part1439 = // "Pattern{Constant('Active Server Switchover: New requests for '), Field(fld31,true), Constant(' server will try '), Field(fld32,true), Constant(' from now on. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1221:00520:05", "nwparser.payload", "Active Server Switchover: New requests for %{fld31->} server will try %{fld32->} from now on. (%{fld1})", processor_chain([ +var part1434 = match("MESSAGE#1221:00520:05", "nwparser.payload", "Active Server Switchover: New requests for %{fld31->} server will try %{fld32->} from now on. (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -19048,7 +17285,7 @@ match("MESSAGE#1221:00520:05", "nwparser.payload", "Active Server Switchover: Ne dup9, ])); -var msg889 = msg("00520:05", part1439); +var msg889 = msg("00520:05", part1434); var select339 = linear_select([ msg884, @@ -19059,8 +17296,7 @@ var select339 = linear_select([ msg889, ]); -var part1440 = // "Pattern{Constant('Can't connect to E-mail server '), Field(hostip,false)}" -match("MESSAGE#879:00521", "nwparser.payload", "Can't connect to E-mail server %{hostip}", processor_chain([ +var part1435 = match("MESSAGE#879:00521", "nwparser.payload", "Can't connect to E-mail server %{hostip}", processor_chain([ dup27, dup2, dup3, @@ -19068,10 +17304,9 @@ match("MESSAGE#879:00521", "nwparser.payload", "Can't connect to E-mail server % dup5, ])); -var msg890 = msg("00521", part1440); +var msg890 = msg("00521", part1435); -var part1441 = // "Pattern{Constant('HA link state has '), Field(fld2,false)}" -match("MESSAGE#880:00522", "nwparser.payload", "HA link state has %{fld2}", processor_chain([ +var part1436 = match("MESSAGE#880:00522", "nwparser.payload", "HA link state has %{fld2}", processor_chain([ dup117, dup2, dup3, @@ -19079,32 +17314,29 @@ match("MESSAGE#880:00522", "nwparser.payload", "HA link state has %{fld2}", proc dup5, ])); -var msg891 = msg("00522", part1441); +var msg891 = msg("00522", part1436); -var part1442 = // "Pattern{Constant('URL filtering received an error from '), Field(fld2,true), Constant(' (error '), Field(resultcode,false), Constant(').')}" -match("MESSAGE#881:00523", "nwparser.payload", "URL filtering received an error from %{fld2->} (error %{resultcode}).", processor_chain([ - dup234, +var part1437 = match("MESSAGE#881:00523", "nwparser.payload", "URL filtering received an error from %{fld2->} (error %{resultcode}).", processor_chain([ + dup232, dup2, dup3, dup4, dup5, ])); -var msg892 = msg("00523", part1442); +var msg892 = msg("00523", part1437); -var part1443 = // "Pattern{Constant('NetScreen device at '), Field(hostip,false), Constant(':'), Field(network_port,true), Constant(' has responded successfully to SNMP request from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#882:00524", "nwparser.payload", "NetScreen device at %{hostip}:%{network_port->} has responded successfully to SNMP request from %{saddr}:%{sport}", processor_chain([ - dup211, +var part1438 = match("MESSAGE#882:00524", "nwparser.payload", "NetScreen device at %{hostip}:%{network_port->} has responded successfully to SNMP request from %{saddr}:%{sport}", processor_chain([ + dup209, dup2, dup3, dup4, dup5, ])); -var msg893 = msg("00524", part1443); +var msg893 = msg("00524", part1438); -var part1444 = // "Pattern{Constant('SNMP request from an unknown SNMP community public at '), Field(hostip,false), Constant(':'), Field(network_port,true), Constant(' has been received. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#883:00524:02", "nwparser.payload", "SNMP request from an unknown SNMP community public at %{hostip}:%{network_port->} has been received. (%{fld1})", processor_chain([ +var part1439 = match("MESSAGE#883:00524:02", "nwparser.payload", "SNMP request from an unknown SNMP community public at %{hostip}:%{network_port->} has been received. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -19113,10 +17345,9 @@ match("MESSAGE#883:00524:02", "nwparser.payload", "SNMP request from an unknown dup5, ])); -var msg894 = msg("00524:02", part1444); +var msg894 = msg("00524:02", part1439); -var part1445 = // "Pattern{Constant('SNMP: NetScreen device has responded successfully to the SNMP request from '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#884:00524:03", "nwparser.payload", "SNMP: NetScreen device has responded successfully to the SNMP request from %{saddr}:%{sport}. (%{fld1})", processor_chain([ +var part1440 = match("MESSAGE#884:00524:03", "nwparser.payload", "SNMP: NetScreen device has responded successfully to the SNMP request from %{saddr}:%{sport}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -19125,10 +17356,9 @@ match("MESSAGE#884:00524:03", "nwparser.payload", "SNMP: NetScreen device has re dup5, ])); -var msg895 = msg("00524:03", part1445); +var msg895 = msg("00524:03", part1440); -var part1446 = // "Pattern{Constant('SNMP request from an unknown SNMP community admin at '), Field(hostip,false), Constant(':'), Field(network_port,true), Constant(' has been received. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#885:00524:04", "nwparser.payload", "SNMP request from an unknown SNMP community admin at %{hostip}:%{network_port->} has been received. (%{fld1})", processor_chain([ +var part1441 = match("MESSAGE#885:00524:04", "nwparser.payload", "SNMP request from an unknown SNMP community admin at %{hostip}:%{network_port->} has been received. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -19137,10 +17367,9 @@ match("MESSAGE#885:00524:04", "nwparser.payload", "SNMP request from an unknown dup5, ])); -var msg896 = msg("00524:04", part1446); +var msg896 = msg("00524:04", part1441); -var part1447 = // "Pattern{Constant('SNMP request from an unknown SNMP community '), Field(fld2,true), Constant(' at '), Field(hostip,false), Constant(':'), Field(network_port,true), Constant(' has been received. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#886:00524:05", "nwparser.payload", "SNMP request from an unknown SNMP community %{fld2->} at %{hostip}:%{network_port->} has been received. (%{fld1})", processor_chain([ +var part1442 = match("MESSAGE#886:00524:05", "nwparser.payload", "SNMP request from an unknown SNMP community %{fld2->} at %{hostip}:%{network_port->} has been received. (%{fld1})", processor_chain([ dup18, dup2, dup4, @@ -19148,10 +17377,9 @@ match("MESSAGE#886:00524:05", "nwparser.payload", "SNMP request from an unknown dup9, ])); -var msg897 = msg("00524:05", part1447); +var msg897 = msg("00524:05", part1442); -var part1448 = // "Pattern{Constant('SNMP request has been received from an unknown host in SNMP community '), Field(fld2,true), Constant(' at '), Field(hostip,false), Constant(':'), Field(network_port,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#887:00524:06", "nwparser.payload", "SNMP request has been received from an unknown host in SNMP community %{fld2->} at %{hostip}:%{network_port}. (%{fld1})", processor_chain([ +var part1443 = match("MESSAGE#887:00524:06", "nwparser.payload", "SNMP request has been received from an unknown host in SNMP community %{fld2->} at %{hostip}:%{network_port}. (%{fld1})", processor_chain([ dup18, dup2, dup4, @@ -19159,20 +17387,18 @@ match("MESSAGE#887:00524:06", "nwparser.payload", "SNMP request has been receive dup9, ])); -var msg898 = msg("00524:06", part1448); +var msg898 = msg("00524:06", part1443); -var part1449 = // "Pattern{Constant('SNMP request from an unknown SNMP community '), Field(fld2,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' has been received')}" -match("MESSAGE#888:00524:12", "nwparser.payload", "SNMP request from an unknown SNMP community %{fld2->} at %{saddr}:%{sport->} to %{daddr}:%{dport->} has been received", processor_chain([ +var part1444 = match("MESSAGE#888:00524:12", "nwparser.payload", "SNMP request from an unknown SNMP community %{fld2->} at %{saddr}:%{sport->} to %{daddr}:%{dport->} has been received", processor_chain([ dup18, dup2, dup4, dup5, ])); -var msg899 = msg("00524:12", part1449); +var msg899 = msg("00524:12", part1444); -var part1450 = // "Pattern{Constant('SNMP request from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has been received, but the SNMP version type is incorrect. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#889:00524:14", "nwparser.payload", "SNMP request from %{saddr}:%{sport->} has been received, but the SNMP version type is incorrect. (%{fld1})", processor_chain([ +var part1445 = match("MESSAGE#889:00524:14", "nwparser.payload", "SNMP request from %{saddr}:%{sport->} has been received, but the SNMP version type is incorrect. (%{fld1})", processor_chain([ dup19, dup2, dup4, @@ -19181,19 +17407,17 @@ match("MESSAGE#889:00524:14", "nwparser.payload", "SNMP request from %{saddr}:%{ dup9, ])); -var msg900 = msg("00524:14", part1450); +var msg900 = msg("00524:14", part1445); -var part1451 = // "Pattern{Constant('SNMP request has been received'), Field(p0,false)}" -match("MESSAGE#890:00524:13/0", "nwparser.payload", "SNMP request has been received%{p0}"); +var part1446 = match("MESSAGE#890:00524:13/0", "nwparser.payload", "SNMP request has been received%{p0}"); -var part1452 = // "Pattern{Field(,false), Constant('but '), Field(result,false)}" -match("MESSAGE#890:00524:13/2", "nwparser.p0", "%{}but %{result}"); +var part1447 = match("MESSAGE#890:00524:13/2", "nwparser.p0", "%{}but %{result}"); -var all322 = all_match({ +var all317 = all_match({ processors: [ - part1451, - dup404, - part1452, + part1446, + dup401, + part1447, ], on_success: processor_chain([ dup18, @@ -19203,60 +17427,54 @@ var all322 = all_match({ ]), }); -var msg901 = msg("00524:13", all322); +var msg901 = msg("00524:13", all317); -var part1453 = // "Pattern{Constant('Response to SNMP request from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' has '), Field(disposition,true), Constant(' due to '), Field(result,false)}" -match("MESSAGE#891:00524:07", "nwparser.payload", "Response to SNMP request from %{saddr}:%{sport->} to %{daddr}:%{dport->} has %{disposition->} due to %{result}", processor_chain([ +var part1448 = match("MESSAGE#891:00524:07", "nwparser.payload", "Response to SNMP request from %{saddr}:%{sport->} to %{daddr}:%{dport->} has %{disposition->} due to %{result}", processor_chain([ dup18, dup2, dup4, dup5, ])); -var msg902 = msg("00524:07", part1453); +var msg902 = msg("00524:07", part1448); -var part1454 = // "Pattern{Constant('SNMP community '), Field(fld2,true), Constant(' cannot be added because '), Field(result,false)}" -match("MESSAGE#892:00524:08", "nwparser.payload", "SNMP community %{fld2->} cannot be added because %{result}", processor_chain([ +var part1449 = match("MESSAGE#892:00524:08", "nwparser.payload", "SNMP community %{fld2->} cannot be added because %{result}", processor_chain([ dup18, dup2, dup4, dup5, ])); -var msg903 = msg("00524:08", part1454); +var msg903 = msg("00524:08", part1449); -var part1455 = // "Pattern{Constant('SNMP host '), Field(hostip,true), Constant(' cannot be added to community '), Field(fld2,true), Constant(' because of '), Field(result,false)}" -match("MESSAGE#893:00524:09", "nwparser.payload", "SNMP host %{hostip->} cannot be added to community %{fld2->} because of %{result}", processor_chain([ +var part1450 = match("MESSAGE#893:00524:09", "nwparser.payload", "SNMP host %{hostip->} cannot be added to community %{fld2->} because of %{result}", processor_chain([ dup18, dup2, dup4, dup5, ])); -var msg904 = msg("00524:09", part1455); +var msg904 = msg("00524:09", part1450); -var part1456 = // "Pattern{Constant('SNMP host '), Field(hostip,true), Constant(' cannot be added because '), Field(result,false)}" -match("MESSAGE#894:00524:10", "nwparser.payload", "SNMP host %{hostip->} cannot be added because %{result}", processor_chain([ +var part1451 = match("MESSAGE#894:00524:10", "nwparser.payload", "SNMP host %{hostip->} cannot be added because %{result}", processor_chain([ dup18, dup2, dup4, dup5, ])); -var msg905 = msg("00524:10", part1456); +var msg905 = msg("00524:10", part1451); -var part1457 = // "Pattern{Constant('SNMP host '), Field(hostip,true), Constant(' cannot be removed from community '), Field(fld2,true), Constant(' because '), Field(result,false)}" -match("MESSAGE#895:00524:11", "nwparser.payload", "SNMP host %{hostip->} cannot be removed from community %{fld2->} because %{result}", processor_chain([ +var part1452 = match("MESSAGE#895:00524:11", "nwparser.payload", "SNMP host %{hostip->} cannot be removed from community %{fld2->} because %{result}", processor_chain([ dup18, dup2, dup4, dup5, ])); -var msg906 = msg("00524:11", part1457); +var msg906 = msg("00524:11", part1452); -var part1458 = // "Pattern{Constant('SNMP user/community '), Field(fld34,true), Constant(' doesn't exist. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1222:00524:16", "nwparser.payload", "SNMP user/community %{fld34->} doesn't exist. (%{fld1})", processor_chain([ +var part1453 = match("MESSAGE#1222:00524:16", "nwparser.payload", "SNMP user/community %{fld34->} doesn't exist. (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -19264,7 +17482,7 @@ match("MESSAGE#1222:00524:16", "nwparser.payload", "SNMP user/community %{fld34- dup9, ])); -var msg907 = msg("00524:16", part1458); +var msg907 = msg("00524:16", part1453); var select340 = linear_select([ msg893, @@ -19284,9 +17502,8 @@ var select340 = linear_select([ msg907, ]); -var part1459 = // "Pattern{Constant('The new PIN for user '), Field(username,true), Constant(' at '), Field(hostip,true), Constant(' has been '), Field(disposition,true), Constant(' by SecurID '), Field(fld2,false)}" -match("MESSAGE#896:00525", "nwparser.payload", "The new PIN for user %{username->} at %{hostip->} has been %{disposition->} by SecurID %{fld2}", processor_chain([ - dup205, +var part1454 = match("MESSAGE#896:00525", "nwparser.payload", "The new PIN for user %{username->} at %{hostip->} has been %{disposition->} by SecurID %{fld2}", processor_chain([ + dup203, setc("ec_subject","Password"), dup38, dup2, @@ -19295,40 +17512,37 @@ match("MESSAGE#896:00525", "nwparser.payload", "The new PIN for user %{username- dup5, ])); -var msg908 = msg("00525", part1459); +var msg908 = msg("00525", part1454); -var part1460 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(hostip,true), Constant(' has selected a system-generated PIN for authentication with SecurID '), Field(fld2,false)}" -match("MESSAGE#897:00525:01", "nwparser.payload", "User %{username->} at %{hostip->} has selected a system-generated PIN for authentication with SecurID %{fld2}", processor_chain([ - dup205, +var part1455 = match("MESSAGE#897:00525:01", "nwparser.payload", "User %{username->} at %{hostip->} has selected a system-generated PIN for authentication with SecurID %{fld2}", processor_chain([ + dup203, dup2, dup3, dup4, dup5, ])); -var msg909 = msg("00525:01", part1460); +var msg909 = msg("00525:01", part1455); -var part1461 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(hostip,true), Constant(' must enter the "new PIN" for SecurID '), Field(fld2,false)}" -match("MESSAGE#898:00525:02", "nwparser.payload", "User %{username->} at %{hostip->} must enter the \"new PIN\" for SecurID %{fld2}", processor_chain([ - dup205, +var part1456 = match("MESSAGE#898:00525:02", "nwparser.payload", "User %{username->} at %{hostip->} must enter the \"new PIN\" for SecurID %{fld2}", processor_chain([ + dup203, dup2, dup3, dup4, dup5, ])); -var msg910 = msg("00525:02", part1461); +var msg910 = msg("00525:02", part1456); -var part1462 = // "Pattern{Constant('User '), Field(username,true), Constant(' at '), Field(hostip,true), Constant(' must make a "New PIN" choice for SecurID '), Field(fld2,false)}" -match("MESSAGE#899:00525:03", "nwparser.payload", "User %{username->} at %{hostip->} must make a \"New PIN\" choice for SecurID %{fld2}", processor_chain([ - dup205, +var part1457 = match("MESSAGE#899:00525:03", "nwparser.payload", "User %{username->} at %{hostip->} must make a \"New PIN\" choice for SecurID %{fld2}", processor_chain([ + dup203, dup2, dup3, dup4, dup5, ])); -var msg911 = msg("00525:03", part1462); +var msg911 = msg("00525:03", part1457); var select341 = linear_select([ msg908, @@ -19337,10 +17551,9 @@ var select341 = linear_select([ msg911, ]); -var part1463 = // "Pattern{Constant('The user limit has been exceeded and '), Field(hostip,true), Constant(' cannot be added')}" -match("MESSAGE#900:00526", "nwparser.payload", "The user limit has been exceeded and %{hostip->} cannot be added", processor_chain([ +var part1458 = match("MESSAGE#900:00526", "nwparser.payload", "The user limit has been exceeded and %{hostip->} cannot be added", processor_chain([ dup37, - dup221, + dup219, dup38, dup39, dup2, @@ -19349,39 +17562,34 @@ match("MESSAGE#900:00526", "nwparser.payload", "The user limit has been exceeded dup5, ])); -var msg912 = msg("00526", part1463); +var msg912 = msg("00526", part1458); -var part1464 = // "Pattern{Constant('A DHCP-'), Field(p0,false)}" -match("MESSAGE#901:00527/0", "nwparser.payload", "A DHCP-%{p0}"); +var part1459 = match("MESSAGE#901:00527/0", "nwparser.payload", "A DHCP-%{p0}"); -var part1465 = // "Pattern{Constant(' assigned '), Field(p0,false)}" -match("MESSAGE#901:00527/1_1", "nwparser.p0", " assigned %{p0}"); +var part1460 = match("MESSAGE#901:00527/1_1", "nwparser.p0", " assigned %{p0}"); var select342 = linear_select([ - dup313, - part1465, + dup311, + part1460, ]); -var part1466 = // "Pattern{Constant('IP address '), Field(hostip,true), Constant(' has been '), Field(p0,false)}" -match("MESSAGE#901:00527/2", "nwparser.p0", "IP address %{hostip->} has been %{p0}"); +var part1461 = match("MESSAGE#901:00527/2", "nwparser.p0", "IP address %{hostip->} has been %{p0}"); -var part1467 = // "Pattern{Constant('freed from '), Field(p0,false)}" -match("MESSAGE#901:00527/3_1", "nwparser.p0", "freed from %{p0}"); +var part1462 = match("MESSAGE#901:00527/3_1", "nwparser.p0", "freed from %{p0}"); -var part1468 = // "Pattern{Constant('freed '), Field(p0,false)}" -match("MESSAGE#901:00527/3_2", "nwparser.p0", "freed %{p0}"); +var part1463 = match("MESSAGE#901:00527/3_2", "nwparser.p0", "freed %{p0}"); var select343 = linear_select([ - dup314, - part1467, - part1468, + dup312, + part1462, + part1463, ]); -var all323 = all_match({ +var all318 = all_match({ processors: [ - part1464, + part1459, select342, - part1466, + part1461, select343, dup108, ], @@ -19394,10 +17602,9 @@ var all323 = all_match({ ]), }); -var msg913 = msg("00527", all323); +var msg913 = msg("00527", all318); -var part1469 = // "Pattern{Constant('A DHCP-assigned IP address has been manually released'), Field(,false)}" -match("MESSAGE#902:00527:01", "nwparser.payload", "A DHCP-assigned IP address has been manually released%{}", processor_chain([ +var part1464 = match("MESSAGE#902:00527:01", "nwparser.payload", "A DHCP-assigned IP address has been manually released%{}", processor_chain([ dup44, dup2, dup3, @@ -19405,31 +17612,27 @@ match("MESSAGE#902:00527:01", "nwparser.payload", "A DHCP-assigned IP address ha dup5, ])); -var msg914 = msg("00527:01", part1469); +var msg914 = msg("00527:01", part1464); -var part1470 = // "Pattern{Constant('DHCP server has '), Field(p0,false)}" -match("MESSAGE#903:00527:02/0", "nwparser.payload", "DHCP server has %{p0}"); +var part1465 = match("MESSAGE#903:00527:02/0", "nwparser.payload", "DHCP server has %{p0}"); -var part1471 = // "Pattern{Constant('released '), Field(p0,false)}" -match("MESSAGE#903:00527:02/1_1", "nwparser.p0", "released %{p0}"); +var part1466 = match("MESSAGE#903:00527:02/1_1", "nwparser.p0", "released %{p0}"); -var part1472 = // "Pattern{Constant('assigned or released '), Field(p0,false)}" -match("MESSAGE#903:00527:02/1_2", "nwparser.p0", "assigned or released %{p0}"); +var part1467 = match("MESSAGE#903:00527:02/1_2", "nwparser.p0", "assigned or released %{p0}"); var select344 = linear_select([ - dup313, - part1471, - part1472, + dup311, + part1466, + part1467, ]); -var part1473 = // "Pattern{Constant('an IP address'), Field(,false)}" -match("MESSAGE#903:00527:02/2", "nwparser.p0", "an IP address%{}"); +var part1468 = match("MESSAGE#903:00527:02/2", "nwparser.p0", "an IP address%{}"); -var all324 = all_match({ +var all319 = all_match({ processors: [ - part1470, + part1465, select344, - part1473, + part1468, ], on_success: processor_chain([ dup44, @@ -19440,21 +17643,19 @@ var all324 = all_match({ ]), }); -var msg915 = msg("00527:02", all324); +var msg915 = msg("00527:02", all319); -var part1474 = // "Pattern{Constant('MAC address '), Field(macaddr,true), Constant(' has detected an IP conflict and has declined address '), Field(hostip,false)}" -match("MESSAGE#904:00527:03", "nwparser.payload", "MAC address %{macaddr->} has detected an IP conflict and has declined address %{hostip}", processor_chain([ - dup274, +var part1469 = match("MESSAGE#904:00527:03", "nwparser.payload", "MAC address %{macaddr->} has detected an IP conflict and has declined address %{hostip}", processor_chain([ + dup272, dup2, dup3, dup4, dup5, ])); -var msg916 = msg("00527:03", part1474); +var msg916 = msg("00527:03", part1469); -var part1475 = // "Pattern{Constant('One or more DHCP-assigned IP addresses have been manually released.'), Field(,false)}" -match("MESSAGE#905:00527:04", "nwparser.payload", "One or more DHCP-assigned IP addresses have been manually released.%{}", processor_chain([ +var part1470 = match("MESSAGE#905:00527:04", "nwparser.payload", "One or more DHCP-assigned IP addresses have been manually released.%{}", processor_chain([ dup44, dup2, dup3, @@ -19462,16 +17663,15 @@ match("MESSAGE#905:00527:04", "nwparser.payload", "One or more DHCP-assigned IP dup5, ])); -var msg917 = msg("00527:04", part1475); +var msg917 = msg("00527:04", part1470); -var part1476 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' is more than '), Field(fld2,true), Constant(' allocated.')}" -match("MESSAGE#906:00527:05/2", "nwparser.p0", "%{} %{interface->} is more than %{fld2->} allocated."); +var part1471 = match("MESSAGE#906:00527:05/2", "nwparser.p0", "%{} %{interface->} is more than %{fld2->} allocated."); -var all325 = all_match({ +var all320 = all_match({ processors: [ - dup212, - dup339, - part1476, + dup210, + dup337, + part1471, ], on_success: processor_chain([ dup44, @@ -19482,34 +17682,31 @@ var all325 = all_match({ ]), }); -var msg918 = msg("00527:05", all325); +var msg918 = msg("00527:05", all320); -var part1477 = // "Pattern{Constant('IP address '), Field(hostip,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#907:00527:06/0", "nwparser.payload", "IP address %{hostip->} %{p0}"); +var part1472 = match("MESSAGE#907:00527:06/0", "nwparser.payload", "IP address %{hostip->} %{p0}"); var select345 = linear_select([ dup106, dup127, ]); -var part1478 = // "Pattern{Constant('released from '), Field(p0,false)}" -match("MESSAGE#907:00527:06/3_1", "nwparser.p0", "released from %{p0}"); +var part1473 = match("MESSAGE#907:00527:06/3_1", "nwparser.p0", "released from %{p0}"); var select346 = linear_select([ - dup314, - part1478, + dup312, + part1473, ]); -var part1479 = // "Pattern{Constant(''), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#907:00527:06/4", "nwparser.p0", "%{fld2->} (%{fld1})"); +var part1474 = match("MESSAGE#907:00527:06/4", "nwparser.p0", "%{fld2->} (%{fld1})"); -var all326 = all_match({ +var all321 = all_match({ processors: [ - part1477, + part1472, select345, dup23, select346, - part1479, + part1474, ], on_success: processor_chain([ dup44, @@ -19521,10 +17718,9 @@ var all326 = all_match({ ]), }); -var msg919 = msg("00527:06", all326); +var msg919 = msg("00527:06", all321); -var part1480 = // "Pattern{Constant('One or more IP addresses have expired. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#908:00527:07", "nwparser.payload", "One or more IP addresses have expired. (%{fld1})", processor_chain([ +var part1475 = match("MESSAGE#908:00527:07", "nwparser.payload", "One or more IP addresses have expired. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -19533,10 +17729,9 @@ match("MESSAGE#908:00527:07", "nwparser.payload", "One or more IP addresses have dup5, ])); -var msg920 = msg("00527:07", part1480); +var msg920 = msg("00527:07", part1475); -var part1481 = // "Pattern{Constant('DHCP server on interface '), Field(interface,true), Constant(' received '), Field(protocol_detail,true), Constant(' from '), Field(smacaddr,true), Constant(' requesting out-of-scope IP address '), Field(hostip,false), Constant('/'), Field(mask,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#909:00527:08", "nwparser.payload", "DHCP server on interface %{interface->} received %{protocol_detail->} from %{smacaddr->} requesting out-of-scope IP address %{hostip}/%{mask->} (%{fld1})", processor_chain([ +var part1476 = match("MESSAGE#909:00527:08", "nwparser.payload", "DHCP server on interface %{interface->} received %{protocol_detail->} from %{smacaddr->} requesting out-of-scope IP address %{hostip}/%{mask->} (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -19545,30 +17740,27 @@ match("MESSAGE#909:00527:08", "nwparser.payload", "DHCP server on interface %{in dup5, ])); -var msg921 = msg("00527:08", part1481); +var msg921 = msg("00527:08", part1476); -var part1482 = // "Pattern{Constant('MAC address '), Field(macaddr,true), Constant(' has '), Field(disposition,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#910:00527:09/0", "nwparser.payload", "MAC address %{macaddr->} has %{disposition->} %{p0}"); +var part1477 = match("MESSAGE#910:00527:09/0", "nwparser.payload", "MAC address %{macaddr->} has %{disposition->} %{p0}"); -var part1483 = // "Pattern{Constant('address '), Field(hostip,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#910:00527:09/1_0", "nwparser.p0", "address %{hostip->} (%{p0}"); +var part1478 = match("MESSAGE#910:00527:09/1_0", "nwparser.p0", "address %{hostip->} (%{p0}"); -var part1484 = // "Pattern{Field(hostip,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#910:00527:09/1_1", "nwparser.p0", "%{hostip->} (%{p0}"); +var part1479 = match("MESSAGE#910:00527:09/1_1", "nwparser.p0", "%{hostip->} (%{p0}"); var select347 = linear_select([ - part1483, - part1484, + part1478, + part1479, ]); -var all327 = all_match({ +var all322 = all_match({ processors: [ - part1482, + part1477, select347, dup41, ], on_success: processor_chain([ - dup274, + dup272, dup2, dup3, dup9, @@ -19577,10 +17769,9 @@ var all327 = all_match({ ]), }); -var msg922 = msg("00527:09", all327); +var msg922 = msg("00527:09", all322); -var part1485 = // "Pattern{Constant('One or more IP addresses are expired. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#911:00527:10", "nwparser.payload", "One or more IP addresses are expired. (%{fld1})", processor_chain([ +var part1480 = match("MESSAGE#911:00527:10", "nwparser.payload", "One or more IP addresses are expired. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -19589,7 +17780,7 @@ match("MESSAGE#911:00527:10", "nwparser.payload", "One or more IP addresses are dup5, ])); -var msg923 = msg("00527:10", part1485); +var msg923 = msg("00527:10", part1480); var select348 = linear_select([ msg913, @@ -19605,8 +17796,7 @@ var select348 = linear_select([ msg923, ]); -var part1486 = // "Pattern{Constant('SCS: User ''), Field(username,false), Constant('' authenticated using password :')}" -match("MESSAGE#912:00528", "nwparser.payload", "SCS: User '%{username}' authenticated using password :", processor_chain([ +var part1481 = match("MESSAGE#912:00528", "nwparser.payload", "SCS: User '%{username}' authenticated using password :", processor_chain([ setc("eventcategory","1302010000"), dup29, dup31, @@ -19617,66 +17807,60 @@ match("MESSAGE#912:00528", "nwparser.payload", "SCS: User '%{username}' authenti dup5, ])); -var msg924 = msg("00528", part1486); +var msg924 = msg("00528", part1481); -var part1487 = // "Pattern{Constant('SCS: Connection terminated for user '), Field(username,true), Constant(' from')}" -match("MESSAGE#913:00528:01", "nwparser.payload", "SCS: Connection terminated for user %{username->} from", processor_chain([ - dup205, +var part1482 = match("MESSAGE#913:00528:01", "nwparser.payload", "SCS: Connection terminated for user %{username->} from", processor_chain([ + dup203, dup2, dup3, dup4, dup5, ])); -var msg925 = msg("00528:01", part1487); +var msg925 = msg("00528:01", part1482); -var part1488 = // "Pattern{Constant('SCS: Disabled for all root/vsys on device. Client host attempting connection to interface ''), Field(interface,false), Constant('' with address '), Field(hostip,true), Constant(' from '), Field(saddr,false)}" -match("MESSAGE#914:00528:02", "nwparser.payload", "SCS: Disabled for all root/vsys on device. Client host attempting connection to interface '%{interface}' with address %{hostip->} from %{saddr}", processor_chain([ - dup205, +var part1483 = match("MESSAGE#914:00528:02", "nwparser.payload", "SCS: Disabled for all root/vsys on device. Client host attempting connection to interface '%{interface}' with address %{hostip->} from %{saddr}", processor_chain([ + dup203, dup2, dup3, dup4, dup5, ])); -var msg926 = msg("00528:02", part1488); +var msg926 = msg("00528:02", part1483); -var part1489 = // "Pattern{Constant('SSH: NetScreen device '), Field(disposition,true), Constant(' to identify itself to the SSH client at '), Field(hostip,false)}" -match("MESSAGE#915:00528:03", "nwparser.payload", "SSH: NetScreen device %{disposition->} to identify itself to the SSH client at %{hostip}", processor_chain([ - dup205, +var part1484 = match("MESSAGE#915:00528:03", "nwparser.payload", "SSH: NetScreen device %{disposition->} to identify itself to the SSH client at %{hostip}", processor_chain([ + dup203, dup2, dup4, dup5, dup3, ])); -var msg927 = msg("00528:03", part1489); +var msg927 = msg("00528:03", part1484); -var part1490 = // "Pattern{Constant('SSH: Incompatible SSH version string has been received from SSH client at '), Field(hostip,false)}" -match("MESSAGE#916:00528:04", "nwparser.payload", "SSH: Incompatible SSH version string has been received from SSH client at %{hostip}", processor_chain([ - dup205, +var part1485 = match("MESSAGE#916:00528:04", "nwparser.payload", "SSH: Incompatible SSH version string has been received from SSH client at %{hostip}", processor_chain([ + dup203, dup2, dup4, dup5, dup3, ])); -var msg928 = msg("00528:04", part1490); +var msg928 = msg("00528:04", part1485); -var part1491 = // "Pattern{Constant('SSH: '), Field(disposition,true), Constant(' to send identification string to client host at '), Field(hostip,false)}" -match("MESSAGE#917:00528:05", "nwparser.payload", "SSH: %{disposition->} to send identification string to client host at %{hostip}", processor_chain([ - dup205, +var part1486 = match("MESSAGE#917:00528:05", "nwparser.payload", "SSH: %{disposition->} to send identification string to client host at %{hostip}", processor_chain([ + dup203, dup2, dup3, dup4, dup5, ])); -var msg929 = msg("00528:05", part1491); +var msg929 = msg("00528:05", part1486); -var part1492 = // "Pattern{Constant('SSH: Client at '), Field(saddr,true), Constant(' attempted to connect with invalid version string.')}" -match("MESSAGE#918:00528:06", "nwparser.payload", "SSH: Client at %{saddr->} attempted to connect with invalid version string.", processor_chain([ - dup315, +var part1487 = match("MESSAGE#918:00528:06", "nwparser.payload", "SSH: Client at %{saddr->} attempted to connect with invalid version string.", processor_chain([ + dup313, dup2, dup3, dup4, @@ -19684,38 +17868,33 @@ match("MESSAGE#918:00528:06", "nwparser.payload", "SSH: Client at %{saddr->} att setc("result","invalid version string"), ])); -var msg930 = msg("00528:06", part1492); +var msg930 = msg("00528:06", part1487); -var part1493 = // "Pattern{Constant('SSH: '), Field(disposition,true), Constant(' to negotiate '), Field(p0,false)}" -match("MESSAGE#919:00528:07/0", "nwparser.payload", "SSH: %{disposition->} to negotiate %{p0}"); +var part1488 = match("MESSAGE#919:00528:07/0", "nwparser.payload", "SSH: %{disposition->} to negotiate %{p0}"); -var part1494 = // "Pattern{Constant('MAC '), Field(p0,false)}" -match("MESSAGE#919:00528:07/1_1", "nwparser.p0", "MAC %{p0}"); +var part1489 = match("MESSAGE#919:00528:07/1_1", "nwparser.p0", "MAC %{p0}"); -var part1495 = // "Pattern{Constant('key exchange '), Field(p0,false)}" -match("MESSAGE#919:00528:07/1_2", "nwparser.p0", "key exchange %{p0}"); +var part1490 = match("MESSAGE#919:00528:07/1_2", "nwparser.p0", "key exchange %{p0}"); -var part1496 = // "Pattern{Constant('host key '), Field(p0,false)}" -match("MESSAGE#919:00528:07/1_3", "nwparser.p0", "host key %{p0}"); +var part1491 = match("MESSAGE#919:00528:07/1_3", "nwparser.p0", "host key %{p0}"); var select349 = linear_select([ dup88, - part1494, - part1495, - part1496, + part1489, + part1490, + part1491, ]); -var part1497 = // "Pattern{Constant('algorithm with host '), Field(hostip,false)}" -match("MESSAGE#919:00528:07/2", "nwparser.p0", "algorithm with host %{hostip}"); +var part1492 = match("MESSAGE#919:00528:07/2", "nwparser.p0", "algorithm with host %{hostip}"); -var all328 = all_match({ +var all323 = all_match({ processors: [ - part1493, + part1488, select349, - part1497, + part1492, ], on_success: processor_chain([ - dup316, + dup314, dup2, dup4, dup5, @@ -19723,55 +17902,50 @@ var all328 = all_match({ ]), }); -var msg931 = msg("00528:07", all328); +var msg931 = msg("00528:07", all323); -var part1498 = // "Pattern{Constant('SSH: Unsupported cipher type '), Field(fld2,true), Constant(' requested from '), Field(saddr,false)}" -match("MESSAGE#920:00528:08", "nwparser.payload", "SSH: Unsupported cipher type %{fld2->} requested from %{saddr}", processor_chain([ - dup316, +var part1493 = match("MESSAGE#920:00528:08", "nwparser.payload", "SSH: Unsupported cipher type %{fld2->} requested from %{saddr}", processor_chain([ + dup314, dup2, dup4, dup5, dup3, ])); -var msg932 = msg("00528:08", part1498); +var msg932 = msg("00528:08", part1493); -var part1499 = // "Pattern{Constant('SSH: Host client has requested NO cipher from '), Field(saddr,false)}" -match("MESSAGE#921:00528:09", "nwparser.payload", "SSH: Host client has requested NO cipher from %{saddr}", processor_chain([ - dup316, +var part1494 = match("MESSAGE#921:00528:09", "nwparser.payload", "SSH: Host client has requested NO cipher from %{saddr}", processor_chain([ + dup314, dup2, dup3, dup4, dup5, ])); -var msg933 = msg("00528:09", part1499); +var msg933 = msg("00528:09", part1494); -var part1500 = // "Pattern{Constant('SSH: Disabled for ''), Field(vsys,false), Constant(''. Attempted connection '), Field(disposition,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#922:00528:10", "nwparser.payload", "SSH: Disabled for '%{vsys}'. Attempted connection %{disposition->} from %{saddr}:%{sport}", processor_chain([ - dup283, +var part1495 = match("MESSAGE#922:00528:10", "nwparser.payload", "SSH: Disabled for '%{vsys}'. Attempted connection %{disposition->} from %{saddr}:%{sport}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg934 = msg("00528:10", part1500); +var msg934 = msg("00528:10", part1495); -var part1501 = // "Pattern{Constant('SSH: Disabled for '), Field(fld2,true), Constant(' Attempted connection '), Field(disposition,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#923:00528:11", "nwparser.payload", "SSH: Disabled for %{fld2->} Attempted connection %{disposition->} from %{saddr}:%{sport}", processor_chain([ - dup283, +var part1496 = match("MESSAGE#923:00528:11", "nwparser.payload", "SSH: Disabled for %{fld2->} Attempted connection %{disposition->} from %{saddr}:%{sport}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg935 = msg("00528:11", part1501); +var msg935 = msg("00528:11", part1496); -var part1502 = // "Pattern{Constant('SSH: SSH user '), Field(username,true), Constant(' at '), Field(saddr,true), Constant(' tried unsuccessfully to log in to '), Field(vsys,true), Constant(' using the shared untrusted interface. SSH disabled on that interface.')}" -match("MESSAGE#924:00528:12", "nwparser.payload", "SSH: SSH user %{username->} at %{saddr->} tried unsuccessfully to log in to %{vsys->} using the shared untrusted interface. SSH disabled on that interface.", processor_chain([ - dup283, +var part1497 = match("MESSAGE#924:00528:12", "nwparser.payload", "SSH: SSH user %{username->} at %{saddr->} tried unsuccessfully to log in to %{vsys->} using the shared untrusted interface. SSH disabled on that interface.", processor_chain([ + dup281, dup2, dup4, dup5, @@ -19779,51 +17953,44 @@ match("MESSAGE#924:00528:12", "nwparser.payload", "SSH: SSH user %{username->} a setc("disposition","disabled"), ])); -var msg936 = msg("00528:12", part1502); +var msg936 = msg("00528:12", part1497); -var part1503 = // "Pattern{Constant('SSH: SSH client at '), Field(saddr,true), Constant(' tried unsuccessfully to '), Field(p0,false)}" -match("MESSAGE#925:00528:13/0", "nwparser.payload", "SSH: SSH client at %{saddr->} tried unsuccessfully to %{p0}"); +var part1498 = match("MESSAGE#925:00528:13/0", "nwparser.payload", "SSH: SSH client at %{saddr->} tried unsuccessfully to %{p0}"); -var part1504 = // "Pattern{Constant('make '), Field(p0,false)}" -match("MESSAGE#925:00528:13/1_0", "nwparser.p0", "make %{p0}"); +var part1499 = match("MESSAGE#925:00528:13/1_0", "nwparser.p0", "make %{p0}"); -var part1505 = // "Pattern{Constant('establish '), Field(p0,false)}" -match("MESSAGE#925:00528:13/1_1", "nwparser.p0", "establish %{p0}"); +var part1500 = match("MESSAGE#925:00528:13/1_1", "nwparser.p0", "establish %{p0}"); var select350 = linear_select([ - part1504, - part1505, + part1499, + part1500, ]); -var part1506 = // "Pattern{Constant('an SSH connection to '), Field(p0,false)}" -match("MESSAGE#925:00528:13/2", "nwparser.p0", "an SSH connection to %{p0}"); +var part1501 = match("MESSAGE#925:00528:13/2", "nwparser.p0", "an SSH connection to %{p0}"); -var part1507 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' with IP '), Field(hostip,true), Constant(' SSH '), Field(p0,false)}" -match("MESSAGE#925:00528:13/4", "nwparser.p0", "%{} %{interface->} with IP %{hostip->} SSH %{p0}"); +var part1502 = match("MESSAGE#925:00528:13/4", "nwparser.p0", "%{} %{interface->} with IP %{hostip->} SSH %{p0}"); -var part1508 = // "Pattern{Constant('not enabled '), Field(p0,false)}" -match("MESSAGE#925:00528:13/5_0", "nwparser.p0", "not enabled %{p0}"); +var part1503 = match("MESSAGE#925:00528:13/5_0", "nwparser.p0", "not enabled %{p0}"); var select351 = linear_select([ - part1508, + part1503, dup157, ]); -var part1509 = // "Pattern{Constant('on that interface.'), Field(,false)}" -match("MESSAGE#925:00528:13/6", "nwparser.p0", "on that interface.%{}"); +var part1504 = match("MESSAGE#925:00528:13/6", "nwparser.p0", "on that interface.%{}"); -var all329 = all_match({ +var all324 = all_match({ processors: [ - part1503, + part1498, select350, - part1506, - dup339, - part1507, + part1501, + dup337, + part1502, select351, - part1509, + part1504, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -19831,54 +17998,48 @@ var all329 = all_match({ ]), }); -var msg937 = msg("00528:13", all329); +var msg937 = msg("00528:13", all324); -var part1510 = // "Pattern{Constant('SSH: SSH client '), Field(saddr,true), Constant(' unsuccessfully attempted to make an SSH connection to '), Field(vsys,true), Constant(' SSH was not completely initialized for that system.')}" -match("MESSAGE#926:00528:14", "nwparser.payload", "SSH: SSH client %{saddr->} unsuccessfully attempted to make an SSH connection to %{vsys->} SSH was not completely initialized for that system.", processor_chain([ - dup283, +var part1505 = match("MESSAGE#926:00528:14", "nwparser.payload", "SSH: SSH client %{saddr->} unsuccessfully attempted to make an SSH connection to %{vsys->} SSH was not completely initialized for that system.", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg938 = msg("00528:14", part1510); +var msg938 = msg("00528:14", part1505); -var part1511 = // "Pattern{Constant('SSH: Admin user '), Field(p0,false)}" -match("MESSAGE#927:00528:15/0", "nwparser.payload", "SSH: Admin user %{p0}"); +var part1506 = match("MESSAGE#927:00528:15/0", "nwparser.payload", "SSH: Admin user %{p0}"); -var part1512 = // "Pattern{Field(administrator,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#927:00528:15/1_1", "nwparser.p0", "%{administrator->} %{p0}"); +var part1507 = match("MESSAGE#927:00528:15/1_1", "nwparser.p0", "%{administrator->} %{p0}"); var select352 = linear_select([ - dup317, - part1512, + dup315, + part1507, ]); -var part1513 = // "Pattern{Constant('at host '), Field(saddr,true), Constant(' requested unsupported '), Field(p0,false)}" -match("MESSAGE#927:00528:15/2", "nwparser.p0", "at host %{saddr->} requested unsupported %{p0}"); +var part1508 = match("MESSAGE#927:00528:15/2", "nwparser.p0", "at host %{saddr->} requested unsupported %{p0}"); -var part1514 = // "Pattern{Constant('PKA algorithm '), Field(p0,false)}" -match("MESSAGE#927:00528:15/3_0", "nwparser.p0", "PKA algorithm %{p0}"); +var part1509 = match("MESSAGE#927:00528:15/3_0", "nwparser.p0", "PKA algorithm %{p0}"); -var part1515 = // "Pattern{Constant('authentication method '), Field(p0,false)}" -match("MESSAGE#927:00528:15/3_1", "nwparser.p0", "authentication method %{p0}"); +var part1510 = match("MESSAGE#927:00528:15/3_1", "nwparser.p0", "authentication method %{p0}"); var select353 = linear_select([ - part1514, - part1515, + part1509, + part1510, ]); -var all330 = all_match({ +var all325 = all_match({ processors: [ - part1511, + part1506, select352, - part1513, + part1508, select353, dup108, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -19886,43 +18047,40 @@ var all330 = all_match({ ]), }); -var msg939 = msg("00528:15", all330); +var msg939 = msg("00528:15", all325); -var part1516 = // "Pattern{Constant('SCP: Admin ''), Field(administrator,false), Constant('' at host '), Field(saddr,true), Constant(' executed invalid scp command: ''), Field(fld2,false), Constant(''')}" -match("MESSAGE#928:00528:16", "nwparser.payload", "SCP: Admin '%{administrator}' at host %{saddr->} executed invalid scp command: '%{fld2}'", processor_chain([ - dup283, +var part1511 = match("MESSAGE#928:00528:16", "nwparser.payload", "SCP: Admin '%{administrator}' at host %{saddr->} executed invalid scp command: '%{fld2}'", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg940 = msg("00528:16", part1516); +var msg940 = msg("00528:16", part1511); -var part1517 = // "Pattern{Constant('SCP: Disabled for ''), Field(username,false), Constant(''. Attempted file transfer failed from host '), Field(saddr,false)}" -match("MESSAGE#929:00528:17", "nwparser.payload", "SCP: Disabled for '%{username}'. Attempted file transfer failed from host %{saddr}", processor_chain([ - dup283, +var part1512 = match("MESSAGE#929:00528:17", "nwparser.payload", "SCP: Disabled for '%{username}'. Attempted file transfer failed from host %{saddr}", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg941 = msg("00528:17", part1517); +var msg941 = msg("00528:17", part1512); -var part1518 = // "Pattern{Constant('authentication successful for admin user '), Field(p0,false)}" -match("MESSAGE#930:00528:18/2", "nwparser.p0", "authentication successful for admin user %{p0}"); +var part1513 = match("MESSAGE#930:00528:18/2", "nwparser.p0", "authentication successful for admin user %{p0}"); -var all331 = all_match({ +var all326 = all_match({ processors: [ - dup318, - dup405, - part1518, - dup406, - dup322, + dup316, + dup402, + part1513, + dup403, + dup320, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -19932,46 +18090,44 @@ var all331 = all_match({ ]), }); -var msg942 = msg("00528:18", all331); +var msg942 = msg("00528:18", all326); -var part1519 = // "Pattern{Constant('authentication failed for admin user '), Field(p0,false)}" -match("MESSAGE#931:00528:26/2", "nwparser.p0", "authentication failed for admin user %{p0}"); +var part1514 = match("MESSAGE#931:00528:26/2", "nwparser.p0", "authentication failed for admin user %{p0}"); -var all332 = all_match({ +var all327 = all_match({ processors: [ - dup318, - dup405, - part1519, - dup406, - dup322, + dup316, + dup402, + part1514, + dup403, + dup320, ], on_success: processor_chain([ - dup208, + dup206, dup29, dup31, dup54, dup2, dup4, dup5, - dup304, + dup302, dup3, setc("event_description","authentication failed for admin user"), ]), }); -var msg943 = msg("00528:26", all332); +var msg943 = msg("00528:26", all327); -var part1520 = // "Pattern{Constant(': SSH user '), Field(username,true), Constant(' has been '), Field(disposition,true), Constant(' using password from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#932:00528:19/2", "nwparser.p0", ": SSH user %{username->} has been %{disposition->} using password from %{saddr}:%{sport}"); +var part1515 = match("MESSAGE#932:00528:19/2", "nwparser.p0", ": SSH user %{username->} has been %{disposition->} using password from %{saddr}:%{sport}"); -var all333 = all_match({ +var all328 = all_match({ processors: [ - dup323, - dup407, - part1520, + dup321, + dup404, + part1515, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -19979,19 +18135,18 @@ var all333 = all_match({ ]), }); -var msg944 = msg("00528:19", all333); +var msg944 = msg("00528:19", all328); -var part1521 = // "Pattern{Constant(': Connection has been '), Field(disposition,true), Constant(' for admin user '), Field(administrator,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#933:00528:20/2", "nwparser.p0", ": Connection has been %{disposition->} for admin user %{administrator->} at %{saddr}:%{sport}"); +var part1516 = match("MESSAGE#933:00528:20/2", "nwparser.p0", ": Connection has been %{disposition->} for admin user %{administrator->} at %{saddr}:%{sport}"); -var all334 = all_match({ +var all329 = all_match({ processors: [ - dup323, - dup407, - part1521, + dup321, + dup404, + part1516, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -19999,33 +18154,30 @@ var all334 = all_match({ ]), }); -var msg945 = msg("00528:20", all334); +var msg945 = msg("00528:20", all329); -var part1522 = // "Pattern{Constant('SCS: SSH user '), Field(username,true), Constant(' at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has requested PKA RSA authentication, which is not supported for that client.')}" -match("MESSAGE#934:00528:21", "nwparser.payload", "SCS: SSH user %{username->} at %{saddr}:%{sport->} has requested PKA RSA authentication, which is not supported for that client.", processor_chain([ - dup283, +var part1517 = match("MESSAGE#934:00528:21", "nwparser.payload", "SCS: SSH user %{username->} at %{saddr}:%{sport->} has requested PKA RSA authentication, which is not supported for that client.", processor_chain([ + dup281, dup2, dup4, dup5, dup3, ])); -var msg946 = msg("00528:21", part1522); +var msg946 = msg("00528:21", part1517); -var part1523 = // "Pattern{Constant('SCS: SSH client at '), Field(saddr,true), Constant(' has attempted to make an SCS connection to '), Field(p0,false)}" -match("MESSAGE#935:00528:22/0", "nwparser.payload", "SCS: SSH client at %{saddr->} has attempted to make an SCS connection to %{p0}"); +var part1518 = match("MESSAGE#935:00528:22/0", "nwparser.payload", "SCS: SSH client at %{saddr->} has attempted to make an SCS connection to %{p0}"); -var part1524 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' with IP '), Field(hostip,true), Constant(' but '), Field(disposition,true), Constant(' because SCS is not enabled for that interface.')}" -match("MESSAGE#935:00528:22/2", "nwparser.p0", "%{} %{interface->} with IP %{hostip->} but %{disposition->} because SCS is not enabled for that interface."); +var part1519 = match("MESSAGE#935:00528:22/2", "nwparser.p0", "%{} %{interface->} with IP %{hostip->} but %{disposition->} because SCS is not enabled for that interface."); -var all335 = all_match({ +var all330 = all_match({ processors: [ - part1523, - dup339, - part1524, + part1518, + dup337, + part1519, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -20034,11 +18186,10 @@ var all335 = all_match({ ]), }); -var msg947 = msg("00528:22", all335); +var msg947 = msg("00528:22", all330); -var part1525 = // "Pattern{Constant('SCS: SSH client at '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' has '), Field(disposition,true), Constant(' to make an SCS connection to vsys '), Field(vsys,true), Constant(' because SCS cannot generate the host and server keys before timing out.')}" -match("MESSAGE#936:00528:23", "nwparser.payload", "SCS: SSH client at %{saddr}:%{sport->} has %{disposition->} to make an SCS connection to vsys %{vsys->} because SCS cannot generate the host and server keys before timing out.", processor_chain([ - dup283, +var part1520 = match("MESSAGE#936:00528:23", "nwparser.payload", "SCS: SSH client at %{saddr}:%{sport->} has %{disposition->} to make an SCS connection to vsys %{vsys->} because SCS cannot generate the host and server keys before timing out.", processor_chain([ + dup281, dup2, dup4, dup5, @@ -20046,33 +18197,30 @@ match("MESSAGE#936:00528:23", "nwparser.payload", "SCS: SSH client at %{saddr}:% setc("result","SCS cannot generate the host and server keys before timing out"), ])); -var msg948 = msg("00528:23", part1525); +var msg948 = msg("00528:23", part1520); -var part1526 = // "Pattern{Constant('SSH: '), Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#937:00528:24", "nwparser.payload", "SSH: %{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ - dup283, +var part1521 = match("MESSAGE#937:00528:24", "nwparser.payload", "SSH: %{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ + dup281, dup2, dup3, dup4, dup5, ])); -var msg949 = msg("00528:24", part1526); +var msg949 = msg("00528:24", part1521); -var part1527 = // "Pattern{Constant('SSH: Admin '), Field(p0,false)}" -match("MESSAGE#938:00528:25/0", "nwparser.payload", "SSH: Admin %{p0}"); +var part1522 = match("MESSAGE#938:00528:25/0", "nwparser.payload", "SSH: Admin %{p0}"); -var part1528 = // "Pattern{Constant('at host '), Field(saddr,true), Constant(' attempted to be authenticated with no authentication methods enabled.')}" -match("MESSAGE#938:00528:25/2", "nwparser.p0", "at host %{saddr->} attempted to be authenticated with no authentication methods enabled."); +var part1523 = match("MESSAGE#938:00528:25/2", "nwparser.p0", "at host %{saddr->} attempted to be authenticated with no authentication methods enabled."); -var all336 = all_match({ +var all331 = all_match({ processors: [ - part1527, - dup406, - part1528, + part1522, + dup403, + part1523, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -20080,7 +18228,7 @@ var all336 = all_match({ ]), }); -var msg950 = msg("00528:25", all336); +var msg950 = msg("00528:25", all331); var select354 = linear_select([ msg924, @@ -20112,25 +18260,22 @@ var select354 = linear_select([ msg950, ]); -var part1529 = // "Pattern{Constant('manually '), Field(p0,false)}" -match("MESSAGE#939:00529/1_0", "nwparser.p0", "manually %{p0}"); +var part1524 = match("MESSAGE#939:00529/1_0", "nwparser.p0", "manually %{p0}"); -var part1530 = // "Pattern{Constant('automatically '), Field(p0,false)}" -match("MESSAGE#939:00529/1_1", "nwparser.p0", "automatically %{p0}"); +var part1525 = match("MESSAGE#939:00529/1_1", "nwparser.p0", "automatically %{p0}"); var select355 = linear_select([ - part1529, - part1530, + part1524, + part1525, ]); -var part1531 = // "Pattern{Constant('refreshed'), Field(,false)}" -match("MESSAGE#939:00529/2", "nwparser.p0", "refreshed%{}"); +var part1526 = match("MESSAGE#939:00529/2", "nwparser.p0", "refreshed%{}"); -var all337 = all_match({ +var all332 = all_match({ processors: [ dup63, select355, - part1531, + part1526, ], on_success: processor_chain([ dup44, @@ -20141,25 +18286,22 @@ var all337 = all_match({ ]), }); -var msg951 = msg("00529", all337); +var msg951 = msg("00529", all332); -var part1532 = // "Pattern{Constant('DNS entries have been refreshed by '), Field(p0,false)}" -match("MESSAGE#940:00529:01/0", "nwparser.payload", "DNS entries have been refreshed by %{p0}"); +var part1527 = match("MESSAGE#940:00529:01/0", "nwparser.payload", "DNS entries have been refreshed by %{p0}"); -var part1533 = // "Pattern{Constant('state change'), Field(,false)}" -match("MESSAGE#940:00529:01/1_0", "nwparser.p0", "state change%{}"); +var part1528 = match("MESSAGE#940:00529:01/1_0", "nwparser.p0", "state change%{}"); -var part1534 = // "Pattern{Constant('HA'), Field(,false)}" -match("MESSAGE#940:00529:01/1_1", "nwparser.p0", "HA%{}"); +var part1529 = match("MESSAGE#940:00529:01/1_1", "nwparser.p0", "HA%{}"); var select356 = linear_select([ - part1533, - part1534, + part1528, + part1529, ]); -var all338 = all_match({ +var all333 = all_match({ processors: [ - part1532, + part1527, select356, ], on_success: processor_chain([ @@ -20171,35 +18313,32 @@ var all338 = all_match({ ]), }); -var msg952 = msg("00529:01", all338); +var msg952 = msg("00529:01", all333); var select357 = linear_select([ msg951, msg952, ]); -var part1535 = // "Pattern{Constant('An IP conflict has been detected and the DHCP client has declined address '), Field(hostip,false)}" -match("MESSAGE#941:00530", "nwparser.payload", "An IP conflict has been detected and the DHCP client has declined address %{hostip}", processor_chain([ - dup274, +var part1530 = match("MESSAGE#941:00530", "nwparser.payload", "An IP conflict has been detected and the DHCP client has declined address %{hostip}", processor_chain([ + dup272, dup2, dup3, dup4, dup5, ])); -var msg953 = msg("00530", part1535); +var msg953 = msg("00530", part1530); -var part1536 = // "Pattern{Constant('DHCP client IP '), Field(hostip,true), Constant(' for the '), Field(p0,false)}" -match("MESSAGE#942:00530:01/0", "nwparser.payload", "DHCP client IP %{hostip->} for the %{p0}"); +var part1531 = match("MESSAGE#942:00530:01/0", "nwparser.payload", "DHCP client IP %{hostip->} for the %{p0}"); -var part1537 = // "Pattern{Field(,true), Constant(' '), Field(interface,true), Constant(' has been manually released')}" -match("MESSAGE#942:00530:01/2", "nwparser.p0", "%{} %{interface->} has been manually released"); +var part1532 = match("MESSAGE#942:00530:01/2", "nwparser.p0", "%{} %{interface->} has been manually released"); -var all339 = all_match({ +var all334 = all_match({ processors: [ - part1536, - dup339, - part1537, + part1531, + dup337, + part1532, ], on_success: processor_chain([ dup44, @@ -20210,10 +18349,9 @@ var all339 = all_match({ ]), }); -var msg954 = msg("00530:01", all339); +var msg954 = msg("00530:01", all334); -var part1538 = // "Pattern{Constant('DHCP client is unable to get an IP address for the '), Field(interface,true), Constant(' interface')}" -match("MESSAGE#943:00530:02", "nwparser.payload", "DHCP client is unable to get an IP address for the %{interface->} interface", processor_chain([ +var part1533 = match("MESSAGE#943:00530:02", "nwparser.payload", "DHCP client is unable to get an IP address for the %{interface->} interface", processor_chain([ dup18, dup2, dup3, @@ -20221,10 +18359,9 @@ match("MESSAGE#943:00530:02", "nwparser.payload", "DHCP client is unable to get dup5, ])); -var msg955 = msg("00530:02", part1538); +var msg955 = msg("00530:02", part1533); -var part1539 = // "Pattern{Constant('DHCP client lease for '), Field(hostip,true), Constant(' has expired')}" -match("MESSAGE#944:00530:03", "nwparser.payload", "DHCP client lease for %{hostip->} has expired", processor_chain([ +var part1534 = match("MESSAGE#944:00530:03", "nwparser.payload", "DHCP client lease for %{hostip->} has expired", processor_chain([ dup44, dup2, dup3, @@ -20232,10 +18369,9 @@ match("MESSAGE#944:00530:03", "nwparser.payload", "DHCP client lease for %{hosti dup5, ])); -var msg956 = msg("00530:03", part1539); +var msg956 = msg("00530:03", part1534); -var part1540 = // "Pattern{Constant('DHCP server '), Field(hostip,true), Constant(' has assigned the untrust Interface '), Field(interface,true), Constant(' with lease '), Field(fld2,false), Constant('.')}" -match("MESSAGE#945:00530:04", "nwparser.payload", "DHCP server %{hostip->} has assigned the untrust Interface %{interface->} with lease %{fld2}.", processor_chain([ +var part1535 = match("MESSAGE#945:00530:04", "nwparser.payload", "DHCP server %{hostip->} has assigned the untrust Interface %{interface->} with lease %{fld2}.", processor_chain([ dup44, dup2, dup3, @@ -20243,10 +18379,9 @@ match("MESSAGE#945:00530:04", "nwparser.payload", "DHCP server %{hostip->} has a dup5, ])); -var msg957 = msg("00530:04", part1540); +var msg957 = msg("00530:04", part1535); -var part1541 = // "Pattern{Constant('DHCP server '), Field(hostip,true), Constant(' has assigned the '), Field(interface,true), Constant(' interface '), Field(fld2,true), Constant(' with lease '), Field(fld3,false)}" -match("MESSAGE#946:00530:05", "nwparser.payload", "DHCP server %{hostip->} has assigned the %{interface->} interface %{fld2->} with lease %{fld3}", processor_chain([ +var part1536 = match("MESSAGE#946:00530:05", "nwparser.payload", "DHCP server %{hostip->} has assigned the %{interface->} interface %{fld2->} with lease %{fld3}", processor_chain([ dup44, dup2, dup3, @@ -20254,10 +18389,9 @@ match("MESSAGE#946:00530:05", "nwparser.payload", "DHCP server %{hostip->} has a dup5, ])); -var msg958 = msg("00530:05", part1541); +var msg958 = msg("00530:05", part1536); -var part1542 = // "Pattern{Constant('DHCP client is unable to get IP address for the untrust interface.'), Field(,false)}" -match("MESSAGE#947:00530:06", "nwparser.payload", "DHCP client is unable to get IP address for the untrust interface.%{}", processor_chain([ +var part1537 = match("MESSAGE#947:00530:06", "nwparser.payload", "DHCP client is unable to get IP address for the untrust interface.%{}", processor_chain([ dup18, dup2, dup3, @@ -20265,7 +18399,7 @@ match("MESSAGE#947:00530:06", "nwparser.payload", "DHCP client is unable to get dup5, ])); -var msg959 = msg("00530:06", part1542); +var msg959 = msg("00530:06", part1537); var select358 = linear_select([ msg953, @@ -20277,13 +18411,12 @@ var select358 = linear_select([ msg959, ]); -var part1543 = // "Pattern{Constant('System clock configurations have been changed by admin '), Field(p0,false)}" -match("MESSAGE#948:00531/0", "nwparser.payload", "System clock configurations have been changed by admin %{p0}"); +var part1538 = match("MESSAGE#948:00531/0", "nwparser.payload", "System clock configurations have been changed by admin %{p0}"); -var all340 = all_match({ +var all335 = all_match({ processors: [ - part1543, - dup400, + part1538, + dup397, ], on_success: processor_chain([ dup1, @@ -20295,10 +18428,9 @@ var all340 = all_match({ ]), }); -var msg960 = msg("00531", all340); +var msg960 = msg("00531", all335); -var part1544 = // "Pattern{Constant('failed to get clock through NTP'), Field(,false)}" -match("MESSAGE#949:00531:01", "nwparser.payload", "failed to get clock through NTP%{}", processor_chain([ +var part1539 = match("MESSAGE#949:00531:01", "nwparser.payload", "failed to get clock through NTP%{}", processor_chain([ dup86, dup2, dup3, @@ -20306,10 +18438,9 @@ match("MESSAGE#949:00531:01", "nwparser.payload", "failed to get clock through N dup5, ])); -var msg961 = msg("00531:01", part1544); +var msg961 = msg("00531:01", part1539); -var part1545 = // "Pattern{Constant('The system clock has been updated through NTP.'), Field(,false)}" -match("MESSAGE#950:00531:02", "nwparser.payload", "The system clock has been updated through NTP.%{}", processor_chain([ +var part1540 = match("MESSAGE#950:00531:02", "nwparser.payload", "The system clock has been updated through NTP.%{}", processor_chain([ dup1, dup2, dup3, @@ -20317,38 +18448,33 @@ match("MESSAGE#950:00531:02", "nwparser.payload", "The system clock has been upd dup5, ])); -var msg962 = msg("00531:02", part1545); +var msg962 = msg("00531:02", part1540); -var part1546 = // "Pattern{Constant('The system clock was updated from '), Field(type,true), Constant(' NTP server type '), Field(hostname,true), Constant(' with a'), Field(p0,false)}" -match("MESSAGE#951:00531:03/0", "nwparser.payload", "The system clock was updated from %{type->} NTP server type %{hostname->} with a%{p0}"); +var part1541 = match("MESSAGE#951:00531:03/0", "nwparser.payload", "The system clock was updated from %{type->} NTP server type %{hostname->} with a%{p0}"); -var part1547 = // "Pattern{Constant(' ms '), Field(p0,false)}" -match("MESSAGE#951:00531:03/1_0", "nwparser.p0", " ms %{p0}"); +var part1542 = match("MESSAGE#951:00531:03/1_0", "nwparser.p0", " ms %{p0}"); var select359 = linear_select([ - part1547, + part1542, dup115, ]); -var part1548 = // "Pattern{Constant('adjustment of '), Field(fld3,false), Constant('. Authentication was '), Field(fld4,false), Constant('. Update mode was '), Field(p0,false)}" -match("MESSAGE#951:00531:03/2", "nwparser.p0", "adjustment of %{fld3}. Authentication was %{fld4}. Update mode was %{p0}"); +var part1543 = match("MESSAGE#951:00531:03/2", "nwparser.p0", "adjustment of %{fld3}. Authentication was %{fld4}. Update mode was %{p0}"); -var part1549 = // "Pattern{Field(fld5,false), Constant('('), Field(fld2,false), Constant(')')}" -match("MESSAGE#951:00531:03/3_0", "nwparser.p0", "%{fld5}(%{fld2})"); +var part1544 = match("MESSAGE#951:00531:03/3_0", "nwparser.p0", "%{fld5}(%{fld2})"); -var part1550 = // "Pattern{Field(fld5,false)}" -match_copy("MESSAGE#951:00531:03/3_1", "nwparser.p0", "fld5"); +var part1545 = match_copy("MESSAGE#951:00531:03/3_1", "nwparser.p0", "fld5"); var select360 = linear_select([ - part1549, - part1550, + part1544, + part1545, ]); -var all341 = all_match({ +var all336 = all_match({ processors: [ - part1546, + part1541, select359, - part1548, + part1543, select360, ], on_success: processor_chain([ @@ -20361,31 +18487,27 @@ var all341 = all_match({ ]), }); -var msg963 = msg("00531:03", all341); +var msg963 = msg("00531:03", all336); -var part1551 = // "Pattern{Constant('The NetScreen device is attempting to contact the '), Field(p0,false)}" -match("MESSAGE#952:00531:04/0", "nwparser.payload", "The NetScreen device is attempting to contact the %{p0}"); +var part1546 = match("MESSAGE#952:00531:04/0", "nwparser.payload", "The NetScreen device is attempting to contact the %{p0}"); -var part1552 = // "Pattern{Constant('primary backup '), Field(p0,false)}" -match("MESSAGE#952:00531:04/1_0", "nwparser.p0", "primary backup %{p0}"); +var part1547 = match("MESSAGE#952:00531:04/1_0", "nwparser.p0", "primary backup %{p0}"); -var part1553 = // "Pattern{Constant('secondary backup '), Field(p0,false)}" -match("MESSAGE#952:00531:04/1_1", "nwparser.p0", "secondary backup %{p0}"); +var part1548 = match("MESSAGE#952:00531:04/1_1", "nwparser.p0", "secondary backup %{p0}"); var select361 = linear_select([ - part1552, - part1553, - dup191, + part1547, + part1548, + dup189, ]); -var part1554 = // "Pattern{Constant('NTP server '), Field(hostname,false)}" -match("MESSAGE#952:00531:04/2", "nwparser.p0", "NTP server %{hostname}"); +var part1549 = match("MESSAGE#952:00531:04/2", "nwparser.p0", "NTP server %{hostname}"); -var all342 = all_match({ +var all337 = all_match({ processors: [ - part1551, + part1546, select361, - part1554, + part1549, ], on_success: processor_chain([ dup1, @@ -20396,10 +18518,9 @@ var all342 = all_match({ ]), }); -var msg964 = msg("00531:04", all342); +var msg964 = msg("00531:04", all337); -var part1555 = // "Pattern{Constant('No NTP server could be contacted. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#953:00531:05", "nwparser.payload", "No NTP server could be contacted. (%{fld1})", processor_chain([ +var part1550 = match("MESSAGE#953:00531:05", "nwparser.payload", "No NTP server could be contacted. (%{fld1})", processor_chain([ dup86, dup2, dup3, @@ -20408,10 +18529,9 @@ match("MESSAGE#953:00531:05", "nwparser.payload", "No NTP server could be contac dup5, ])); -var msg965 = msg("00531:05", part1555); +var msg965 = msg("00531:05", part1550); -var part1556 = // "Pattern{Constant('Network Time Protocol adjustment of '), Field(fld2,true), Constant(' from NTP server '), Field(hostname,true), Constant(' exceeds the allowed adjustment of '), Field(fld3,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#954:00531:06", "nwparser.payload", "Network Time Protocol adjustment of %{fld2->} from NTP server %{hostname->} exceeds the allowed adjustment of %{fld3}. (%{fld1})", processor_chain([ +var part1551 = match("MESSAGE#954:00531:06", "nwparser.payload", "Network Time Protocol adjustment of %{fld2->} from NTP server %{hostname->} exceeds the allowed adjustment of %{fld3}. (%{fld1})", processor_chain([ dup86, dup2, dup3, @@ -20420,10 +18540,9 @@ match("MESSAGE#954:00531:06", "nwparser.payload", "Network Time Protocol adjustm dup5, ])); -var msg966 = msg("00531:06", part1556); +var msg966 = msg("00531:06", part1551); -var part1557 = // "Pattern{Constant('No acceptable time could be obtained from any NTP server. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#955:00531:07", "nwparser.payload", "No acceptable time could be obtained from any NTP server. (%{fld1})", processor_chain([ +var part1552 = match("MESSAGE#955:00531:07", "nwparser.payload", "No acceptable time could be obtained from any NTP server. (%{fld1})", processor_chain([ dup86, dup2, dup3, @@ -20432,10 +18551,9 @@ match("MESSAGE#955:00531:07", "nwparser.payload", "No acceptable time could be o dup5, ])); -var msg967 = msg("00531:07", part1557); +var msg967 = msg("00531:07", part1552); -var part1558 = // "Pattern{Constant('Administrator '), Field(administrator,true), Constant(' changed the '), Field(change_attribute,true), Constant(' from '), Field(change_old,true), Constant(' to '), Field(change_new,true), Constant(' (by '), Field(fld3,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(') ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#956:00531:08", "nwparser.payload", "Administrator %{administrator->} changed the %{change_attribute->} from %{change_old->} to %{change_new->} (by %{fld3->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}) (%{fld1})", processor_chain([ +var part1553 = match("MESSAGE#956:00531:08", "nwparser.payload", "Administrator %{administrator->} changed the %{change_attribute->} from %{change_old->} to %{change_new->} (by %{fld3->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport}) (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -20444,10 +18562,9 @@ match("MESSAGE#956:00531:08", "nwparser.payload", "Administrator %{administrator dup5, ])); -var msg968 = msg("00531:08", part1558); +var msg968 = msg("00531:08", part1553); -var part1559 = // "Pattern{Constant('Network Time Protocol settings changed. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#957:00531:09", "nwparser.payload", "Network Time Protocol settings changed. (%{fld1})", processor_chain([ +var part1554 = match("MESSAGE#957:00531:09", "nwparser.payload", "Network Time Protocol settings changed. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -20456,10 +18573,9 @@ match("MESSAGE#957:00531:09", "nwparser.payload", "Network Time Protocol setting dup5, ])); -var msg969 = msg("00531:09", part1559); +var msg969 = msg("00531:09", part1554); -var part1560 = // "Pattern{Constant('NTP server is '), Field(disposition,true), Constant(' on interface '), Field(interface,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#958:00531:10", "nwparser.payload", "NTP server is %{disposition->} on interface %{interface->} (%{fld1})", processor_chain([ +var part1555 = match("MESSAGE#958:00531:10", "nwparser.payload", "NTP server is %{disposition->} on interface %{interface->} (%{fld1})", processor_chain([ dup86, dup2, dup3, @@ -20468,10 +18584,9 @@ match("MESSAGE#958:00531:10", "nwparser.payload", "NTP server is %{disposition-> dup5, ])); -var msg970 = msg("00531:10", part1560); +var msg970 = msg("00531:10", part1555); -var part1561 = // "Pattern{Constant('The system clock will be changed from '), Field(change_old,true), Constant(' to '), Field(change_new,true), Constant(' received from primary NTP server '), Field(hostip,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#959:00531:11", "nwparser.payload", "The system clock will be changed from %{change_old->} to %{change_new->} received from primary NTP server %{hostip->} (%{fld1})", processor_chain([ +var part1556 = match("MESSAGE#959:00531:11", "nwparser.payload", "The system clock will be changed from %{change_old->} to %{change_new->} received from primary NTP server %{hostip->} (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -20481,10 +18596,9 @@ match("MESSAGE#959:00531:11", "nwparser.payload", "The system clock will be chan setc("event_description","system clock changed based on receive from primary NTP server"), ])); -var msg971 = msg("00531:11", part1561); +var msg971 = msg("00531:11", part1556); -var part1562 = // "Pattern{Field(fld35,true), Constant(' NTP server '), Field(saddr,true), Constant(' could not be contacted. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1223:00531:12", "nwparser.payload", "%{fld35->} NTP server %{saddr->} could not be contacted. (%{fld1})", processor_chain([ +var part1557 = match("MESSAGE#1223:00531:12", "nwparser.payload", "%{fld35->} NTP server %{saddr->} could not be contacted. (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -20492,7 +18606,7 @@ match("MESSAGE#1223:00531:12", "nwparser.payload", "%{fld35->} NTP server %{sadd dup9, ])); -var msg972 = msg("00531:12", part1562); +var msg972 = msg("00531:12", part1557); var select362 = linear_select([ msg960, @@ -20510,8 +18624,7 @@ var select362 = linear_select([ msg972, ]); -var part1563 = // "Pattern{Constant('VIP server '), Field(hostip,true), Constant(' is now responding')}" -match("MESSAGE#960:00533", "nwparser.payload", "VIP server %{hostip->} is now responding", processor_chain([ +var part1558 = match("MESSAGE#960:00533", "nwparser.payload", "VIP server %{hostip->} is now responding", processor_chain([ dup44, dup2, dup3, @@ -20519,10 +18632,9 @@ match("MESSAGE#960:00533", "nwparser.payload", "VIP server %{hostip->} is now re dup5, ])); -var msg973 = msg("00533", part1563); +var msg973 = msg("00533", part1558); -var part1564 = // "Pattern{Field(fld2,true), Constant(' has been cleared')}" -match("MESSAGE#961:00534", "nwparser.payload", "%{fld2->} has been cleared", processor_chain([ +var part1559 = match("MESSAGE#961:00534", "nwparser.payload", "%{fld2->} has been cleared", processor_chain([ dup44, dup2, dup3, @@ -20530,55 +18642,50 @@ match("MESSAGE#961:00534", "nwparser.payload", "%{fld2->} has been cleared", pro dup5, ])); -var msg974 = msg("00534", part1564); +var msg974 = msg("00534", part1559); -var part1565 = // "Pattern{Constant('Cannot find the CA certificate with distinguished name '), Field(fld2,false)}" -match("MESSAGE#962:00535", "nwparser.payload", "Cannot find the CA certificate with distinguished name %{fld2}", processor_chain([ - dup316, +var part1560 = match("MESSAGE#962:00535", "nwparser.payload", "Cannot find the CA certificate with distinguished name %{fld2}", processor_chain([ + dup314, dup2, dup3, dup4, dup5, ])); -var msg975 = msg("00535", part1565); +var msg975 = msg("00535", part1560); -var part1566 = // "Pattern{Constant('Distinguished name '), Field(dn,true), Constant(' in the X509 certificate request is '), Field(disposition,false)}" -match("MESSAGE#963:00535:01", "nwparser.payload", "Distinguished name %{dn->} in the X509 certificate request is %{disposition}", processor_chain([ - dup316, +var part1561 = match("MESSAGE#963:00535:01", "nwparser.payload", "Distinguished name %{dn->} in the X509 certificate request is %{disposition}", processor_chain([ + dup314, dup2, dup3, dup4, dup5, ])); -var msg976 = msg("00535:01", part1566); +var msg976 = msg("00535:01", part1561); -var part1567 = // "Pattern{Constant('Local certificate with distinguished name '), Field(dn,true), Constant(' is '), Field(disposition,false)}" -match("MESSAGE#964:00535:02", "nwparser.payload", "Local certificate with distinguished name %{dn->} is %{disposition}", processor_chain([ - dup316, +var part1562 = match("MESSAGE#964:00535:02", "nwparser.payload", "Local certificate with distinguished name %{dn->} is %{disposition}", processor_chain([ + dup314, dup2, dup3, dup4, dup5, ])); -var msg977 = msg("00535:02", part1567); +var msg977 = msg("00535:02", part1562); -var part1568 = // "Pattern{Constant('PKCS #7 data cannot be decapsulated'), Field(,false)}" -match("MESSAGE#965:00535:03", "nwparser.payload", "PKCS #7 data cannot be decapsulated%{}", processor_chain([ - dup316, +var part1563 = match("MESSAGE#965:00535:03", "nwparser.payload", "PKCS #7 data cannot be decapsulated%{}", processor_chain([ + dup314, dup2, dup3, dup4, dup5, ])); -var msg978 = msg("00535:03", part1568); +var msg978 = msg("00535:03", part1563); -var part1569 = // "Pattern{Constant('SCEP_FAILURE message has been received from the CA'), Field(,false)}" -match("MESSAGE#966:00535:04", "nwparser.payload", "SCEP_FAILURE message has been received from the CA%{}", processor_chain([ - dup316, +var part1564 = match("MESSAGE#966:00535:04", "nwparser.payload", "SCEP_FAILURE message has been received from the CA%{}", processor_chain([ + dup314, dup2, dup3, dup4, @@ -20586,22 +18693,20 @@ match("MESSAGE#966:00535:04", "nwparser.payload", "SCEP_FAILURE message has been setc("result","SCEP_FAILURE message"), ])); -var msg979 = msg("00535:04", part1569); +var msg979 = msg("00535:04", part1564); -var part1570 = // "Pattern{Constant('PKI error message has been received: '), Field(result,false)}" -match("MESSAGE#967:00535:05", "nwparser.payload", "PKI error message has been received: %{result}", processor_chain([ - dup316, +var part1565 = match("MESSAGE#967:00535:05", "nwparser.payload", "PKI error message has been received: %{result}", processor_chain([ + dup314, dup2, dup3, dup4, dup5, ])); -var msg980 = msg("00535:05", part1570); +var msg980 = msg("00535:05", part1565); -var part1571 = // "Pattern{Constant('PKI: Saved CA configuration (CA cert subject name '), Field(dn,false), Constant('). ('), Field(event_time_string,false), Constant(')')}" -match("MESSAGE#968:00535:06", "nwparser.payload", "PKI: Saved CA configuration (CA cert subject name %{dn}). (%{event_time_string})", processor_chain([ - dup316, +var part1566 = match("MESSAGE#968:00535:06", "nwparser.payload", "PKI: Saved CA configuration (CA cert subject name %{dn}). (%{event_time_string})", processor_chain([ + dup314, dup2, dup3, dup4, @@ -20609,7 +18714,7 @@ match("MESSAGE#968:00535:06", "nwparser.payload", "PKI: Saved CA configuration ( setc("event_description","Saved CA configuration - cert subject name"), ])); -var msg981 = msg("00535:06", part1571); +var msg981 = msg("00535:06", part1566); var select363 = linear_select([ msg975, @@ -20621,31 +18726,26 @@ var select363 = linear_select([ msg981, ]); -var part1572 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#969:00536:49/0", "nwparser.payload", "IKE %{hostip->} %{p0}"); +var part1567 = match("MESSAGE#969:00536:49/0", "nwparser.payload", "IKE %{hostip->} %{p0}"); -var part1573 = // "Pattern{Constant('Phase 2 msg ID '), Field(sessionid,false), Constant(': '), Field(disposition,false), Constant('. '), Field(p0,false)}" -match("MESSAGE#969:00536:49/1_0", "nwparser.p0", "Phase 2 msg ID %{sessionid}: %{disposition}. %{p0}"); +var part1568 = match("MESSAGE#969:00536:49/1_0", "nwparser.p0", "Phase 2 msg ID %{sessionid}: %{disposition}. %{p0}"); -var part1574 = // "Pattern{Constant('Phase 1: '), Field(disposition,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#969:00536:49/1_1", "nwparser.p0", "Phase 1: %{disposition->} %{p0}"); +var part1569 = match("MESSAGE#969:00536:49/1_1", "nwparser.p0", "Phase 1: %{disposition->} %{p0}"); -var part1575 = // "Pattern{Constant('phase 2:'), Field(disposition,false), Constant('. '), Field(p0,false)}" -match("MESSAGE#969:00536:49/1_2", "nwparser.p0", "phase 2:%{disposition}. %{p0}"); +var part1570 = match("MESSAGE#969:00536:49/1_2", "nwparser.p0", "phase 2:%{disposition}. %{p0}"); -var part1576 = // "Pattern{Constant('phase 1:'), Field(disposition,false), Constant('. '), Field(p0,false)}" -match("MESSAGE#969:00536:49/1_3", "nwparser.p0", "phase 1:%{disposition}. %{p0}"); +var part1571 = match("MESSAGE#969:00536:49/1_3", "nwparser.p0", "phase 1:%{disposition}. %{p0}"); var select364 = linear_select([ - part1573, - part1574, - part1575, - part1576, + part1568, + part1569, + part1570, + part1571, ]); -var all343 = all_match({ +var all338 = all_match({ processors: [ - part1572, + part1567, select364, dup10, ], @@ -20659,10 +18759,9 @@ var all343 = all_match({ ]), }); -var msg982 = msg("00536:49", all343); +var msg982 = msg("00536:49", all338); -var part1577 = // "Pattern{Constant('UDP packets have been received from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' at interface '), Field(interface,true), Constant(' at '), Field(daddr,false), Constant('/'), Field(dport,false)}" -match("MESSAGE#970:00536", "nwparser.payload", "UDP packets have been received from %{saddr}/%{sport->} at interface %{interface->} at %{daddr}/%{dport}", processor_chain([ +var part1572 = match("MESSAGE#970:00536", "nwparser.payload", "UDP packets have been received from %{saddr}/%{sport->} at interface %{interface->} at %{daddr}/%{dport}", processor_chain([ dup44, dup2, dup4, @@ -20671,10 +18770,9 @@ match("MESSAGE#970:00536", "nwparser.payload", "UDP packets have been received f dup61, ])); -var msg983 = msg("00536", part1577); +var msg983 = msg("00536", part1572); -var part1578 = // "Pattern{Constant('Attempt to set tunnel ('), Field(fld2,false), Constant(') without IP address at both end points! Check outgoing interface.')}" -match("MESSAGE#971:00536:01", "nwparser.payload", "Attempt to set tunnel (%{fld2}) without IP address at both end points! Check outgoing interface.", processor_chain([ +var part1573 = match("MESSAGE#971:00536:01", "nwparser.payload", "Attempt to set tunnel (%{fld2}) without IP address at both end points! Check outgoing interface.", processor_chain([ dup18, dup2, dup3, @@ -20682,10 +18780,9 @@ match("MESSAGE#971:00536:01", "nwparser.payload", "Attempt to set tunnel (%{fld2 dup5, ])); -var msg984 = msg("00536:01", part1578); +var msg984 = msg("00536:01", part1573); -var part1579 = // "Pattern{Constant('Gateway '), Field(fld2,true), Constant(' at '), Field(hostip,true), Constant(' in '), Field(fld4,true), Constant(' mode with ID: '), Field(fld3,true), Constant(' has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#972:00536:02", "nwparser.payload", "Gateway %{fld2->} at %{hostip->} in %{fld4->} mode with ID: %{fld3->} has been %{disposition}.", processor_chain([ +var part1574 = match("MESSAGE#972:00536:02", "nwparser.payload", "Gateway %{fld2->} at %{hostip->} in %{fld4->} mode with ID: %{fld3->} has been %{disposition}.", processor_chain([ dup1, dup2, dup3, @@ -20693,10 +18790,9 @@ match("MESSAGE#972:00536:02", "nwparser.payload", "Gateway %{fld2->} at %{hostip dup5, ])); -var msg985 = msg("00536:02", part1579); +var msg985 = msg("00536:02", part1574); -var part1580 = // "Pattern{Constant('IKE gateway '), Field(fld2,true), Constant(' has been '), Field(disposition,false), Constant('. '), Field(info,false)}" -match("MESSAGE#973:00536:03", "nwparser.payload", "IKE gateway %{fld2->} has been %{disposition}. %{info}", processor_chain([ +var part1575 = match("MESSAGE#973:00536:03", "nwparser.payload", "IKE gateway %{fld2->} has been %{disposition}. %{info}", processor_chain([ dup1, dup2, dup3, @@ -20704,10 +18800,9 @@ match("MESSAGE#973:00536:03", "nwparser.payload", "IKE gateway %{fld2->} has bee dup5, ])); -var msg986 = msg("00536:03", part1580); +var msg986 = msg("00536:03", part1575); -var part1581 = // "Pattern{Constant('VPN monitoring for VPN '), Field(group,true), Constant(' has deactivated the SA with ID '), Field(fld2,false), Constant('.')}" -match("MESSAGE#974:00536:04", "nwparser.payload", "VPN monitoring for VPN %{group->} has deactivated the SA with ID %{fld2}.", processor_chain([ +var part1576 = match("MESSAGE#974:00536:04", "nwparser.payload", "VPN monitoring for VPN %{group->} has deactivated the SA with ID %{fld2}.", processor_chain([ setc("eventcategory","1801010100"), dup2, dup3, @@ -20715,10 +18810,9 @@ match("MESSAGE#974:00536:04", "nwparser.payload", "VPN monitoring for VPN %{grou dup5, ])); -var msg987 = msg("00536:04", part1581); +var msg987 = msg("00536:04", part1576); -var part1582 = // "Pattern{Constant('VPN ID number cannot be assigned'), Field(,false)}" -match("MESSAGE#975:00536:05", "nwparser.payload", "VPN ID number cannot be assigned%{}", processor_chain([ +var part1577 = match("MESSAGE#975:00536:05", "nwparser.payload", "VPN ID number cannot be assigned%{}", processor_chain([ dup44, dup2, dup3, @@ -20726,10 +18820,9 @@ match("MESSAGE#975:00536:05", "nwparser.payload", "VPN ID number cannot be assig dup5, ])); -var msg988 = msg("00536:05", part1582); +var msg988 = msg("00536:05", part1577); -var part1583 = // "Pattern{Constant('Local gateway IP address has changed to '), Field(fld2,false), Constant('. VPNs cannot terminate at an interface with IP '), Field(hostip,false)}" -match("MESSAGE#976:00536:06", "nwparser.payload", "Local gateway IP address has changed to %{fld2}. VPNs cannot terminate at an interface with IP %{hostip}", processor_chain([ +var part1578 = match("MESSAGE#976:00536:06", "nwparser.payload", "Local gateway IP address has changed to %{fld2}. VPNs cannot terminate at an interface with IP %{hostip}", processor_chain([ dup1, dup2, dup3, @@ -20737,10 +18830,9 @@ match("MESSAGE#976:00536:06", "nwparser.payload", "Local gateway IP address has dup5, ])); -var msg989 = msg("00536:06", part1583); +var msg989 = msg("00536:06", part1578); -var part1584 = // "Pattern{Constant('Local gateway IP address has changed from '), Field(change_old,true), Constant(' to another setting')}" -match("MESSAGE#977:00536:07", "nwparser.payload", "Local gateway IP address has changed from %{change_old->} to another setting", processor_chain([ +var part1579 = match("MESSAGE#977:00536:07", "nwparser.payload", "Local gateway IP address has changed from %{change_old->} to another setting", processor_chain([ dup1, dup2, dup3, @@ -20748,10 +18840,9 @@ match("MESSAGE#977:00536:07", "nwparser.payload", "Local gateway IP address has dup5, ])); -var msg990 = msg("00536:07", part1584); +var msg990 = msg("00536:07", part1579); -var part1585 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Sent initial contact notification message')}" -match("MESSAGE#978:00536:08", "nwparser.payload", "IKE %{hostip}: Sent initial contact notification message", processor_chain([ +var part1580 = match("MESSAGE#978:00536:08", "nwparser.payload", "IKE %{hostip}: Sent initial contact notification message", processor_chain([ dup44, dup2, dup3, @@ -20759,10 +18850,9 @@ match("MESSAGE#978:00536:08", "nwparser.payload", "IKE %{hostip}: Sent initial c dup5, ])); -var msg991 = msg("00536:08", part1585); +var msg991 = msg("00536:08", part1580); -var part1586 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Sent initial contact notification')}" -match("MESSAGE#979:00536:09", "nwparser.payload", "IKE %{hostip}: Sent initial contact notification", processor_chain([ +var part1581 = match("MESSAGE#979:00536:09", "nwparser.payload", "IKE %{hostip}: Sent initial contact notification", processor_chain([ dup44, dup2, dup3, @@ -20770,10 +18860,9 @@ match("MESSAGE#979:00536:09", "nwparser.payload", "IKE %{hostip}: Sent initial c dup5, ])); -var msg992 = msg("00536:09", part1586); +var msg992 = msg("00536:09", part1581); -var part1587 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Responded to a packet with a bad SPI after rebooting')}" -match("MESSAGE#980:00536:10", "nwparser.payload", "IKE %{hostip}: Responded to a packet with a bad SPI after rebooting", processor_chain([ +var part1582 = match("MESSAGE#980:00536:10", "nwparser.payload", "IKE %{hostip}: Responded to a packet with a bad SPI after rebooting", processor_chain([ dup44, dup2, dup3, @@ -20781,10 +18870,9 @@ match("MESSAGE#980:00536:10", "nwparser.payload", "IKE %{hostip}: Responded to a dup5, ])); -var msg993 = msg("00536:10", part1587); +var msg993 = msg("00536:10", part1582); -var part1588 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Removed Phase 2 SAs after receiving a notification message')}" -match("MESSAGE#981:00536:11", "nwparser.payload", "IKE %{hostip}: Removed Phase 2 SAs after receiving a notification message", processor_chain([ +var part1583 = match("MESSAGE#981:00536:11", "nwparser.payload", "IKE %{hostip}: Removed Phase 2 SAs after receiving a notification message", processor_chain([ dup44, dup2, dup3, @@ -20792,10 +18880,9 @@ match("MESSAGE#981:00536:11", "nwparser.payload", "IKE %{hostip}: Removed Phase dup5, ])); -var msg994 = msg("00536:11", part1588); +var msg994 = msg("00536:11", part1583); -var part1589 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Rejected first Phase 1 packet from an unrecognized source')}" -match("MESSAGE#982:00536:12", "nwparser.payload", "IKE %{hostip}: Rejected first Phase 1 packet from an unrecognized source", processor_chain([ +var part1584 = match("MESSAGE#982:00536:12", "nwparser.payload", "IKE %{hostip}: Rejected first Phase 1 packet from an unrecognized source", processor_chain([ dup44, dup2, dup3, @@ -20803,10 +18890,9 @@ match("MESSAGE#982:00536:12", "nwparser.payload", "IKE %{hostip}: Rejected first dup5, ])); -var msg995 = msg("00536:12", part1589); +var msg995 = msg("00536:12", part1584); -var part1590 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Rejected an initial Phase 1 packet from an unrecognized peer gateway')}" -match("MESSAGE#983:00536:13", "nwparser.payload", "IKE %{hostip}: Rejected an initial Phase 1 packet from an unrecognized peer gateway", processor_chain([ +var part1585 = match("MESSAGE#983:00536:13", "nwparser.payload", "IKE %{hostip}: Rejected an initial Phase 1 packet from an unrecognized peer gateway", processor_chain([ dup44, dup2, dup3, @@ -20814,19 +18900,17 @@ match("MESSAGE#983:00536:13", "nwparser.payload", "IKE %{hostip}: Rejected an in dup5, ])); -var msg996 = msg("00536:13", part1590); +var msg996 = msg("00536:13", part1585); -var part1591 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Received initial contact notification and removed Phase '), Field(p0,false)}" -match("MESSAGE#984:00536:14/0", "nwparser.payload", "IKE %{hostip}: Received initial contact notification and removed Phase %{p0}"); +var part1586 = match("MESSAGE#984:00536:14/0", "nwparser.payload", "IKE %{hostip}: Received initial contact notification and removed Phase %{p0}"); -var part1592 = // "Pattern{Constant('SAs'), Field(,false)}" -match("MESSAGE#984:00536:14/2", "nwparser.p0", "SAs%{}"); +var part1587 = match("MESSAGE#984:00536:14/2", "nwparser.p0", "SAs%{}"); -var all344 = all_match({ +var all339 = all_match({ processors: [ - part1591, - dup386, - part1592, + part1586, + dup383, + part1587, ], on_success: processor_chain([ dup44, @@ -20837,10 +18921,9 @@ var all344 = all_match({ ]), }); -var msg997 = msg("00536:14", all344); +var msg997 = msg("00536:14", all339); -var part1593 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Received a notification message for '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#985:00536:50", "nwparser.payload", "IKE %{hostip}: Received a notification message for %{disposition}. (%{fld1})", processor_chain([ +var part1588 = match("MESSAGE#985:00536:50", "nwparser.payload", "IKE %{hostip}: Received a notification message for %{disposition}. (%{fld1})", processor_chain([ dup44, dup2, dup9, @@ -20849,10 +18932,9 @@ match("MESSAGE#985:00536:50", "nwparser.payload", "IKE %{hostip}: Received a not dup5, ])); -var msg998 = msg("00536:50", part1593); +var msg998 = msg("00536:50", part1588); -var part1594 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Received incorrect ID payload: IP address '), Field(fld2,true), Constant(' instead of IP address '), Field(fld3,false)}" -match("MESSAGE#986:00536:15", "nwparser.payload", "IKE %{hostip}: Received incorrect ID payload: IP address %{fld2->} instead of IP address %{fld3}", processor_chain([ +var part1589 = match("MESSAGE#986:00536:15", "nwparser.payload", "IKE %{hostip}: Received incorrect ID payload: IP address %{fld2->} instead of IP address %{fld3}", processor_chain([ dup44, dup2, dup3, @@ -20860,10 +18942,9 @@ match("MESSAGE#986:00536:15", "nwparser.payload", "IKE %{hostip}: Received incor dup5, ])); -var msg999 = msg("00536:15", part1594); +var msg999 = msg("00536:15", part1589); -var part1595 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Phase 2 negotiation request is already in the task list')}" -match("MESSAGE#987:00536:16", "nwparser.payload", "IKE %{hostip}: Phase 2 negotiation request is already in the task list", processor_chain([ +var part1590 = match("MESSAGE#987:00536:16", "nwparser.payload", "IKE %{hostip}: Phase 2 negotiation request is already in the task list", processor_chain([ dup44, dup2, dup3, @@ -20871,10 +18952,9 @@ match("MESSAGE#987:00536:16", "nwparser.payload", "IKE %{hostip}: Phase 2 negoti dup5, ])); -var msg1000 = msg("00536:16", part1595); +var msg1000 = msg("00536:16", part1590); -var part1596 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Heartbeats have been lost '), Field(fld2,true), Constant(' times')}" -match("MESSAGE#988:00536:17", "nwparser.payload", "IKE %{hostip}: Heartbeats have been lost %{fld2->} times", processor_chain([ +var part1591 = match("MESSAGE#988:00536:17", "nwparser.payload", "IKE %{hostip}: Heartbeats have been lost %{fld2->} times", processor_chain([ dup44, dup2, dup3, @@ -20882,10 +18962,9 @@ match("MESSAGE#988:00536:17", "nwparser.payload", "IKE %{hostip}: Heartbeats hav dup5, ])); -var msg1001 = msg("00536:17", part1596); +var msg1001 = msg("00536:17", part1591); -var part1597 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Dropped peer packet because no policy uses the peer configuration')}" -match("MESSAGE#989:00536:18", "nwparser.payload", "IKE %{hostip}: Dropped peer packet because no policy uses the peer configuration", processor_chain([ +var part1592 = match("MESSAGE#989:00536:18", "nwparser.payload", "IKE %{hostip}: Dropped peer packet because no policy uses the peer configuration", processor_chain([ dup44, dup2, dup3, @@ -20893,10 +18972,9 @@ match("MESSAGE#989:00536:18", "nwparser.payload", "IKE %{hostip}: Dropped peer p dup5, ])); -var msg1002 = msg("00536:18", part1597); +var msg1002 = msg("00536:18", part1592); -var part1598 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Dropped packet because remote gateway OK is not used in any VPN tunnel configurations')}" -match("MESSAGE#990:00536:19", "nwparser.payload", "IKE %{hostip}: Dropped packet because remote gateway OK is not used in any VPN tunnel configurations", processor_chain([ +var part1593 = match("MESSAGE#990:00536:19", "nwparser.payload", "IKE %{hostip}: Dropped packet because remote gateway OK is not used in any VPN tunnel configurations", processor_chain([ dup44, dup2, dup3, @@ -20904,10 +18982,9 @@ match("MESSAGE#990:00536:19", "nwparser.payload", "IKE %{hostip}: Dropped packet dup5, ])); -var msg1003 = msg("00536:19", part1598); +var msg1003 = msg("00536:19", part1593); -var part1599 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Added the initial contact task to the task list')}" -match("MESSAGE#991:00536:20", "nwparser.payload", "IKE %{hostip}: Added the initial contact task to the task list", processor_chain([ +var part1594 = match("MESSAGE#991:00536:20", "nwparser.payload", "IKE %{hostip}: Added the initial contact task to the task list", processor_chain([ dup44, dup2, dup3, @@ -20915,10 +18992,9 @@ match("MESSAGE#991:00536:20", "nwparser.payload", "IKE %{hostip}: Added the init dup5, ])); -var msg1004 = msg("00536:20", part1599); +var msg1004 = msg("00536:20", part1594); -var part1600 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Added Phase 2 session tasks to the task list')}" -match("MESSAGE#992:00536:21", "nwparser.payload", "IKE %{hostip}: Added Phase 2 session tasks to the task list", processor_chain([ +var part1595 = match("MESSAGE#992:00536:21", "nwparser.payload", "IKE %{hostip}: Added Phase 2 session tasks to the task list", processor_chain([ dup44, dup2, dup3, @@ -20926,10 +19002,9 @@ match("MESSAGE#992:00536:21", "nwparser.payload", "IKE %{hostip}: Added Phase 2 dup5, ])); -var msg1005 = msg("00536:21", part1600); +var msg1005 = msg("00536:21", part1595); -var part1601 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1 : '), Field(disposition,true), Constant(' proposals from peer. Negotiations failed')}" -match("MESSAGE#993:00536:22", "nwparser.payload", "IKE %{hostip->} Phase 1 : %{disposition->} proposals from peer. Negotiations failed", processor_chain([ +var part1596 = match("MESSAGE#993:00536:22", "nwparser.payload", "IKE %{hostip->} Phase 1 : %{disposition->} proposals from peer. Negotiations failed", processor_chain([ dup44, dup2, dup3, @@ -20938,10 +19013,9 @@ match("MESSAGE#993:00536:22", "nwparser.payload", "IKE %{hostip->} Phase 1 : %{d setc("result","Negotiations failed"), ])); -var msg1006 = msg("00536:22", part1601); +var msg1006 = msg("00536:22", part1596); -var part1602 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1 : Aborted negotiations because the time limit has elapsed')}" -match("MESSAGE#994:00536:23", "nwparser.payload", "IKE %{hostip->} Phase 1 : Aborted negotiations because the time limit has elapsed", processor_chain([ +var part1597 = match("MESSAGE#994:00536:23", "nwparser.payload", "IKE %{hostip->} Phase 1 : Aborted negotiations because the time limit has elapsed", processor_chain([ dup44, dup2, dup3, @@ -20951,10 +19025,9 @@ match("MESSAGE#994:00536:23", "nwparser.payload", "IKE %{hostip->} Phase 1 : Abo setc("disposition","Aborted"), ])); -var msg1007 = msg("00536:23", part1602); +var msg1007 = msg("00536:23", part1597); -var part1603 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 2: Received a message but did not check a policy because id-mode is set to IP or policy-checking is disabled')}" -match("MESSAGE#995:00536:24", "nwparser.payload", "IKE %{hostip->} Phase 2: Received a message but did not check a policy because id-mode is set to IP or policy-checking is disabled", processor_chain([ +var part1598 = match("MESSAGE#995:00536:24", "nwparser.payload", "IKE %{hostip->} Phase 2: Received a message but did not check a policy because id-mode is set to IP or policy-checking is disabled", processor_chain([ dup44, dup2, dup3, @@ -20962,10 +19035,9 @@ match("MESSAGE#995:00536:24", "nwparser.payload", "IKE %{hostip->} Phase 2: Rece dup5, ])); -var msg1008 = msg("00536:24", part1603); +var msg1008 = msg("00536:24", part1598); -var part1604 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 2: Received DH group '), Field(fld2,true), Constant(' instead of expected group '), Field(fld3,true), Constant(' for PFS')}" -match("MESSAGE#996:00536:25", "nwparser.payload", "IKE %{hostip->} Phase 2: Received DH group %{fld2->} instead of expected group %{fld3->} for PFS", processor_chain([ +var part1599 = match("MESSAGE#996:00536:25", "nwparser.payload", "IKE %{hostip->} Phase 2: Received DH group %{fld2->} instead of expected group %{fld3->} for PFS", processor_chain([ dup44, dup2, dup3, @@ -20973,10 +19045,9 @@ match("MESSAGE#996:00536:25", "nwparser.payload", "IKE %{hostip->} Phase 2: Rece dup5, ])); -var msg1009 = msg("00536:25", part1604); +var msg1009 = msg("00536:25", part1599); -var part1605 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 2: No policy exists for the proxy ID received: local ID '), Field(fld2,true), Constant(' remote ID '), Field(fld3,false)}" -match("MESSAGE#997:00536:26", "nwparser.payload", "IKE %{hostip->} Phase 2: No policy exists for the proxy ID received: local ID %{fld2->} remote ID %{fld3}", processor_chain([ +var part1600 = match("MESSAGE#997:00536:26", "nwparser.payload", "IKE %{hostip->} Phase 2: No policy exists for the proxy ID received: local ID %{fld2->} remote ID %{fld3}", processor_chain([ dup44, dup2, dup3, @@ -20984,10 +19055,9 @@ match("MESSAGE#997:00536:26", "nwparser.payload", "IKE %{hostip->} Phase 2: No p dup5, ])); -var msg1010 = msg("00536:26", part1605); +var msg1010 = msg("00536:26", part1600); -var part1606 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: RSA private key is needed to sign packets')}" -match("MESSAGE#998:00536:27", "nwparser.payload", "IKE %{hostip->} Phase 1: RSA private key is needed to sign packets", processor_chain([ +var part1601 = match("MESSAGE#998:00536:27", "nwparser.payload", "IKE %{hostip->} Phase 1: RSA private key is needed to sign packets", processor_chain([ dup44, dup2, dup3, @@ -20995,10 +19065,9 @@ match("MESSAGE#998:00536:27", "nwparser.payload", "IKE %{hostip->} Phase 1: RSA dup5, ])); -var msg1011 = msg("00536:27", part1606); +var msg1011 = msg("00536:27", part1601); -var part1607 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Aggressive mode negotiations have '), Field(disposition,false)}" -match("MESSAGE#999:00536:28", "nwparser.payload", "IKE %{hostip->} Phase 1: Aggressive mode negotiations have %{disposition}", processor_chain([ +var part1602 = match("MESSAGE#999:00536:28", "nwparser.payload", "IKE %{hostip->} Phase 1: Aggressive mode negotiations have %{disposition}", processor_chain([ dup44, dup2, dup3, @@ -21006,10 +19075,9 @@ match("MESSAGE#999:00536:28", "nwparser.payload", "IKE %{hostip->} Phase 1: Aggr dup5, ])); -var msg1012 = msg("00536:28", part1607); +var msg1012 = msg("00536:28", part1602); -var part1608 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Vendor ID payload indicates that the peer does not support NAT-T')}" -match("MESSAGE#1000:00536:29", "nwparser.payload", "IKE %{hostip->} Phase 1: Vendor ID payload indicates that the peer does not support NAT-T", processor_chain([ +var part1603 = match("MESSAGE#1000:00536:29", "nwparser.payload", "IKE %{hostip->} Phase 1: Vendor ID payload indicates that the peer does not support NAT-T", processor_chain([ dup44, dup2, dup3, @@ -21017,10 +19085,9 @@ match("MESSAGE#1000:00536:29", "nwparser.payload", "IKE %{hostip->} Phase 1: Ven dup5, ])); -var msg1013 = msg("00536:29", part1608); +var msg1013 = msg("00536:29", part1603); -var part1609 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Retransmission limit has been reached')}" -match("MESSAGE#1001:00536:30", "nwparser.payload", "IKE %{hostip->} Phase 1: Retransmission limit has been reached", processor_chain([ +var part1604 = match("MESSAGE#1001:00536:30", "nwparser.payload", "IKE %{hostip->} Phase 1: Retransmission limit has been reached", processor_chain([ dup44, dup2, dup3, @@ -21028,10 +19095,9 @@ match("MESSAGE#1001:00536:30", "nwparser.payload", "IKE %{hostip->} Phase 1: Ret dup5, ])); -var msg1014 = msg("00536:30", part1609); +var msg1014 = msg("00536:30", part1604); -var part1610 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Received an invalid RSA signature')}" -match("MESSAGE#1002:00536:31", "nwparser.payload", "IKE %{hostip->} Phase 1: Received an invalid RSA signature", processor_chain([ +var part1605 = match("MESSAGE#1002:00536:31", "nwparser.payload", "IKE %{hostip->} Phase 1: Received an invalid RSA signature", processor_chain([ dup44, dup2, dup3, @@ -21039,10 +19105,9 @@ match("MESSAGE#1002:00536:31", "nwparser.payload", "IKE %{hostip->} Phase 1: Rec dup5, ])); -var msg1015 = msg("00536:31", part1610); +var msg1015 = msg("00536:31", part1605); -var part1611 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Received an incorrect public key authentication method')}" -match("MESSAGE#1003:00536:32", "nwparser.payload", "IKE %{hostip->} Phase 1: Received an incorrect public key authentication method", processor_chain([ +var part1606 = match("MESSAGE#1003:00536:32", "nwparser.payload", "IKE %{hostip->} Phase 1: Received an incorrect public key authentication method", processor_chain([ dup44, dup2, dup3, @@ -21050,10 +19115,9 @@ match("MESSAGE#1003:00536:32", "nwparser.payload", "IKE %{hostip->} Phase 1: Rec dup5, ])); -var msg1016 = msg("00536:32", part1611); +var msg1016 = msg("00536:32", part1606); -var part1612 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: No private key exists to sign packets')}" -match("MESSAGE#1004:00536:33", "nwparser.payload", "IKE %{hostip->} Phase 1: No private key exists to sign packets", processor_chain([ +var part1607 = match("MESSAGE#1004:00536:33", "nwparser.payload", "IKE %{hostip->} Phase 1: No private key exists to sign packets", processor_chain([ dup44, dup2, dup3, @@ -21061,10 +19125,9 @@ match("MESSAGE#1004:00536:33", "nwparser.payload", "IKE %{hostip->} Phase 1: No dup5, ])); -var msg1017 = msg("00536:33", part1612); +var msg1017 = msg("00536:33", part1607); -var part1613 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Main mode packet has arrived with ID type IP address but no user configuration was found for that ID')}" -match("MESSAGE#1005:00536:34", "nwparser.payload", "IKE %{hostip->} Phase 1: Main mode packet has arrived with ID type IP address but no user configuration was found for that ID", processor_chain([ +var part1608 = match("MESSAGE#1005:00536:34", "nwparser.payload", "IKE %{hostip->} Phase 1: Main mode packet has arrived with ID type IP address but no user configuration was found for that ID", processor_chain([ dup44, dup2, dup3, @@ -21072,10 +19135,9 @@ match("MESSAGE#1005:00536:34", "nwparser.payload", "IKE %{hostip->} Phase 1: Mai dup5, ])); -var msg1018 = msg("00536:34", part1613); +var msg1018 = msg("00536:34", part1608); -var part1614 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: IKE initiator has detected NAT in front of the local device')}" -match("MESSAGE#1006:00536:35", "nwparser.payload", "IKE %{hostip->} Phase 1: IKE initiator has detected NAT in front of the local device", processor_chain([ +var part1609 = match("MESSAGE#1006:00536:35", "nwparser.payload", "IKE %{hostip->} Phase 1: IKE initiator has detected NAT in front of the local device", processor_chain([ dup44, dup2, dup3, @@ -21083,19 +19145,17 @@ match("MESSAGE#1006:00536:35", "nwparser.payload", "IKE %{hostip->} Phase 1: IKE dup5, ])); -var msg1019 = msg("00536:35", part1614); +var msg1019 = msg("00536:35", part1609); -var part1615 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Discarded a second initial packet'), Field(p0,false)}" -match("MESSAGE#1007:00536:36/0", "nwparser.payload", "IKE %{hostip->} Phase 1: Discarded a second initial packet%{p0}"); +var part1610 = match("MESSAGE#1007:00536:36/0", "nwparser.payload", "IKE %{hostip->} Phase 1: Discarded a second initial packet%{p0}"); -var part1616 = // "Pattern{Field(,false), Constant('which arrived within '), Field(fld2,true), Constant(' after the first')}" -match("MESSAGE#1007:00536:36/2", "nwparser.p0", "%{}which arrived within %{fld2->} after the first"); +var part1611 = match("MESSAGE#1007:00536:36/2", "nwparser.p0", "%{}which arrived within %{fld2->} after the first"); -var all345 = all_match({ +var all340 = all_match({ processors: [ - part1615, - dup404, - part1616, + part1610, + dup401, + part1611, ], on_success: processor_chain([ dup44, @@ -21106,10 +19166,19 @@ var all345 = all_match({ ]), }); -var msg1020 = msg("00536:36", all345); +var msg1020 = msg("00536:36", all340); + +var part1612 = match("MESSAGE#1008:00536:37", "nwparser.payload", "IKE %{hostip->} Phase 1: Completed Aggressive mode negotiations with a %{fld2->} lifetime", processor_chain([ + dup44, + dup2, + dup3, + dup4, + dup5, +])); + +var msg1021 = msg("00536:37", part1612); -var part1617 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Completed Aggressive mode negotiations with a '), Field(fld2,true), Constant(' lifetime')}" -match("MESSAGE#1008:00536:37", "nwparser.payload", "IKE %{hostip->} Phase 1: Completed Aggressive mode negotiations with a %{fld2->} lifetime", processor_chain([ +var part1613 = match("MESSAGE#1009:00536:38", "nwparser.payload", "IKE %{hostip->} Phase 1: Certificate received has a subject name that does not match the ID payload", processor_chain([ dup44, dup2, dup3, @@ -21117,10 +19186,9 @@ match("MESSAGE#1008:00536:37", "nwparser.payload", "IKE %{hostip->} Phase 1: Com dup5, ])); -var msg1021 = msg("00536:37", part1617); +var msg1022 = msg("00536:38", part1613); -var part1618 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Certificate received has a subject name that does not match the ID payload')}" -match("MESSAGE#1009:00536:38", "nwparser.payload", "IKE %{hostip->} Phase 1: Certificate received has a subject name that does not match the ID payload", processor_chain([ +var part1614 = match("MESSAGE#1010:00536:39", "nwparser.payload", "IKE %{hostip->} Phase 1: Certificate received has a different IP address %{fld2->} than expected", processor_chain([ dup44, dup2, dup3, @@ -21128,10 +19196,9 @@ match("MESSAGE#1009:00536:38", "nwparser.payload", "IKE %{hostip->} Phase 1: Cer dup5, ])); -var msg1022 = msg("00536:38", part1618); +var msg1023 = msg("00536:39", part1614); -var part1619 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Certificate received has a different IP address '), Field(fld2,true), Constant(' than expected')}" -match("MESSAGE#1010:00536:39", "nwparser.payload", "IKE %{hostip->} Phase 1: Certificate received has a different IP address %{fld2->} than expected", processor_chain([ +var part1615 = match("MESSAGE#1011:00536:40", "nwparser.payload", "IKE %{hostip->} Phase 1: Cannot use a preshared key because the peer%{quote}s gateway has a dynamic IP address and negotiations are in Main mode", processor_chain([ dup44, dup2, dup3, @@ -21139,33 +19206,9 @@ match("MESSAGE#1010:00536:39", "nwparser.payload", "IKE %{hostip->} Phase 1: Cer dup5, ])); -var msg1023 = msg("00536:39", part1619); - -var part1620 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Cannot use a preshared key because the peer'), Field(p0,false)}" -match("MESSAGE#1011:00536:40/0", "nwparser.payload", "IKE %{hostip->} Phase 1: Cannot use a preshared key because the peer%{p0}"); - -var part1621 = // "Pattern{Constant('s gateway has a dynamic IP address and negotiations are in Main mode'), Field(,false)}" -match("MESSAGE#1011:00536:40/2", "nwparser.p0", "s gateway has a dynamic IP address and negotiations are in Main mode%{}"); - -var all346 = all_match({ - processors: [ - part1620, - dup363, - part1621, - ], - on_success: processor_chain([ - dup44, - dup2, - dup3, - dup4, - dup5, - ]), -}); - -var msg1024 = msg("00536:40", all346); +var msg1024 = msg("00536:40", part1615); -var part1622 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Initiated negotiations in Aggressive mode')}" -match("MESSAGE#1012:00536:47", "nwparser.payload", "IKE %{hostip->} Phase 1: Initiated negotiations in Aggressive mode", processor_chain([ +var part1616 = match("MESSAGE#1012:00536:47", "nwparser.payload", "IKE %{hostip->} Phase 1: Initiated negotiations in Aggressive mode", processor_chain([ dup44, dup2, dup3, @@ -21173,10 +19216,9 @@ match("MESSAGE#1012:00536:47", "nwparser.payload", "IKE %{hostip->} Phase 1: Ini dup5, ])); -var msg1025 = msg("00536:47", part1622); +var msg1025 = msg("00536:47", part1616); -var part1623 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Cannot verify RSA signature')}" -match("MESSAGE#1013:00536:41", "nwparser.payload", "IKE %{hostip->} Phase 1: Cannot verify RSA signature", processor_chain([ +var part1617 = match("MESSAGE#1013:00536:41", "nwparser.payload", "IKE %{hostip->} Phase 1: Cannot verify RSA signature", processor_chain([ dup44, dup2, dup3, @@ -21184,10 +19226,9 @@ match("MESSAGE#1013:00536:41", "nwparser.payload", "IKE %{hostip->} Phase 1: Can dup5, ])); -var msg1026 = msg("00536:41", part1623); +var msg1026 = msg("00536:41", part1617); -var part1624 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 1: Initiated Main mode negotiations')}" -match("MESSAGE#1014:00536:42", "nwparser.payload", "IKE %{hostip->} Phase 1: Initiated Main mode negotiations", processor_chain([ +var part1618 = match("MESSAGE#1014:00536:42", "nwparser.payload", "IKE %{hostip->} Phase 1: Initiated Main mode negotiations", processor_chain([ dup44, dup2, dup3, @@ -21195,10 +19236,9 @@ match("MESSAGE#1014:00536:42", "nwparser.payload", "IKE %{hostip->} Phase 1: Ini dup5, ])); -var msg1027 = msg("00536:42", part1624); +var msg1027 = msg("00536:42", part1618); -var part1625 = // "Pattern{Constant('IKE '), Field(hostip,true), Constant(' Phase 2: Initiated negotiations')}" -match("MESSAGE#1015:00536:43", "nwparser.payload", "IKE %{hostip->} Phase 2: Initiated negotiations", processor_chain([ +var part1619 = match("MESSAGE#1015:00536:43", "nwparser.payload", "IKE %{hostip->} Phase 2: Initiated negotiations", processor_chain([ dup44, dup2, dup3, @@ -21206,10 +19246,9 @@ match("MESSAGE#1015:00536:43", "nwparser.payload", "IKE %{hostip->} Phase 2: Ini dup5, ])); -var msg1028 = msg("00536:43", part1625); +var msg1028 = msg("00536:43", part1619); -var part1626 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Changed heartbeat interval to '), Field(fld2,false)}" -match("MESSAGE#1016:00536:44", "nwparser.payload", "IKE %{hostip}: Changed heartbeat interval to %{fld2}", processor_chain([ +var part1620 = match("MESSAGE#1016:00536:44", "nwparser.payload", "IKE %{hostip}: Changed heartbeat interval to %{fld2}", processor_chain([ dup44, dup2, dup3, @@ -21217,10 +19256,9 @@ match("MESSAGE#1016:00536:44", "nwparser.payload", "IKE %{hostip}: Changed heart dup5, ])); -var msg1029 = msg("00536:44", part1626); +var msg1029 = msg("00536:44", part1620); -var part1627 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Heartbeats have been '), Field(disposition,true), Constant(' because '), Field(result,false)}" -match("MESSAGE#1017:00536:45", "nwparser.payload", "IKE %{hostip}: Heartbeats have been %{disposition->} because %{result}", processor_chain([ +var part1621 = match("MESSAGE#1017:00536:45", "nwparser.payload", "IKE %{hostip}: Heartbeats have been %{disposition->} because %{result}", processor_chain([ dup44, dup2, dup3, @@ -21228,10 +19266,9 @@ match("MESSAGE#1017:00536:45", "nwparser.payload", "IKE %{hostip}: Heartbeats ha dup5, ])); -var msg1030 = msg("00536:45", part1627); +var msg1030 = msg("00536:45", part1621); -var part1628 = // "Pattern{Constant('Received an IKE packet on '), Field(interface,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('/'), Field(fld1,false), Constant('. Cookies: '), Field(ike_cookie1,false), Constant(', '), Field(ike_cookie2,false), Constant('. ('), Field(event_time_string,false), Constant(')')}" -match("MESSAGE#1018:00536:48", "nwparser.payload", "Received an IKE packet on %{interface->} from %{saddr}:%{sport->} to %{daddr}:%{dport}/%{fld1}. Cookies: %{ike_cookie1}, %{ike_cookie2}. (%{event_time_string})", processor_chain([ +var part1622 = match("MESSAGE#1018:00536:48", "nwparser.payload", "Received an IKE packet on %{interface->} from %{saddr}:%{sport->} to %{daddr}:%{dport}/%{fld1}. Cookies: %{ike_cookie1}, %{ike_cookie2}. (%{event_time_string})", processor_chain([ dup44, dup2, dup3, @@ -21240,10 +19277,9 @@ match("MESSAGE#1018:00536:48", "nwparser.payload", "Received an IKE packet on %{ setc("event_description","Received an IKE packet on interface"), ])); -var msg1031 = msg("00536:48", part1628); +var msg1031 = msg("00536:48", part1622); -var part1629 = // "Pattern{Constant('IKE '), Field(hostip,false), Constant(': Received a bad SPI')}" -match("MESSAGE#1019:00536:46", "nwparser.payload", "IKE %{hostip}: Received a bad SPI", processor_chain([ +var part1623 = match("MESSAGE#1019:00536:46", "nwparser.payload", "IKE %{hostip}: Received a bad SPI", processor_chain([ dup44, dup2, dup3, @@ -21251,7 +19287,7 @@ match("MESSAGE#1019:00536:46", "nwparser.payload", "IKE %{hostip}: Received a ba dup5, ])); -var msg1032 = msg("00536:46", part1629); +var msg1032 = msg("00536:46", part1623); var select365 = linear_select([ msg982, @@ -21307,8 +19343,7 @@ var select365 = linear_select([ msg1032, ]); -var part1630 = // "Pattern{Constant('PPPoE '), Field(disposition,true), Constant(' to establish a session: '), Field(info,false)}" -match("MESSAGE#1020:00537", "nwparser.payload", "PPPoE %{disposition->} to establish a session: %{info}", processor_chain([ +var part1624 = match("MESSAGE#1020:00537", "nwparser.payload", "PPPoE %{disposition->} to establish a session: %{info}", processor_chain([ dup18, dup2, dup4, @@ -21316,10 +19351,9 @@ match("MESSAGE#1020:00537", "nwparser.payload", "PPPoE %{disposition->} to estab dup3, ])); -var msg1033 = msg("00537", part1630); +var msg1033 = msg("00537", part1624); -var part1631 = // "Pattern{Constant('PPPoE session shuts down: '), Field(result,false)}" -match("MESSAGE#1021:00537:01", "nwparser.payload", "PPPoE session shuts down: %{result}", processor_chain([ +var part1625 = match("MESSAGE#1021:00537:01", "nwparser.payload", "PPPoE session shuts down: %{result}", processor_chain([ dup18, dup2, dup3, @@ -21327,10 +19361,9 @@ match("MESSAGE#1021:00537:01", "nwparser.payload", "PPPoE session shuts down: %{ dup5, ])); -var msg1034 = msg("00537:01", part1631); +var msg1034 = msg("00537:01", part1625); -var part1632 = // "Pattern{Constant('The Point-to-Point over Ethernet (PPPoE) connection failed to establish a session: '), Field(result,false)}" -match("MESSAGE#1022:00537:02", "nwparser.payload", "The Point-to-Point over Ethernet (PPPoE) connection failed to establish a session: %{result}", processor_chain([ +var part1626 = match("MESSAGE#1022:00537:02", "nwparser.payload", "The Point-to-Point over Ethernet (PPPoE) connection failed to establish a session: %{result}", processor_chain([ dup18, dup2, dup3, @@ -21338,10 +19371,9 @@ match("MESSAGE#1022:00537:02", "nwparser.payload", "The Point-to-Point over Ethe dup5, ])); -var msg1035 = msg("00537:02", part1632); +var msg1035 = msg("00537:02", part1626); -var part1633 = // "Pattern{Constant('PPPoE session has successfully established'), Field(,false)}" -match("MESSAGE#1023:00537:03", "nwparser.payload", "PPPoE session has successfully established%{}", processor_chain([ +var part1627 = match("MESSAGE#1023:00537:03", "nwparser.payload", "PPPoE session has successfully established%{}", processor_chain([ dup44, dup2, dup3, @@ -21349,7 +19381,7 @@ match("MESSAGE#1023:00537:03", "nwparser.payload", "PPPoE session has successful dup5, ])); -var msg1036 = msg("00537:03", part1633); +var msg1036 = msg("00537:03", part1627); var select366 = linear_select([ msg1033, @@ -21358,22 +19390,20 @@ var select366 = linear_select([ msg1036, ]); -var part1634 = // "Pattern{Constant('NACN failed to register to Policy Manager '), Field(fld2,true), Constant(' because '), Field(p0,false)}" -match("MESSAGE#1024:00538/0", "nwparser.payload", "NACN failed to register to Policy Manager %{fld2->} because %{p0}"); +var part1628 = match("MESSAGE#1024:00538/0", "nwparser.payload", "NACN failed to register to Policy Manager %{fld2->} because %{p0}"); var select367 = linear_select([ dup111, dup119, ]); -var part1635 = // "Pattern{Constant(''), Field(result,false)}" -match("MESSAGE#1024:00538/2", "nwparser.p0", "%{result}"); +var part1629 = match("MESSAGE#1024:00538/2", "nwparser.p0", "%{result}"); -var all347 = all_match({ +var all341 = all_match({ processors: [ - part1634, + part1628, select367, - part1635, + part1629, ], on_success: processor_chain([ dup44, @@ -21384,10 +19414,9 @@ var all347 = all_match({ ]), }); -var msg1037 = msg("00538", all347); +var msg1037 = msg("00538", all341); -var part1636 = // "Pattern{Constant('NACN successfully registered to Policy Manager '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1025:00538:01", "nwparser.payload", "NACN successfully registered to Policy Manager %{fld2}.", processor_chain([ +var part1630 = match("MESSAGE#1025:00538:01", "nwparser.payload", "NACN successfully registered to Policy Manager %{fld2}.", processor_chain([ dup44, dup2, dup3, @@ -21395,10 +19424,9 @@ match("MESSAGE#1025:00538:01", "nwparser.payload", "NACN successfully registered dup5, ])); -var msg1038 = msg("00538:01", part1636); +var msg1038 = msg("00538:01", part1630); -var part1637 = // "Pattern{Constant('The NACN protocol has started for Policy Manager '), Field(fld2,true), Constant(' on hostname '), Field(hostname,true), Constant(' IP address '), Field(hostip,true), Constant(' port '), Field(network_port,false), Constant('.')}" -match("MESSAGE#1026:00538:02", "nwparser.payload", "The NACN protocol has started for Policy Manager %{fld2->} on hostname %{hostname->} IP address %{hostip->} port %{network_port}.", processor_chain([ +var part1631 = match("MESSAGE#1026:00538:02", "nwparser.payload", "The NACN protocol has started for Policy Manager %{fld2->} on hostname %{hostname->} IP address %{hostip->} port %{network_port}.", processor_chain([ dup44, dup2, dup3, @@ -21406,10 +19434,9 @@ match("MESSAGE#1026:00538:02", "nwparser.payload", "The NACN protocol has starte dup5, ])); -var msg1039 = msg("00538:02", part1637); +var msg1039 = msg("00538:02", part1631); -var part1638 = // "Pattern{Constant('Cannot connect to NSM Server at '), Field(hostip,true), Constant(' ('), Field(fld2,true), Constant(' connect attempt(s)) '), Field(fld3,false)}" -match("MESSAGE#1027:00538:03", "nwparser.payload", "Cannot connect to NSM Server at %{hostip->} (%{fld2->} connect attempt(s)) %{fld3}", processor_chain([ +var part1632 = match("MESSAGE#1027:00538:03", "nwparser.payload", "Cannot connect to NSM Server at %{hostip->} (%{fld2->} connect attempt(s)) %{fld3}", processor_chain([ dup19, dup2, dup4, @@ -21417,10 +19444,9 @@ match("MESSAGE#1027:00538:03", "nwparser.payload", "Cannot connect to NSM Server dup3, ])); -var msg1040 = msg("00538:03", part1638); +var msg1040 = msg("00538:03", part1632); -var part1639 = // "Pattern{Constant('Device is not known to Global PRO data collector at '), Field(hostip,false)}" -match("MESSAGE#1028:00538:04", "nwparser.payload", "Device is not known to Global PRO data collector at %{hostip}", processor_chain([ +var part1633 = match("MESSAGE#1028:00538:04", "nwparser.payload", "Device is not known to Global PRO data collector at %{hostip}", processor_chain([ dup27, dup2, dup3, @@ -21428,30 +19454,26 @@ match("MESSAGE#1028:00538:04", "nwparser.payload", "Device is not known to Globa dup5, ])); -var msg1041 = msg("00538:04", part1639); +var msg1041 = msg("00538:04", part1633); -var part1640 = // "Pattern{Constant('Lost '), Field(p0,false)}" -match("MESSAGE#1029:00538:05/0", "nwparser.payload", "Lost %{p0}"); +var part1634 = match("MESSAGE#1029:00538:05/0", "nwparser.payload", "Lost %{p0}"); -var part1641 = // "Pattern{Constant('socket connection'), Field(p0,false)}" -match("MESSAGE#1029:00538:05/1_0", "nwparser.p0", "socket connection%{p0}"); +var part1635 = match("MESSAGE#1029:00538:05/1_0", "nwparser.p0", "socket connection%{p0}"); -var part1642 = // "Pattern{Constant('connection'), Field(p0,false)}" -match("MESSAGE#1029:00538:05/1_1", "nwparser.p0", "connection%{p0}"); +var part1636 = match("MESSAGE#1029:00538:05/1_1", "nwparser.p0", "connection%{p0}"); var select368 = linear_select([ - part1641, - part1642, + part1635, + part1636, ]); -var part1643 = // "Pattern{Field(,false), Constant('to Global PRO data collector at '), Field(hostip,false)}" -match("MESSAGE#1029:00538:05/2", "nwparser.p0", "%{}to Global PRO data collector at %{hostip}"); +var part1637 = match("MESSAGE#1029:00538:05/2", "nwparser.p0", "%{}to Global PRO data collector at %{hostip}"); -var all348 = all_match({ +var all342 = all_match({ processors: [ - part1640, + part1634, select368, - part1643, + part1637, ], on_success: processor_chain([ dup27, @@ -21462,30 +19484,26 @@ var all348 = all_match({ ]), }); -var msg1042 = msg("00538:05", all348); +var msg1042 = msg("00538:05", all342); -var part1644 = // "Pattern{Constant('Device has connected to the Global PRO'), Field(p0,false)}" -match("MESSAGE#1030:00538:06/0", "nwparser.payload", "Device has connected to the Global PRO%{p0}"); +var part1638 = match("MESSAGE#1030:00538:06/0", "nwparser.payload", "Device has connected to the Global PRO%{p0}"); -var part1645 = // "Pattern{Constant(' '), Field(fld2,true), Constant(' primary data collector at '), Field(p0,false)}" -match("MESSAGE#1030:00538:06/1_0", "nwparser.p0", " %{fld2->} primary data collector at %{p0}"); +var part1639 = match("MESSAGE#1030:00538:06/1_0", "nwparser.p0", " %{fld2->} primary data collector at %{p0}"); -var part1646 = // "Pattern{Constant(' primary data collector at '), Field(p0,false)}" -match("MESSAGE#1030:00538:06/1_1", "nwparser.p0", " primary data collector at %{p0}"); +var part1640 = match("MESSAGE#1030:00538:06/1_1", "nwparser.p0", " primary data collector at %{p0}"); var select369 = linear_select([ - part1645, - part1646, + part1639, + part1640, ]); -var part1647 = // "Pattern{Field(hostip,false)}" -match_copy("MESSAGE#1030:00538:06/2", "nwparser.p0", "hostip"); +var part1641 = match_copy("MESSAGE#1030:00538:06/2", "nwparser.p0", "hostip"); -var all349 = all_match({ +var all343 = all_match({ processors: [ - part1644, + part1638, select369, - part1647, + part1641, ], on_success: processor_chain([ dup27, @@ -21496,22 +19514,20 @@ var all349 = all_match({ ]), }); -var msg1043 = msg("00538:06", all349); +var msg1043 = msg("00538:06", all343); -var part1648 = // "Pattern{Constant('Connection to Global PRO data collector at '), Field(hostip,true), Constant(' has'), Field(p0,false)}" -match("MESSAGE#1031:00538:07/0", "nwparser.payload", "Connection to Global PRO data collector at %{hostip->} has%{p0}"); +var part1642 = match("MESSAGE#1031:00538:07/0", "nwparser.payload", "Connection to Global PRO data collector at %{hostip->} has%{p0}"); -var part1649 = // "Pattern{Constant(' been'), Field(p0,false)}" -match("MESSAGE#1031:00538:07/1_0", "nwparser.p0", " been%{p0}"); +var part1643 = match("MESSAGE#1031:00538:07/1_0", "nwparser.p0", " been%{p0}"); var select370 = linear_select([ - part1649, + part1643, dup16, ]); -var all350 = all_match({ +var all344 = all_match({ processors: [ - part1648, + part1642, select370, dup136, ], @@ -21524,10 +19540,9 @@ var all350 = all_match({ ]), }); -var msg1044 = msg("00538:07", all350); +var msg1044 = msg("00538:07", all344); -var part1650 = // "Pattern{Constant('Cannot connect to Global PRO data collector at '), Field(hostip,false)}" -match("MESSAGE#1032:00538:08", "nwparser.payload", "Cannot connect to Global PRO data collector at %{hostip}", processor_chain([ +var part1644 = match("MESSAGE#1032:00538:08", "nwparser.payload", "Cannot connect to Global PRO data collector at %{hostip}", processor_chain([ dup27, dup2, dup3, @@ -21535,11 +19550,10 @@ match("MESSAGE#1032:00538:08", "nwparser.payload", "Cannot connect to Global PRO dup5, ])); -var msg1045 = msg("00538:08", part1650); +var msg1045 = msg("00538:08", part1644); -var part1651 = // "Pattern{Constant('NSM: Connected to NSM server at '), Field(hostip,true), Constant(' ('), Field(info,false), Constant(') ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1033:00538:09", "nwparser.payload", "NSM: Connected to NSM server at %{hostip->} (%{info}) (%{fld1})", processor_chain([ - dup303, +var part1645 = match("MESSAGE#1033:00538:09", "nwparser.payload", "NSM: Connected to NSM server at %{hostip->} (%{info}) (%{fld1})", processor_chain([ + dup301, dup2, dup3, dup9, @@ -21548,26 +19562,24 @@ match("MESSAGE#1033:00538:09", "nwparser.payload", "NSM: Connected to NSM server setc("event_description","Connected to NSM server"), ])); -var msg1046 = msg("00538:09", part1651); +var msg1046 = msg("00538:09", part1645); -var part1652 = // "Pattern{Constant('NSM: Connection to NSM server at '), Field(hostip,true), Constant(' is down. Reason: '), Field(resultcode,false), Constant(', '), Field(result,true), Constant(' ('), Field(p0,false)}" -match("MESSAGE#1034:00538:10/0", "nwparser.payload", "NSM: Connection to NSM server at %{hostip->} is down. Reason: %{resultcode}, %{result->} (%{p0}"); +var part1646 = match("MESSAGE#1034:00538:10/0", "nwparser.payload", "NSM: Connection to NSM server at %{hostip->} is down. Reason: %{resultcode}, %{result->} (%{p0}"); -var part1653 = // "Pattern{Field(info,false), Constant(') ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1034:00538:10/1_0", "nwparser.p0", "%{info}) (%{fld1})"); +var part1647 = match("MESSAGE#1034:00538:10/1_0", "nwparser.p0", "%{info}) (%{fld1})"); var select371 = linear_select([ - part1653, + part1647, dup41, ]); -var all351 = all_match({ +var all345 = all_match({ processors: [ - part1652, + part1646, select371, ], on_success: processor_chain([ - dup200, + dup198, dup2, dup3, dup9, @@ -21577,36 +19589,33 @@ var all351 = all_match({ ]), }); -var msg1047 = msg("00538:10", all351); +var msg1047 = msg("00538:10", all345); -var part1654 = // "Pattern{Constant('NSM: Cannot connect to NSM server at '), Field(hostip,false), Constant('. Reason: '), Field(resultcode,false), Constant(', '), Field(result,true), Constant(' ('), Field(info,false), Constant(') ('), Field(fld2,true), Constant(' connect attempt(s)) ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1035:00538:11", "nwparser.payload", "NSM: Cannot connect to NSM server at %{hostip}. Reason: %{resultcode}, %{result->} (%{info}) (%{fld2->} connect attempt(s)) (%{fld1})", processor_chain([ - dup200, +var part1648 = match("MESSAGE#1035:00538:11", "nwparser.payload", "NSM: Cannot connect to NSM server at %{hostip}. Reason: %{resultcode}, %{result->} (%{info}) (%{fld2->} connect attempt(s)) (%{fld1})", processor_chain([ + dup198, dup2, dup3, dup9, dup4, dup5, - dup325, + dup323, ])); -var msg1048 = msg("00538:11", part1654); +var msg1048 = msg("00538:11", part1648); -var part1655 = // "Pattern{Constant('NSM: Cannot connect to NSM server at '), Field(hostip,false), Constant('. Reason: '), Field(resultcode,false), Constant(', '), Field(result,true), Constant(' ('), Field(info,false), Constant(') ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1036:00538:12", "nwparser.payload", "NSM: Cannot connect to NSM server at %{hostip}. Reason: %{resultcode}, %{result->} (%{info}) (%{fld1})", processor_chain([ - dup200, +var part1649 = match("MESSAGE#1036:00538:12", "nwparser.payload", "NSM: Cannot connect to NSM server at %{hostip}. Reason: %{resultcode}, %{result->} (%{info}) (%{fld1})", processor_chain([ + dup198, dup2, dup3, dup9, dup4, dup5, - dup325, + dup323, ])); -var msg1049 = msg("00538:12", part1655); +var msg1049 = msg("00538:12", part1649); -var part1656 = // "Pattern{Constant('NSM: Sent 2B message ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1037:00538:13", "nwparser.payload", "NSM: Sent 2B message (%{fld1})", processor_chain([ +var part1650 = match("MESSAGE#1037:00538:13", "nwparser.payload", "NSM: Sent 2B message (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -21616,7 +19625,7 @@ match("MESSAGE#1037:00538:13", "nwparser.payload", "NSM: Sent 2B message (%{fld1 setc("event_description","Sent 2B message"), ])); -var msg1050 = msg("00538:13", part1656); +var msg1050 = msg("00538:13", part1650); var select372 = linear_select([ msg1037, @@ -21635,8 +19644,7 @@ var select372 = linear_select([ msg1050, ]); -var part1657 = // "Pattern{Constant('No IP address in L2TP IP pool for user '), Field(username,false)}" -match("MESSAGE#1038:00539", "nwparser.payload", "No IP address in L2TP IP pool for user %{username}", processor_chain([ +var part1651 = match("MESSAGE#1038:00539", "nwparser.payload", "No IP address in L2TP IP pool for user %{username}", processor_chain([ dup117, dup2, dup3, @@ -21644,10 +19652,9 @@ match("MESSAGE#1038:00539", "nwparser.payload", "No IP address in L2TP IP pool f dup5, ])); -var msg1051 = msg("00539", part1657); +var msg1051 = msg("00539", part1651); -var part1658 = // "Pattern{Constant('No L2TP IP pool for user '), Field(username,false)}" -match("MESSAGE#1039:00539:01", "nwparser.payload", "No L2TP IP pool for user %{username}", processor_chain([ +var part1652 = match("MESSAGE#1039:00539:01", "nwparser.payload", "No L2TP IP pool for user %{username}", processor_chain([ dup117, dup2, dup3, @@ -21655,10 +19662,9 @@ match("MESSAGE#1039:00539:01", "nwparser.payload", "No L2TP IP pool for user %{u dup5, ])); -var msg1052 = msg("00539:01", part1658); +var msg1052 = msg("00539:01", part1652); -var part1659 = // "Pattern{Constant('Cannot allocate IP addr from Pool '), Field(group_object,true), Constant(' for user '), Field(username,false)}" -match("MESSAGE#1040:00539:02", "nwparser.payload", "Cannot allocate IP addr from Pool %{group_object->} for user %{username}", processor_chain([ +var part1653 = match("MESSAGE#1040:00539:02", "nwparser.payload", "Cannot allocate IP addr from Pool %{group_object->} for user %{username}", processor_chain([ dup117, dup2, dup3, @@ -21666,10 +19672,9 @@ match("MESSAGE#1040:00539:02", "nwparser.payload", "Cannot allocate IP addr from dup5, ])); -var msg1053 = msg("00539:02", part1659); +var msg1053 = msg("00539:02", part1653); -var part1660 = // "Pattern{Constant('Dialup HDLC PPP failed to establish a session: '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1041:00539:03", "nwparser.payload", "Dialup HDLC PPP failed to establish a session: %{fld2}.", processor_chain([ +var part1654 = match("MESSAGE#1041:00539:03", "nwparser.payload", "Dialup HDLC PPP failed to establish a session: %{fld2}.", processor_chain([ dup19, dup2, dup3, @@ -21677,10 +19682,9 @@ match("MESSAGE#1041:00539:03", "nwparser.payload", "Dialup HDLC PPP failed to es dup5, ])); -var msg1054 = msg("00539:03", part1660); +var msg1054 = msg("00539:03", part1654); -var part1661 = // "Pattern{Constant('Dialup HDLC PPP session has successfully established.'), Field(,false)}" -match("MESSAGE#1042:00539:04", "nwparser.payload", "Dialup HDLC PPP session has successfully established.%{}", processor_chain([ +var part1655 = match("MESSAGE#1042:00539:04", "nwparser.payload", "Dialup HDLC PPP session has successfully established.%{}", processor_chain([ dup44, dup2, dup3, @@ -21688,10 +19692,9 @@ match("MESSAGE#1042:00539:04", "nwparser.payload", "Dialup HDLC PPP session has dup5, ])); -var msg1055 = msg("00539:04", part1661); +var msg1055 = msg("00539:04", part1655); -var part1662 = // "Pattern{Constant('No IP Pool has been assigned. You cannot allocate an IP address'), Field(,false)}" -match("MESSAGE#1043:00539:05", "nwparser.payload", "No IP Pool has been assigned. You cannot allocate an IP address%{}", processor_chain([ +var part1656 = match("MESSAGE#1043:00539:05", "nwparser.payload", "No IP Pool has been assigned. You cannot allocate an IP address%{}", processor_chain([ dup18, dup2, dup3, @@ -21699,10 +19702,9 @@ match("MESSAGE#1043:00539:05", "nwparser.payload", "No IP Pool has been assigned dup5, ])); -var msg1056 = msg("00539:05", part1662); +var msg1056 = msg("00539:05", part1656); -var part1663 = // "Pattern{Constant('PPP settings changed.'), Field(,false)}" -match("MESSAGE#1044:00539:06", "nwparser.payload", "PPP settings changed.%{}", processor_chain([ +var part1657 = match("MESSAGE#1044:00539:06", "nwparser.payload", "PPP settings changed.%{}", processor_chain([ dup1, dup2, dup3, @@ -21710,7 +19712,7 @@ match("MESSAGE#1044:00539:06", "nwparser.payload", "PPP settings changed.%{}", p dup5, ])); -var msg1057 = msg("00539:06", part1663); +var msg1057 = msg("00539:06", part1657); var select373 = linear_select([ msg1051, @@ -21722,20 +19724,18 @@ var select373 = linear_select([ msg1057, ]); -var part1664 = // "Pattern{Constant('ScreenOS '), Field(fld2,true), Constant(' serial # '), Field(serial_number,false), Constant(': Asset recovery has been '), Field(disposition,false)}" -match("MESSAGE#1045:00541", "nwparser.payload", "ScreenOS %{fld2->} serial # %{serial_number}: Asset recovery has been %{disposition}", processor_chain([ - dup326, +var part1658 = match("MESSAGE#1045:00541", "nwparser.payload", "ScreenOS %{fld2->} serial # %{serial_number}: Asset recovery has been %{disposition}", processor_chain([ + dup324, dup2, dup3, dup4, dup5, ])); -var msg1058 = msg("00541", part1664); +var msg1058 = msg("00541", part1658); -var part1665 = // "Pattern{Constant('Neighbor router ID - '), Field(fld2,true), Constant(' IP address - '), Field(hostip,true), Constant(' changed its state to '), Field(change_new,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1216:00541:01", "nwparser.payload", "Neighbor router ID - %{fld2->} IP address - %{hostip->} changed its state to %{change_new}. (%{fld1})", processor_chain([ - dup275, +var part1659 = match("MESSAGE#1216:00541:01", "nwparser.payload", "Neighbor router ID - %{fld2->} IP address - %{hostip->} changed its state to %{change_new}. (%{fld1})", processor_chain([ + dup273, dup9, dup2, dup3, @@ -21743,11 +19743,10 @@ match("MESSAGE#1216:00541:01", "nwparser.payload", "Neighbor router ID - %{fld2- dup5, ])); -var msg1059 = msg("00541:01", part1665); +var msg1059 = msg("00541:01", part1659); -var part1666 = // "Pattern{Constant('The system killed OSPF neighbor because the current router could not see itself in the hello packet. Neighbor changed state from '), Field(change_old,true), Constant(' to '), Field(change_new,true), Constant(' state, (neighbor router-id 1'), Field(fld2,false), Constant(', ip-address '), Field(hostip,false), Constant('). ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1218:00541:02", "nwparser.payload", "The system killed OSPF neighbor because the current router could not see itself in the hello packet. Neighbor changed state from %{change_old->} to %{change_new->} state, (neighbor router-id 1%{fld2}, ip-address %{hostip}). (%{fld1})", processor_chain([ - dup275, +var part1660 = match("MESSAGE#1218:00541:02", "nwparser.payload", "The system killed OSPF neighbor because the current router could not see itself in the hello packet. Neighbor changed state from %{change_old->} to %{change_new->} state, (neighbor router-id 1%{fld2}, ip-address %{hostip}). (%{fld1})", processor_chain([ + dup273, dup9, dup2, dup3, @@ -21755,22 +19754,20 @@ match("MESSAGE#1218:00541:02", "nwparser.payload", "The system killed OSPF neigh dup5, ])); -var msg1060 = msg("00541:02", part1666); +var msg1060 = msg("00541:02", part1660); -var part1667 = // "Pattern{Constant('LSA in following area aged out: LSA area ID '), Field(fld3,false), Constant(', LSA ID '), Field(fld4,false), Constant(', router ID '), Field(fld2,false), Constant(', type '), Field(fld7,true), Constant(' in OSPF. ('), Field(fld1,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#1219:00541:03/0", "nwparser.payload", "LSA in following area aged out: LSA area ID %{fld3}, LSA ID %{fld4}, router ID %{fld2}, type %{fld7->} in OSPF. (%{fld1})%{p0}"); +var part1661 = match("MESSAGE#1219:00541:03/0", "nwparser.payload", "LSA in following area aged out: LSA area ID %{fld3}, LSA ID %{fld4}, router ID %{fld2}, type %{fld7->} in OSPF. (%{fld1})%{p0}"); -var part1668 = // "Pattern{Constant('<<'), Field(fld16,false), Constant('>')}" -match("MESSAGE#1219:00541:03/1_0", "nwparser.p0", "\u003c\u003c%{fld16}>"); +var part1662 = match("MESSAGE#1219:00541:03/1_0", "nwparser.p0", "\u003c\u003c%{fld16}>"); var select374 = linear_select([ - part1668, + part1662, dup21, ]); -var all352 = all_match({ +var all346 = all_match({ processors: [ - part1667, + part1661, select374, ], on_success: processor_chain([ @@ -21783,7 +19780,7 @@ var all352 = all_match({ ]), }); -var msg1061 = msg("00541:03", all352); +var msg1061 = msg("00541:03", all346); var select375 = linear_select([ msg1058, @@ -21792,8 +19789,7 @@ var select375 = linear_select([ msg1061, ]); -var part1669 = // "Pattern{Constant('BGP of vr: '), Field(node,false), Constant(', prefix adding: '), Field(fld2,false), Constant(', ribin overflow '), Field(fld3,true), Constant(' times (max rib-in '), Field(fld4,false), Constant(')')}" -match("MESSAGE#1046:00542", "nwparser.payload", "BGP of vr: %{node}, prefix adding: %{fld2}, ribin overflow %{fld3->} times (max rib-in %{fld4})", processor_chain([ +var part1663 = match("MESSAGE#1046:00542", "nwparser.payload", "BGP of vr: %{node}, prefix adding: %{fld2}, ribin overflow %{fld3->} times (max rib-in %{fld4})", processor_chain([ dup1, dup2, dup3, @@ -21801,46 +19797,40 @@ match("MESSAGE#1046:00542", "nwparser.payload", "BGP of vr: %{node}, prefix addi dup5, ])); -var msg1062 = msg("00542", part1669); +var msg1062 = msg("00542", part1663); -var part1670 = // "Pattern{Constant('Access for '), Field(p0,false)}" -match("MESSAGE#1047:00543/0", "nwparser.payload", "Access for %{p0}"); +var part1664 = match("MESSAGE#1047:00543/0", "nwparser.payload", "Access for %{p0}"); -var part1671 = // "Pattern{Constant('WebAuth firewall '), Field(p0,false)}" -match("MESSAGE#1047:00543/1_0", "nwparser.p0", "WebAuth firewall %{p0}"); +var part1665 = match("MESSAGE#1047:00543/1_0", "nwparser.p0", "WebAuth firewall %{p0}"); -var part1672 = // "Pattern{Constant('firewall '), Field(p0,false)}" -match("MESSAGE#1047:00543/1_1", "nwparser.p0", "firewall %{p0}"); +var part1666 = match("MESSAGE#1047:00543/1_1", "nwparser.p0", "firewall %{p0}"); var select376 = linear_select([ - part1671, - part1672, + part1665, + part1666, ]); -var part1673 = // "Pattern{Constant('user '), Field(username,true), Constant(' '), Field(space,false), Constant('at '), Field(hostip,true), Constant(' (accepted at '), Field(fld2,true), Constant(' for duration '), Field(duration,true), Constant(' via the '), Field(logon_type,false), Constant(') '), Field(p0,false)}" -match("MESSAGE#1047:00543/2", "nwparser.p0", "user %{username->} %{space}at %{hostip->} (accepted at %{fld2->} for duration %{duration->} via the %{logon_type}) %{p0}"); +var part1667 = match("MESSAGE#1047:00543/2", "nwparser.p0", "user %{username->} %{space}at %{hostip->} (accepted at %{fld2->} for duration %{duration->} via the %{logon_type}) %{p0}"); -var part1674 = // "Pattern{Constant('by policy id '), Field(policy_id,true), Constant(' is '), Field(p0,false)}" -match("MESSAGE#1047:00543/3_0", "nwparser.p0", "by policy id %{policy_id->} is %{p0}"); +var part1668 = match("MESSAGE#1047:00543/3_0", "nwparser.p0", "by policy id %{policy_id->} is %{p0}"); var select377 = linear_select([ - part1674, + part1668, dup106, ]); -var part1675 = // "Pattern{Constant('now over ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1047:00543/4", "nwparser.p0", "now over (%{fld1})"); +var part1669 = match("MESSAGE#1047:00543/4", "nwparser.p0", "now over (%{fld1})"); -var all353 = all_match({ +var all347 = all_match({ processors: [ - part1670, + part1664, select376, - part1673, + part1667, select377, - part1675, + part1669, ], on_success: processor_chain([ - dup283, + dup281, dup2, dup4, dup5, @@ -21849,11 +19839,10 @@ var all353 = all_match({ ]), }); -var msg1063 = msg("00543", all353); +var msg1063 = msg("00543", all347); -var part1676 = // "Pattern{Constant('User '), Field(username,true), Constant(' [ of group '), Field(group,true), Constant(' ] at '), Field(hostip,true), Constant(' has been challenged by the RADIUS server at '), Field(daddr,false)}" -match("MESSAGE#1048:00544", "nwparser.payload", "User %{username->} [ of group %{group->} ] at %{hostip->} has been challenged by the RADIUS server at %{daddr}", processor_chain([ - dup283, +var part1670 = match("MESSAGE#1048:00544", "nwparser.payload", "User %{username->} [ of group %{group->} ] at %{hostip->} has been challenged by the RADIUS server at %{daddr}", processor_chain([ + dup281, dup2, dup4, dup5, @@ -21862,21 +19851,19 @@ match("MESSAGE#1048:00544", "nwparser.payload", "User %{username->} [ of group % setc("action","RADIUS server challenge"), ])); -var msg1064 = msg("00544", part1676); +var msg1064 = msg("00544", part1670); -var part1677 = // "Pattern{Constant('delete-route-> trust-vr: '), Field(fld2,false)}" -match("MESSAGE#1049:00546", "nwparser.payload", "delete-route-> trust-vr: %{fld2}", processor_chain([ - dup283, +var part1671 = match("MESSAGE#1049:00546", "nwparser.payload", "delete-route-> trust-vr: %{fld2}", processor_chain([ + dup281, dup2, dup3, dup4, dup5, ])); -var msg1065 = msg("00546", part1677); +var msg1065 = msg("00546", part1671); -var part1678 = // "Pattern{Constant('AV: Content from '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('->'), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' was not scanned because max content size was exceeded.')}" -match("MESSAGE#1050:00547", "nwparser.payload", "AV: Content from %{saddr}:%{sport}->%{daddr}:%{dport->} was not scanned because max content size was exceeded.", processor_chain([ +var part1672 = match("MESSAGE#1050:00547", "nwparser.payload", "AV: Content from %{saddr}:%{sport}->%{daddr}:%{dport->} was not scanned because max content size was exceeded.", processor_chain([ dup44, dup2, dup4, @@ -21885,10 +19872,9 @@ match("MESSAGE#1050:00547", "nwparser.payload", "AV: Content from %{saddr}:%{spo dup61, ])); -var msg1066 = msg("00547", part1678); +var msg1066 = msg("00547", part1672); -var part1679 = // "Pattern{Constant('AV: Content from '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('->'), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' was not scanned due to a scan engine error or constraint.')}" -match("MESSAGE#1051:00547:01", "nwparser.payload", "AV: Content from %{saddr}:%{sport}->%{daddr}:%{dport->} was not scanned due to a scan engine error or constraint.", processor_chain([ +var part1673 = match("MESSAGE#1051:00547:01", "nwparser.payload", "AV: Content from %{saddr}:%{sport}->%{daddr}:%{dport->} was not scanned due to a scan engine error or constraint.", processor_chain([ dup44, dup2, dup4, @@ -21897,10 +19883,9 @@ match("MESSAGE#1051:00547:01", "nwparser.payload", "AV: Content from %{saddr}:%{ dup61, ])); -var msg1067 = msg("00547:01", part1679); +var msg1067 = msg("00547:01", part1673); -var part1680 = // "Pattern{Constant('AV object scan-mgr data has been '), Field(disposition,false), Constant('.')}" -match("MESSAGE#1052:00547:02", "nwparser.payload", "AV object scan-mgr data has been %{disposition}.", processor_chain([ +var part1674 = match("MESSAGE#1052:00547:02", "nwparser.payload", "AV object scan-mgr data has been %{disposition}.", processor_chain([ dup1, dup2, dup3, @@ -21908,30 +19893,26 @@ match("MESSAGE#1052:00547:02", "nwparser.payload", "AV object scan-mgr data has dup5, ])); -var msg1068 = msg("00547:02", part1680); +var msg1068 = msg("00547:02", part1674); -var part1681 = // "Pattern{Constant('AV: Content from '), Field(location_desc,false), Constant(', http url: '), Field(url,false), Constant(', is passed '), Field(p0,false)}" -match("MESSAGE#1053:00547:03/0", "nwparser.payload", "AV: Content from %{location_desc}, http url: %{url}, is passed %{p0}"); +var part1675 = match("MESSAGE#1053:00547:03/0", "nwparser.payload", "AV: Content from %{location_desc}, http url: %{url}, is passed %{p0}"); -var part1682 = // "Pattern{Constant('due to '), Field(p0,false)}" -match("MESSAGE#1053:00547:03/1_0", "nwparser.p0", "due to %{p0}"); +var part1676 = match("MESSAGE#1053:00547:03/1_0", "nwparser.p0", "due to %{p0}"); -var part1683 = // "Pattern{Constant('because '), Field(p0,false)}" -match("MESSAGE#1053:00547:03/1_1", "nwparser.p0", "because %{p0}"); +var part1677 = match("MESSAGE#1053:00547:03/1_1", "nwparser.p0", "because %{p0}"); var select378 = linear_select([ - part1682, - part1683, + part1676, + part1677, ]); -var part1684 = // "Pattern{Constant(''), Field(result,false), Constant('. ('), Field(event_time_string,false), Constant(')')}" -match("MESSAGE#1053:00547:03/2", "nwparser.p0", "%{result}. (%{event_time_string})"); +var part1678 = match("MESSAGE#1053:00547:03/2", "nwparser.p0", "%{result}. (%{event_time_string})"); -var all354 = all_match({ +var all348 = all_match({ processors: [ - part1681, + part1675, select378, - part1684, + part1678, ], on_success: processor_chain([ dup1, @@ -21943,7 +19924,7 @@ var all354 = all_match({ ]), }); -var msg1069 = msg("00547:03", all354); +var msg1069 = msg("00547:03", all348); var select379 = linear_select([ msg1066, @@ -21952,19 +19933,17 @@ var select379 = linear_select([ msg1069, ]); -var part1685 = // "Pattern{Constant('add-route-> untrust-vr: '), Field(fld2,false)}" -match("MESSAGE#1054:00549", "nwparser.payload", "add-route-> untrust-vr: %{fld2}", processor_chain([ - dup283, +var part1679 = match("MESSAGE#1054:00549", "nwparser.payload", "add-route-> untrust-vr: %{fld2}", processor_chain([ + dup281, dup2, dup3, dup4, dup5, ])); -var msg1070 = msg("00549", part1685); +var msg1070 = msg("00549", part1679); -var part1686 = // "Pattern{Constant('Error '), Field(resultcode,true), Constant(' occurred during configlet file processing.')}" -match("MESSAGE#1055:00551", "nwparser.payload", "Error %{resultcode->} occurred during configlet file processing.", processor_chain([ +var part1680 = match("MESSAGE#1055:00551", "nwparser.payload", "Error %{resultcode->} occurred during configlet file processing.", processor_chain([ dup18, dup2, dup3, @@ -21972,10 +19951,9 @@ match("MESSAGE#1055:00551", "nwparser.payload", "Error %{resultcode->} occurred dup5, ])); -var msg1071 = msg("00551", part1686); +var msg1071 = msg("00551", part1680); -var part1687 = // "Pattern{Constant('Error '), Field(resultcode,true), Constant(' occurred, causing failure to establish secure management with Management System.')}" -match("MESSAGE#1056:00551:01", "nwparser.payload", "Error %{resultcode->} occurred, causing failure to establish secure management with Management System.", processor_chain([ +var part1681 = match("MESSAGE#1056:00551:01", "nwparser.payload", "Error %{resultcode->} occurred, causing failure to establish secure management with Management System.", processor_chain([ dup86, dup2, dup3, @@ -21983,22 +19961,20 @@ match("MESSAGE#1056:00551:01", "nwparser.payload", "Error %{resultcode->} occurr dup5, ])); -var msg1072 = msg("00551:01", part1687); +var msg1072 = msg("00551:01", part1681); -var part1688 = // "Pattern{Constant('Configlet file '), Field(p0,false)}" -match("MESSAGE#1057:00551:02/0", "nwparser.payload", "Configlet file %{p0}"); +var part1682 = match("MESSAGE#1057:00551:02/0", "nwparser.payload", "Configlet file %{p0}"); -var part1689 = // "Pattern{Constant('decryption '), Field(p0,false)}" -match("MESSAGE#1057:00551:02/1_0", "nwparser.p0", "decryption %{p0}"); +var part1683 = match("MESSAGE#1057:00551:02/1_0", "nwparser.p0", "decryption %{p0}"); var select380 = linear_select([ - part1689, + part1683, dup89, ]); -var all355 = all_match({ +var all349 = all_match({ processors: [ - part1688, + part1682, select380, dup128, ], @@ -22011,10 +19987,9 @@ var all355 = all_match({ ]), }); -var msg1073 = msg("00551:02", all355); +var msg1073 = msg("00551:02", all349); -var part1690 = // "Pattern{Constant('Rapid Deployment cannot start because gateway has undergone configuration changes. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1058:00551:03", "nwparser.payload", "Rapid Deployment cannot start because gateway has undergone configuration changes. (%{fld1})", processor_chain([ +var part1684 = match("MESSAGE#1058:00551:03", "nwparser.payload", "Rapid Deployment cannot start because gateway has undergone configuration changes. (%{fld1})", processor_chain([ dup18, dup2, dup3, @@ -22023,10 +19998,9 @@ match("MESSAGE#1058:00551:03", "nwparser.payload", "Rapid Deployment cannot star dup5, ])); -var msg1074 = msg("00551:03", part1690); +var msg1074 = msg("00551:03", part1684); -var part1691 = // "Pattern{Constant('Secure management established successfully with remote server. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1059:00551:04", "nwparser.payload", "Secure management established successfully with remote server. (%{fld1})", processor_chain([ +var part1685 = match("MESSAGE#1059:00551:04", "nwparser.payload", "Secure management established successfully with remote server. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -22035,7 +20009,7 @@ match("MESSAGE#1059:00551:04", "nwparser.payload", "Secure management establishe dup5, ])); -var msg1075 = msg("00551:04", part1691); +var msg1075 = msg("00551:04", part1685); var select381 = linear_select([ msg1071, @@ -22045,29 +20019,25 @@ var select381 = linear_select([ msg1075, ]); -var part1692 = // "Pattern{Constant('SCAN-MGR: Failed to get '), Field(p0,false)}" -match("MESSAGE#1060:00553/0", "nwparser.payload", "SCAN-MGR: Failed to get %{p0}"); +var part1686 = match("MESSAGE#1060:00553/0", "nwparser.payload", "SCAN-MGR: Failed to get %{p0}"); -var part1693 = // "Pattern{Constant('AltServer '), Field(p0,false)}" -match("MESSAGE#1060:00553/1_0", "nwparser.p0", "AltServer %{p0}"); +var part1687 = match("MESSAGE#1060:00553/1_0", "nwparser.p0", "AltServer %{p0}"); -var part1694 = // "Pattern{Constant('Version '), Field(p0,false)}" -match("MESSAGE#1060:00553/1_1", "nwparser.p0", "Version %{p0}"); +var part1688 = match("MESSAGE#1060:00553/1_1", "nwparser.p0", "Version %{p0}"); -var part1695 = // "Pattern{Constant('Path_GateLockCE '), Field(p0,false)}" -match("MESSAGE#1060:00553/1_2", "nwparser.p0", "Path_GateLockCE %{p0}"); +var part1689 = match("MESSAGE#1060:00553/1_2", "nwparser.p0", "Path_GateLockCE %{p0}"); var select382 = linear_select([ - part1693, - part1694, - part1695, + part1687, + part1688, + part1689, ]); -var all356 = all_match({ +var all350 = all_match({ processors: [ - part1692, + part1686, select382, - dup327, + dup325, ], on_success: processor_chain([ dup18, @@ -22078,10 +20048,9 @@ var all356 = all_match({ ]), }); -var msg1076 = msg("00553", all356); +var msg1076 = msg("00553", all350); -var part1696 = // "Pattern{Constant('SCAN-MGR: Zero pattern size from server.ini.'), Field(,false)}" -match("MESSAGE#1061:00553:01", "nwparser.payload", "SCAN-MGR: Zero pattern size from server.ini.%{}", processor_chain([ +var part1690 = match("MESSAGE#1061:00553:01", "nwparser.payload", "SCAN-MGR: Zero pattern size from server.ini.%{}", processor_chain([ dup18, dup2, dup3, @@ -22089,10 +20058,9 @@ match("MESSAGE#1061:00553:01", "nwparser.payload", "SCAN-MGR: Zero pattern size dup5, ])); -var msg1077 = msg("00553:01", part1696); +var msg1077 = msg("00553:01", part1690); -var part1697 = // "Pattern{Constant('SCAN-MGR: Pattern size from server.ini is too large: '), Field(bytes,true), Constant(' (bytes).')}" -match("MESSAGE#1062:00553:02", "nwparser.payload", "SCAN-MGR: Pattern size from server.ini is too large: %{bytes->} (bytes).", processor_chain([ +var part1691 = match("MESSAGE#1062:00553:02", "nwparser.payload", "SCAN-MGR: Pattern size from server.ini is too large: %{bytes->} (bytes).", processor_chain([ dup18, dup2, dup3, @@ -22100,10 +20068,9 @@ match("MESSAGE#1062:00553:02", "nwparser.payload", "SCAN-MGR: Pattern size from dup5, ])); -var msg1078 = msg("00553:02", part1697); +var msg1078 = msg("00553:02", part1691); -var part1698 = // "Pattern{Constant('SCAN-MGR: Pattern URL from server.ini is too long: '), Field(fld2,false), Constant('; max is '), Field(fld3,false), Constant('.')}" -match("MESSAGE#1063:00553:03", "nwparser.payload", "SCAN-MGR: Pattern URL from server.ini is too long: %{fld2}; max is %{fld3}.", processor_chain([ +var part1692 = match("MESSAGE#1063:00553:03", "nwparser.payload", "SCAN-MGR: Pattern URL from server.ini is too long: %{fld2}; max is %{fld3}.", processor_chain([ dup18, dup2, dup3, @@ -22111,24 +20078,22 @@ match("MESSAGE#1063:00553:03", "nwparser.payload", "SCAN-MGR: Pattern URL from s dup5, ])); -var msg1079 = msg("00553:03", part1698); +var msg1079 = msg("00553:03", part1692); -var part1699 = // "Pattern{Constant('SCAN-MGR: Failed to retrieve '), Field(p0,false)}" -match("MESSAGE#1064:00553:04/0", "nwparser.payload", "SCAN-MGR: Failed to retrieve %{p0}"); +var part1693 = match("MESSAGE#1064:00553:04/0", "nwparser.payload", "SCAN-MGR: Failed to retrieve %{p0}"); var select383 = linear_select([ - dup328, - dup329, + dup326, + dup327, ]); -var part1700 = // "Pattern{Constant('file: '), Field(fld2,false), Constant('; http status code: '), Field(resultcode,false), Constant('.')}" -match("MESSAGE#1064:00553:04/2", "nwparser.p0", "file: %{fld2}; http status code: %{resultcode}."); +var part1694 = match("MESSAGE#1064:00553:04/2", "nwparser.p0", "file: %{fld2}; http status code: %{resultcode}."); -var all357 = all_match({ +var all351 = all_match({ processors: [ - part1699, + part1693, select383, - part1700, + part1694, ], on_success: processor_chain([ dup18, @@ -22139,10 +20104,9 @@ var all357 = all_match({ ]), }); -var msg1080 = msg("00553:04", all357); +var msg1080 = msg("00553:04", all351); -var part1701 = // "Pattern{Constant('SCAN-MGR: Failed to write pattern into a RAM file.'), Field(,false)}" -match("MESSAGE#1065:00553:05", "nwparser.payload", "SCAN-MGR: Failed to write pattern into a RAM file.%{}", processor_chain([ +var part1695 = match("MESSAGE#1065:00553:05", "nwparser.payload", "SCAN-MGR: Failed to write pattern into a RAM file.%{}", processor_chain([ dup18, dup2, dup3, @@ -22150,10 +20114,9 @@ match("MESSAGE#1065:00553:05", "nwparser.payload", "SCAN-MGR: Failed to write pa dup5, ])); -var msg1081 = msg("00553:05", part1701); +var msg1081 = msg("00553:05", part1695); -var part1702 = // "Pattern{Constant('SCAN-MGR: Check Pattern File failed: code from VSAPI: '), Field(resultcode,false)}" -match("MESSAGE#1066:00553:06", "nwparser.payload", "SCAN-MGR: Check Pattern File failed: code from VSAPI: %{resultcode}", processor_chain([ +var part1696 = match("MESSAGE#1066:00553:06", "nwparser.payload", "SCAN-MGR: Check Pattern File failed: code from VSAPI: %{resultcode}", processor_chain([ dup18, dup2, dup3, @@ -22161,10 +20124,9 @@ match("MESSAGE#1066:00553:06", "nwparser.payload", "SCAN-MGR: Check Pattern File dup5, ])); -var msg1082 = msg("00553:06", part1702); +var msg1082 = msg("00553:06", part1696); -var part1703 = // "Pattern{Constant('SCAN-MGR: Failed to write pattern into flash.'), Field(,false)}" -match("MESSAGE#1067:00553:07", "nwparser.payload", "SCAN-MGR: Failed to write pattern into flash.%{}", processor_chain([ +var part1697 = match("MESSAGE#1067:00553:07", "nwparser.payload", "SCAN-MGR: Failed to write pattern into flash.%{}", processor_chain([ dup18, dup2, dup3, @@ -22172,21 +20134,20 @@ match("MESSAGE#1067:00553:07", "nwparser.payload", "SCAN-MGR: Failed to write pa dup5, ])); -var msg1083 = msg("00553:07", part1703); +var msg1083 = msg("00553:07", part1697); -var part1704 = // "Pattern{Constant('SCAN-MGR: Internal error while setting up for retrieving '), Field(p0,false)}" -match("MESSAGE#1068:00553:08/0", "nwparser.payload", "SCAN-MGR: Internal error while setting up for retrieving %{p0}"); +var part1698 = match("MESSAGE#1068:00553:08/0", "nwparser.payload", "SCAN-MGR: Internal error while setting up for retrieving %{p0}"); var select384 = linear_select([ - dup329, - dup328, + dup327, + dup326, ]); -var all358 = all_match({ +var all352 = all_match({ processors: [ - part1704, + part1698, select384, - dup330, + dup328, ], on_success: processor_chain([ dup19, @@ -22197,10 +20158,9 @@ var all358 = all_match({ ]), }); -var msg1084 = msg("00553:08", all358); +var msg1084 = msg("00553:08", all352); -var part1705 = // "Pattern{Constant('SCAN-MGR: '), Field(fld2,true), Constant(' '), Field(disposition,false), Constant(': Err: '), Field(resultcode,false), Constant('.')}" -match("MESSAGE#1069:00553:09", "nwparser.payload", "SCAN-MGR: %{fld2->} %{disposition}: Err: %{resultcode}.", processor_chain([ +var part1699 = match("MESSAGE#1069:00553:09", "nwparser.payload", "SCAN-MGR: %{fld2->} %{disposition}: Err: %{resultcode}.", processor_chain([ dup19, dup2, dup3, @@ -22208,10 +20168,9 @@ match("MESSAGE#1069:00553:09", "nwparser.payload", "SCAN-MGR: %{fld2->} %{dispos dup5, ])); -var msg1085 = msg("00553:09", part1705); +var msg1085 = msg("00553:09", part1699); -var part1706 = // "Pattern{Constant('SCAN-MGR: TMIntCPVSInit '), Field(disposition,true), Constant(' due to '), Field(result,false)}" -match("MESSAGE#1070:00553:10", "nwparser.payload", "SCAN-MGR: TMIntCPVSInit %{disposition->} due to %{result}", processor_chain([ +var part1700 = match("MESSAGE#1070:00553:10", "nwparser.payload", "SCAN-MGR: TMIntCPVSInit %{disposition->} due to %{result}", processor_chain([ dup19, dup2, dup3, @@ -22219,10 +20178,9 @@ match("MESSAGE#1070:00553:10", "nwparser.payload", "SCAN-MGR: TMIntCPVSInit %{di dup5, ])); -var msg1086 = msg("00553:10", part1706); +var msg1086 = msg("00553:10", part1700); -var part1707 = // "Pattern{Constant('SCAN-MGR: Attempted Pattern Creation Date('), Field(fld2,false), Constant(') is after AV Key Expiration date('), Field(fld3,false), Constant(').')}" -match("MESSAGE#1071:00553:11", "nwparser.payload", "SCAN-MGR: Attempted Pattern Creation Date(%{fld2}) is after AV Key Expiration date(%{fld3}).", processor_chain([ +var part1701 = match("MESSAGE#1071:00553:11", "nwparser.payload", "SCAN-MGR: Attempted Pattern Creation Date(%{fld2}) is after AV Key Expiration date(%{fld3}).", processor_chain([ dup18, dup2, dup3, @@ -22230,10 +20188,9 @@ match("MESSAGE#1071:00553:11", "nwparser.payload", "SCAN-MGR: Attempted Pattern dup5, ])); -var msg1087 = msg("00553:11", part1707); +var msg1087 = msg("00553:11", part1701); -var part1708 = // "Pattern{Constant('SCAN-MGR: TMIntSetDecompressLayer '), Field(disposition,false), Constant(': Layer: '), Field(fld2,false), Constant(', Err: '), Field(resultcode,false), Constant('.')}" -match("MESSAGE#1072:00553:12", "nwparser.payload", "SCAN-MGR: TMIntSetDecompressLayer %{disposition}: Layer: %{fld2}, Err: %{resultcode}.", processor_chain([ +var part1702 = match("MESSAGE#1072:00553:12", "nwparser.payload", "SCAN-MGR: TMIntSetDecompressLayer %{disposition}: Layer: %{fld2}, Err: %{resultcode}.", processor_chain([ dup19, dup2, dup3, @@ -22241,10 +20198,9 @@ match("MESSAGE#1072:00553:12", "nwparser.payload", "SCAN-MGR: TMIntSetDecompress dup5, ])); -var msg1088 = msg("00553:12", part1708); +var msg1088 = msg("00553:12", part1702); -var part1709 = // "Pattern{Constant('SCAN-MGR: TMIntSetExtractFileSizeLimit '), Field(disposition,false), Constant(': Limit: '), Field(fld2,false), Constant(', Err: '), Field(resultcode,false), Constant('.')}" -match("MESSAGE#1073:00553:13", "nwparser.payload", "SCAN-MGR: TMIntSetExtractFileSizeLimit %{disposition}: Limit: %{fld2}, Err: %{resultcode}.", processor_chain([ +var part1703 = match("MESSAGE#1073:00553:13", "nwparser.payload", "SCAN-MGR: TMIntSetExtractFileSizeLimit %{disposition}: Limit: %{fld2}, Err: %{resultcode}.", processor_chain([ dup19, dup2, dup3, @@ -22252,10 +20208,9 @@ match("MESSAGE#1073:00553:13", "nwparser.payload", "SCAN-MGR: TMIntSetExtractFil dup5, ])); -var msg1089 = msg("00553:13", part1709); +var msg1089 = msg("00553:13", part1703); -var part1710 = // "Pattern{Constant('SCAN-MGR: TMIntScanFile '), Field(disposition,false), Constant(': ret: '), Field(fld2,false), Constant('; cpapiErrCode: '), Field(resultcode,false), Constant('.')}" -match("MESSAGE#1074:00553:14", "nwparser.payload", "SCAN-MGR: TMIntScanFile %{disposition}: ret: %{fld2}; cpapiErrCode: %{resultcode}.", processor_chain([ +var part1704 = match("MESSAGE#1074:00553:14", "nwparser.payload", "SCAN-MGR: TMIntScanFile %{disposition}: ret: %{fld2}; cpapiErrCode: %{resultcode}.", processor_chain([ dup19, dup2, dup3, @@ -22263,10 +20218,9 @@ match("MESSAGE#1074:00553:14", "nwparser.payload", "SCAN-MGR: TMIntScanFile %{di dup5, ])); -var msg1090 = msg("00553:14", part1710); +var msg1090 = msg("00553:14", part1704); -var part1711 = // "Pattern{Constant('SCAN-MGR: VSAPI resource usage error. Left usage: '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1075:00553:15", "nwparser.payload", "SCAN-MGR: VSAPI resource usage error. Left usage: %{fld2}.", processor_chain([ +var part1705 = match("MESSAGE#1075:00553:15", "nwparser.payload", "SCAN-MGR: VSAPI resource usage error. Left usage: %{fld2}.", processor_chain([ dup19, dup2, dup3, @@ -22274,10 +20228,9 @@ match("MESSAGE#1075:00553:15", "nwparser.payload", "SCAN-MGR: VSAPI resource usa dup5, ])); -var msg1091 = msg("00553:15", part1711); +var msg1091 = msg("00553:15", part1705); -var part1712 = // "Pattern{Constant('SCAN-MGR: Set decompress layer to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1076:00553:16", "nwparser.payload", "SCAN-MGR: Set decompress layer to %{fld2}.", processor_chain([ +var part1706 = match("MESSAGE#1076:00553:16", "nwparser.payload", "SCAN-MGR: Set decompress layer to %{fld2}.", processor_chain([ dup1, dup2, dup3, @@ -22285,10 +20238,9 @@ match("MESSAGE#1076:00553:16", "nwparser.payload", "SCAN-MGR: Set decompress lay dup5, ])); -var msg1092 = msg("00553:16", part1712); +var msg1092 = msg("00553:16", part1706); -var part1713 = // "Pattern{Constant('SCAN-MGR: Set maximum content size to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1077:00553:17", "nwparser.payload", "SCAN-MGR: Set maximum content size to %{fld2}.", processor_chain([ +var part1707 = match("MESSAGE#1077:00553:17", "nwparser.payload", "SCAN-MGR: Set maximum content size to %{fld2}.", processor_chain([ dup1, dup2, dup3, @@ -22296,10 +20248,9 @@ match("MESSAGE#1077:00553:17", "nwparser.payload", "SCAN-MGR: Set maximum conten dup5, ])); -var msg1093 = msg("00553:17", part1713); +var msg1093 = msg("00553:17", part1707); -var part1714 = // "Pattern{Constant('SCAN-MGR: Set maximum number of concurrent messages to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1078:00553:18", "nwparser.payload", "SCAN-MGR: Set maximum number of concurrent messages to %{fld2}.", processor_chain([ +var part1708 = match("MESSAGE#1078:00553:18", "nwparser.payload", "SCAN-MGR: Set maximum number of concurrent messages to %{fld2}.", processor_chain([ dup1, dup2, dup3, @@ -22307,10 +20258,9 @@ match("MESSAGE#1078:00553:18", "nwparser.payload", "SCAN-MGR: Set maximum number dup5, ])); -var msg1094 = msg("00553:18", part1714); +var msg1094 = msg("00553:18", part1708); -var part1715 = // "Pattern{Constant('SCAN-MGR: Set drop if maximum number of concurrent messages exceeds max to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1079:00553:19", "nwparser.payload", "SCAN-MGR: Set drop if maximum number of concurrent messages exceeds max to %{fld2}.", processor_chain([ +var part1709 = match("MESSAGE#1079:00553:19", "nwparser.payload", "SCAN-MGR: Set drop if maximum number of concurrent messages exceeds max to %{fld2}.", processor_chain([ dup1, dup2, dup3, @@ -22318,10 +20268,9 @@ match("MESSAGE#1079:00553:19", "nwparser.payload", "SCAN-MGR: Set drop if maximu dup5, ])); -var msg1095 = msg("00553:19", part1715); +var msg1095 = msg("00553:19", part1709); -var part1716 = // "Pattern{Constant('SCAN-MGR: Set Pattern URL to '), Field(fld2,false), Constant('; update interval is '), Field(fld3,false), Constant('.')}" -match("MESSAGE#1080:00553:20", "nwparser.payload", "SCAN-MGR: Set Pattern URL to %{fld2}; update interval is %{fld3}.", processor_chain([ +var part1710 = match("MESSAGE#1080:00553:20", "nwparser.payload", "SCAN-MGR: Set Pattern URL to %{fld2}; update interval is %{fld3}.", processor_chain([ dup1, dup2, dup3, @@ -22329,10 +20278,9 @@ match("MESSAGE#1080:00553:20", "nwparser.payload", "SCAN-MGR: Set Pattern URL to dup5, ])); -var msg1096 = msg("00553:20", part1716); +var msg1096 = msg("00553:20", part1710); -var part1717 = // "Pattern{Constant('SCAN-MGR: Unset Pattern URL; Pattern will not be updated automatically.'), Field(,false)}" -match("MESSAGE#1081:00553:21", "nwparser.payload", "SCAN-MGR: Unset Pattern URL; Pattern will not be updated automatically.%{}", processor_chain([ +var part1711 = match("MESSAGE#1081:00553:21", "nwparser.payload", "SCAN-MGR: Unset Pattern URL; Pattern will not be updated automatically.%{}", processor_chain([ dup1, dup2, dup3, @@ -22340,10 +20288,9 @@ match("MESSAGE#1081:00553:21", "nwparser.payload", "SCAN-MGR: Unset Pattern URL; dup5, ])); -var msg1097 = msg("00553:21", part1717); +var msg1097 = msg("00553:21", part1711); -var part1718 = // "Pattern{Constant('SCAN-MGR: New pattern updated: version: '), Field(version,false), Constant(', size: '), Field(bytes,true), Constant(' (bytes).')}" -match("MESSAGE#1082:00553:22", "nwparser.payload", "SCAN-MGR: New pattern updated: version: %{version}, size: %{bytes->} (bytes).", processor_chain([ +var part1712 = match("MESSAGE#1082:00553:22", "nwparser.payload", "SCAN-MGR: New pattern updated: version: %{version}, size: %{bytes->} (bytes).", processor_chain([ dup1, dup2, dup3, @@ -22351,7 +20298,7 @@ match("MESSAGE#1082:00553:22", "nwparser.payload", "SCAN-MGR: New pattern update dup5, ])); -var msg1098 = msg("00553:22", part1718); +var msg1098 = msg("00553:22", part1712); var select385 = linear_select([ msg1076, @@ -22379,29 +20326,25 @@ var select385 = linear_select([ msg1098, ]); -var part1719 = // "Pattern{Constant('SCAN-MGR: Cannot get '), Field(p0,false)}" -match("MESSAGE#1083:00554/0", "nwparser.payload", "SCAN-MGR: Cannot get %{p0}"); +var part1713 = match("MESSAGE#1083:00554/0", "nwparser.payload", "SCAN-MGR: Cannot get %{p0}"); -var part1720 = // "Pattern{Constant('AltServer info '), Field(p0,false)}" -match("MESSAGE#1083:00554/1_0", "nwparser.p0", "AltServer info %{p0}"); +var part1714 = match("MESSAGE#1083:00554/1_0", "nwparser.p0", "AltServer info %{p0}"); -var part1721 = // "Pattern{Constant('Version number '), Field(p0,false)}" -match("MESSAGE#1083:00554/1_1", "nwparser.p0", "Version number %{p0}"); +var part1715 = match("MESSAGE#1083:00554/1_1", "nwparser.p0", "Version number %{p0}"); -var part1722 = // "Pattern{Constant('Path_GateLockCE info '), Field(p0,false)}" -match("MESSAGE#1083:00554/1_2", "nwparser.p0", "Path_GateLockCE info %{p0}"); +var part1716 = match("MESSAGE#1083:00554/1_2", "nwparser.p0", "Path_GateLockCE info %{p0}"); var select386 = linear_select([ - part1720, - part1721, - part1722, + part1714, + part1715, + part1716, ]); -var all359 = all_match({ +var all353 = all_match({ processors: [ - part1719, + part1713, select386, - dup327, + dup325, ], on_success: processor_chain([ dup144, @@ -22412,10 +20355,9 @@ var all359 = all_match({ ]), }); -var msg1099 = msg("00554", all359); +var msg1099 = msg("00554", all353); -var part1723 = // "Pattern{Constant('SCAN-MGR: Per server.ini file, the AV pattern file size is zero.'), Field(,false)}" -match("MESSAGE#1084:00554:01", "nwparser.payload", "SCAN-MGR: Per server.ini file, the AV pattern file size is zero.%{}", processor_chain([ +var part1717 = match("MESSAGE#1084:00554:01", "nwparser.payload", "SCAN-MGR: Per server.ini file, the AV pattern file size is zero.%{}", processor_chain([ dup19, dup2, dup3, @@ -22423,10 +20365,9 @@ match("MESSAGE#1084:00554:01", "nwparser.payload", "SCAN-MGR: Per server.ini fil dup5, ])); -var msg1100 = msg("00554:01", part1723); +var msg1100 = msg("00554:01", part1717); -var part1724 = // "Pattern{Constant('SCAN-MGR: AV pattern file size is too large ('), Field(bytes,true), Constant(' bytes).')}" -match("MESSAGE#1085:00554:02", "nwparser.payload", "SCAN-MGR: AV pattern file size is too large (%{bytes->} bytes).", processor_chain([ +var part1718 = match("MESSAGE#1085:00554:02", "nwparser.payload", "SCAN-MGR: AV pattern file size is too large (%{bytes->} bytes).", processor_chain([ dup19, dup2, dup3, @@ -22434,10 +20375,9 @@ match("MESSAGE#1085:00554:02", "nwparser.payload", "SCAN-MGR: AV pattern file si dup5, ])); -var msg1101 = msg("00554:02", part1724); +var msg1101 = msg("00554:02", part1718); -var part1725 = // "Pattern{Constant('SCAN-MGR: Alternate AV pattern file server URL is too long: '), Field(bytes,true), Constant(' bytes. Max: '), Field(fld2,true), Constant(' bytes.')}" -match("MESSAGE#1086:00554:03", "nwparser.payload", "SCAN-MGR: Alternate AV pattern file server URL is too long: %{bytes->} bytes. Max: %{fld2->} bytes.", processor_chain([ +var part1719 = match("MESSAGE#1086:00554:03", "nwparser.payload", "SCAN-MGR: Alternate AV pattern file server URL is too long: %{bytes->} bytes. Max: %{fld2->} bytes.", processor_chain([ dup19, dup2, dup3, @@ -22445,19 +20385,17 @@ match("MESSAGE#1086:00554:03", "nwparser.payload", "SCAN-MGR: Alternate AV patte dup5, ])); -var msg1102 = msg("00554:03", part1725); +var msg1102 = msg("00554:03", part1719); -var part1726 = // "Pattern{Constant('SCAN-MGR: Cannot retrieve '), Field(p0,false)}" -match("MESSAGE#1087:00554:04/0", "nwparser.payload", "SCAN-MGR: Cannot retrieve %{p0}"); +var part1720 = match("MESSAGE#1087:00554:04/0", "nwparser.payload", "SCAN-MGR: Cannot retrieve %{p0}"); -var part1727 = // "Pattern{Constant('file from '), Field(hostip,false), Constant(':'), Field(network_port,false), Constant('. HTTP status code: '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1087:00554:04/2", "nwparser.p0", "file from %{hostip}:%{network_port}. HTTP status code: %{fld2}."); +var part1721 = match("MESSAGE#1087:00554:04/2", "nwparser.p0", "file from %{hostip}:%{network_port}. HTTP status code: %{fld2}."); -var all360 = all_match({ +var all354 = all_match({ processors: [ - part1726, - dup408, - part1727, + part1720, + dup405, + part1721, ], on_success: processor_chain([ dup144, @@ -22468,25 +20406,22 @@ var all360 = all_match({ ]), }); -var msg1103 = msg("00554:04", all360); +var msg1103 = msg("00554:04", all354); -var part1728 = // "Pattern{Constant('SCAN-MGR: Cannot write AV pattern file to '), Field(p0,false)}" -match("MESSAGE#1088:00554:05/0", "nwparser.payload", "SCAN-MGR: Cannot write AV pattern file to %{p0}"); +var part1722 = match("MESSAGE#1088:00554:05/0", "nwparser.payload", "SCAN-MGR: Cannot write AV pattern file to %{p0}"); -var part1729 = // "Pattern{Constant('RAM '), Field(p0,false)}" -match("MESSAGE#1088:00554:05/1_0", "nwparser.p0", "RAM %{p0}"); +var part1723 = match("MESSAGE#1088:00554:05/1_0", "nwparser.p0", "RAM %{p0}"); -var part1730 = // "Pattern{Constant('flash '), Field(p0,false)}" -match("MESSAGE#1088:00554:05/1_1", "nwparser.p0", "flash %{p0}"); +var part1724 = match("MESSAGE#1088:00554:05/1_1", "nwparser.p0", "flash %{p0}"); var select387 = linear_select([ - part1729, - part1730, + part1723, + part1724, ]); -var all361 = all_match({ +var all355 = all_match({ processors: [ - part1728, + part1722, select387, dup116, ], @@ -22499,10 +20434,9 @@ var all361 = all_match({ ]), }); -var msg1104 = msg("00554:05", all361); +var msg1104 = msg("00554:05", all355); -var part1731 = // "Pattern{Constant('SCAN-MGR: Cannot check AV pattern file. VSAPI code: '), Field(fld2,false)}" -match("MESSAGE#1089:00554:06", "nwparser.payload", "SCAN-MGR: Cannot check AV pattern file. VSAPI code: %{fld2}", processor_chain([ +var part1725 = match("MESSAGE#1089:00554:06", "nwparser.payload", "SCAN-MGR: Cannot check AV pattern file. VSAPI code: %{fld2}", processor_chain([ dup144, dup2, dup3, @@ -22510,16 +20444,15 @@ match("MESSAGE#1089:00554:06", "nwparser.payload", "SCAN-MGR: Cannot check AV pa dup5, ])); -var msg1105 = msg("00554:06", part1731); +var msg1105 = msg("00554:06", part1725); -var part1732 = // "Pattern{Constant('SCAN-MGR: Internal error occurred while retrieving '), Field(p0,false)}" -match("MESSAGE#1090:00554:07/0", "nwparser.payload", "SCAN-MGR: Internal error occurred while retrieving %{p0}"); +var part1726 = match("MESSAGE#1090:00554:07/0", "nwparser.payload", "SCAN-MGR: Internal error occurred while retrieving %{p0}"); -var all362 = all_match({ +var all356 = all_match({ processors: [ - part1732, - dup408, - dup330, + part1726, + dup405, + dup328, ], on_success: processor_chain([ dup19, @@ -22530,29 +20463,25 @@ var all362 = all_match({ ]), }); -var msg1106 = msg("00554:07", all362); +var msg1106 = msg("00554:07", all356); -var part1733 = // "Pattern{Constant('SCAN-MGR: Internal error occurred when calling this function: '), Field(fld2,false), Constant('. '), Field(fld3,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1091:00554:08/0", "nwparser.payload", "SCAN-MGR: Internal error occurred when calling this function: %{fld2}. %{fld3->} %{p0}"); +var part1727 = match("MESSAGE#1091:00554:08/0", "nwparser.payload", "SCAN-MGR: Internal error occurred when calling this function: %{fld2}. %{fld3->} %{p0}"); -var part1734 = // "Pattern{Constant('Error: '), Field(resultcode,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1091:00554:08/1_0", "nwparser.p0", "Error: %{resultcode->} %{p0}"); +var part1728 = match("MESSAGE#1091:00554:08/1_0", "nwparser.p0", "Error: %{resultcode->} %{p0}"); -var part1735 = // "Pattern{Constant('Returned a NULL VSC handler '), Field(p0,false)}" -match("MESSAGE#1091:00554:08/1_1", "nwparser.p0", "Returned a NULL VSC handler %{p0}"); +var part1729 = match("MESSAGE#1091:00554:08/1_1", "nwparser.p0", "Returned a NULL VSC handler %{p0}"); -var part1736 = // "Pattern{Constant('cpapiErrCode: '), Field(resultcode,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1091:00554:08/1_2", "nwparser.p0", "cpapiErrCode: %{resultcode->} %{p0}"); +var part1730 = match("MESSAGE#1091:00554:08/1_2", "nwparser.p0", "cpapiErrCode: %{resultcode->} %{p0}"); var select388 = linear_select([ - part1734, - part1735, - part1736, + part1728, + part1729, + part1730, ]); -var all363 = all_match({ +var all357 = all_match({ processors: [ - part1733, + part1727, select388, dup116, ], @@ -22565,10 +20494,9 @@ var all363 = all_match({ ]), }); -var msg1107 = msg("00554:08", all363); +var msg1107 = msg("00554:08", all357); -var part1737 = // "Pattern{Constant('SCAN-MGR: Number of decompression layers has been set to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1092:00554:09", "nwparser.payload", "SCAN-MGR: Number of decompression layers has been set to %{fld2}.", processor_chain([ +var part1731 = match("MESSAGE#1092:00554:09", "nwparser.payload", "SCAN-MGR: Number of decompression layers has been set to %{fld2}.", processor_chain([ dup1, dup2, dup3, @@ -22576,10 +20504,9 @@ match("MESSAGE#1092:00554:09", "nwparser.payload", "SCAN-MGR: Number of decompre dup5, ])); -var msg1108 = msg("00554:09", part1737); +var msg1108 = msg("00554:09", part1731); -var part1738 = // "Pattern{Constant('SCAN-MGR: Maximum content size has been set to '), Field(fld2,true), Constant(' KB.')}" -match("MESSAGE#1093:00554:10", "nwparser.payload", "SCAN-MGR: Maximum content size has been set to %{fld2->} KB.", processor_chain([ +var part1732 = match("MESSAGE#1093:00554:10", "nwparser.payload", "SCAN-MGR: Maximum content size has been set to %{fld2->} KB.", processor_chain([ dup1, dup2, dup3, @@ -22587,10 +20514,9 @@ match("MESSAGE#1093:00554:10", "nwparser.payload", "SCAN-MGR: Maximum content si dup5, ])); -var msg1109 = msg("00554:10", part1738); +var msg1109 = msg("00554:10", part1732); -var part1739 = // "Pattern{Constant('SCAN-MGR: Maximum number of concurrent messages has been set to '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1094:00554:11", "nwparser.payload", "SCAN-MGR: Maximum number of concurrent messages has been set to %{fld2}.", processor_chain([ +var part1733 = match("MESSAGE#1094:00554:11", "nwparser.payload", "SCAN-MGR: Maximum number of concurrent messages has been set to %{fld2}.", processor_chain([ dup1, dup2, dup3, @@ -22598,46 +20524,39 @@ match("MESSAGE#1094:00554:11", "nwparser.payload", "SCAN-MGR: Maximum number of dup5, ])); -var msg1110 = msg("00554:11", part1739); +var msg1110 = msg("00554:11", part1733); -var part1740 = // "Pattern{Constant('SCAN-MGR: Fail mode has been set to '), Field(p0,false)}" -match("MESSAGE#1095:00554:12/0", "nwparser.payload", "SCAN-MGR: Fail mode has been set to %{p0}"); +var part1734 = match("MESSAGE#1095:00554:12/0", "nwparser.payload", "SCAN-MGR: Fail mode has been set to %{p0}"); -var part1741 = // "Pattern{Constant('drop '), Field(p0,false)}" -match("MESSAGE#1095:00554:12/1_0", "nwparser.p0", "drop %{p0}"); +var part1735 = match("MESSAGE#1095:00554:12/1_0", "nwparser.p0", "drop %{p0}"); -var part1742 = // "Pattern{Constant('pass '), Field(p0,false)}" -match("MESSAGE#1095:00554:12/1_1", "nwparser.p0", "pass %{p0}"); +var part1736 = match("MESSAGE#1095:00554:12/1_1", "nwparser.p0", "pass %{p0}"); var select389 = linear_select([ - part1741, - part1742, + part1735, + part1736, ]); -var part1743 = // "Pattern{Constant('unexamined traffic if '), Field(p0,false)}" -match("MESSAGE#1095:00554:12/2", "nwparser.p0", "unexamined traffic if %{p0}"); +var part1737 = match("MESSAGE#1095:00554:12/2", "nwparser.p0", "unexamined traffic if %{p0}"); -var part1744 = // "Pattern{Constant('content size '), Field(p0,false)}" -match("MESSAGE#1095:00554:12/3_0", "nwparser.p0", "content size %{p0}"); +var part1738 = match("MESSAGE#1095:00554:12/3_0", "nwparser.p0", "content size %{p0}"); -var part1745 = // "Pattern{Constant('number of concurrent messages '), Field(p0,false)}" -match("MESSAGE#1095:00554:12/3_1", "nwparser.p0", "number of concurrent messages %{p0}"); +var part1739 = match("MESSAGE#1095:00554:12/3_1", "nwparser.p0", "number of concurrent messages %{p0}"); var select390 = linear_select([ - part1744, - part1745, + part1738, + part1739, ]); -var part1746 = // "Pattern{Constant('exceeds max.'), Field(,false)}" -match("MESSAGE#1095:00554:12/4", "nwparser.p0", "exceeds max.%{}"); +var part1740 = match("MESSAGE#1095:00554:12/4", "nwparser.p0", "exceeds max.%{}"); -var all364 = all_match({ +var all358 = all_match({ processors: [ - part1740, + part1734, select389, - part1743, + part1737, select390, - part1746, + part1740, ], on_success: processor_chain([ dup1, @@ -22648,10 +20567,9 @@ var all364 = all_match({ ]), }); -var msg1111 = msg("00554:12", all364); +var msg1111 = msg("00554:12", all358); -var part1747 = // "Pattern{Constant('SCAN-MGR: URL for AV pattern update server has been set to '), Field(fld2,false), Constant(', and the update interval to '), Field(fld3,true), Constant(' minutes.')}" -match("MESSAGE#1096:00554:13", "nwparser.payload", "SCAN-MGR: URL for AV pattern update server has been set to %{fld2}, and the update interval to %{fld3->} minutes.", processor_chain([ +var part1741 = match("MESSAGE#1096:00554:13", "nwparser.payload", "SCAN-MGR: URL for AV pattern update server has been set to %{fld2}, and the update interval to %{fld3->} minutes.", processor_chain([ dup1, dup2, dup3, @@ -22659,10 +20577,9 @@ match("MESSAGE#1096:00554:13", "nwparser.payload", "SCAN-MGR: URL for AV pattern dup5, ])); -var msg1112 = msg("00554:13", part1747); +var msg1112 = msg("00554:13", part1741); -var part1748 = // "Pattern{Constant('SCAN-MGR: URL for AV pattern update server has been unset, and the update interval returned to its default.'), Field(,false)}" -match("MESSAGE#1097:00554:14", "nwparser.payload", "SCAN-MGR: URL for AV pattern update server has been unset, and the update interval returned to its default.%{}", processor_chain([ +var part1742 = match("MESSAGE#1097:00554:14", "nwparser.payload", "SCAN-MGR: URL for AV pattern update server has been unset, and the update interval returned to its default.%{}", processor_chain([ dup1, dup2, dup3, @@ -22670,10 +20587,9 @@ match("MESSAGE#1097:00554:14", "nwparser.payload", "SCAN-MGR: URL for AV pattern dup5, ])); -var msg1113 = msg("00554:14", part1748); +var msg1113 = msg("00554:14", part1742); -var part1749 = // "Pattern{Constant('SCAN-MGR: New AV pattern file has been updated. Version: '), Field(version,false), Constant('; size: '), Field(bytes,true), Constant(' bytes.')}" -match("MESSAGE#1098:00554:15", "nwparser.payload", "SCAN-MGR: New AV pattern file has been updated. Version: %{version}; size: %{bytes->} bytes.", processor_chain([ +var part1743 = match("MESSAGE#1098:00554:15", "nwparser.payload", "SCAN-MGR: New AV pattern file has been updated. Version: %{version}; size: %{bytes->} bytes.", processor_chain([ dup1, dup2, dup3, @@ -22681,10 +20597,9 @@ match("MESSAGE#1098:00554:15", "nwparser.payload", "SCAN-MGR: New AV pattern fil dup5, ])); -var msg1114 = msg("00554:15", part1749); +var msg1114 = msg("00554:15", part1743); -var part1750 = // "Pattern{Constant('SCAN-MGR: AV client has exceeded its resource allotment. Remaining available resources: '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1099:00554:16", "nwparser.payload", "SCAN-MGR: AV client has exceeded its resource allotment. Remaining available resources: %{fld2}.", processor_chain([ +var part1744 = match("MESSAGE#1099:00554:16", "nwparser.payload", "SCAN-MGR: AV client has exceeded its resource allotment. Remaining available resources: %{fld2}.", processor_chain([ dup19, dup2, dup3, @@ -22692,10 +20607,9 @@ match("MESSAGE#1099:00554:16", "nwparser.payload", "SCAN-MGR: AV client has exce dup5, ])); -var msg1115 = msg("00554:16", part1750); +var msg1115 = msg("00554:16", part1744); -var part1751 = // "Pattern{Constant('SCAN-MGR: Attempted to load AV pattern file created '), Field(fld2,true), Constant(' after the AV subscription expired. (Exp: '), Field(fld3,false), Constant(')')}" -match("MESSAGE#1100:00554:17", "nwparser.payload", "SCAN-MGR: Attempted to load AV pattern file created %{fld2->} after the AV subscription expired. (Exp: %{fld3})", processor_chain([ +var part1745 = match("MESSAGE#1100:00554:17", "nwparser.payload", "SCAN-MGR: Attempted to load AV pattern file created %{fld2->} after the AV subscription expired. (Exp: %{fld3})", processor_chain([ dup1, dup2, dup3, @@ -22703,7 +20617,7 @@ match("MESSAGE#1100:00554:17", "nwparser.payload", "SCAN-MGR: Attempted to load dup5, ])); -var msg1116 = msg("00554:17", part1751); +var msg1116 = msg("00554:17", part1745); var select391 = linear_select([ msg1099, @@ -22726,8 +20640,7 @@ var select391 = linear_select([ msg1116, ]); -var part1752 = // "Pattern{Constant('Vrouter '), Field(node,true), Constant(' PIMSM cannot process non-multicast address '), Field(hostip,false)}" -match("MESSAGE#1101:00555", "nwparser.payload", "Vrouter %{node->} PIMSM cannot process non-multicast address %{hostip}", processor_chain([ +var part1746 = match("MESSAGE#1101:00555", "nwparser.payload", "Vrouter %{node->} PIMSM cannot process non-multicast address %{hostip}", processor_chain([ dup19, dup2, dup3, @@ -22735,10 +20648,9 @@ match("MESSAGE#1101:00555", "nwparser.payload", "Vrouter %{node->} PIMSM cannot dup5, ])); -var msg1117 = msg("00555", part1752); +var msg1117 = msg("00555", part1746); -var part1753 = // "Pattern{Constant('UF-MGR: Failed to process a request. Reason: '), Field(result,false)}" -match("MESSAGE#1102:00556", "nwparser.payload", "UF-MGR: Failed to process a request. Reason: %{result}", processor_chain([ +var part1747 = match("MESSAGE#1102:00556", "nwparser.payload", "UF-MGR: Failed to process a request. Reason: %{result}", processor_chain([ dup19, dup2, dup3, @@ -22746,10 +20658,9 @@ match("MESSAGE#1102:00556", "nwparser.payload", "UF-MGR: Failed to process a req dup5, ])); -var msg1118 = msg("00556", part1753); +var msg1118 = msg("00556", part1747); -var part1754 = // "Pattern{Constant('UF-MGR: Failed to abort a transaction. Reason: '), Field(result,false)}" -match("MESSAGE#1103:00556:01", "nwparser.payload", "UF-MGR: Failed to abort a transaction. Reason: %{result}", processor_chain([ +var part1748 = match("MESSAGE#1103:00556:01", "nwparser.payload", "UF-MGR: Failed to abort a transaction. Reason: %{result}", processor_chain([ dup19, dup2, dup3, @@ -22757,49 +20668,42 @@ match("MESSAGE#1103:00556:01", "nwparser.payload", "UF-MGR: Failed to abort a tr dup5, ])); -var msg1119 = msg("00556:01", part1754); +var msg1119 = msg("00556:01", part1748); -var part1755 = // "Pattern{Constant('UF-MGR: UF '), Field(p0,false)}" -match("MESSAGE#1104:00556:02/0", "nwparser.payload", "UF-MGR: UF %{p0}"); +var part1749 = match("MESSAGE#1104:00556:02/0", "nwparser.payload", "UF-MGR: UF %{p0}"); -var part1756 = // "Pattern{Constant('K'), Field(p0,false)}" -match("MESSAGE#1104:00556:02/1_0", "nwparser.p0", "K%{p0}"); +var part1750 = match("MESSAGE#1104:00556:02/1_0", "nwparser.p0", "K%{p0}"); -var part1757 = // "Pattern{Constant('k'), Field(p0,false)}" -match("MESSAGE#1104:00556:02/1_1", "nwparser.p0", "k%{p0}"); +var part1751 = match("MESSAGE#1104:00556:02/1_1", "nwparser.p0", "k%{p0}"); var select392 = linear_select([ - part1756, - part1757, + part1750, + part1751, ]); -var part1758 = // "Pattern{Constant('ey '), Field(p0,false)}" -match("MESSAGE#1104:00556:02/2", "nwparser.p0", "ey %{p0}"); +var part1752 = match("MESSAGE#1104:00556:02/2", "nwparser.p0", "ey %{p0}"); -var part1759 = // "Pattern{Constant('Expired'), Field(p0,false)}" -match("MESSAGE#1104:00556:02/3_0", "nwparser.p0", "Expired%{p0}"); +var part1753 = match("MESSAGE#1104:00556:02/3_0", "nwparser.p0", "Expired%{p0}"); -var part1760 = // "Pattern{Constant('expired'), Field(p0,false)}" -match("MESSAGE#1104:00556:02/3_1", "nwparser.p0", "expired%{p0}"); +var part1754 = match("MESSAGE#1104:00556:02/3_1", "nwparser.p0", "expired%{p0}"); var select393 = linear_select([ - part1759, - part1760, + part1753, + part1754, ]); -var part1761 = // "Pattern{Field(,false), Constant('(expiration date: '), Field(fld2,false), Constant('; current date: '), Field(fld3,false), Constant(').')}" -match("MESSAGE#1104:00556:02/4", "nwparser.p0", "%{}(expiration date: %{fld2}; current date: %{fld3})."); +var part1755 = match("MESSAGE#1104:00556:02/4", "nwparser.p0", "%{}(expiration date: %{fld2}; current date: %{fld3})."); -var all365 = all_match({ +var all359 = all_match({ processors: [ - part1755, + part1749, select392, - part1758, + part1752, select393, - part1761, + part1755, ], on_success: processor_chain([ - dup256, + dup254, dup2, dup3, dup4, @@ -22807,30 +20711,26 @@ var all365 = all_match({ ]), }); -var msg1120 = msg("00556:02", all365); +var msg1120 = msg("00556:02", all359); -var part1762 = // "Pattern{Constant('UF-MGR: Failed to '), Field(p0,false)}" -match("MESSAGE#1105:00556:03/0", "nwparser.payload", "UF-MGR: Failed to %{p0}"); +var part1756 = match("MESSAGE#1105:00556:03/0", "nwparser.payload", "UF-MGR: Failed to %{p0}"); -var part1763 = // "Pattern{Constant('enable '), Field(p0,false)}" -match("MESSAGE#1105:00556:03/1_0", "nwparser.p0", "enable %{p0}"); +var part1757 = match("MESSAGE#1105:00556:03/1_0", "nwparser.p0", "enable %{p0}"); -var part1764 = // "Pattern{Constant('disable '), Field(p0,false)}" -match("MESSAGE#1105:00556:03/1_1", "nwparser.p0", "disable %{p0}"); +var part1758 = match("MESSAGE#1105:00556:03/1_1", "nwparser.p0", "disable %{p0}"); var select394 = linear_select([ - part1763, - part1764, + part1757, + part1758, ]); -var part1765 = // "Pattern{Constant('cache.'), Field(,false)}" -match("MESSAGE#1105:00556:03/2", "nwparser.p0", "cache.%{}"); +var part1759 = match("MESSAGE#1105:00556:03/2", "nwparser.p0", "cache.%{}"); -var all366 = all_match({ +var all360 = all_match({ processors: [ - part1762, + part1756, select394, - part1765, + part1759, ], on_success: processor_chain([ dup19, @@ -22841,10 +20741,9 @@ var all366 = all_match({ ]), }); -var msg1121 = msg("00556:03", all366); +var msg1121 = msg("00556:03", all360); -var part1766 = // "Pattern{Constant('UF-MGR: Internal Error: '), Field(resultcode,false)}" -match("MESSAGE#1106:00556:04", "nwparser.payload", "UF-MGR: Internal Error: %{resultcode}", processor_chain([ +var part1760 = match("MESSAGE#1106:00556:04", "nwparser.payload", "UF-MGR: Internal Error: %{resultcode}", processor_chain([ dup19, dup2, dup3, @@ -22852,10 +20751,9 @@ match("MESSAGE#1106:00556:04", "nwparser.payload", "UF-MGR: Internal Error: %{re dup5, ])); -var msg1122 = msg("00556:04", part1766); +var msg1122 = msg("00556:04", part1760); -var part1767 = // "Pattern{Constant('UF-MGR: Cache size changed to '), Field(fld2,false), Constant('(K).')}" -match("MESSAGE#1107:00556:05", "nwparser.payload", "UF-MGR: Cache size changed to %{fld2}(K).", processor_chain([ +var part1761 = match("MESSAGE#1107:00556:05", "nwparser.payload", "UF-MGR: Cache size changed to %{fld2}(K).", processor_chain([ dup19, dup2, dup3, @@ -22863,10 +20761,9 @@ match("MESSAGE#1107:00556:05", "nwparser.payload", "UF-MGR: Cache size changed t dup5, ])); -var msg1123 = msg("00556:05", part1767); +var msg1123 = msg("00556:05", part1761); -var part1768 = // "Pattern{Constant('UF-MGR: Cache timeout changes to '), Field(fld2,true), Constant(' (hours).')}" -match("MESSAGE#1108:00556:06", "nwparser.payload", "UF-MGR: Cache timeout changes to %{fld2->} (hours).", processor_chain([ +var part1762 = match("MESSAGE#1108:00556:06", "nwparser.payload", "UF-MGR: Cache timeout changes to %{fld2->} (hours).", processor_chain([ dup19, dup2, dup3, @@ -22874,10 +20771,9 @@ match("MESSAGE#1108:00556:06", "nwparser.payload", "UF-MGR: Cache timeout change dup5, ])); -var msg1124 = msg("00556:06", part1768); +var msg1124 = msg("00556:06", part1762); -var part1769 = // "Pattern{Constant('UF-MGR: Category update interval changed to '), Field(fld2,true), Constant(' (weeks).')}" -match("MESSAGE#1109:00556:07", "nwparser.payload", "UF-MGR: Category update interval changed to %{fld2->} (weeks).", processor_chain([ +var part1763 = match("MESSAGE#1109:00556:07", "nwparser.payload", "UF-MGR: Category update interval changed to %{fld2->} (weeks).", processor_chain([ dup19, dup2, dup3, @@ -22885,15 +20781,14 @@ match("MESSAGE#1109:00556:07", "nwparser.payload", "UF-MGR: Category update inte dup5, ])); -var msg1125 = msg("00556:07", part1769); +var msg1125 = msg("00556:07", part1763); -var part1770 = // "Pattern{Constant('UF-MGR: Cache '), Field(p0,false)}" -match("MESSAGE#1110:00556:08/0", "nwparser.payload", "UF-MGR: Cache %{p0}"); +var part1764 = match("MESSAGE#1110:00556:08/0", "nwparser.payload", "UF-MGR: Cache %{p0}"); -var all367 = all_match({ +var all361 = all_match({ processors: [ - part1770, - dup360, + part1764, + dup358, dup116, ], on_success: processor_chain([ @@ -22905,33 +20800,30 @@ var all367 = all_match({ ]), }); -var msg1126 = msg("00556:08", all367); +var msg1126 = msg("00556:08", all361); -var part1771 = // "Pattern{Constant('UF-MGR: URL BLOCKED: ip_addr ('), Field(fld2,false), Constant(') -> ip_addr ('), Field(fld3,false), Constant('), '), Field(fld4,true), Constant(' action: '), Field(disposition,false), Constant(', category: '), Field(fld5,false), Constant(', reason '), Field(result,false)}" -match("MESSAGE#1111:00556:09", "nwparser.payload", "UF-MGR: URL BLOCKED: ip_addr (%{fld2}) -> ip_addr (%{fld3}), %{fld4->} action: %{disposition}, category: %{fld5}, reason %{result}", processor_chain([ - dup234, +var part1765 = match("MESSAGE#1111:00556:09", "nwparser.payload", "UF-MGR: URL BLOCKED: ip_addr (%{fld2}) -> ip_addr (%{fld3}), %{fld4->} action: %{disposition}, category: %{fld5}, reason %{result}", processor_chain([ + dup232, dup2, dup3, dup4, dup5, - dup284, + dup282, ])); -var msg1127 = msg("00556:09", part1771); +var msg1127 = msg("00556:09", part1765); -var part1772 = // "Pattern{Constant('UF-MGR: URL FILTER ERR: ip_addr ('), Field(fld2,false), Constant(') -> ip_addr ('), Field(fld3,false), Constant('), host: '), Field(fld5,true), Constant(' page: '), Field(fld4,true), Constant(' code: '), Field(resultcode,true), Constant(' reason: '), Field(result,false), Constant('.')}" -match("MESSAGE#1112:00556:10", "nwparser.payload", "UF-MGR: URL FILTER ERR: ip_addr (%{fld2}) -> ip_addr (%{fld3}), host: %{fld5->} page: %{fld4->} code: %{resultcode->} reason: %{result}.", processor_chain([ - dup234, +var part1766 = match("MESSAGE#1112:00556:10", "nwparser.payload", "UF-MGR: URL FILTER ERR: ip_addr (%{fld2}) -> ip_addr (%{fld3}), host: %{fld5->} page: %{fld4->} code: %{resultcode->} reason: %{result}.", processor_chain([ + dup232, dup2, dup3, dup4, dup5, ])); -var msg1128 = msg("00556:10", part1772); +var msg1128 = msg("00556:10", part1766); -var part1773 = // "Pattern{Constant('UF-MGR: Primary CPA server changed to '), Field(fld2,false)}" -match("MESSAGE#1113:00556:11", "nwparser.payload", "UF-MGR: Primary CPA server changed to %{fld2}", processor_chain([ +var part1767 = match("MESSAGE#1113:00556:11", "nwparser.payload", "UF-MGR: Primary CPA server changed to %{fld2}", processor_chain([ dup19, dup2, dup3, @@ -22939,24 +20831,22 @@ match("MESSAGE#1113:00556:11", "nwparser.payload", "UF-MGR: Primary CPA server c dup5, ])); -var msg1129 = msg("00556:11", part1773); +var msg1129 = msg("00556:11", part1767); -var part1774 = // "Pattern{Constant('UF-MGR: '), Field(fld2,true), Constant(' CPA server '), Field(p0,false)}" -match("MESSAGE#1114:00556:12/0", "nwparser.payload", "UF-MGR: %{fld2->} CPA server %{p0}"); +var part1768 = match("MESSAGE#1114:00556:12/0", "nwparser.payload", "UF-MGR: %{fld2->} CPA server %{p0}"); var select395 = linear_select([ dup140, - dup171, + dup169, ]); -var part1775 = // "Pattern{Constant('changed to '), Field(fld3,false), Constant('.')}" -match("MESSAGE#1114:00556:12/2", "nwparser.p0", "changed to %{fld3}."); +var part1769 = match("MESSAGE#1114:00556:12/2", "nwparser.p0", "changed to %{fld3}."); -var all368 = all_match({ +var all362 = all_match({ processors: [ - part1774, + part1768, select395, - part1775, + part1769, ], on_success: processor_chain([ dup19, @@ -22967,10 +20857,9 @@ var all368 = all_match({ ]), }); -var msg1130 = msg("00556:12", all368); +var msg1130 = msg("00556:12", all362); -var part1776 = // "Pattern{Constant('UF-MGR: SurfControl URL filtering '), Field(disposition,false), Constant('.')}" -match("MESSAGE#1115:00556:13", "nwparser.payload", "UF-MGR: SurfControl URL filtering %{disposition}.", processor_chain([ +var part1770 = match("MESSAGE#1115:00556:13", "nwparser.payload", "UF-MGR: SurfControl URL filtering %{disposition}.", processor_chain([ dup19, dup2, dup3, @@ -22978,19 +20867,17 @@ match("MESSAGE#1115:00556:13", "nwparser.payload", "UF-MGR: SurfControl URL filt dup5, ])); -var msg1131 = msg("00556:13", part1776); +var msg1131 = msg("00556:13", part1770); -var part1777 = // "Pattern{Constant('UF-MGR: The url '), Field(url,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#1116:00556:14/0", "nwparser.payload", "UF-MGR: The url %{url->} was %{p0}"); +var part1771 = match("MESSAGE#1116:00556:14/0", "nwparser.payload", "UF-MGR: The url %{url->} was %{p0}"); -var part1778 = // "Pattern{Constant('category '), Field(fld2,false), Constant('.')}" -match("MESSAGE#1116:00556:14/2", "nwparser.p0", "category %{fld2}."); +var part1772 = match("MESSAGE#1116:00556:14/2", "nwparser.p0", "category %{fld2}."); -var all369 = all_match({ +var all363 = all_match({ processors: [ - part1777, - dup409, - part1778, + part1771, + dup406, + part1772, ], on_success: processor_chain([ dup19, @@ -23001,19 +20888,17 @@ var all369 = all_match({ ]), }); -var msg1132 = msg("00556:14", all369); +var msg1132 = msg("00556:14", all363); -var part1779 = // "Pattern{Constant('UF-MGR: The category '), Field(fld2,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#1117:00556:15/0", "nwparser.payload", "UF-MGR: The category %{fld2->} was %{p0}"); +var part1773 = match("MESSAGE#1117:00556:15/0", "nwparser.payload", "UF-MGR: The category %{fld2->} was %{p0}"); -var part1780 = // "Pattern{Constant('profile '), Field(fld3,true), Constant(' with action '), Field(disposition,false), Constant('.')}" -match("MESSAGE#1117:00556:15/2", "nwparser.p0", "profile %{fld3->} with action %{disposition}."); +var part1774 = match("MESSAGE#1117:00556:15/2", "nwparser.p0", "profile %{fld3->} with action %{disposition}."); -var all370 = all_match({ +var all364 = all_match({ processors: [ - part1779, - dup409, - part1780, + part1773, + dup406, + part1774, ], on_success: processor_chain([ dup19, @@ -23021,39 +20906,35 @@ var all370 = all_match({ dup3, dup4, dup5, - dup284, + dup282, ]), }); -var msg1133 = msg("00556:15", all370); +var msg1133 = msg("00556:15", all364); -var part1781 = // "Pattern{Constant('UF-MGR: The '), Field(p0,false)}" -match("MESSAGE#1118:00556:16/0", "nwparser.payload", "UF-MGR: The %{p0}"); +var part1775 = match("MESSAGE#1118:00556:16/0", "nwparser.payload", "UF-MGR: The %{p0}"); -var part1782 = // "Pattern{Constant('profile '), Field(p0,false)}" -match("MESSAGE#1118:00556:16/1_0", "nwparser.p0", "profile %{p0}"); +var part1776 = match("MESSAGE#1118:00556:16/1_0", "nwparser.p0", "profile %{p0}"); -var part1783 = // "Pattern{Constant('category '), Field(p0,false)}" -match("MESSAGE#1118:00556:16/1_1", "nwparser.p0", "category %{p0}"); +var part1777 = match("MESSAGE#1118:00556:16/1_1", "nwparser.p0", "category %{p0}"); var select396 = linear_select([ - part1782, - part1783, + part1776, + part1777, ]); -var part1784 = // "Pattern{Constant(''), Field(fld2,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#1118:00556:16/2", "nwparser.p0", "%{fld2->} was %{p0}"); +var part1778 = match("MESSAGE#1118:00556:16/2", "nwparser.p0", "%{fld2->} was %{p0}"); var select397 = linear_select([ dup104, dup120, ]); -var all371 = all_match({ +var all365 = all_match({ processors: [ - part1781, + part1775, select396, - part1784, + part1778, select397, dup116, ], @@ -23066,30 +20947,26 @@ var all371 = all_match({ ]), }); -var msg1134 = msg("00556:16", all371); +var msg1134 = msg("00556:16", all365); -var part1785 = // "Pattern{Constant('UF-MGR: The category '), Field(fld2,true), Constant(' was set in profile '), Field(profile,true), Constant(' as the '), Field(p0,false)}" -match("MESSAGE#1119:00556:17/0", "nwparser.payload", "UF-MGR: The category %{fld2->} was set in profile %{profile->} as the %{p0}"); +var part1779 = match("MESSAGE#1119:00556:17/0", "nwparser.payload", "UF-MGR: The category %{fld2->} was set in profile %{profile->} as the %{p0}"); -var part1786 = // "Pattern{Constant('black '), Field(p0,false)}" -match("MESSAGE#1119:00556:17/1_0", "nwparser.p0", "black %{p0}"); +var part1780 = match("MESSAGE#1119:00556:17/1_0", "nwparser.p0", "black %{p0}"); -var part1787 = // "Pattern{Constant('white '), Field(p0,false)}" -match("MESSAGE#1119:00556:17/1_1", "nwparser.p0", "white %{p0}"); +var part1781 = match("MESSAGE#1119:00556:17/1_1", "nwparser.p0", "white %{p0}"); var select398 = linear_select([ - part1786, - part1787, + part1780, + part1781, ]); -var part1788 = // "Pattern{Constant('list.'), Field(,false)}" -match("MESSAGE#1119:00556:17/2", "nwparser.p0", "list.%{}"); +var part1782 = match("MESSAGE#1119:00556:17/2", "nwparser.p0", "list.%{}"); -var all372 = all_match({ +var all366 = all_match({ processors: [ - part1785, + part1779, select398, - part1788, + part1782, ], on_success: processor_chain([ dup19, @@ -23100,27 +20977,24 @@ var all372 = all_match({ ]), }); -var msg1135 = msg("00556:17", all372); +var msg1135 = msg("00556:17", all366); -var part1789 = // "Pattern{Constant('UF-MGR: The action for '), Field(fld2,true), Constant(' in profile '), Field(profile,true), Constant(' was '), Field(p0,false)}" -match("MESSAGE#1120:00556:18/0", "nwparser.payload", "UF-MGR: The action for %{fld2->} in profile %{profile->} was %{p0}"); +var part1783 = match("MESSAGE#1120:00556:18/0", "nwparser.payload", "UF-MGR: The action for %{fld2->} in profile %{profile->} was %{p0}"); -var part1790 = // "Pattern{Constant('changed '), Field(p0,false)}" -match("MESSAGE#1120:00556:18/1_1", "nwparser.p0", "changed %{p0}"); +var part1784 = match("MESSAGE#1120:00556:18/1_1", "nwparser.p0", "changed %{p0}"); var select399 = linear_select([ dup101, - part1790, + part1784, ]); -var part1791 = // "Pattern{Constant('to '), Field(fld3,false), Constant('.')}" -match("MESSAGE#1120:00556:18/2", "nwparser.p0", "to %{fld3}."); +var part1785 = match("MESSAGE#1120:00556:18/2", "nwparser.p0", "to %{fld3}."); -var all373 = all_match({ +var all367 = all_match({ processors: [ - part1789, + part1783, select399, - part1791, + part1785, ], on_success: processor_chain([ dup19, @@ -23131,29 +21005,26 @@ var all373 = all_match({ ]), }); -var msg1136 = msg("00556:18", all373); +var msg1136 = msg("00556:18", all367); -var part1792 = // "Pattern{Constant('UF-MGR: The category list from the CPA server '), Field(p0,false)}" -match("MESSAGE#1121:00556:20/0", "nwparser.payload", "UF-MGR: The category list from the CPA server %{p0}"); +var part1786 = match("MESSAGE#1121:00556:20/0", "nwparser.payload", "UF-MGR: The category list from the CPA server %{p0}"); -var part1793 = // "Pattern{Constant('updated on'), Field(p0,false)}" -match("MESSAGE#1121:00556:20/2", "nwparser.p0", "updated on%{p0}"); +var part1787 = match("MESSAGE#1121:00556:20/2", "nwparser.p0", "updated on%{p0}"); var select400 = linear_select([ dup103, dup96, ]); -var part1794 = // "Pattern{Constant('the device.'), Field(,false)}" -match("MESSAGE#1121:00556:20/4", "nwparser.p0", "the device.%{}"); +var part1788 = match("MESSAGE#1121:00556:20/4", "nwparser.p0", "the device.%{}"); -var all374 = all_match({ +var all368 = all_match({ processors: [ - part1792, - dup357, - part1793, + part1786, + dup355, + part1787, select400, - part1794, + part1788, ], on_success: processor_chain([ dup19, @@ -23164,24 +21035,22 @@ var all374 = all_match({ ]), }); -var msg1137 = msg("00556:20", all374); +var msg1137 = msg("00556:20", all368); -var part1795 = // "Pattern{Constant('UF-MGR: URL BLOCKED: '), Field(saddr,false), Constant('('), Field(sport,false), Constant(')->'), Field(daddr,false), Constant('('), Field(dport,false), Constant('), '), Field(fld2,true), Constant(' action: '), Field(disposition,false), Constant(', category: '), Field(category,false), Constant(', reason: '), Field(result,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1122:00556:21", "nwparser.payload", "UF-MGR: URL BLOCKED: %{saddr}(%{sport})->%{daddr}(%{dport}), %{fld2->} action: %{disposition}, category: %{category}, reason: %{result->} (%{fld1})", processor_chain([ - dup234, +var part1789 = match("MESSAGE#1122:00556:21", "nwparser.payload", "UF-MGR: URL BLOCKED: %{saddr}(%{sport})->%{daddr}(%{dport}), %{fld2->} action: %{disposition}, category: %{category}, reason: %{result->} (%{fld1})", processor_chain([ + dup232, dup2, dup3, dup9, dup4, dup5, - dup284, + dup282, ])); -var msg1138 = msg("00556:21", part1795); +var msg1138 = msg("00556:21", part1789); -var part1796 = // "Pattern{Constant('UF-MGR: URL BLOCKED: '), Field(saddr,false), Constant('('), Field(sport,false), Constant(')->'), Field(daddr,false), Constant('('), Field(dport,false), Constant('), '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1123:00556:22", "nwparser.payload", "UF-MGR: URL BLOCKED: %{saddr}(%{sport})->%{daddr}(%{dport}), %{fld2->} (%{fld1})", processor_chain([ - dup234, +var part1790 = match("MESSAGE#1123:00556:22", "nwparser.payload", "UF-MGR: URL BLOCKED: %{saddr}(%{sport})->%{daddr}(%{dport}), %{fld2->} (%{fld1})", processor_chain([ + dup232, dup2, dup3, dup9, @@ -23189,7 +21058,7 @@ match("MESSAGE#1123:00556:22", "nwparser.payload", "UF-MGR: URL BLOCKED: %{saddr dup5, ])); -var msg1139 = msg("00556:22", part1796); +var msg1139 = msg("00556:22", part1790); var select401 = linear_select([ msg1118, @@ -23216,8 +21085,7 @@ var select401 = linear_select([ msg1139, ]); -var part1797 = // "Pattern{Constant('PPP LCP on interface '), Field(interface,true), Constant(' is '), Field(fld2,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1124:00572", "nwparser.payload", "PPP LCP on interface %{interface->} is %{fld2}. (%{fld1})", processor_chain([ +var part1791 = match("MESSAGE#1124:00572", "nwparser.payload", "PPP LCP on interface %{interface->} is %{fld2}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -23226,10 +21094,9 @@ match("MESSAGE#1124:00572", "nwparser.payload", "PPP LCP on interface %{interfac dup5, ])); -var msg1140 = msg("00572", part1797); +var msg1140 = msg("00572", part1791); -var part1798 = // "Pattern{Constant('PPP authentication state on interface '), Field(interface,false), Constant(': '), Field(result,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1125:00572:01", "nwparser.payload", "PPP authentication state on interface %{interface}: %{result}. (%{fld1})", processor_chain([ +var part1792 = match("MESSAGE#1125:00572:01", "nwparser.payload", "PPP authentication state on interface %{interface}: %{result}. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -23238,10 +21105,9 @@ match("MESSAGE#1125:00572:01", "nwparser.payload", "PPP authentication state on dup5, ])); -var msg1141 = msg("00572:01", part1798); +var msg1141 = msg("00572:01", part1792); -var part1799 = // "Pattern{Constant('PPP on interface '), Field(interface,true), Constant(' is '), Field(disposition,true), Constant(' by receiving Terminate-Request. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1126:00572:03", "nwparser.payload", "PPP on interface %{interface->} is %{disposition->} by receiving Terminate-Request. (%{fld1})", processor_chain([ +var part1793 = match("MESSAGE#1126:00572:03", "nwparser.payload", "PPP on interface %{interface->} is %{disposition->} by receiving Terminate-Request. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -23250,7 +21116,7 @@ match("MESSAGE#1126:00572:03", "nwparser.payload", "PPP on interface %{interface dup5, ])); -var msg1142 = msg("00572:03", part1799); +var msg1142 = msg("00572:03", part1793); var select402 = linear_select([ msg1140, @@ -23258,8 +21124,7 @@ var select402 = linear_select([ msg1142, ]); -var part1800 = // "Pattern{Constant('PBR policy "'), Field(policyname,false), Constant('" rebuilding lookup tree for virtual router "'), Field(node,false), Constant('". ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1127:00615", "nwparser.payload", "PBR policy \"%{policyname}\" rebuilding lookup tree for virtual router \"%{node}\". (%{fld1})", processor_chain([ +var part1794 = match("MESSAGE#1127:00615", "nwparser.payload", "PBR policy \"%{policyname}\" rebuilding lookup tree for virtual router \"%{node}\". (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -23267,10 +21132,9 @@ match("MESSAGE#1127:00615", "nwparser.payload", "PBR policy \"%{policyname}\" re dup9, ])); -var msg1143 = msg("00615", part1800); +var msg1143 = msg("00615", part1794); -var part1801 = // "Pattern{Constant('PBR policy "'), Field(policyname,false), Constant('" lookup tree rebuilt successfully in virtual router "'), Field(node,false), Constant('". ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1128:00615:01", "nwparser.payload", "PBR policy \"%{policyname}\" lookup tree rebuilt successfully in virtual router \"%{node}\". (%{fld1})", processor_chain([ +var part1795 = match("MESSAGE#1128:00615:01", "nwparser.payload", "PBR policy \"%{policyname}\" lookup tree rebuilt successfully in virtual router \"%{node}\". (%{fld1})", processor_chain([ dup44, dup2, dup4, @@ -23278,15 +21142,14 @@ match("MESSAGE#1128:00615:01", "nwparser.payload", "PBR policy \"%{policyname}\" dup9, ])); -var msg1144 = msg("00615:01", part1801); +var msg1144 = msg("00615:01", part1795); var select403 = linear_select([ msg1143, msg1144, ]); -var part1802 = // "Pattern{Field(signame,true), Constant(' attack! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,false), Constant(', through policy '), Field(policyname,false), Constant('. Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1129:00601", "nwparser.payload", "%{signame->} attack! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol}, through policy %{policyname}. Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1796 = match("MESSAGE#1129:00601", "nwparser.payload", "%{signame->} attack! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol}, through policy %{policyname}. Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup59, @@ -23297,10 +21160,9 @@ match("MESSAGE#1129:00601", "nwparser.payload", "%{signame->} attack! From %{sad dup61, ])); -var msg1145 = msg("00601", part1802); +var msg1145 = msg("00601", part1796); -var part1803 = // "Pattern{Field(signame,true), Constant(' has been detected from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' through policy '), Field(policyname,true), Constant(' '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1130:00601:01", "nwparser.payload", "%{signame->} has been detected from %{saddr}/%{sport->} to %{daddr}/%{dport->} through policy %{policyname->} %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part1797 = match("MESSAGE#1130:00601:01", "nwparser.payload", "%{signame->} has been detected from %{saddr}/%{sport->} to %{daddr}/%{dport->} through policy %{policyname->} %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup2, dup59, @@ -23311,10 +21173,9 @@ match("MESSAGE#1130:00601:01", "nwparser.payload", "%{signame->} has been detect dup61, ])); -var msg1146 = msg("00601:01", part1803); +var msg1146 = msg("00601:01", part1797); -var part1804 = // "Pattern{Constant('Error in initializing multicast.'), Field(,false)}" -match("MESSAGE#1131:00601:18", "nwparser.payload", "Error in initializing multicast.%{}", processor_chain([ +var part1798 = match("MESSAGE#1131:00601:18", "nwparser.payload", "Error in initializing multicast.%{}", processor_chain([ dup19, dup2, dup3, @@ -23322,7 +21183,7 @@ match("MESSAGE#1131:00601:18", "nwparser.payload", "Error in initializing multic dup5, ])); -var msg1147 = msg("00601:18", part1804); +var msg1147 = msg("00601:18", part1798); var select404 = linear_select([ msg1145, @@ -23330,8 +21191,7 @@ var select404 = linear_select([ msg1147, ]); -var part1805 = // "Pattern{Constant('PIMSM Error in initializing interface state change'), Field(,false)}" -match("MESSAGE#1132:00602", "nwparser.payload", "PIMSM Error in initializing interface state change%{}", processor_chain([ +var part1799 = match("MESSAGE#1132:00602", "nwparser.payload", "PIMSM Error in initializing interface state change%{}", processor_chain([ dup19, dup2, dup3, @@ -23339,48 +21199,41 @@ match("MESSAGE#1132:00602", "nwparser.payload", "PIMSM Error in initializing int dup5, ])); -var msg1148 = msg("00602", part1805); +var msg1148 = msg("00602", part1799); -var part1806 = // "Pattern{Constant('Switch event: the status of ethernet port '), Field(fld2,true), Constant(' changed to link '), Field(p0,false)}" -match("MESSAGE#1133:00612/0", "nwparser.payload", "Switch event: the status of ethernet port %{fld2->} changed to link %{p0}"); +var part1800 = match("MESSAGE#1133:00612/0", "nwparser.payload", "Switch event: the status of ethernet port %{fld2->} changed to link %{p0}"); -var part1807 = // "Pattern{Constant(', duplex '), Field(p0,false)}" -match("MESSAGE#1133:00612/2", "nwparser.p0", ", duplex %{p0}"); +var part1801 = match("MESSAGE#1133:00612/2", "nwparser.p0", ", duplex %{p0}"); -var part1808 = // "Pattern{Constant('full '), Field(p0,false)}" -match("MESSAGE#1133:00612/3_0", "nwparser.p0", "full %{p0}"); +var part1802 = match("MESSAGE#1133:00612/3_0", "nwparser.p0", "full %{p0}"); -var part1809 = // "Pattern{Constant('half '), Field(p0,false)}" -match("MESSAGE#1133:00612/3_1", "nwparser.p0", "half %{p0}"); +var part1803 = match("MESSAGE#1133:00612/3_1", "nwparser.p0", "half %{p0}"); var select405 = linear_select([ - part1808, - part1809, + part1802, + part1803, ]); -var part1810 = // "Pattern{Constant(', speed 10'), Field(p0,false)}" -match("MESSAGE#1133:00612/4", "nwparser.p0", ", speed 10%{p0}"); +var part1804 = match("MESSAGE#1133:00612/4", "nwparser.p0", ", speed 10%{p0}"); -var part1811 = // "Pattern{Constant('0 '), Field(p0,false)}" -match("MESSAGE#1133:00612/5_0", "nwparser.p0", "0 %{p0}"); +var part1805 = match("MESSAGE#1133:00612/5_0", "nwparser.p0", "0 %{p0}"); var select406 = linear_select([ - part1811, + part1805, dup96, ]); -var part1812 = // "Pattern{Constant('M. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1133:00612/6", "nwparser.p0", "M. (%{fld1})"); +var part1806 = match("MESSAGE#1133:00612/6", "nwparser.p0", "M. (%{fld1})"); -var all375 = all_match({ +var all369 = all_match({ processors: [ - part1806, - dup355, - part1807, + part1800, + dup353, + part1801, select405, - part1810, + part1804, select406, - part1812, + part1806, ], on_success: processor_chain([ dup1, @@ -23392,11 +21245,10 @@ var all375 = all_match({ ]), }); -var msg1149 = msg("00612", all375); +var msg1149 = msg("00612", all369); -var part1813 = // "Pattern{Constant('RTSYNC: Event posted to send all the DRP routes to backup device. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1134:00620", "nwparser.payload", "RTSYNC: Event posted to send all the DRP routes to backup device. (%{fld1})", processor_chain([ - dup274, +var part1807 = match("MESSAGE#1134:00620", "nwparser.payload", "RTSYNC: Event posted to send all the DRP routes to backup device. (%{fld1})", processor_chain([ + dup272, dup2, dup3, dup9, @@ -23404,33 +21256,29 @@ match("MESSAGE#1134:00620", "nwparser.payload", "RTSYNC: Event posted to send al dup5, ])); -var msg1150 = msg("00620", part1813); +var msg1150 = msg("00620", part1807); -var part1814 = // "Pattern{Constant('RTSYNC: '), Field(p0,false)}" -match("MESSAGE#1135:00620:01/0", "nwparser.payload", "RTSYNC: %{p0}"); +var part1808 = match("MESSAGE#1135:00620:01/0", "nwparser.payload", "RTSYNC: %{p0}"); -var part1815 = // "Pattern{Constant('Serviced'), Field(p0,false)}" -match("MESSAGE#1135:00620:01/1_0", "nwparser.p0", "Serviced%{p0}"); +var part1809 = match("MESSAGE#1135:00620:01/1_0", "nwparser.p0", "Serviced%{p0}"); -var part1816 = // "Pattern{Constant('Recieved'), Field(p0,false)}" -match("MESSAGE#1135:00620:01/1_1", "nwparser.p0", "Recieved%{p0}"); +var part1810 = match("MESSAGE#1135:00620:01/1_1", "nwparser.p0", "Recieved%{p0}"); var select407 = linear_select([ - part1815, - part1816, + part1809, + part1810, ]); -var part1817 = // "Pattern{Field(,false), Constant('coldstart request for route synchronization from NSRP peer. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1135:00620:01/2", "nwparser.p0", "%{}coldstart request for route synchronization from NSRP peer. (%{fld1})"); +var part1811 = match("MESSAGE#1135:00620:01/2", "nwparser.p0", "%{}coldstart request for route synchronization from NSRP peer. (%{fld1})"); -var all376 = all_match({ +var all370 = all_match({ processors: [ - part1814, + part1808, select407, - part1817, + part1811, ], on_success: processor_chain([ - dup274, + dup272, dup2, dup3, dup9, @@ -23439,11 +21287,10 @@ var all376 = all_match({ ]), }); -var msg1151 = msg("00620:01", all376); +var msg1151 = msg("00620:01", all370); -var part1818 = // "Pattern{Constant('RTSYNC: Started timer to purge all the DRP backup routes - '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1136:00620:02", "nwparser.payload", "RTSYNC: Started timer to purge all the DRP backup routes - %{fld2->} (%{fld1})", processor_chain([ - dup274, +var part1812 = match("MESSAGE#1136:00620:02", "nwparser.payload", "RTSYNC: Started timer to purge all the DRP backup routes - %{fld2->} (%{fld1})", processor_chain([ + dup272, dup2, dup3, dup9, @@ -23451,11 +21298,10 @@ match("MESSAGE#1136:00620:02", "nwparser.payload", "RTSYNC: Started timer to pur dup5, ])); -var msg1152 = msg("00620:02", part1818); +var msg1152 = msg("00620:02", part1812); -var part1819 = // "Pattern{Constant('RTSYNC: Event posted to purge backup routes in all vrouters. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1137:00620:03", "nwparser.payload", "RTSYNC: Event posted to purge backup routes in all vrouters. (%{fld1})", processor_chain([ - dup274, +var part1813 = match("MESSAGE#1137:00620:03", "nwparser.payload", "RTSYNC: Event posted to purge backup routes in all vrouters. (%{fld1})", processor_chain([ + dup272, dup2, dup3, dup9, @@ -23463,11 +21309,10 @@ match("MESSAGE#1137:00620:03", "nwparser.payload", "RTSYNC: Event posted to purg dup5, ])); -var msg1153 = msg("00620:03", part1819); +var msg1153 = msg("00620:03", part1813); -var part1820 = // "Pattern{Constant('RTSYNC: Timer to purge the DRP backup routes is stopped. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1138:00620:04", "nwparser.payload", "RTSYNC: Timer to purge the DRP backup routes is stopped. (%{fld1})", processor_chain([ - dup274, +var part1814 = match("MESSAGE#1138:00620:04", "nwparser.payload", "RTSYNC: Timer to purge the DRP backup routes is stopped. (%{fld1})", processor_chain([ + dup272, dup2, dup3, dup9, @@ -23475,7 +21320,7 @@ match("MESSAGE#1138:00620:04", "nwparser.payload", "RTSYNC: Timer to purge the D dup5, ])); -var msg1154 = msg("00620:04", part1820); +var msg1154 = msg("00620:04", part1814); var select408 = linear_select([ msg1150, @@ -23485,9 +21330,8 @@ var select408 = linear_select([ msg1154, ]); -var part1821 = // "Pattern{Constant('NHRP : NHRP instance in virtual router '), Field(node,true), Constant(' is created. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1139:00622", "nwparser.payload", "NHRP : NHRP instance in virtual router %{node->} is created. (%{fld1})", processor_chain([ - dup275, +var part1815 = match("MESSAGE#1139:00622", "nwparser.payload", "NHRP : NHRP instance in virtual router %{node->} is created. (%{fld1})", processor_chain([ + dup273, dup2, dup3, dup9, @@ -23495,30 +21339,27 @@ match("MESSAGE#1139:00622", "nwparser.payload", "NHRP : NHRP instance in virtual dup5, ])); -var msg1155 = msg("00622", part1821); +var msg1155 = msg("00622", part1815); -var part1822 = // "Pattern{Constant('Session (id '), Field(sessionid,true), Constant(' src-ip '), Field(saddr,true), Constant(' dst-ip '), Field(daddr,true), Constant(' dst port '), Field(dport,false), Constant(') route is '), Field(p0,false)}" -match("MESSAGE#1140:00625/0", "nwparser.payload", "Session (id %{sessionid->} src-ip %{saddr->} dst-ip %{daddr->} dst port %{dport}) route is %{p0}"); +var part1816 = match("MESSAGE#1140:00625/0", "nwparser.payload", "Session (id %{sessionid->} src-ip %{saddr->} dst-ip %{daddr->} dst port %{dport}) route is %{p0}"); -var part1823 = // "Pattern{Constant('invalid'), Field(p0,false)}" -match("MESSAGE#1140:00625/1_0", "nwparser.p0", "invalid%{p0}"); +var part1817 = match("MESSAGE#1140:00625/1_0", "nwparser.p0", "invalid%{p0}"); -var part1824 = // "Pattern{Constant('valid'), Field(p0,false)}" -match("MESSAGE#1140:00625/1_1", "nwparser.p0", "valid%{p0}"); +var part1818 = match("MESSAGE#1140:00625/1_1", "nwparser.p0", "valid%{p0}"); var select409 = linear_select([ - part1823, - part1824, + part1817, + part1818, ]); -var all377 = all_match({ +var all371 = all_match({ processors: [ - part1822, + part1816, select409, dup49, ], on_success: processor_chain([ - dup275, + dup273, dup2, dup4, dup5, @@ -23526,37 +21367,32 @@ var all377 = all_match({ ]), }); -var msg1156 = msg("00625", all377); +var msg1156 = msg("00625", all371); -var part1825 = // "Pattern{Constant('audit log queue '), Field(p0,false)}" -match("MESSAGE#1141:00628/0", "nwparser.payload", "audit log queue %{p0}"); +var part1819 = match("MESSAGE#1141:00628/0", "nwparser.payload", "audit log queue %{p0}"); -var part1826 = // "Pattern{Constant('Traffic Log '), Field(p0,false)}" -match("MESSAGE#1141:00628/1_0", "nwparser.p0", "Traffic Log %{p0}"); +var part1820 = match("MESSAGE#1141:00628/1_0", "nwparser.p0", "Traffic Log %{p0}"); -var part1827 = // "Pattern{Constant('Event Alarm Log '), Field(p0,false)}" -match("MESSAGE#1141:00628/1_1", "nwparser.p0", "Event Alarm Log %{p0}"); +var part1821 = match("MESSAGE#1141:00628/1_1", "nwparser.p0", "Event Alarm Log %{p0}"); -var part1828 = // "Pattern{Constant('Event Log '), Field(p0,false)}" -match("MESSAGE#1141:00628/1_2", "nwparser.p0", "Event Log %{p0}"); +var part1822 = match("MESSAGE#1141:00628/1_2", "nwparser.p0", "Event Log %{p0}"); var select410 = linear_select([ - part1826, - part1827, - part1828, + part1820, + part1821, + part1822, ]); -var part1829 = // "Pattern{Constant('is overwritten ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1141:00628/2", "nwparser.p0", "is overwritten (%{fld1})"); +var part1823 = match("MESSAGE#1141:00628/2", "nwparser.p0", "is overwritten (%{fld1})"); -var all378 = all_match({ +var all372 = all_match({ processors: [ - part1825, + part1819, select410, - part1829, + part1823, ], on_success: processor_chain([ - dup225, + dup223, dup2, dup4, dup5, @@ -23564,22 +21400,20 @@ var all378 = all_match({ ]), }); -var msg1157 = msg("00628", all378); +var msg1157 = msg("00628", all372); -var part1830 = // "Pattern{Constant('Log setting was modified to '), Field(disposition,true), Constant(' '), Field(fld2,true), Constant(' level by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1142:00767:50", "nwparser.payload", "Log setting was modified to %{disposition->} %{fld2->} level by admin %{administrator->} (%{fld1})", processor_chain([ +var part1824 = match("MESSAGE#1142:00767:50", "nwparser.payload", "Log setting was modified to %{disposition->} %{fld2->} level by admin %{administrator->} (%{fld1})", processor_chain([ dup1, dup2, dup4, dup5, dup9, - dup284, + dup282, ])); -var msg1158 = msg("00767:50", part1830); +var msg1158 = msg("00767:50", part1824); -var part1831 = // "Pattern{Constant('Attack CS:Man in Middle is created by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1143:00767:51", "nwparser.payload", "Attack CS:Man in Middle is created by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by admin %{administrator->} (%{fld1})", processor_chain([ +var part1825 = match("MESSAGE#1143:00767:51", "nwparser.payload", "Attack CS:Man in Middle is created by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by admin %{administrator->} (%{fld1})", processor_chain([ dup58, dup2, dup4, @@ -23587,10 +21421,9 @@ match("MESSAGE#1143:00767:51", "nwparser.payload", "Attack CS:Man in Middle is c dup9, ])); -var msg1159 = msg("00767:51", part1831); +var msg1159 = msg("00767:51", part1825); -var part1832 = // "Pattern{Constant('Attack group '), Field(group,true), Constant(' is created by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1144:00767:52", "nwparser.payload", "Attack group %{group->} is created by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by admin %{administrator->} (%{fld1})", processor_chain([ +var part1826 = match("MESSAGE#1144:00767:52", "nwparser.payload", "Attack group %{group->} is created by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by admin %{administrator->} (%{fld1})", processor_chain([ dup58, dup2, dup4, @@ -23598,10 +21431,9 @@ match("MESSAGE#1144:00767:52", "nwparser.payload", "Attack group %{group->} is c dup9, ])); -var msg1160 = msg("00767:52", part1832); +var msg1160 = msg("00767:52", part1826); -var part1833 = // "Pattern{Constant('Attack CS:Man in Middle is added to attack group '), Field(group,true), Constant(' by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1145:00767:53", "nwparser.payload", "Attack CS:Man in Middle is added to attack group %{group->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by admin %{administrator->} (%{fld1})", processor_chain([ +var part1827 = match("MESSAGE#1145:00767:53", "nwparser.payload", "Attack CS:Man in Middle is added to attack group %{group->} by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by admin %{administrator->} (%{fld1})", processor_chain([ dup58, dup2, dup4, @@ -23609,10 +21441,9 @@ match("MESSAGE#1145:00767:53", "nwparser.payload", "Attack CS:Man in Middle is a dup9, ])); -var msg1161 = msg("00767:53", part1833); +var msg1161 = msg("00767:53", part1827); -var part1834 = // "Pattern{Constant('Cannot contact the SecurID server'), Field(,false)}" -match("MESSAGE#1146:00767", "nwparser.payload", "Cannot contact the SecurID server%{}", processor_chain([ +var part1828 = match("MESSAGE#1146:00767", "nwparser.payload", "Cannot contact the SecurID server%{}", processor_chain([ dup27, setc("ec_theme","Communication"), dup39, @@ -23622,25 +21453,22 @@ match("MESSAGE#1146:00767", "nwparser.payload", "Cannot contact the SecurID serv dup5, ])); -var msg1162 = msg("00767", part1834); +var msg1162 = msg("00767", part1828); -var part1835 = // "Pattern{Constant('System auto-config of file '), Field(fld2,true), Constant(' from TFTP server '), Field(hostip,true), Constant(' has '), Field(p0,false)}" -match("MESSAGE#1147:00767:01/0", "nwparser.payload", "System auto-config of file %{fld2->} from TFTP server %{hostip->} has %{p0}"); +var part1829 = match("MESSAGE#1147:00767:01/0", "nwparser.payload", "System auto-config of file %{fld2->} from TFTP server %{hostip->} has %{p0}"); -var part1836 = // "Pattern{Constant('been loaded successfully'), Field(,false)}" -match("MESSAGE#1147:00767:01/1_0", "nwparser.p0", "been loaded successfully%{}"); +var part1830 = match("MESSAGE#1147:00767:01/1_0", "nwparser.p0", "been loaded successfully%{}"); -var part1837 = // "Pattern{Constant('failed'), Field(,false)}" -match("MESSAGE#1147:00767:01/1_1", "nwparser.p0", "failed%{}"); +var part1831 = match("MESSAGE#1147:00767:01/1_1", "nwparser.p0", "failed%{}"); var select411 = linear_select([ - part1836, - part1837, + part1830, + part1831, ]); -var all379 = all_match({ +var all373 = all_match({ processors: [ - part1835, + part1829, select411, ], on_success: processor_chain([ @@ -23652,10 +21480,9 @@ var all379 = all_match({ ]), }); -var msg1163 = msg("00767:01", all379); +var msg1163 = msg("00767:01", all373); -var part1838 = // "Pattern{Constant('netscreen: System Config saved from host '), Field(saddr,false)}" -match("MESSAGE#1148:00767:02", "nwparser.payload", "netscreen: System Config saved from host %{saddr}", processor_chain([ +var part1832 = match("MESSAGE#1148:00767:02", "nwparser.payload", "netscreen: System Config saved from host %{saddr}", processor_chain([ setc("eventcategory","1702000000"), dup2, dup3, @@ -23663,10 +21490,9 @@ match("MESSAGE#1148:00767:02", "nwparser.payload", "netscreen: System Config sav dup5, ])); -var msg1164 = msg("00767:02", part1838); +var msg1164 = msg("00767:02", part1832); -var part1839 = // "Pattern{Constant('System Config saved to filename '), Field(filename,false)}" -match("MESSAGE#1149:00767:03", "nwparser.payload", "System Config saved to filename %{filename}", processor_chain([ +var part1833 = match("MESSAGE#1149:00767:03", "nwparser.payload", "System Config saved to filename %{filename}", processor_chain([ dup1, dup2, dup3, @@ -23674,10 +21500,9 @@ match("MESSAGE#1149:00767:03", "nwparser.payload", "System Config saved to filen dup5, ])); -var msg1165 = msg("00767:03", part1839); +var msg1165 = msg("00767:03", part1833); -var part1840 = // "Pattern{Constant('System is operational.'), Field(,false)}" -match("MESSAGE#1150:00767:04", "nwparser.payload", "System is operational.%{}", processor_chain([ +var part1834 = match("MESSAGE#1150:00767:04", "nwparser.payload", "System is operational.%{}", processor_chain([ dup44, dup2, dup3, @@ -23685,10 +21510,9 @@ match("MESSAGE#1150:00767:04", "nwparser.payload", "System is operational.%{}", dup5, ])); -var msg1166 = msg("00767:04", part1840); +var msg1166 = msg("00767:04", part1834); -var part1841 = // "Pattern{Constant('The device cannot contact the SecurID server'), Field(,false)}" -match("MESSAGE#1151:00767:05", "nwparser.payload", "The device cannot contact the SecurID server%{}", processor_chain([ +var part1835 = match("MESSAGE#1151:00767:05", "nwparser.payload", "The device cannot contact the SecurID server%{}", processor_chain([ dup27, dup2, dup3, @@ -23696,10 +21520,9 @@ match("MESSAGE#1151:00767:05", "nwparser.payload", "The device cannot contact th dup5, ])); -var msg1167 = msg("00767:05", part1841); +var msg1167 = msg("00767:05", part1835); -var part1842 = // "Pattern{Constant('The device cannot send data to the SecurID server'), Field(,false)}" -match("MESSAGE#1152:00767:06", "nwparser.payload", "The device cannot send data to the SecurID server%{}", processor_chain([ +var part1836 = match("MESSAGE#1152:00767:06", "nwparser.payload", "The device cannot send data to the SecurID server%{}", processor_chain([ dup27, dup2, dup3, @@ -23707,10 +21530,9 @@ match("MESSAGE#1152:00767:06", "nwparser.payload", "The device cannot send data dup5, ])); -var msg1168 = msg("00767:06", part1842); +var msg1168 = msg("00767:06", part1836); -var part1843 = // "Pattern{Constant('The system configuration was saved from peer unit by admin'), Field(,false)}" -match("MESSAGE#1153:00767:07", "nwparser.payload", "The system configuration was saved from peer unit by admin%{}", processor_chain([ +var part1837 = match("MESSAGE#1153:00767:07", "nwparser.payload", "The system configuration was saved from peer unit by admin%{}", processor_chain([ dup1, dup2, dup3, @@ -23718,15 +21540,14 @@ match("MESSAGE#1153:00767:07", "nwparser.payload", "The system configuration was dup5, ])); -var msg1169 = msg("00767:07", part1843); +var msg1169 = msg("00767:07", part1837); -var part1844 = // "Pattern{Constant('The system configuration was saved by admin '), Field(p0,false)}" -match("MESSAGE#1154:00767:08/0", "nwparser.payload", "The system configuration was saved by admin %{p0}"); +var part1838 = match("MESSAGE#1154:00767:08/0", "nwparser.payload", "The system configuration was saved by admin %{p0}"); -var all380 = all_match({ +var all374 = all_match({ processors: [ - part1844, - dup400, + part1838, + dup397, ], on_success: processor_chain([ dup1, @@ -23738,25 +21559,22 @@ var all380 = all_match({ ]), }); -var msg1170 = msg("00767:08", all380); +var msg1170 = msg("00767:08", all374); -var part1845 = // "Pattern{Constant('traffic shaping is turned O'), Field(p0,false)}" -match("MESSAGE#1155:00767:09/0", "nwparser.payload", "traffic shaping is turned O%{p0}"); +var part1839 = match("MESSAGE#1155:00767:09/0", "nwparser.payload", "traffic shaping is turned O%{p0}"); -var part1846 = // "Pattern{Constant('N'), Field(,false)}" -match("MESSAGE#1155:00767:09/1_0", "nwparser.p0", "N%{}"); +var part1840 = match("MESSAGE#1155:00767:09/1_0", "nwparser.p0", "N%{}"); -var part1847 = // "Pattern{Constant('FF'), Field(,false)}" -match("MESSAGE#1155:00767:09/1_1", "nwparser.p0", "FF%{}"); +var part1841 = match("MESSAGE#1155:00767:09/1_1", "nwparser.p0", "FF%{}"); var select412 = linear_select([ - part1846, - part1847, + part1840, + part1841, ]); -var all381 = all_match({ +var all375 = all_match({ processors: [ - part1845, + part1839, select412, ], on_success: processor_chain([ @@ -23768,15 +21586,14 @@ var all381 = all_match({ ]), }); -var msg1171 = msg("00767:09", all381); +var msg1171 = msg("00767:09", all375); -var part1848 = // "Pattern{Constant('The system configuration was saved from host '), Field(saddr,true), Constant(' by admin '), Field(p0,false)}" -match("MESSAGE#1156:00767:10/0", "nwparser.payload", "The system configuration was saved from host %{saddr->} by admin %{p0}"); +var part1842 = match("MESSAGE#1156:00767:10/0", "nwparser.payload", "The system configuration was saved from host %{saddr->} by admin %{p0}"); -var all382 = all_match({ +var all376 = all_match({ processors: [ - part1848, - dup400, + part1842, + dup397, ], on_success: processor_chain([ dup1, @@ -23788,40 +21605,35 @@ var all382 = all_match({ ]), }); -var msg1172 = msg("00767:10", all382); +var msg1172 = msg("00767:10", all376); -var part1849 = // "Pattern{Constant('Fatal error. The NetScreen device was unable to upgrade the '), Field(p0,false)}" -match("MESSAGE#1157:00767:11/0", "nwparser.payload", "Fatal error. The NetScreen device was unable to upgrade the %{p0}"); +var part1843 = match("MESSAGE#1157:00767:11/0", "nwparser.payload", "Fatal error. The NetScreen device was unable to upgrade the %{p0}"); -var part1850 = // "Pattern{Constant('file system '), Field(p0,false)}" -match("MESSAGE#1157:00767:11/1_1", "nwparser.p0", "file system %{p0}"); +var part1844 = match("MESSAGE#1157:00767:11/1_1", "nwparser.p0", "file system %{p0}"); var select413 = linear_select([ - dup333, - part1850, + dup331, + part1844, ]); -var part1851 = // "Pattern{Constant(', and the '), Field(p0,false)}" -match("MESSAGE#1157:00767:11/2", "nwparser.p0", ", and the %{p0}"); +var part1845 = match("MESSAGE#1157:00767:11/2", "nwparser.p0", ", and the %{p0}"); -var part1852 = // "Pattern{Constant('old file system '), Field(p0,false)}" -match("MESSAGE#1157:00767:11/3_1", "nwparser.p0", "old file system %{p0}"); +var part1846 = match("MESSAGE#1157:00767:11/3_1", "nwparser.p0", "old file system %{p0}"); var select414 = linear_select([ - dup333, - part1852, + dup331, + part1846, ]); -var part1853 = // "Pattern{Constant('is damaged.'), Field(,false)}" -match("MESSAGE#1157:00767:11/4", "nwparser.p0", "is damaged.%{}"); +var part1847 = match("MESSAGE#1157:00767:11/4", "nwparser.p0", "is damaged.%{}"); -var all383 = all_match({ +var all377 = all_match({ processors: [ - part1849, + part1843, select413, - part1851, + part1845, select414, - part1853, + part1847, ], on_success: processor_chain([ dup18, @@ -23832,10 +21644,9 @@ var all383 = all_match({ ]), }); -var msg1173 = msg("00767:11", all383); +var msg1173 = msg("00767:11", all377); -var part1854 = // "Pattern{Constant('System configuration saved by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' by '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1158:00767:12", "nwparser.payload", "System configuration saved by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by %{fld2->} (%{fld1})", processor_chain([ +var part1848 = match("MESSAGE#1158:00767:12", "nwparser.payload", "System configuration saved by %{username->} via %{logon_type->} from host %{saddr->} to %{daddr}:%{dport->} by %{fld2->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -23844,15 +21655,14 @@ match("MESSAGE#1158:00767:12", "nwparser.payload", "System configuration saved b dup5, ])); -var msg1174 = msg("00767:12", part1854); +var msg1174 = msg("00767:12", part1848); -var part1855 = // "Pattern{Field(fld2,false), Constant('Environment variable '), Field(fld3,true), Constant(' is changed to '), Field(fld4,true), Constant(' by admin '), Field(p0,false)}" -match("MESSAGE#1159:00767:13/0", "nwparser.payload", "%{fld2}Environment variable %{fld3->} is changed to %{fld4->} by admin %{p0}"); +var part1849 = match("MESSAGE#1159:00767:13/0", "nwparser.payload", "%{fld2}Environment variable %{fld3->} is changed to %{fld4->} by admin %{p0}"); -var all384 = all_match({ +var all378 = all_match({ processors: [ - part1855, - dup400, + part1849, + dup397, ], on_success: processor_chain([ dup1, @@ -23864,38 +21674,33 @@ var all384 = all_match({ ]), }); -var msg1175 = msg("00767:13", all384); +var msg1175 = msg("00767:13", all378); -var part1856 = // "Pattern{Constant('System was '), Field(p0,false)}" -match("MESSAGE#1160:00767:14/0", "nwparser.payload", "System was %{p0}"); +var part1850 = match("MESSAGE#1160:00767:14/0", "nwparser.payload", "System was %{p0}"); -var part1857 = // "Pattern{Constant('reset '), Field(p0,false)}" -match("MESSAGE#1160:00767:14/1_0", "nwparser.p0", "reset %{p0}"); +var part1851 = match("MESSAGE#1160:00767:14/1_0", "nwparser.p0", "reset %{p0}"); var select415 = linear_select([ - part1857, - dup264, + part1851, + dup262, ]); -var part1858 = // "Pattern{Constant('at '), Field(fld2,true), Constant(' by '), Field(p0,false)}" -match("MESSAGE#1160:00767:14/2", "nwparser.p0", "at %{fld2->} by %{p0}"); +var part1852 = match("MESSAGE#1160:00767:14/2", "nwparser.p0", "at %{fld2->} by %{p0}"); -var part1859 = // "Pattern{Constant('admin '), Field(administrator,false)}" -match("MESSAGE#1160:00767:14/3_0", "nwparser.p0", "admin %{administrator}"); +var part1853 = match("MESSAGE#1160:00767:14/3_0", "nwparser.p0", "admin %{administrator}"); -var part1860 = // "Pattern{Field(username,false)}" -match_copy("MESSAGE#1160:00767:14/3_1", "nwparser.p0", "username"); +var part1854 = match_copy("MESSAGE#1160:00767:14/3_1", "nwparser.p0", "username"); var select416 = linear_select([ - part1859, - part1860, + part1853, + part1854, ]); -var all385 = all_match({ +var all379 = all_match({ processors: [ - part1856, + part1850, select415, - part1858, + part1852, select416, ], on_success: processor_chain([ @@ -23907,39 +21712,34 @@ var all385 = all_match({ ]), }); -var msg1176 = msg("00767:14", all385); +var msg1176 = msg("00767:14", all379); -var part1861 = // "Pattern{Constant('System '), Field(p0,false)}" -match("MESSAGE#1161:00767:15/1_0", "nwparser.p0", "System %{p0}"); +var part1855 = match("MESSAGE#1161:00767:15/1_0", "nwparser.p0", "System %{p0}"); -var part1862 = // "Pattern{Constant('Event '), Field(p0,false)}" -match("MESSAGE#1161:00767:15/1_1", "nwparser.p0", "Event %{p0}"); +var part1856 = match("MESSAGE#1161:00767:15/1_1", "nwparser.p0", "Event %{p0}"); -var part1863 = // "Pattern{Constant('Traffic '), Field(p0,false)}" -match("MESSAGE#1161:00767:15/1_2", "nwparser.p0", "Traffic %{p0}"); +var part1857 = match("MESSAGE#1161:00767:15/1_2", "nwparser.p0", "Traffic %{p0}"); var select417 = linear_select([ - part1861, - part1862, - part1863, + part1855, + part1856, + part1857, ]); -var part1864 = // "Pattern{Constant('log was reviewed by '), Field(p0,false)}" -match("MESSAGE#1161:00767:15/2", "nwparser.p0", "log was reviewed by %{p0}"); +var part1858 = match("MESSAGE#1161:00767:15/2", "nwparser.p0", "log was reviewed by %{p0}"); -var part1865 = // "Pattern{Field(,true), Constant(' '), Field(username,false), Constant('.')}" -match("MESSAGE#1161:00767:15/4", "nwparser.p0", "%{} %{username}."); +var part1859 = match("MESSAGE#1161:00767:15/4", "nwparser.p0", "%{} %{username}."); -var all386 = all_match({ +var all380 = all_match({ processors: [ - dup185, + dup183, select417, - part1864, - dup338, - part1865, + part1858, + dup336, + part1859, ], on_success: processor_chain([ - dup225, + dup223, dup2, dup3, dup4, @@ -23947,10 +21747,9 @@ var all386 = all_match({ ]), }); -var msg1177 = msg("00767:15", all386); +var msg1177 = msg("00767:15", all380); -var part1866 = // "Pattern{Field(fld2,true), Constant(' Admin '), Field(administrator,true), Constant(' issued command '), Field(info,true), Constant(' to redirect output.')}" -match("MESSAGE#1162:00767:16", "nwparser.payload", "%{fld2->} Admin %{administrator->} issued command %{info->} to redirect output.", processor_chain([ +var part1860 = match("MESSAGE#1162:00767:16", "nwparser.payload", "%{fld2->} Admin %{administrator->} issued command %{info->} to redirect output.", processor_chain([ dup1, dup2, dup3, @@ -23958,15 +21757,14 @@ match("MESSAGE#1162:00767:16", "nwparser.payload", "%{fld2->} Admin %{administra dup5, ])); -var msg1178 = msg("00767:16", part1866); +var msg1178 = msg("00767:16", part1860); -var part1867 = // "Pattern{Field(fld2,true), Constant(' Save new software from '), Field(fld3,true), Constant(' to flash by admin '), Field(p0,false)}" -match("MESSAGE#1163:00767:17/0", "nwparser.payload", "%{fld2->} Save new software from %{fld3->} to flash by admin %{p0}"); +var part1861 = match("MESSAGE#1163:00767:17/0", "nwparser.payload", "%{fld2->} Save new software from %{fld3->} to flash by admin %{p0}"); -var all387 = all_match({ +var all381 = all_match({ processors: [ - part1867, - dup400, + part1861, + dup397, ], on_success: processor_chain([ dup1, @@ -23978,10 +21776,9 @@ var all387 = all_match({ ]), }); -var msg1179 = msg("00767:17", all387); +var msg1179 = msg("00767:17", all381); -var part1868 = // "Pattern{Constant('Attack database version '), Field(version,true), Constant(' has been '), Field(fld2,true), Constant(' saved to flash.')}" -match("MESSAGE#1164:00767:18", "nwparser.payload", "Attack database version %{version->} has been %{fld2->} saved to flash.", processor_chain([ +var part1862 = match("MESSAGE#1164:00767:18", "nwparser.payload", "Attack database version %{version->} has been %{fld2->} saved to flash.", processor_chain([ dup1, dup2, dup3, @@ -23989,10 +21786,9 @@ match("MESSAGE#1164:00767:18", "nwparser.payload", "Attack database version %{ve dup5, ])); -var msg1180 = msg("00767:18", part1868); +var msg1180 = msg("00767:18", part1862); -var part1869 = // "Pattern{Constant('Attack database version '), Field(version,true), Constant(' was rejected because the authentication check failed.')}" -match("MESSAGE#1165:00767:19", "nwparser.payload", "Attack database version %{version->} was rejected because the authentication check failed.", processor_chain([ +var part1863 = match("MESSAGE#1165:00767:19", "nwparser.payload", "Attack database version %{version->} was rejected because the authentication check failed.", processor_chain([ dup1, dup2, dup3, @@ -24000,10 +21796,9 @@ match("MESSAGE#1165:00767:19", "nwparser.payload", "Attack database version %{ve dup5, ])); -var msg1181 = msg("00767:19", part1869); +var msg1181 = msg("00767:19", part1863); -var part1870 = // "Pattern{Constant('The dictionary file version of the RADIUS server '), Field(hostname,true), Constant(' does not match '), Field(fld2,false)}" -match("MESSAGE#1166:00767:20", "nwparser.payload", "The dictionary file version of the RADIUS server %{hostname->} does not match %{fld2}", processor_chain([ +var part1864 = match("MESSAGE#1166:00767:20", "nwparser.payload", "The dictionary file version of the RADIUS server %{hostname->} does not match %{fld2}", processor_chain([ dup1, dup2, dup3, @@ -24011,10 +21806,9 @@ match("MESSAGE#1166:00767:20", "nwparser.payload", "The dictionary file version dup5, ])); -var msg1182 = msg("00767:20", part1870); +var msg1182 = msg("00767:20", part1864); -var part1871 = // "Pattern{Constant('Session ('), Field(fld2,true), Constant(' '), Field(fld3,false), Constant(', '), Field(fld4,false), Constant(') cleared '), Field(fld5,false)}" -match("MESSAGE#1167:00767:21", "nwparser.payload", "Session (%{fld2->} %{fld3}, %{fld4}) cleared %{fld5}", processor_chain([ +var part1865 = match("MESSAGE#1167:00767:21", "nwparser.payload", "Session (%{fld2->} %{fld3}, %{fld4}) cleared %{fld5}", processor_chain([ dup1, dup2, dup3, @@ -24022,47 +21816,40 @@ match("MESSAGE#1167:00767:21", "nwparser.payload", "Session (%{fld2->} %{fld3}, dup5, ])); -var msg1183 = msg("00767:21", part1871); +var msg1183 = msg("00767:21", part1865); -var part1872 = // "Pattern{Constant('The system configuration was not saved '), Field(p0,false)}" -match("MESSAGE#1168:00767:22/0", "nwparser.payload", "The system configuration was not saved %{p0}"); +var part1866 = match("MESSAGE#1168:00767:22/0", "nwparser.payload", "The system configuration was not saved %{p0}"); -var part1873 = // "Pattern{Field(fld2,true), Constant(' by admin '), Field(administrator,true), Constant(' via NSRP Peer '), Field(p0,false)}" -match("MESSAGE#1168:00767:22/1_0", "nwparser.p0", "%{fld2->} by admin %{administrator->} via NSRP Peer %{p0}"); +var part1867 = match("MESSAGE#1168:00767:22/1_0", "nwparser.p0", "%{fld2->} by admin %{administrator->} via NSRP Peer %{p0}"); -var part1874 = // "Pattern{Constant(''), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1168:00767:22/1_1", "nwparser.p0", "%{fld2->} %{p0}"); +var part1868 = match("MESSAGE#1168:00767:22/1_1", "nwparser.p0", "%{fld2->} %{p0}"); var select418 = linear_select([ - part1873, - part1874, + part1867, + part1868, ]); -var part1875 = // "Pattern{Constant('by administrator '), Field(fld3,false), Constant('. '), Field(p0,false)}" -match("MESSAGE#1168:00767:22/2", "nwparser.p0", "by administrator %{fld3}. %{p0}"); +var part1869 = match("MESSAGE#1168:00767:22/2", "nwparser.p0", "by administrator %{fld3}. %{p0}"); -var part1876 = // "Pattern{Constant('It was locked '), Field(p0,false)}" -match("MESSAGE#1168:00767:22/3_0", "nwparser.p0", "It was locked %{p0}"); +var part1870 = match("MESSAGE#1168:00767:22/3_0", "nwparser.p0", "It was locked %{p0}"); -var part1877 = // "Pattern{Constant('Locked '), Field(p0,false)}" -match("MESSAGE#1168:00767:22/3_1", "nwparser.p0", "Locked %{p0}"); +var part1871 = match("MESSAGE#1168:00767:22/3_1", "nwparser.p0", "Locked %{p0}"); var select419 = linear_select([ - part1876, - part1877, + part1870, + part1871, ]); -var part1878 = // "Pattern{Constant('by administrator '), Field(fld4,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1168:00767:22/4", "nwparser.p0", "by administrator %{fld4->} %{p0}"); +var part1872 = match("MESSAGE#1168:00767:22/4", "nwparser.p0", "by administrator %{fld4->} %{p0}"); -var all388 = all_match({ +var all382 = all_match({ processors: [ - part1872, + part1866, select418, - part1875, + part1869, select419, - part1878, - dup356, + part1872, + dup354, ], on_success: processor_chain([ dup50, @@ -24076,10 +21863,9 @@ var all388 = all_match({ ]), }); -var msg1184 = msg("00767:22", all388); +var msg1184 = msg("00767:22", all382); -var part1879 = // "Pattern{Constant('Save new software from slot filename '), Field(filename,true), Constant(' to flash memory by administrator '), Field(administrator,false)}" -match("MESSAGE#1169:00767:23", "nwparser.payload", "Save new software from slot filename %{filename->} to flash memory by administrator %{administrator}", processor_chain([ +var part1873 = match("MESSAGE#1169:00767:23", "nwparser.payload", "Save new software from slot filename %{filename->} to flash memory by administrator %{administrator}", processor_chain([ dup1, dup2, dup3, @@ -24087,30 +21873,27 @@ match("MESSAGE#1169:00767:23", "nwparser.payload", "Save new software from slot dup5, ])); -var msg1185 = msg("00767:23", part1879); +var msg1185 = msg("00767:23", part1873); -var part1880 = // "Pattern{Constant('System configuration saved by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' from '), Field(p0,false)}" -match("MESSAGE#1170:00767:25/0", "nwparser.payload", "System configuration saved by %{username->} via %{logon_type->} from %{p0}"); +var part1874 = match("MESSAGE#1170:00767:25/0", "nwparser.payload", "System configuration saved by %{username->} via %{logon_type->} from %{p0}"); var select420 = linear_select([ - dup171, + dup169, dup16, ]); -var part1881 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' by '), Field(p0,false)}" -match("MESSAGE#1170:00767:25/3_0", "nwparser.p0", "%{saddr}:%{sport->} by %{p0}"); +var part1875 = match("MESSAGE#1170:00767:25/3_0", "nwparser.p0", "%{saddr}:%{sport->} by %{p0}"); -var part1882 = // "Pattern{Field(saddr,true), Constant(' by '), Field(p0,false)}" -match("MESSAGE#1170:00767:25/3_1", "nwparser.p0", "%{saddr->} by %{p0}"); +var part1876 = match("MESSAGE#1170:00767:25/3_1", "nwparser.p0", "%{saddr->} by %{p0}"); var select421 = linear_select([ - part1881, - part1882, + part1875, + part1876, ]); -var all389 = all_match({ +var all383 = all_match({ processors: [ - part1880, + part1874, select420, dup23, select421, @@ -24125,41 +21908,35 @@ var all389 = all_match({ ]), }); -var msg1186 = msg("00767:25", all389); +var msg1186 = msg("00767:25", all383); -var part1883 = // "Pattern{Constant('Lock configuration '), Field(p0,false)}" -match("MESSAGE#1171:00767:26/0", "nwparser.payload", "Lock configuration %{p0}"); +var part1877 = match("MESSAGE#1171:00767:26/0", "nwparser.payload", "Lock configuration %{p0}"); -var part1884 = // "Pattern{Constant('started'), Field(p0,false)}" -match("MESSAGE#1171:00767:26/1_0", "nwparser.p0", "started%{p0}"); +var part1878 = match("MESSAGE#1171:00767:26/1_0", "nwparser.p0", "started%{p0}"); -var part1885 = // "Pattern{Constant('ended'), Field(p0,false)}" -match("MESSAGE#1171:00767:26/1_1", "nwparser.p0", "ended%{p0}"); +var part1879 = match("MESSAGE#1171:00767:26/1_1", "nwparser.p0", "ended%{p0}"); var select422 = linear_select([ - part1884, - part1885, + part1878, + part1879, ]); -var part1886 = // "Pattern{Field(,false), Constant('by task '), Field(p0,false)}" -match("MESSAGE#1171:00767:26/2", "nwparser.p0", "%{}by task %{p0}"); +var part1880 = match("MESSAGE#1171:00767:26/2", "nwparser.p0", "%{}by task %{p0}"); -var part1887 = // "Pattern{Constant(''), Field(fld3,false), Constant(', with a timeout value of '), Field(fld2,false)}" -match("MESSAGE#1171:00767:26/3_0", "nwparser.p0", "%{fld3}, with a timeout value of %{fld2}"); +var part1881 = match("MESSAGE#1171:00767:26/3_0", "nwparser.p0", "%{fld3}, with a timeout value of %{fld2}"); -var part1888 = // "Pattern{Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1171:00767:26/3_1", "nwparser.p0", "%{fld2->} (%{fld1})"); +var part1882 = match("MESSAGE#1171:00767:26/3_1", "nwparser.p0", "%{fld2->} (%{fld1})"); var select423 = linear_select([ - part1887, - part1888, + part1881, + part1882, ]); -var all390 = all_match({ +var all384 = all_match({ processors: [ - part1883, + part1877, select422, - part1886, + part1880, select423, ], on_success: processor_chain([ @@ -24174,29 +21951,26 @@ var all390 = all_match({ ]), }); -var msg1187 = msg("00767:26", all390); +var msg1187 = msg("00767:26", all384); -var part1889 = // "Pattern{Constant('Environment variable '), Field(fld2,true), Constant(' changed to '), Field(p0,false)}" -match("MESSAGE#1172:00767:27/0", "nwparser.payload", "Environment variable %{fld2->} changed to %{p0}"); +var part1883 = match("MESSAGE#1172:00767:27/0", "nwparser.payload", "Environment variable %{fld2->} changed to %{p0}"); -var part1890 = // "Pattern{Field(fld3,true), Constant(' by '), Field(username,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1172:00767:27/1_0", "nwparser.p0", "%{fld3->} by %{username->} (%{fld1})"); +var part1884 = match("MESSAGE#1172:00767:27/1_0", "nwparser.p0", "%{fld3->} by %{username->} (%{fld1})"); -var part1891 = // "Pattern{Field(fld3,false)}" -match_copy("MESSAGE#1172:00767:27/1_1", "nwparser.p0", "fld3"); +var part1885 = match_copy("MESSAGE#1172:00767:27/1_1", "nwparser.p0", "fld3"); var select424 = linear_select([ - part1890, - part1891, + part1884, + part1885, ]); -var all391 = all_match({ +var all385 = all_match({ processors: [ - part1889, + part1883, select424, ], on_success: processor_chain([ - dup225, + dup223, dup2, dup3, dup9, @@ -24205,10 +21979,9 @@ var all391 = all_match({ ]), }); -var msg1188 = msg("00767:27", all391); +var msg1188 = msg("00767:27", all385); -var part1892 = // "Pattern{Constant('The system configuration was loaded from IP address '), Field(hostip,true), Constant(' under filename '), Field(filename,true), Constant(' by administrator by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1173:00767:28", "nwparser.payload", "The system configuration was loaded from IP address %{hostip->} under filename %{filename->} by administrator by admin %{administrator->} (%{fld1})", processor_chain([ +var part1886 = match("MESSAGE#1173:00767:28", "nwparser.payload", "The system configuration was loaded from IP address %{hostip->} under filename %{filename->} by administrator by admin %{administrator->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24217,10 +21990,9 @@ match("MESSAGE#1173:00767:28", "nwparser.payload", "The system configuration was dup5, ])); -var msg1189 = msg("00767:28", part1892); +var msg1189 = msg("00767:28", part1886); -var part1893 = // "Pattern{Constant('Save configuration to IP address '), Field(hostip,true), Constant(' under filename '), Field(filename,true), Constant(' by administrator by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1174:00767:29", "nwparser.payload", "Save configuration to IP address %{hostip->} under filename %{filename->} by administrator by admin %{administrator->} (%{fld1})", processor_chain([ +var part1887 = match("MESSAGE#1174:00767:29", "nwparser.payload", "Save configuration to IP address %{hostip->} under filename %{filename->} by administrator by admin %{administrator->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24229,10 +22001,9 @@ match("MESSAGE#1174:00767:29", "nwparser.payload", "Save configuration to IP add dup5, ])); -var msg1190 = msg("00767:29", part1893); +var msg1190 = msg("00767:29", part1887); -var part1894 = // "Pattern{Field(fld2,false), Constant(': The system configuration was saved from host '), Field(saddr,true), Constant(' by admin '), Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1175:00767:30", "nwparser.payload", "%{fld2}: The system configuration was saved from host %{saddr->} by admin %{administrator->} (%{fld1})", processor_chain([ +var part1888 = match("MESSAGE#1175:00767:30", "nwparser.payload", "%{fld2}: The system configuration was saved from host %{saddr->} by admin %{administrator->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24241,28 +22012,25 @@ match("MESSAGE#1175:00767:30", "nwparser.payload", "%{fld2}: The system configur dup5, ])); -var msg1191 = msg("00767:30", part1894); +var msg1191 = msg("00767:30", part1888); -var part1895 = // "Pattern{Constant('logged events or alarms '), Field(p0,false)}" -match("MESSAGE#1176:00767:31/1_0", "nwparser.p0", "logged events or alarms %{p0}"); +var part1889 = match("MESSAGE#1176:00767:31/1_0", "nwparser.p0", "logged events or alarms %{p0}"); -var part1896 = // "Pattern{Constant('traffic logs '), Field(p0,false)}" -match("MESSAGE#1176:00767:31/1_1", "nwparser.p0", "traffic logs %{p0}"); +var part1890 = match("MESSAGE#1176:00767:31/1_1", "nwparser.p0", "traffic logs %{p0}"); var select425 = linear_select([ - part1895, - part1896, + part1889, + part1890, ]); -var part1897 = // "Pattern{Constant('were cleared by admin '), Field(p0,false)}" -match("MESSAGE#1176:00767:31/2", "nwparser.p0", "were cleared by admin %{p0}"); +var part1891 = match("MESSAGE#1176:00767:31/2", "nwparser.p0", "were cleared by admin %{p0}"); -var all392 = all_match({ +var all386 = all_match({ processors: [ - dup188, + dup186, select425, - part1897, - dup400, + part1891, + dup397, ], on_success: processor_chain([ dup1, @@ -24274,30 +22042,26 @@ var all392 = all_match({ ]), }); -var msg1192 = msg("00767:31", all392); +var msg1192 = msg("00767:31", all386); -var part1898 = // "Pattern{Constant('SIP parser error '), Field(p0,false)}" -match("MESSAGE#1177:00767:32/0", "nwparser.payload", "SIP parser error %{p0}"); +var part1892 = match("MESSAGE#1177:00767:32/0", "nwparser.payload", "SIP parser error %{p0}"); -var part1899 = // "Pattern{Constant('SIP-field'), Field(p0,false)}" -match("MESSAGE#1177:00767:32/1_0", "nwparser.p0", "SIP-field%{p0}"); +var part1893 = match("MESSAGE#1177:00767:32/1_0", "nwparser.p0", "SIP-field%{p0}"); -var part1900 = // "Pattern{Constant('Message'), Field(p0,false)}" -match("MESSAGE#1177:00767:32/1_1", "nwparser.p0", "Message%{p0}"); +var part1894 = match("MESSAGE#1177:00767:32/1_1", "nwparser.p0", "Message%{p0}"); var select426 = linear_select([ - part1899, - part1900, + part1893, + part1894, ]); -var part1901 = // "Pattern{Constant(': '), Field(result,false), Constant('('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1177:00767:32/2", "nwparser.p0", ": %{result}(%{fld1})"); +var part1895 = match("MESSAGE#1177:00767:32/2", "nwparser.p0", ": %{result}(%{fld1})"); -var all393 = all_match({ +var all387 = all_match({ processors: [ - part1898, + part1892, select426, - part1901, + part1895, ], on_success: processor_chain([ dup27, @@ -24309,10 +22073,9 @@ var all393 = all_match({ ]), }); -var msg1193 = msg("00767:32", all393); +var msg1193 = msg("00767:32", all387); -var part1902 = // "Pattern{Constant('Daylight Saving Time has started. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1178:00767:33", "nwparser.payload", "Daylight Saving Time has started. (%{fld1})", processor_chain([ +var part1896 = match("MESSAGE#1178:00767:33", "nwparser.payload", "Daylight Saving Time has started. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -24321,11 +22084,10 @@ match("MESSAGE#1178:00767:33", "nwparser.payload", "Daylight Saving Time has sta dup5, ])); -var msg1194 = msg("00767:33", part1902); +var msg1194 = msg("00767:33", part1896); -var part1903 = // "Pattern{Constant('NetScreen devices do not support multiple IP addresses '), Field(hostip,true), Constant(' or ports '), Field(network_port,true), Constant(' in SIP headers RESPONSE ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1179:00767:34", "nwparser.payload", "NetScreen devices do not support multiple IP addresses %{hostip->} or ports %{network_port->} in SIP headers RESPONSE (%{fld1})", processor_chain([ - dup315, +var part1897 = match("MESSAGE#1179:00767:34", "nwparser.payload", "NetScreen devices do not support multiple IP addresses %{hostip->} or ports %{network_port->} in SIP headers RESPONSE (%{fld1})", processor_chain([ + dup313, dup2, dup3, dup9, @@ -24333,10 +22095,9 @@ match("MESSAGE#1179:00767:34", "nwparser.payload", "NetScreen devices do not sup dup5, ])); -var msg1195 = msg("00767:34", part1903); +var msg1195 = msg("00767:34", part1897); -var part1904 = // "Pattern{Constant('Environment variable '), Field(fld2,true), Constant(' set to '), Field(fld3,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1180:00767:35", "nwparser.payload", "Environment variable %{fld2->} set to %{fld3->} (%{fld1})", processor_chain([ +var part1898 = match("MESSAGE#1180:00767:35", "nwparser.payload", "Environment variable %{fld2->} set to %{fld3->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24345,10 +22106,9 @@ match("MESSAGE#1180:00767:35", "nwparser.payload", "Environment variable %{fld2- dup5, ])); -var msg1196 = msg("00767:35", part1904); +var msg1196 = msg("00767:35", part1898); -var part1905 = // "Pattern{Constant('System configuration saved from '), Field(fld2,true), Constant(' by '), Field(username,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1181:00767:36", "nwparser.payload", "System configuration saved from %{fld2->} by %{username->} (%{fld1})", processor_chain([ +var part1899 = match("MESSAGE#1181:00767:36", "nwparser.payload", "System configuration saved from %{fld2->} by %{username->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24357,11 +22117,10 @@ match("MESSAGE#1181:00767:36", "nwparser.payload", "System configuration saved f dup5, ])); -var msg1197 = msg("00767:36", part1905); +var msg1197 = msg("00767:36", part1899); -var part1906 = // "Pattern{Constant('Trial keys are available to download to enable advanced features. '), Field(space,true), Constant(' To find out, please visit '), Field(url,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1182:00767:37", "nwparser.payload", "Trial keys are available to download to enable advanced features. %{space->} To find out, please visit %{url->} (%{fld1})", processor_chain([ - dup256, +var part1900 = match("MESSAGE#1182:00767:37", "nwparser.payload", "Trial keys are available to download to enable advanced features. %{space->} To find out, please visit %{url->} (%{fld1})", processor_chain([ + dup254, dup2, dup3, dup9, @@ -24369,10 +22128,9 @@ match("MESSAGE#1182:00767:37", "nwparser.payload", "Trial keys are available to dup5, ])); -var msg1198 = msg("00767:37", part1906); +var msg1198 = msg("00767:37", part1900); -var part1907 = // "Pattern{Constant('Log buffer was full and remaining messages were sent to external destination. '), Field(fld2,true), Constant(' packets were dropped. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1183:00767:38", "nwparser.payload", "Log buffer was full and remaining messages were sent to external destination. %{fld2->} packets were dropped. (%{fld1})", processor_chain([ +var part1901 = match("MESSAGE#1183:00767:38", "nwparser.payload", "Log buffer was full and remaining messages were sent to external destination. %{fld2->} packets were dropped. (%{fld1})", processor_chain([ setc("eventcategory","1602000000"), dup2, dup3, @@ -24381,46 +22139,40 @@ match("MESSAGE#1183:00767:38", "nwparser.payload", "Log buffer was full and rema dup5, ])); -var msg1199 = msg("00767:38", part1907); +var msg1199 = msg("00767:38", part1901); -var part1908 = // "Pattern{Constant('Cannot '), Field(p0,false)}" -match("MESSAGE#1184:00767:39/0", "nwparser.payload", "Cannot %{p0}"); +var part1902 = match("MESSAGE#1184:00767:39/0", "nwparser.payload", "Cannot %{p0}"); -var part1909 = // "Pattern{Constant('download '), Field(p0,false)}" -match("MESSAGE#1184:00767:39/1_0", "nwparser.p0", "download %{p0}"); +var part1903 = match("MESSAGE#1184:00767:39/1_0", "nwparser.p0", "download %{p0}"); -var part1910 = // "Pattern{Constant('parse '), Field(p0,false)}" -match("MESSAGE#1184:00767:39/1_1", "nwparser.p0", "parse %{p0}"); +var part1904 = match("MESSAGE#1184:00767:39/1_1", "nwparser.p0", "parse %{p0}"); var select427 = linear_select([ - part1909, - part1910, + part1903, + part1904, ]); -var part1911 = // "Pattern{Constant('attack database '), Field(p0,false)}" -match("MESSAGE#1184:00767:39/2", "nwparser.p0", "attack database %{p0}"); +var part1905 = match("MESSAGE#1184:00767:39/2", "nwparser.p0", "attack database %{p0}"); -var part1912 = // "Pattern{Constant('from '), Field(url,true), Constant(' ('), Field(result,false), Constant('). '), Field(p0,false)}" -match("MESSAGE#1184:00767:39/3_0", "nwparser.p0", "from %{url->} (%{result}). %{p0}"); +var part1906 = match("MESSAGE#1184:00767:39/3_0", "nwparser.p0", "from %{url->} (%{result}). %{p0}"); -var part1913 = // "Pattern{Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#1184:00767:39/3_1", "nwparser.p0", "%{fld2->} %{p0}"); +var part1907 = match("MESSAGE#1184:00767:39/3_1", "nwparser.p0", "%{fld2->} %{p0}"); var select428 = linear_select([ - part1912, - part1913, + part1906, + part1907, ]); -var all394 = all_match({ +var all388 = all_match({ processors: [ - part1908, + part1902, select427, - part1911, + part1905, select428, dup10, ], on_success: processor_chain([ - dup326, + dup324, dup2, dup3, dup9, @@ -24429,10 +22181,9 @@ var all394 = all_match({ ]), }); -var msg1200 = msg("00767:39", all394); +var msg1200 = msg("00767:39", all388); -var part1914 = // "Pattern{Constant('Deep Inspection update key is '), Field(disposition,false), Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1185:00767:40", "nwparser.payload", "Deep Inspection update key is %{disposition}. (%{fld1})", processor_chain([ +var part1908 = match("MESSAGE#1185:00767:40", "nwparser.payload", "Deep Inspection update key is %{disposition}. (%{fld1})", processor_chain([ dup62, dup2, dup3, @@ -24441,10 +22192,9 @@ match("MESSAGE#1185:00767:40", "nwparser.payload", "Deep Inspection update key i dup5, ])); -var msg1201 = msg("00767:40", part1914); +var msg1201 = msg("00767:40", part1908); -var part1915 = // "Pattern{Constant('System configuration saved by '), Field(username,true), Constant(' via '), Field(logon_type,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' by '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1186:00767:42", "nwparser.payload", "System configuration saved by %{username->} via %{logon_type->} to %{daddr}:%{dport->} by %{fld2->} (%{fld1})", processor_chain([ +var part1909 = match("MESSAGE#1186:00767:42", "nwparser.payload", "System configuration saved by %{username->} via %{logon_type->} to %{daddr}:%{dport->} by %{fld2->} (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24453,10 +22203,9 @@ match("MESSAGE#1186:00767:42", "nwparser.payload", "System configuration saved b dup5, ])); -var msg1202 = msg("00767:42", part1915); +var msg1202 = msg("00767:42", part1909); -var part1916 = // "Pattern{Constant('Daylight Saving Time ended. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1187:00767:43", "nwparser.payload", "Daylight Saving Time ended. (%{fld1})", processor_chain([ +var part1910 = match("MESSAGE#1187:00767:43", "nwparser.payload", "Daylight Saving Time ended. (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -24465,10 +22214,9 @@ match("MESSAGE#1187:00767:43", "nwparser.payload", "Daylight Saving Time ended. dup5, ])); -var msg1203 = msg("00767:43", part1916); +var msg1203 = msg("00767:43", part1910); -var part1917 = // "Pattern{Constant('New GMT zone ahead or behind by '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1188:00767:44", "nwparser.payload", "New GMT zone ahead or behind by %{fld2->} (%{fld1})", processor_chain([ +var part1911 = match("MESSAGE#1188:00767:44", "nwparser.payload", "New GMT zone ahead or behind by %{fld2->} (%{fld1})", processor_chain([ dup44, dup2, dup3, @@ -24477,10 +22225,9 @@ match("MESSAGE#1188:00767:44", "nwparser.payload", "New GMT zone ahead or behind dup5, ])); -var msg1204 = msg("00767:44", part1917); +var msg1204 = msg("00767:44", part1911); -var part1918 = // "Pattern{Constant('Attack database version '), Field(version,true), Constant(' is saved to flash. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1189:00767:45", "nwparser.payload", "Attack database version %{version->} is saved to flash. (%{fld1})", processor_chain([ +var part1912 = match("MESSAGE#1189:00767:45", "nwparser.payload", "Attack database version %{version->} is saved to flash. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24489,10 +22236,9 @@ match("MESSAGE#1189:00767:45", "nwparser.payload", "Attack database version %{ve dup5, ])); -var msg1205 = msg("00767:45", part1918); +var msg1205 = msg("00767:45", part1912); -var part1919 = // "Pattern{Constant('System configuration saved by netscreen via '), Field(logon_type,true), Constant(' by netscreen. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1190:00767:46", "nwparser.payload", "System configuration saved by netscreen via %{logon_type->} by netscreen. (%{fld1})", processor_chain([ +var part1913 = match("MESSAGE#1190:00767:46", "nwparser.payload", "System configuration saved by netscreen via %{logon_type->} by netscreen. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24501,10 +22247,9 @@ match("MESSAGE#1190:00767:46", "nwparser.payload", "System configuration saved b dup5, ])); -var msg1206 = msg("00767:46", part1919); +var msg1206 = msg("00767:46", part1913); -var part1920 = // "Pattern{Constant('User '), Field(username,true), Constant(' belongs to a different group in the RADIUS server than that allowed in the device. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1191:00767:47", "nwparser.payload", "User %{username->} belongs to a different group in the RADIUS server than that allowed in the device. (%{fld1})", processor_chain([ +var part1914 = match("MESSAGE#1191:00767:47", "nwparser.payload", "User %{username->} belongs to a different group in the RADIUS server than that allowed in the device. (%{fld1})", processor_chain([ dup1, dup2, dup3, @@ -24513,19 +22258,17 @@ match("MESSAGE#1191:00767:47", "nwparser.payload", "User %{username->} belongs t dup9, ])); -var msg1207 = msg("00767:47", part1920); +var msg1207 = msg("00767:47", part1914); -var part1921 = // "Pattern{Constant('System configuration saved by '), Field(p0,false)}" -match("MESSAGE#1192:00767:24/0", "nwparser.payload", "System configuration saved by %{p0}"); +var part1915 = match("MESSAGE#1192:00767:24/0", "nwparser.payload", "System configuration saved by %{p0}"); -var part1922 = // "Pattern{Field(logon_type,true), Constant(' by '), Field(fld2,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1192:00767:24/2", "nwparser.p0", "%{logon_type->} by %{fld2->} (%{fld1})"); +var part1916 = match("MESSAGE#1192:00767:24/2", "nwparser.p0", "%{logon_type->} by %{fld2->} (%{fld1})"); -var all395 = all_match({ +var all389 = all_match({ processors: [ - part1921, - dup367, - part1922, + part1915, + dup364, + part1916, ], on_success: processor_chain([ dup1, @@ -24537,11 +22280,10 @@ var all395 = all_match({ ]), }); -var msg1208 = msg("00767:24", all395); +var msg1208 = msg("00767:24", all389); -var part1923 = // "Pattern{Constant('HA: Synchronization file(s) hidden file end with c sent to backup device in cluster. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1193:00767:48", "nwparser.payload", "HA: Synchronization file(s) hidden file end with c sent to backup device in cluster. (%{fld1})", processor_chain([ - dup274, +var part1917 = match("MESSAGE#1193:00767:48", "nwparser.payload", "HA: Synchronization file(s) hidden file end with c sent to backup device in cluster. (%{fld1})", processor_chain([ + dup272, dup2, dup3, dup9, @@ -24549,30 +22291,26 @@ match("MESSAGE#1193:00767:48", "nwparser.payload", "HA: Synchronization file(s) dup5, ])); -var msg1209 = msg("00767:48", part1923); +var msg1209 = msg("00767:48", part1917); -var part1924 = // "Pattern{Field(fld2,true), Constant(' turn o'), Field(p0,false)}" -match("MESSAGE#1194:00767:49/0", "nwparser.payload", "%{fld2->} turn o%{p0}"); +var part1918 = match("MESSAGE#1194:00767:49/0", "nwparser.payload", "%{fld2->} turn o%{p0}"); -var part1925 = // "Pattern{Constant('n'), Field(p0,false)}" -match("MESSAGE#1194:00767:49/1_0", "nwparser.p0", "n%{p0}"); +var part1919 = match("MESSAGE#1194:00767:49/1_0", "nwparser.p0", "n%{p0}"); -var part1926 = // "Pattern{Constant('ff'), Field(p0,false)}" -match("MESSAGE#1194:00767:49/1_1", "nwparser.p0", "ff%{p0}"); +var part1920 = match("MESSAGE#1194:00767:49/1_1", "nwparser.p0", "ff%{p0}"); var select429 = linear_select([ - part1925, - part1926, + part1919, + part1920, ]); -var part1927 = // "Pattern{Field(,false), Constant('debug switch for '), Field(fld3,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#1194:00767:49/2", "nwparser.p0", "%{}debug switch for %{fld3->} (%{fld1})"); +var part1921 = match("MESSAGE#1194:00767:49/2", "nwparser.p0", "%{}debug switch for %{fld3->} (%{fld1})"); -var all396 = all_match({ +var all390 = all_match({ processors: [ - part1924, + part1918, select429, - part1927, + part1921, ], on_success: processor_chain([ dup1, @@ -24583,7 +22321,7 @@ var all396 = all_match({ ]), }); -var msg1210 = msg("00767:49", all396); +var msg1210 = msg("00767:49", all390); var select430 = linear_select([ msg1158, @@ -24641,26 +22379,25 @@ var select430 = linear_select([ msg1210, ]); -var part1928 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1195:01269", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup187, +var part1922 = match("MESSAGE#1195:01269", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, - dup279, - dup3, + dup274, dup277, + dup3, + dup275, dup60, ])); -var msg1211 = msg("01269", part1928); +var msg1211 = msg("01269", part1922); -var msg1212 = msg("01269:01", dup410); +var msg1212 = msg("01269:01", dup407); -var msg1213 = msg("01269:02", dup411); +var msg1213 = msg("01269:02", dup408); -var msg1214 = msg("01269:03", dup412); +var msg1214 = msg("01269:03", dup409); var select431 = linear_select([ msg1211, @@ -24669,67 +22406,63 @@ var select431 = linear_select([ msg1214, ]); -var part1929 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1199:17852", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup187, +var part1923 = match("MESSAGE#1199:17852", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup278, - dup279, + dup276, dup277, - dup334, + dup275, + dup332, ])); -var msg1215 = msg("17852", part1929); +var msg1215 = msg("17852", part1923); -var part1930 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1200:17852:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup283, +var part1924 = match("MESSAGE#1200:17852:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, - dup334, - dup284, + dup275, + dup332, + dup282, ])); -var msg1216 = msg("17852:01", part1930); +var msg1216 = msg("17852:01", part1924); -var part1931 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1201:17852:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup187, +var part1925 = match("MESSAGE#1201:17852:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, + dup274, dup3, + dup275, + dup276, dup277, - dup278, - dup279, dup61, ])); -var msg1217 = msg("17852:02", part1931); +var msg1217 = msg("17852:02", part1925); -var part1932 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1202:17852:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup283, +var part1926 = match("MESSAGE#1202:17852:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, - dup334, - dup284, + dup275, + dup332, + dup282, ])); -var msg1218 = msg("17852:03", part1932); +var msg1218 = msg("17852:03", part1926); var select432 = linear_select([ msg1215, @@ -24738,53 +22471,50 @@ var select432 = linear_select([ msg1218, ]); -var msg1219 = msg("23184", dup413); +var msg1219 = msg("23184", dup410); -var part1933 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' ('), Field(fld3,false), Constant(') proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1204:23184:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup283, +var part1927 = match("MESSAGE#1204:23184:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, + dup275, dup61, - dup284, + dup282, ])); -var msg1220 = msg("23184:01", part1933); +var msg1220 = msg("23184:01", part1927); -var part1934 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' ('), Field(fld3,false), Constant(') proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1205:23184:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup187, +var part1928 = match("MESSAGE#1205:23184:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup278, - dup279, + dup276, dup277, + dup275, dup61, ])); -var msg1221 = msg("23184:02", part1934); +var msg1221 = msg("23184:02", part1928); -var part1935 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' ('), Field(fld3,false), Constant(') proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1206:23184:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup283, +var part1929 = match("MESSAGE#1206:23184:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, - dup334, - dup284, + dup275, + dup332, + dup282, ])); -var msg1222 = msg("23184:03", part1935); +var msg1222 = msg("23184:03", part1929); var select433 = linear_select([ msg1219, @@ -24793,49 +22523,47 @@ var select433 = linear_select([ msg1222, ]); -var msg1223 = msg("27052", dup413); +var msg1223 = msg("27052", dup410); -var part1936 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' ('), Field(fld3,false), Constant(') proto='), Field(protocol,false), Constant('direction='), Field(direction,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1208:27052:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol}direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup283, +var part1930 = match("MESSAGE#1208:27052:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol}direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, + dup275, dup61, - dup284, + dup282, ])); -var msg1224 = msg("27052:01", part1936); +var msg1224 = msg("27052:01", part1930); var select434 = linear_select([ msg1223, msg1224, ]); -var part1937 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1209:39568", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup187, +var part1931 = match("MESSAGE#1209:39568", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup185, dup2, dup4, - dup279, + dup277, dup5, - dup276, + dup274, dup3, - dup277, - dup278, + dup275, + dup276, dup60, ])); -var msg1225 = msg("39568", part1937); +var msg1225 = msg("39568", part1931); -var msg1226 = msg("39568:01", dup410); +var msg1226 = msg("39568:01", dup407); -var msg1227 = msg("39568:02", dup411); +var msg1227 = msg("39568:02", dup408); -var msg1228 = msg("39568:03", dup412); +var msg1228 = msg("39568:03", dup409); var select435 = linear_select([ msg1225, @@ -25010,751 +22738,500 @@ var chain1 = processor_chain([ }), ]); -var part1938 = // "Pattern{Constant('Address '), Field(group_object,true), Constant(' for '), Field(p0,false)}" -match("MESSAGE#2:00001:02/0", "nwparser.payload", "Address %{group_object->} for %{p0}"); - -var part1939 = // "Pattern{Constant('domain address '), Field(domain,true), Constant(' in zone '), Field(p0,false)}" -match("MESSAGE#2:00001:02/1_1", "nwparser.p0", "domain address %{domain->} in zone %{p0}"); +var part1932 = match("MESSAGE#2:00001:02/0", "nwparser.payload", "Address %{group_object->} for %{p0}"); -var part1940 = // "Pattern{Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#4:00001:04/3_0", "nwparser.p0", " (%{fld1})"); +var part1933 = match("MESSAGE#2:00001:02/1_1", "nwparser.p0", "domain address %{domain->} in zone %{p0}"); -var part1941 = // "Pattern{Constant('('), Field(fld1,false), Constant(')')}" -match("MESSAGE#5:00001:05/1_0", "nwparser.p0", "(%{fld1})"); +var part1934 = match("MESSAGE#4:00001:04/3_0", "nwparser.p0", " (%{fld1})"); -var part1942 = // "Pattern{Field(fld1,false)}" -match_copy("MESSAGE#5:00001:05/1_1", "nwparser.p0", "fld1"); +var part1935 = match("MESSAGE#5:00001:05/1_0", "nwparser.p0", "(%{fld1})"); -var part1943 = // "Pattern{Constant('Address '), Field(p0,false)}" -match("MESSAGE#8:00001:08/0", "nwparser.payload", "Address %{p0}"); +var part1936 = match_copy("MESSAGE#5:00001:05/1_1", "nwparser.p0", "fld1"); -var part1944 = // "Pattern{Constant('MIP('), Field(interface,false), Constant(') '), Field(p0,false)}" -match("MESSAGE#8:00001:08/1_0", "nwparser.p0", "MIP(%{interface}) %{p0}"); +var part1937 = match("MESSAGE#8:00001:08/0", "nwparser.payload", "Address %{p0}"); -var part1945 = // "Pattern{Field(group_object,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#8:00001:08/1_1", "nwparser.p0", "%{group_object->} %{p0}"); +var part1938 = match("MESSAGE#8:00001:08/1_0", "nwparser.p0", "MIP(%{interface}) %{p0}"); -var part1946 = // "Pattern{Constant('admin '), Field(p0,false)}" -match("MESSAGE#8:00001:08/3_0", "nwparser.p0", "admin %{p0}"); +var part1939 = match("MESSAGE#8:00001:08/1_1", "nwparser.p0", "%{group_object->} %{p0}"); -var part1947 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#8:00001:08/3_1", "nwparser.p0", "p0"); +var part1940 = match("MESSAGE#8:00001:08/3_0", "nwparser.p0", "admin %{p0}"); -var part1948 = // "Pattern{Constant('from host '), Field(saddr,true), Constant(' ')}" -match("MESSAGE#25:00002:20/1_1", "nwparser.p0", "from host %{saddr->} "); +var part1941 = match_copy("MESSAGE#8:00001:08/3_1", "nwparser.p0", "p0"); -var part1949 = // "Pattern{}" -match_copy("MESSAGE#25:00002:20/1_2", "nwparser.p0", ""); +var part1942 = match("MESSAGE#25:00002:20/1_1", "nwparser.p0", "from host %{saddr->} "); -var part1950 = // "Pattern{Constant(''), Field(p0,false)}" -match("MESSAGE#26:00002:21/1", "nwparser.p0", "%{p0}"); +var part1943 = match_copy("MESSAGE#25:00002:20/1_2", "nwparser.p0", ""); -var part1951 = // "Pattern{Constant('password '), Field(p0,false)}" -match("MESSAGE#26:00002:21/2_0", "nwparser.p0", "password %{p0}"); +var part1944 = match("MESSAGE#26:00002:21/1", "nwparser.p0", "%{p0}"); -var part1952 = // "Pattern{Constant('name '), Field(p0,false)}" -match("MESSAGE#26:00002:21/2_1", "nwparser.p0", "name %{p0}"); +var part1945 = match("MESSAGE#26:00002:21/2_0", "nwparser.p0", "password %{p0}"); -var part1953 = // "Pattern{Field(administrator,false)}" -match_copy("MESSAGE#27:00002:22/1_2", "nwparser.p0", "administrator"); +var part1946 = match("MESSAGE#26:00002:21/2_1", "nwparser.p0", "name %{p0}"); -var part1954 = // "Pattern{Field(disposition,false)}" -match_copy("MESSAGE#42:00002:38/1_1", "nwparser.p0", "disposition"); +var part1947 = match_copy("MESSAGE#27:00002:22/1_2", "nwparser.p0", "administrator"); -var part1955 = // "Pattern{Constant('via '), Field(p0,false)}" -match("MESSAGE#46:00002:42/1_1", "nwparser.p0", "via %{p0}"); +var part1948 = match_copy("MESSAGE#42:00002:38/1_1", "nwparser.p0", "disposition"); -var part1956 = // "Pattern{Field(fld1,false), Constant(')')}" -match("MESSAGE#46:00002:42/4", "nwparser.p0", "%{fld1})"); +var part1949 = match("MESSAGE#46:00002:42/1_1", "nwparser.p0", "via %{p0}"); -var part1957 = // "Pattern{Field(logon_type,true), Constant(' from host '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant('. ('), Field(p0,false)}" -match("MESSAGE#52:00002:48/3_1", "nwparser.p0", "%{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{p0}"); +var part1950 = match("MESSAGE#46:00002:42/4", "nwparser.p0", "%{fld1})"); -var part1958 = // "Pattern{Constant('admin '), Field(administrator,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#53:00002:52/3_0", "nwparser.p0", "admin %{administrator->} via %{p0}"); +var part1951 = match("MESSAGE#52:00002:48/3_1", "nwparser.p0", "%{logon_type->} from host %{saddr->} to %{daddr}:%{dport}. (%{p0}"); -var part1959 = // "Pattern{Field(username,true), Constant(' via '), Field(p0,false)}" -match("MESSAGE#53:00002:52/3_2", "nwparser.p0", "%{username->} via %{p0}"); +var part1952 = match("MESSAGE#53:00002:52/3_0", "nwparser.p0", "admin %{administrator->} via %{p0}"); -var part1960 = // "Pattern{Constant('NSRP Peer . ('), Field(p0,false)}" -match("MESSAGE#53:00002:52/4_0", "nwparser.p0", "NSRP Peer . (%{p0}"); +var part1953 = match("MESSAGE#53:00002:52/3_2", "nwparser.p0", "%{username->} via %{p0}"); -var part1961 = // "Pattern{Constant('. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#55:00002:54/2", "nwparser.p0", ". (%{fld1})"); +var part1954 = match("MESSAGE#53:00002:52/4_0", "nwparser.p0", "NSRP Peer . (%{p0}"); -var part1962 = // "Pattern{Constant('changed'), Field(p0,false)}" -match("MESSAGE#56:00002/1_1", "nwparser.p0", "changed%{p0}"); +var part1955 = match("MESSAGE#55:00002:54/2", "nwparser.p0", ". (%{fld1})"); -var part1963 = // "Pattern{Constant('The '), Field(p0,false)}" -match("MESSAGE#61:00003:05/0", "nwparser.payload", "The %{p0}"); +var part1956 = match("MESSAGE#56:00002/1_1", "nwparser.p0", "changed%{p0}"); -var part1964 = // "Pattern{Constant('interface'), Field(p0,false)}" -match("MESSAGE#66:00004:04/1_0", "nwparser.p0", "interface%{p0}"); +var part1957 = match("MESSAGE#61:00003:05/0", "nwparser.payload", "The %{p0}"); -var part1965 = // "Pattern{Constant('Interface'), Field(p0,false)}" -match("MESSAGE#66:00004:04/1_1", "nwparser.p0", "Interface%{p0}"); +var part1958 = match("MESSAGE#66:00004:04/1_0", "nwparser.p0", "interface%{p0}"); -var part1966 = // "Pattern{Constant('DNS entries have been '), Field(p0,false)}" -match("MESSAGE#76:00004:14/0", "nwparser.payload", "DNS entries have been %{p0}"); +var part1959 = match("MESSAGE#66:00004:04/1_1", "nwparser.p0", "Interface%{p0}"); -var part1967 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(p0,false)}" -match("MESSAGE#79:00004:17/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{p0}"); +var part1960 = match("MESSAGE#76:00004:14/0", "nwparser.payload", "DNS entries have been %{p0}"); -var part1968 = // "Pattern{Field(zone,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#79:00004:17/1_0", "nwparser.p0", "%{zone}, %{p0}"); +var part1961 = match("MESSAGE#79:00004:17/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{p0}"); -var part1969 = // "Pattern{Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#79:00004:17/1_1", "nwparser.p0", "%{zone->} %{p0}"); +var part1962 = match("MESSAGE#79:00004:17/1_0", "nwparser.p0", "%{zone}, %{p0}"); -var part1970 = // "Pattern{Constant('int '), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#79:00004:17/2", "nwparser.p0", "int %{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); +var part1963 = match("MESSAGE#79:00004:17/1_1", "nwparser.p0", "%{zone->} %{p0}"); -var part1971 = // "Pattern{Field(dport,false), Constant(','), Field(p0,false)}" -match("MESSAGE#83:00005:03/1_0", "nwparser.p0", "%{dport},%{p0}"); +var part1964 = match("MESSAGE#79:00004:17/2", "nwparser.p0", "int %{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); -var part1972 = // "Pattern{Field(dport,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#83:00005:03/1_1", "nwparser.p0", "%{dport->} %{p0}"); +var part1965 = match("MESSAGE#83:00005:03/1_0", "nwparser.p0", "%{dport},%{p0}"); -var part1973 = // "Pattern{Field(space,false), Constant('using protocol '), Field(p0,false)}" -match("MESSAGE#83:00005:03/2", "nwparser.p0", "%{space}using protocol %{p0}"); +var part1966 = match("MESSAGE#83:00005:03/1_1", "nwparser.p0", "%{dport->} %{p0}"); -var part1974 = // "Pattern{Field(protocol,false), Constant(','), Field(p0,false)}" -match("MESSAGE#83:00005:03/3_0", "nwparser.p0", "%{protocol},%{p0}"); +var part1967 = match("MESSAGE#83:00005:03/2", "nwparser.p0", "%{space}using protocol %{p0}"); -var part1975 = // "Pattern{Field(protocol,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#83:00005:03/3_1", "nwparser.p0", "%{protocol->} %{p0}"); +var part1968 = match("MESSAGE#83:00005:03/3_0", "nwparser.p0", "%{protocol},%{p0}"); -var part1976 = // "Pattern{Constant('. '), Field(p0,false)}" -match("MESSAGE#83:00005:03/5_1", "nwparser.p0", ". %{p0}"); +var part1969 = match("MESSAGE#83:00005:03/3_1", "nwparser.p0", "%{protocol->} %{p0}"); -var part1977 = // "Pattern{Field(fld2,false), Constant(': SYN '), Field(p0,false)}" -match("MESSAGE#86:00005:06/0_0", "nwparser.payload", "%{fld2}: SYN %{p0}"); +var part1970 = match("MESSAGE#83:00005:03/5_1", "nwparser.p0", ". %{p0}"); -var part1978 = // "Pattern{Constant('SYN '), Field(p0,false)}" -match("MESSAGE#86:00005:06/0_1", "nwparser.payload", "SYN %{p0}"); +var part1971 = match("MESSAGE#86:00005:06/0_0", "nwparser.payload", "%{fld2}: SYN %{p0}"); -var part1979 = // "Pattern{Constant('timeout value '), Field(p0,false)}" -match("MESSAGE#87:00005:07/1_2", "nwparser.p0", "timeout value %{p0}"); +var part1972 = match("MESSAGE#86:00005:06/0_1", "nwparser.payload", "SYN %{p0}"); -var part1980 = // "Pattern{Constant('destination '), Field(p0,false)}" -match("MESSAGE#88:00005:08/2_0", "nwparser.p0", "destination %{p0}"); +var part1973 = match("MESSAGE#87:00005:07/1_2", "nwparser.p0", "timeout value %{p0}"); -var part1981 = // "Pattern{Constant('source '), Field(p0,false)}" -match("MESSAGE#88:00005:08/2_1", "nwparser.p0", "source %{p0}"); +var part1974 = match("MESSAGE#88:00005:08/2_0", "nwparser.p0", "destination %{p0}"); -var part1982 = // "Pattern{Constant('A '), Field(p0,false)}" -match("MESSAGE#97:00005:17/0", "nwparser.payload", "A %{p0}"); +var part1975 = match("MESSAGE#88:00005:08/2_1", "nwparser.p0", "source %{p0}"); -var part1983 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#98:00005:18/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var part1976 = match("MESSAGE#97:00005:17/0", "nwparser.payload", "A %{p0}"); -var part1984 = // "Pattern{Constant(', int '), Field(p0,false)}" -match("MESSAGE#98:00005:18/1_0", "nwparser.p0", ", int %{p0}"); +var part1977 = match("MESSAGE#98:00005:18/0", "nwparser.payload", "%{signame->} From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var part1985 = // "Pattern{Constant('int '), Field(p0,false)}" -match("MESSAGE#98:00005:18/1_1", "nwparser.p0", "int %{p0}"); +var part1978 = match("MESSAGE#98:00005:18/1_0", "nwparser.p0", ", int %{p0}"); -var part1986 = // "Pattern{Constant(''), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#98:00005:18/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); +var part1979 = match("MESSAGE#98:00005:18/1_1", "nwparser.p0", "int %{p0}"); -var part1987 = // "Pattern{Constant('HA '), Field(p0,false)}" -match("MESSAGE#111:00007:04/0", "nwparser.payload", "HA %{p0}"); +var part1980 = match("MESSAGE#98:00005:18/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times. (%{fld1})"); -var part1988 = // "Pattern{Constant('encryption '), Field(p0,false)}" -match("MESSAGE#111:00007:04/1_0", "nwparser.p0", "encryption %{p0}"); +var part1981 = match("MESSAGE#111:00007:04/0", "nwparser.payload", "HA %{p0}"); -var part1989 = // "Pattern{Constant('authentication '), Field(p0,false)}" -match("MESSAGE#111:00007:04/1_1", "nwparser.p0", "authentication %{p0}"); +var part1982 = match("MESSAGE#111:00007:04/1_0", "nwparser.p0", "encryption %{p0}"); -var part1990 = // "Pattern{Constant('key '), Field(p0,false)}" -match("MESSAGE#111:00007:04/3_1", "nwparser.p0", "key %{p0}"); +var part1983 = match("MESSAGE#111:00007:04/1_1", "nwparser.p0", "authentication %{p0}"); -var part1991 = // "Pattern{Constant('disabled'), Field(,false)}" -match("MESSAGE#118:00007:11/1_0", "nwparser.p0", "disabled%{}"); +var part1984 = match("MESSAGE#111:00007:04/3_1", "nwparser.p0", "key %{p0}"); -var part1992 = // "Pattern{Constant('set to '), Field(trigger_val,false)}" -match("MESSAGE#118:00007:11/1_1", "nwparser.p0", "set to %{trigger_val}"); +var part1985 = match("MESSAGE#118:00007:11/1_0", "nwparser.p0", "disabled%{}"); -var part1993 = // "Pattern{Constant('up'), Field(,false)}" -match("MESSAGE#127:00007:21/1_0", "nwparser.p0", "up%{}"); +var part1986 = match("MESSAGE#118:00007:11/1_1", "nwparser.p0", "set to %{trigger_val}"); -var part1994 = // "Pattern{Constant('down'), Field(,false)}" -match("MESSAGE#127:00007:21/1_1", "nwparser.p0", "down%{}"); +var part1987 = match("MESSAGE#127:00007:21/1_0", "nwparser.p0", "up%{}"); -var part1995 = // "Pattern{Constant(' '), Field(p0,false)}" -match("MESSAGE#139:00007:33/2_1", "nwparser.p0", " %{p0}"); +var part1988 = match("MESSAGE#127:00007:21/1_1", "nwparser.p0", "down%{}"); -var part1996 = // "Pattern{Constant('set'), Field(,false)}" -match("MESSAGE#143:00007:37/1_0", "nwparser.p0", "set%{}"); +var part1989 = match("MESSAGE#139:00007:33/2_1", "nwparser.p0", " %{p0}"); -var part1997 = // "Pattern{Constant('unset'), Field(,false)}" -match("MESSAGE#143:00007:37/1_1", "nwparser.p0", "unset%{}"); +var part1990 = match("MESSAGE#143:00007:37/1_0", "nwparser.p0", "set%{}"); -var part1998 = // "Pattern{Constant('undefined '), Field(p0,false)}" -match("MESSAGE#144:00007:38/1_0", "nwparser.p0", "undefined %{p0}"); +var part1991 = match("MESSAGE#143:00007:37/1_1", "nwparser.p0", "unset%{}"); -var part1999 = // "Pattern{Constant('set '), Field(p0,false)}" -match("MESSAGE#144:00007:38/1_1", "nwparser.p0", "set %{p0}"); +var part1992 = match("MESSAGE#144:00007:38/1_0", "nwparser.p0", "undefined %{p0}"); -var part2000 = // "Pattern{Constant('active '), Field(p0,false)}" -match("MESSAGE#144:00007:38/1_2", "nwparser.p0", "active %{p0}"); +var part1993 = match("MESSAGE#144:00007:38/1_1", "nwparser.p0", "set %{p0}"); -var part2001 = // "Pattern{Constant('to '), Field(p0,false)}" -match("MESSAGE#144:00007:38/2", "nwparser.p0", "to %{p0}"); +var part1994 = match("MESSAGE#144:00007:38/1_2", "nwparser.p0", "active %{p0}"); -var part2002 = // "Pattern{Constant('created '), Field(p0,false)}" -match("MESSAGE#157:00007:51/1_0", "nwparser.p0", "created %{p0}"); +var part1995 = match("MESSAGE#144:00007:38/2", "nwparser.p0", "to %{p0}"); -var part2003 = // "Pattern{Constant(', '), Field(p0,false)}" -match("MESSAGE#157:00007:51/3_0", "nwparser.p0", ", %{p0}"); +var part1996 = match("MESSAGE#157:00007:51/1_0", "nwparser.p0", "created %{p0}"); -var part2004 = // "Pattern{Constant('is '), Field(p0,false)}" -match("MESSAGE#157:00007:51/5_0", "nwparser.p0", "is %{p0}"); +var part1997 = match("MESSAGE#157:00007:51/3_0", "nwparser.p0", ", %{p0}"); -var part2005 = // "Pattern{Constant('was '), Field(p0,false)}" -match("MESSAGE#157:00007:51/5_1", "nwparser.p0", "was %{p0}"); +var part1998 = match("MESSAGE#157:00007:51/5_0", "nwparser.p0", "is %{p0}"); -var part2006 = // "Pattern{Constant(''), Field(fld2,false)}" -match("MESSAGE#157:00007:51/6", "nwparser.p0", "%{fld2}"); +var part1999 = match("MESSAGE#157:00007:51/5_1", "nwparser.p0", "was %{p0}"); -var part2007 = // "Pattern{Constant('threshold '), Field(p0,false)}" -match("MESSAGE#163:00007:57/1_0", "nwparser.p0", "threshold %{p0}"); +var part2000 = match("MESSAGE#157:00007:51/6", "nwparser.p0", "%{fld2}"); -var part2008 = // "Pattern{Constant('interval '), Field(p0,false)}" -match("MESSAGE#163:00007:57/1_1", "nwparser.p0", "interval %{p0}"); +var part2001 = match("MESSAGE#163:00007:57/1_0", "nwparser.p0", "threshold %{p0}"); -var part2009 = // "Pattern{Constant('of '), Field(p0,false)}" -match("MESSAGE#163:00007:57/3_0", "nwparser.p0", "of %{p0}"); +var part2002 = match("MESSAGE#163:00007:57/1_1", "nwparser.p0", "interval %{p0}"); -var part2010 = // "Pattern{Constant('that '), Field(p0,false)}" -match("MESSAGE#163:00007:57/3_1", "nwparser.p0", "that %{p0}"); +var part2003 = match("MESSAGE#163:00007:57/3_0", "nwparser.p0", "of %{p0}"); -var part2011 = // "Pattern{Constant('Zone '), Field(p0,false)}" -match("MESSAGE#170:00007:64/0_0", "nwparser.payload", "Zone %{p0}"); +var part2004 = match("MESSAGE#163:00007:57/3_1", "nwparser.p0", "that %{p0}"); -var part2012 = // "Pattern{Constant('Interface '), Field(p0,false)}" -match("MESSAGE#170:00007:64/0_1", "nwparser.payload", "Interface %{p0}"); +var part2005 = match("MESSAGE#170:00007:64/0_0", "nwparser.payload", "Zone %{p0}"); -var part2013 = // "Pattern{Constant('n '), Field(p0,false)}" -match("MESSAGE#172:00007:66/2_1", "nwparser.p0", "n %{p0}"); +var part2006 = match("MESSAGE#170:00007:64/0_1", "nwparser.payload", "Interface %{p0}"); -var part2014 = // "Pattern{Constant('.'), Field(,false)}" -match("MESSAGE#174:00007:68/4", "nwparser.p0", ".%{}"); +var part2007 = match("MESSAGE#172:00007:66/2_1", "nwparser.p0", "n %{p0}"); -var part2015 = // "Pattern{Constant('for '), Field(p0,false)}" -match("MESSAGE#195:00009:06/1", "nwparser.p0", "for %{p0}"); +var part2008 = match("MESSAGE#174:00007:68/4", "nwparser.p0", ".%{}"); -var part2016 = // "Pattern{Constant('the '), Field(p0,false)}" -match("MESSAGE#195:00009:06/2_0", "nwparser.p0", "the %{p0}"); +var part2009 = match("MESSAGE#195:00009:06/1", "nwparser.p0", "for %{p0}"); -var part2017 = // "Pattern{Constant('removed '), Field(p0,false)}" -match("MESSAGE#195:00009:06/4_0", "nwparser.p0", "removed %{p0}"); +var part2010 = match("MESSAGE#195:00009:06/2_0", "nwparser.p0", "the %{p0}"); -var part2018 = // "Pattern{Constant('interface '), Field(p0,false)}" -match("MESSAGE#202:00009:14/2_0", "nwparser.p0", "interface %{p0}"); +var part2011 = match("MESSAGE#195:00009:06/4_0", "nwparser.p0", "removed %{p0}"); -var part2019 = // "Pattern{Constant('the interface '), Field(p0,false)}" -match("MESSAGE#202:00009:14/2_1", "nwparser.p0", "the interface %{p0}"); +var part2012 = match("MESSAGE#202:00009:14/2_0", "nwparser.p0", "interface %{p0}"); -var part2020 = // "Pattern{Field(interface,false)}" -match_copy("MESSAGE#202:00009:14/4_1", "nwparser.p0", "interface"); +var part2013 = match("MESSAGE#202:00009:14/2_1", "nwparser.p0", "the interface %{p0}"); -var part2021 = // "Pattern{Constant('s '), Field(p0,false)}" -match("MESSAGE#203:00009:15/1_1", "nwparser.p0", "s %{p0}"); +var part2014 = match_copy("MESSAGE#202:00009:14/4_1", "nwparser.p0", "interface"); -var part2022 = // "Pattern{Constant('on interface '), Field(interface,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#203:00009:15/2", "nwparser.p0", "on interface %{interface->} %{p0}"); +var part2015 = match("MESSAGE#203:00009:15/1_1", "nwparser.p0", "s %{p0}"); -var part2023 = // "Pattern{Constant('has been '), Field(p0,false)}" -match("MESSAGE#203:00009:15/3_0", "nwparser.p0", "has been %{p0}"); +var part2016 = match("MESSAGE#203:00009:15/2", "nwparser.p0", "on interface %{interface->} %{p0}"); -var part2024 = // "Pattern{Constant(''), Field(disposition,false), Constant('.')}" -match("MESSAGE#203:00009:15/4", "nwparser.p0", "%{disposition}."); +var part2017 = match("MESSAGE#203:00009:15/3_0", "nwparser.p0", "has been %{p0}"); -var part2025 = // "Pattern{Constant('removed from '), Field(p0,false)}" -match("MESSAGE#204:00009:16/3_0", "nwparser.p0", "removed from %{p0}"); +var part2018 = match("MESSAGE#203:00009:15/4", "nwparser.p0", "%{disposition}."); -var part2026 = // "Pattern{Constant('added to '), Field(p0,false)}" -match("MESSAGE#204:00009:16/3_1", "nwparser.p0", "added to %{p0}"); +var part2019 = match("MESSAGE#204:00009:16/3_0", "nwparser.p0", "removed from %{p0}"); -var part2027 = // "Pattern{Constant(''), Field(interface,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#210:00009:21/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times. (%{fld1})"); +var part2020 = match("MESSAGE#204:00009:16/3_1", "nwparser.p0", "added to %{p0}"); -var part2028 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#219:00010:03/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); +var part2021 = match("MESSAGE#210:00009:21/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times. (%{fld1})"); -var part2029 = // "Pattern{Constant('Interface '), Field(p0,false)}" -match("MESSAGE#224:00011:04/1_1", "nwparser.p0", "Interface %{p0}"); +var part2022 = match("MESSAGE#219:00010:03/0", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, proto %{protocol->} (zone %{zone->} %{p0}"); -var part2030 = // "Pattern{Constant('set to '), Field(fld2,false)}" -match("MESSAGE#233:00011:14/1_0", "nwparser.p0", "set to %{fld2}"); +var part2023 = match("MESSAGE#224:00011:04/1_1", "nwparser.p0", "Interface %{p0}"); -var part2031 = // "Pattern{Constant('gateway '), Field(p0,false)}" -match("MESSAGE#237:00011:18/4_1", "nwparser.p0", "gateway %{p0}"); +var part2024 = match("MESSAGE#233:00011:14/1_0", "nwparser.p0", "set to %{fld2}"); -var part2032 = // "Pattern{Field(,true), Constant(' '), Field(disposition,false)}" -match("MESSAGE#238:00011:19/6", "nwparser.p0", "%{} %{disposition}"); +var part2025 = match("MESSAGE#237:00011:18/4_1", "nwparser.p0", "gateway %{p0}"); -var part2033 = // "Pattern{Constant('port number '), Field(p0,false)}" -match("MESSAGE#274:00015:02/1_1", "nwparser.p0", "port number %{p0}"); +var part2026 = match("MESSAGE#238:00011:19/6", "nwparser.p0", "%{} %{disposition}"); -var part2034 = // "Pattern{Constant('has been '), Field(disposition,false)}" -match("MESSAGE#274:00015:02/2", "nwparser.p0", "has been %{disposition}"); +var part2027 = match("MESSAGE#274:00015:02/1_1", "nwparser.p0", "port number %{p0}"); -var part2035 = // "Pattern{Constant('IP '), Field(p0,false)}" -match("MESSAGE#276:00015:04/1_0", "nwparser.p0", "IP %{p0}"); +var part2028 = match("MESSAGE#274:00015:02/2", "nwparser.p0", "has been %{disposition}"); -var part2036 = // "Pattern{Constant('port '), Field(p0,false)}" -match("MESSAGE#276:00015:04/1_1", "nwparser.p0", "port %{p0}"); +var part2029 = match("MESSAGE#276:00015:04/1_0", "nwparser.p0", "IP %{p0}"); -var part2037 = // "Pattern{Constant('up '), Field(p0,false)}" -match("MESSAGE#284:00015:12/3_0", "nwparser.p0", "up %{p0}"); +var part2030 = match("MESSAGE#276:00015:04/1_1", "nwparser.p0", "port %{p0}"); -var part2038 = // "Pattern{Constant('down '), Field(p0,false)}" -match("MESSAGE#284:00015:12/3_1", "nwparser.p0", "down %{p0}"); +var part2031 = match("MESSAGE#284:00015:12/3_0", "nwparser.p0", "up %{p0}"); -var part2039 = // "Pattern{Constant('('), Field(fld1,false), Constant(') ')}" -match("MESSAGE#294:00015:22/2_0", "nwparser.p0", "(%{fld1}) "); +var part2032 = match("MESSAGE#284:00015:12/3_1", "nwparser.p0", "down %{p0}"); -var part2040 = // "Pattern{Constant(': '), Field(p0,false)}" -match("MESSAGE#317:00017:01/2_0", "nwparser.p0", ": %{p0}"); +var part2033 = match("MESSAGE#294:00015:22/2_0", "nwparser.p0", "(%{fld1}) "); -var part2041 = // "Pattern{Constant('IP '), Field(p0,false)}" -match("MESSAGE#320:00017:04/0", "nwparser.payload", "IP %{p0}"); +var part2034 = match("MESSAGE#317:00017:01/2_0", "nwparser.p0", ": %{p0}"); -var part2042 = // "Pattern{Constant('address pool '), Field(p0,false)}" -match("MESSAGE#320:00017:04/1_0", "nwparser.p0", "address pool %{p0}"); +var part2035 = match("MESSAGE#320:00017:04/0", "nwparser.payload", "IP %{p0}"); -var part2043 = // "Pattern{Constant('pool '), Field(p0,false)}" -match("MESSAGE#320:00017:04/1_1", "nwparser.p0", "pool %{p0}"); +var part2036 = match("MESSAGE#320:00017:04/1_0", "nwparser.p0", "address pool %{p0}"); -var part2044 = // "Pattern{Constant('enabled '), Field(p0,false)}" -match("MESSAGE#326:00017:10/1_0", "nwparser.p0", "enabled %{p0}"); +var part2037 = match("MESSAGE#320:00017:04/1_1", "nwparser.p0", "pool %{p0}"); -var part2045 = // "Pattern{Constant('disabled '), Field(p0,false)}" -match("MESSAGE#326:00017:10/1_1", "nwparser.p0", "disabled %{p0}"); +var part2038 = match("MESSAGE#326:00017:10/1_0", "nwparser.p0", "enabled %{p0}"); -var part2046 = // "Pattern{Constant('AH '), Field(p0,false)}" -match("MESSAGE#332:00017:15/1_0", "nwparser.p0", "AH %{p0}"); +var part2039 = match("MESSAGE#326:00017:10/1_1", "nwparser.p0", "disabled %{p0}"); -var part2047 = // "Pattern{Constant('ESP '), Field(p0,false)}" -match("MESSAGE#332:00017:15/1_1", "nwparser.p0", "ESP %{p0}"); +var part2040 = match("MESSAGE#332:00017:15/1_0", "nwparser.p0", "AH %{p0}"); -var part2048 = // "Pattern{Constant('’'), Field(p0,false)}" -match("MESSAGE#347:00018:02/1_0", "nwparser.p0", "’%{p0}"); +var part2041 = match("MESSAGE#332:00017:15/1_1", "nwparser.p0", "ESP %{p0}"); -var part2049 = // "Pattern{Constant('&'), Field(p0,false)}" -match("MESSAGE#347:00018:02/1_1", "nwparser.p0", "\u0026%{p0}"); +var part2042 = match("MESSAGE#354:00018:11/0", "nwparser.payload", "%{} %{p0}"); -var part2050 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#354:00018:11/0", "nwparser.payload", "%{} %{p0}"); +var part2043 = match("MESSAGE#356:00018:32/0_0", "nwparser.payload", "Source%{p0}"); -var part2051 = // "Pattern{Constant('Source'), Field(p0,false)}" -match("MESSAGE#356:00018:32/0_0", "nwparser.payload", "Source%{p0}"); +var part2044 = match("MESSAGE#356:00018:32/0_1", "nwparser.payload", "Destination%{p0}"); -var part2052 = // "Pattern{Constant('Destination'), Field(p0,false)}" -match("MESSAGE#356:00018:32/0_1", "nwparser.payload", "Destination%{p0}"); +var part2045 = match("MESSAGE#356:00018:32/2_0", "nwparser.p0", "from %{p0}"); -var part2053 = // "Pattern{Constant('from '), Field(p0,false)}" -match("MESSAGE#356:00018:32/2_0", "nwparser.p0", "from %{p0}"); +var part2046 = match("MESSAGE#356:00018:32/3", "nwparser.p0", "policy ID %{policy_id->} by admin %{administrator->} via NSRP Peer . (%{fld1})"); -var part2054 = // "Pattern{Constant('policy ID '), Field(policy_id,true), Constant(' by admin '), Field(administrator,true), Constant(' via NSRP Peer . ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#356:00018:32/3", "nwparser.p0", "policy ID %{policy_id->} by admin %{administrator->} via NSRP Peer . (%{fld1})"); +var part2047 = match("MESSAGE#375:00019:01/0", "nwparser.payload", "Attempt to enable %{p0}"); -var part2055 = // "Pattern{Constant('Attempt to enable '), Field(p0,false)}" -match("MESSAGE#375:00019:01/0", "nwparser.payload", "Attempt to enable %{p0}"); +var part2048 = match("MESSAGE#375:00019:01/1_0", "nwparser.p0", "traffic logging via syslog %{p0}"); -var part2056 = // "Pattern{Constant('traffic logging via syslog '), Field(p0,false)}" -match("MESSAGE#375:00019:01/1_0", "nwparser.p0", "traffic logging via syslog %{p0}"); +var part2049 = match("MESSAGE#375:00019:01/1_1", "nwparser.p0", "syslog %{p0}"); -var part2057 = // "Pattern{Constant('syslog '), Field(p0,false)}" -match("MESSAGE#375:00019:01/1_1", "nwparser.p0", "syslog %{p0}"); +var part2050 = match("MESSAGE#378:00019:04/0", "nwparser.payload", "Syslog %{p0}"); -var part2058 = // "Pattern{Constant('Syslog '), Field(p0,false)}" -match("MESSAGE#378:00019:04/0", "nwparser.payload", "Syslog %{p0}"); +var part2051 = match("MESSAGE#378:00019:04/1_0", "nwparser.p0", "host %{p0}"); -var part2059 = // "Pattern{Constant('host '), Field(p0,false)}" -match("MESSAGE#378:00019:04/1_0", "nwparser.p0", "host %{p0}"); +var part2052 = match("MESSAGE#378:00019:04/3_1", "nwparser.p0", "domain name %{p0}"); -var part2060 = // "Pattern{Constant('domain name '), Field(p0,false)}" -match("MESSAGE#378:00019:04/3_1", "nwparser.p0", "domain name %{p0}"); +var part2053 = match("MESSAGE#378:00019:04/4", "nwparser.p0", "has been changed to %{fld2}"); -var part2061 = // "Pattern{Constant('has been changed to '), Field(fld2,false)}" -match("MESSAGE#378:00019:04/4", "nwparser.p0", "has been changed to %{fld2}"); +var part2054 = match("MESSAGE#380:00019:06/1_0", "nwparser.p0", "security facility %{p0}"); -var part2062 = // "Pattern{Constant('security facility '), Field(p0,false)}" -match("MESSAGE#380:00019:06/1_0", "nwparser.p0", "security facility %{p0}"); +var part2055 = match("MESSAGE#380:00019:06/1_1", "nwparser.p0", "facility %{p0}"); -var part2063 = // "Pattern{Constant('facility '), Field(p0,false)}" -match("MESSAGE#380:00019:06/1_1", "nwparser.p0", "facility %{p0}"); +var part2056 = match("MESSAGE#380:00019:06/3_0", "nwparser.p0", "local0%{}"); -var part2064 = // "Pattern{Constant('local0'), Field(,false)}" -match("MESSAGE#380:00019:06/3_0", "nwparser.p0", "local0%{}"); +var part2057 = match("MESSAGE#380:00019:06/3_1", "nwparser.p0", "local1%{}"); -var part2065 = // "Pattern{Constant('local1'), Field(,false)}" -match("MESSAGE#380:00019:06/3_1", "nwparser.p0", "local1%{}"); +var part2058 = match("MESSAGE#380:00019:06/3_2", "nwparser.p0", "local2%{}"); -var part2066 = // "Pattern{Constant('local2'), Field(,false)}" -match("MESSAGE#380:00019:06/3_2", "nwparser.p0", "local2%{}"); +var part2059 = match("MESSAGE#380:00019:06/3_3", "nwparser.p0", "local3%{}"); -var part2067 = // "Pattern{Constant('local3'), Field(,false)}" -match("MESSAGE#380:00019:06/3_3", "nwparser.p0", "local3%{}"); +var part2060 = match("MESSAGE#380:00019:06/3_4", "nwparser.p0", "local4%{}"); -var part2068 = // "Pattern{Constant('local4'), Field(,false)}" -match("MESSAGE#380:00019:06/3_4", "nwparser.p0", "local4%{}"); +var part2061 = match("MESSAGE#380:00019:06/3_5", "nwparser.p0", "local5%{}"); -var part2069 = // "Pattern{Constant('local5'), Field(,false)}" -match("MESSAGE#380:00019:06/3_5", "nwparser.p0", "local5%{}"); +var part2062 = match("MESSAGE#380:00019:06/3_6", "nwparser.p0", "local6%{}"); -var part2070 = // "Pattern{Constant('local6'), Field(,false)}" -match("MESSAGE#380:00019:06/3_6", "nwparser.p0", "local6%{}"); +var part2063 = match("MESSAGE#380:00019:06/3_7", "nwparser.p0", "local7%{}"); -var part2071 = // "Pattern{Constant('local7'), Field(,false)}" -match("MESSAGE#380:00019:06/3_7", "nwparser.p0", "local7%{}"); +var part2064 = match("MESSAGE#380:00019:06/3_8", "nwparser.p0", "auth/sec%{}"); -var part2072 = // "Pattern{Constant('auth/sec'), Field(,false)}" -match("MESSAGE#380:00019:06/3_8", "nwparser.p0", "auth/sec%{}"); +var part2065 = match("MESSAGE#384:00019:10/0", "nwparser.payload", "%{fld2->} %{p0}"); -var part2073 = // "Pattern{Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#384:00019:10/0", "nwparser.payload", "%{fld2->} %{p0}"); +var part2066 = match("MESSAGE#405:00022/0", "nwparser.payload", "All %{p0}"); -var part2074 = // "Pattern{Constant('All '), Field(p0,false)}" -match("MESSAGE#405:00022/0", "nwparser.payload", "All %{p0}"); +var part2067 = match("MESSAGE#414:00022:09/1_0", "nwparser.p0", "primary %{p0}"); -var part2075 = // "Pattern{Constant('primary '), Field(p0,false)}" -match("MESSAGE#414:00022:09/1_0", "nwparser.p0", "primary %{p0}"); +var part2068 = match("MESSAGE#414:00022:09/1_1", "nwparser.p0", "secondary %{p0}"); -var part2076 = // "Pattern{Constant('secondary '), Field(p0,false)}" -match("MESSAGE#414:00022:09/1_1", "nwparser.p0", "secondary %{p0}"); +var part2069 = match("MESSAGE#414:00022:09/3_0", "nwparser.p0", "t %{p0}"); -var part2077 = // "Pattern{Constant('t '), Field(p0,false)}" -match("MESSAGE#414:00022:09/3_0", "nwparser.p0", "t %{p0}"); +var part2070 = match("MESSAGE#414:00022:09/3_1", "nwparser.p0", "w %{p0}"); -var part2078 = // "Pattern{Constant('w '), Field(p0,false)}" -match("MESSAGE#414:00022:09/3_1", "nwparser.p0", "w %{p0}"); +var part2071 = match("MESSAGE#423:00024/1", "nwparser.p0", "server %{p0}"); -var part2079 = // "Pattern{Constant('server '), Field(p0,false)}" -match("MESSAGE#423:00024/1", "nwparser.p0", "server %{p0}"); +var part2072 = match("MESSAGE#426:00024:03/1_0", "nwparser.p0", "has %{p0}"); -var part2080 = // "Pattern{Constant('has '), Field(p0,false)}" -match("MESSAGE#426:00024:03/1_0", "nwparser.p0", "has %{p0}"); +var part2073 = match("MESSAGE#434:00026:01/0", "nwparser.payload", "SCS%{p0}"); -var part2081 = // "Pattern{Constant('SCS'), Field(p0,false)}" -match("MESSAGE#434:00026:01/0", "nwparser.payload", "SCS%{p0}"); +var part2074 = match("MESSAGE#434:00026:01/3_0", "nwparser.p0", "bound to %{p0}"); -var part2082 = // "Pattern{Constant('bound to '), Field(p0,false)}" -match("MESSAGE#434:00026:01/3_0", "nwparser.p0", "bound to %{p0}"); +var part2075 = match("MESSAGE#434:00026:01/3_1", "nwparser.p0", "unbound from %{p0}"); -var part2083 = // "Pattern{Constant('unbound from '), Field(p0,false)}" -match("MESSAGE#434:00026:01/3_1", "nwparser.p0", "unbound from %{p0}"); +var part2076 = match("MESSAGE#441:00026:08/1_1", "nwparser.p0", "PKA RSA %{p0}"); -var part2084 = // "Pattern{Constant('PKA RSA '), Field(p0,false)}" -match("MESSAGE#441:00026:08/1_1", "nwparser.p0", "PKA RSA %{p0}"); +var part2077 = match("MESSAGE#443:00026:10/3_1", "nwparser.p0", "unbind %{p0}"); -var part2085 = // "Pattern{Constant('unbind '), Field(p0,false)}" -match("MESSAGE#443:00026:10/3_1", "nwparser.p0", "unbind %{p0}"); +var part2078 = match("MESSAGE#443:00026:10/4", "nwparser.p0", "PKA key %{p0}"); -var part2086 = // "Pattern{Constant('PKA key '), Field(p0,false)}" -match("MESSAGE#443:00026:10/4", "nwparser.p0", "PKA key %{p0}"); +var part2079 = match("MESSAGE#446:00027/0", "nwparser.payload", "Multiple login failures %{p0}"); -var part2087 = // "Pattern{Constant('Multiple login failures '), Field(p0,false)}" -match("MESSAGE#446:00027/0", "nwparser.payload", "Multiple login failures %{p0}"); +var part2080 = match("MESSAGE#446:00027/1_0", "nwparser.p0", "occurred for %{p0}"); -var part2088 = // "Pattern{Constant('occurred for '), Field(p0,false)}" -match("MESSAGE#446:00027/1_0", "nwparser.p0", "occurred for %{p0}"); +var part2081 = match("MESSAGE#451:00027:05/5_0", "nwparser.p0", "aborted%{}"); -var part2089 = // "Pattern{Constant('aborted'), Field(,false)}" -match("MESSAGE#451:00027:05/5_0", "nwparser.p0", "aborted%{}"); +var part2082 = match("MESSAGE#451:00027:05/5_1", "nwparser.p0", "performed%{}"); -var part2090 = // "Pattern{Constant('performed'), Field(,false)}" -match("MESSAGE#451:00027:05/5_1", "nwparser.p0", "performed%{}"); +var part2083 = match("MESSAGE#466:00029:03/0", "nwparser.payload", "IP pool of DHCP server on %{p0}"); -var part2091 = // "Pattern{Constant('IP pool of DHCP server on '), Field(p0,false)}" -match("MESSAGE#466:00029:03/0", "nwparser.payload", "IP pool of DHCP server on %{p0}"); +var part2084 = match("MESSAGE#492:00030:17/1_0", "nwparser.p0", "certificate %{p0}"); -var part2092 = // "Pattern{Constant('certificate '), Field(p0,false)}" -match("MESSAGE#492:00030:17/1_0", "nwparser.p0", "certificate %{p0}"); +var part2085 = match("MESSAGE#492:00030:17/1_1", "nwparser.p0", "CRL %{p0}"); -var part2093 = // "Pattern{Constant('CRL '), Field(p0,false)}" -match("MESSAGE#492:00030:17/1_1", "nwparser.p0", "CRL %{p0}"); +var part2086 = match("MESSAGE#493:00030:40/1_0", "nwparser.p0", "auto %{p0}"); -var part2094 = // "Pattern{Constant('auto '), Field(p0,false)}" -match("MESSAGE#493:00030:40/1_0", "nwparser.p0", "auto %{p0}"); +var part2087 = match("MESSAGE#508:00030:55/1_0", "nwparser.p0", "RSA %{p0}"); -var part2095 = // "Pattern{Constant('RSA '), Field(p0,false)}" -match("MESSAGE#508:00030:55/1_0", "nwparser.p0", "RSA %{p0}"); +var part2088 = match("MESSAGE#508:00030:55/1_1", "nwparser.p0", "DSA %{p0}"); -var part2096 = // "Pattern{Constant('DSA '), Field(p0,false)}" -match("MESSAGE#508:00030:55/1_1", "nwparser.p0", "DSA %{p0}"); +var part2089 = match("MESSAGE#508:00030:55/2", "nwparser.p0", "key pair.%{}"); -var part2097 = // "Pattern{Constant('key pair.'), Field(,false)}" -match("MESSAGE#508:00030:55/2", "nwparser.p0", "key pair.%{}"); +var part2090 = match("MESSAGE#539:00030:86/0", "nwparser.payload", "FIPS test for %{p0}"); -var part2098 = // "Pattern{Constant('FIPS test for '), Field(p0,false)}" -match("MESSAGE#539:00030:86/0", "nwparser.payload", "FIPS test for %{p0}"); +var part2091 = match("MESSAGE#539:00030:86/1_0", "nwparser.p0", "ECDSA %{p0}"); -var part2099 = // "Pattern{Constant('ECDSA '), Field(p0,false)}" -match("MESSAGE#539:00030:86/1_0", "nwparser.p0", "ECDSA %{p0}"); +var part2092 = match("MESSAGE#543:00031:02/1_0", "nwparser.p0", "yes %{p0}"); -var part2100 = // "Pattern{Constant('yes '), Field(p0,false)}" -match("MESSAGE#543:00031:02/1_0", "nwparser.p0", "yes %{p0}"); +var part2093 = match("MESSAGE#543:00031:02/1_1", "nwparser.p0", "no %{p0}"); -var part2101 = // "Pattern{Constant('no '), Field(p0,false)}" -match("MESSAGE#543:00031:02/1_1", "nwparser.p0", "no %{p0}"); +var part2094 = match("MESSAGE#545:00031:04/1_1", "nwparser.p0", "location %{p0}"); -var part2102 = // "Pattern{Constant('location '), Field(p0,false)}" -match("MESSAGE#545:00031:04/1_1", "nwparser.p0", "location %{p0}"); +var part2095 = match("MESSAGE#548:00031:05/2", "nwparser.p0", "%{} %{interface}"); -var part2103 = // "Pattern{Field(,true), Constant(' '), Field(interface,false)}" -match("MESSAGE#548:00031:05/2", "nwparser.p0", "%{} %{interface}"); +var part2096 = match("MESSAGE#549:00031:06/0", "nwparser.payload", "arp re%{p0}"); -var part2104 = // "Pattern{Constant('arp re'), Field(p0,false)}" -match("MESSAGE#549:00031:06/0", "nwparser.payload", "arp re%{p0}"); +var part2097 = match("MESSAGE#549:00031:06/1_1", "nwparser.p0", "q %{p0}"); -var part2105 = // "Pattern{Constant('q '), Field(p0,false)}" -match("MESSAGE#549:00031:06/1_1", "nwparser.p0", "q %{p0}"); +var part2098 = match("MESSAGE#549:00031:06/1_2", "nwparser.p0", "ply %{p0}"); -var part2106 = // "Pattern{Constant('ply '), Field(p0,false)}" -match("MESSAGE#549:00031:06/1_2", "nwparser.p0", "ply %{p0}"); +var part2099 = match("MESSAGE#549:00031:06/9_0", "nwparser.p0", "%{interface->} (%{fld1})"); -var part2107 = // "Pattern{Field(interface,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#549:00031:06/9_0", "nwparser.p0", "%{interface->} (%{fld1})"); +var part2100 = match("MESSAGE#561:00033/0_0", "nwparser.payload", "Global PRO %{p0}"); -var part2108 = // "Pattern{Constant('Global PRO '), Field(p0,false)}" -match("MESSAGE#561:00033/0_0", "nwparser.payload", "Global PRO %{p0}"); +var part2101 = match("MESSAGE#561:00033/0_1", "nwparser.payload", "%{fld3->} %{p0}"); -var part2109 = // "Pattern{Field(fld3,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#561:00033/0_1", "nwparser.payload", "%{fld3->} %{p0}"); +var part2102 = match("MESSAGE#569:00033:08/0", "nwparser.payload", "NACN Policy Manager %{p0}"); -var part2110 = // "Pattern{Constant('NACN Policy Manager '), Field(p0,false)}" -match("MESSAGE#569:00033:08/0", "nwparser.payload", "NACN Policy Manager %{p0}"); +var part2103 = match("MESSAGE#569:00033:08/1_0", "nwparser.p0", "1 %{p0}"); -var part2111 = // "Pattern{Constant('1 '), Field(p0,false)}" -match("MESSAGE#569:00033:08/1_0", "nwparser.p0", "1 %{p0}"); +var part2104 = match("MESSAGE#569:00033:08/1_1", "nwparser.p0", "2 %{p0}"); -var part2112 = // "Pattern{Constant('2 '), Field(p0,false)}" -match("MESSAGE#569:00033:08/1_1", "nwparser.p0", "2 %{p0}"); +var part2105 = match("MESSAGE#571:00033:10/3_1", "nwparser.p0", "unset %{p0}"); -var part2113 = // "Pattern{Constant('unset '), Field(p0,false)}" -match("MESSAGE#571:00033:10/3_1", "nwparser.p0", "unset %{p0}"); +var part2106 = match("MESSAGE#581:00033:21/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var part2114 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#581:00033:21/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var part2107 = match("MESSAGE#586:00034:01/2_1", "nwparser.p0", "SSH %{p0}"); -var part2115 = // "Pattern{Constant('SSH '), Field(p0,false)}" -match("MESSAGE#586:00034:01/2_1", "nwparser.p0", "SSH %{p0}"); +var part2108 = match("MESSAGE#588:00034:03/0_0", "nwparser.payload", "SCS: NetScreen %{p0}"); -var part2116 = // "Pattern{Constant('SCS: NetScreen '), Field(p0,false)}" -match("MESSAGE#588:00034:03/0_0", "nwparser.payload", "SCS: NetScreen %{p0}"); +var part2109 = match("MESSAGE#588:00034:03/0_1", "nwparser.payload", "NetScreen %{p0}"); -var part2117 = // "Pattern{Constant('NetScreen '), Field(p0,false)}" -match("MESSAGE#588:00034:03/0_1", "nwparser.payload", "NetScreen %{p0}"); +var part2110 = match("MESSAGE#595:00034:10/0", "nwparser.payload", "S%{p0}"); -var part2118 = // "Pattern{Constant('S'), Field(p0,false)}" -match("MESSAGE#595:00034:10/0", "nwparser.payload", "S%{p0}"); +var part2111 = match("MESSAGE#595:00034:10/1_0", "nwparser.p0", "CS: SSH%{p0}"); -var part2119 = // "Pattern{Constant('CS: SSH'), Field(p0,false)}" -match("MESSAGE#595:00034:10/1_0", "nwparser.p0", "CS: SSH%{p0}"); +var part2112 = match("MESSAGE#595:00034:10/1_1", "nwparser.p0", "SH%{p0}"); -var part2120 = // "Pattern{Constant('SH'), Field(p0,false)}" -match("MESSAGE#595:00034:10/1_1", "nwparser.p0", "SH%{p0}"); +var part2113 = match("MESSAGE#596:00034:12/3_0", "nwparser.p0", "the root system %{p0}"); -var part2121 = // "Pattern{Constant('the root system '), Field(p0,false)}" -match("MESSAGE#596:00034:12/3_0", "nwparser.p0", "the root system %{p0}"); +var part2114 = match("MESSAGE#596:00034:12/3_1", "nwparser.p0", "vsys %{fld2->} %{p0}"); -var part2122 = // "Pattern{Constant('vsys '), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#596:00034:12/3_1", "nwparser.p0", "vsys %{fld2->} %{p0}"); +var part2115 = match("MESSAGE#599:00034:18/1_0", "nwparser.p0", "CS: SSH %{p0}"); -var part2123 = // "Pattern{Constant('CS: SSH '), Field(p0,false)}" -match("MESSAGE#599:00034:18/1_0", "nwparser.p0", "CS: SSH %{p0}"); +var part2116 = match("MESSAGE#599:00034:18/1_1", "nwparser.p0", "SH %{p0}"); -var part2124 = // "Pattern{Constant('SH '), Field(p0,false)}" -match("MESSAGE#599:00034:18/1_1", "nwparser.p0", "SH %{p0}"); +var part2117 = match("MESSAGE#630:00035:06/1_0", "nwparser.p0", "a %{p0}"); -var part2125 = // "Pattern{Constant('a '), Field(p0,false)}" -match("MESSAGE#630:00035:06/1_0", "nwparser.p0", "a %{p0}"); +var part2118 = match("MESSAGE#630:00035:06/1_1", "nwparser.p0", "ert %{p0}"); -var part2126 = // "Pattern{Constant('ert '), Field(p0,false)}" -match("MESSAGE#630:00035:06/1_1", "nwparser.p0", "ert %{p0}"); +var part2119 = match("MESSAGE#633:00035:09/0", "nwparser.payload", "SSL %{p0}"); -var part2127 = // "Pattern{Constant('SSL '), Field(p0,false)}" -match("MESSAGE#633:00035:09/0", "nwparser.payload", "SSL %{p0}"); +var part2120 = match("MESSAGE#644:00037:01/1_0", "nwparser.p0", "id: %{p0}"); -var part2128 = // "Pattern{Constant('id: '), Field(p0,false)}" -match("MESSAGE#644:00037:01/1_0", "nwparser.p0", "id: %{p0}"); +var part2121 = match("MESSAGE#644:00037:01/1_1", "nwparser.p0", "ID %{p0}"); -var part2129 = // "Pattern{Constant('ID '), Field(p0,false)}" -match("MESSAGE#644:00037:01/1_1", "nwparser.p0", "ID %{p0}"); +var part2122 = match("MESSAGE#659:00044/1_0", "nwparser.p0", "permit %{p0}"); -var part2130 = // "Pattern{Constant('permit '), Field(p0,false)}" -match("MESSAGE#659:00044/1_0", "nwparser.p0", "permit %{p0}"); +var part2123 = match("MESSAGE#675:00055/0", "nwparser.payload", "IGMP %{p0}"); -var part2131 = // "Pattern{Constant('IGMP '), Field(p0,false)}" -match("MESSAGE#675:00055/0", "nwparser.payload", "IGMP %{p0}"); +var part2124 = match("MESSAGE#677:00055:02/0", "nwparser.payload", "IGMP will %{p0}"); -var part2132 = // "Pattern{Constant('IGMP will '), Field(p0,false)}" -match("MESSAGE#677:00055:02/0", "nwparser.payload", "IGMP will %{p0}"); +var part2125 = match("MESSAGE#677:00055:02/1_0", "nwparser.p0", "not do %{p0}"); -var part2133 = // "Pattern{Constant('not do '), Field(p0,false)}" -match("MESSAGE#677:00055:02/1_0", "nwparser.p0", "not do %{p0}"); +var part2126 = match("MESSAGE#677:00055:02/1_1", "nwparser.p0", "do %{p0}"); -var part2134 = // "Pattern{Constant('do '), Field(p0,false)}" -match("MESSAGE#677:00055:02/1_1", "nwparser.p0", "do %{p0}"); +var part2127 = match("MESSAGE#689:00059/1_1", "nwparser.p0", "shut down %{p0}"); -var part2135 = // "Pattern{Constant('shut down '), Field(p0,false)}" -match("MESSAGE#689:00059/1_1", "nwparser.p0", "shut down %{p0}"); +var part2128 = match("MESSAGE#707:00070/0", "nwparser.payload", "NSRP: %{p0}"); -var part2136 = // "Pattern{Constant('NSRP: '), Field(p0,false)}" -match("MESSAGE#707:00070/0", "nwparser.payload", "NSRP: %{p0}"); +var part2129 = match("MESSAGE#707:00070/1_0", "nwparser.p0", "Unit %{p0}"); -var part2137 = // "Pattern{Constant('Unit '), Field(p0,false)}" -match("MESSAGE#707:00070/1_0", "nwparser.p0", "Unit %{p0}"); +var part2130 = match("MESSAGE#707:00070/1_1", "nwparser.p0", "local unit= %{p0}"); -var part2138 = // "Pattern{Constant('local unit= '), Field(p0,false)}" -match("MESSAGE#707:00070/1_1", "nwparser.p0", "local unit= %{p0}"); +var part2131 = match("MESSAGE#707:00070/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); -var part2139 = // "Pattern{Field(fld2,true), Constant(' of VSD group '), Field(group,true), Constant(' '), Field(info,false)}" -match("MESSAGE#707:00070/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); +var part2132 = match("MESSAGE#708:00070:01/0", "nwparser.payload", "The local device %{fld2->} in the Virtual Sec%{p0}"); -var part2140 = // "Pattern{Constant('The local device '), Field(fld2,true), Constant(' in the Virtual Sec'), Field(p0,false)}" -match("MESSAGE#708:00070:01/0", "nwparser.payload", "The local device %{fld2->} in the Virtual Sec%{p0}"); +var part2133 = match("MESSAGE#708:00070:01/1_0", "nwparser.p0", "ruity%{p0}"); -var part2141 = // "Pattern{Constant('ruity'), Field(p0,false)}" -match("MESSAGE#708:00070:01/1_0", "nwparser.p0", "ruity%{p0}"); +var part2134 = match("MESSAGE#708:00070:01/1_1", "nwparser.p0", "urity%{p0}"); -var part2142 = // "Pattern{Constant('urity'), Field(p0,false)}" -match("MESSAGE#708:00070:01/1_1", "nwparser.p0", "urity%{p0}"); +var part2135 = match("MESSAGE#713:00072:01/2", "nwparser.p0", "%{}Device group %{group->} changed state"); -var part2143 = // "Pattern{Field(,false), Constant('Device group '), Field(group,true), Constant(' changed state')}" -match("MESSAGE#713:00072:01/2", "nwparser.p0", "%{}Device group %{group->} changed state"); +var part2136 = match("MESSAGE#717:00075/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); -var part2144 = // "Pattern{Constant(''), Field(fld2,true), Constant(' of VSD group '), Field(group,true), Constant(' '), Field(info,false)}" -match("MESSAGE#717:00075/2", "nwparser.p0", "%{fld2->} of VSD group %{group->} %{info}"); +var part2137 = match("MESSAGE#748:00257:19/0", "nwparser.payload", "start_time=%{p0}"); -var part2145 = // "Pattern{Constant('start_time='), Field(p0,false)}" -match("MESSAGE#748:00257:19/0", "nwparser.payload", "start_time=%{p0}"); +var part2138 = match("MESSAGE#748:00257:19/1_0", "nwparser.p0", "\\\"%{fld2}\\\"%{p0}"); -var part2146 = // "Pattern{Constant('\"'), Field(fld2,false), Constant('\"'), Field(p0,false)}" -match("MESSAGE#748:00257:19/1_0", "nwparser.p0", "\\\"%{fld2}\\\"%{p0}"); +var part2139 = match("MESSAGE#748:00257:19/1_1", "nwparser.p0", " \"%{fld2}\" %{p0}"); -var part2147 = // "Pattern{Constant(' "'), Field(fld2,false), Constant('" '), Field(p0,false)}" -match("MESSAGE#748:00257:19/1_1", "nwparser.p0", " \"%{fld2}\" %{p0}"); +var part2140 = match_copy("MESSAGE#756:00257:10/1_1", "nwparser.p0", "daddr"); -var part2148 = // "Pattern{Field(daddr,false)}" -match_copy("MESSAGE#756:00257:10/1_1", "nwparser.p0", "daddr"); +var part2141 = match("MESSAGE#760:00259/0_0", "nwparser.payload", "Admin %{p0}"); -var part2149 = // "Pattern{Constant('Admin '), Field(p0,false)}" -match("MESSAGE#760:00259/0_0", "nwparser.payload", "Admin %{p0}"); +var part2142 = match("MESSAGE#760:00259/0_1", "nwparser.payload", "Vsys admin %{p0}"); -var part2150 = // "Pattern{Constant('Vsys admin '), Field(p0,false)}" -match("MESSAGE#760:00259/0_1", "nwparser.payload", "Vsys admin %{p0}"); +var part2143 = match("MESSAGE#760:00259/2_1", "nwparser.p0", "Telnet %{p0}"); -var part2151 = // "Pattern{Constant('Telnet '), Field(p0,false)}" -match("MESSAGE#760:00259/2_1", "nwparser.p0", "Telnet %{p0}"); +var part2144 = match("MESSAGE#777:00406/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times."); -var part2152 = // "Pattern{Constant(''), Field(interface,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#777:00406/2", "nwparser.p0", "%{interface}). Occurred %{dclass_counter1->} times."); +var part2145 = match("MESSAGE#790:00423/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times."); -var part2153 = // "Pattern{Constant(''), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#790:00423/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times."); +var part2146 = match("MESSAGE#793:00430/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times.%{p0}"); -var part2154 = // "Pattern{Constant(''), Field(interface,false), Constant(').'), Field(space,false), Constant('Occurred '), Field(dclass_counter1,true), Constant(' times.'), Field(p0,false)}" -match("MESSAGE#793:00430/2", "nwparser.p0", "%{interface}).%{space}Occurred %{dclass_counter1->} times.%{p0}"); +var part2147 = match("MESSAGE#795:00431/0", "nwparser.payload", "%{obj_type->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var part2155 = // "Pattern{Field(obj_type,true), Constant(' '), Field(disposition,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#795:00431/0", "nwparser.payload", "%{obj_type->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var part2148 = match("MESSAGE#797:00433/0", "nwparser.payload", "%{signame->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); -var part2156 = // "Pattern{Field(signame,true), Constant(' '), Field(disposition,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(zone,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#797:00433/0", "nwparser.payload", "%{signame->} %{disposition}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{zone->} %{p0}"); +var part2149 = match("MESSAGE#804:00437:01/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{p0}"); -var part2157 = // "Pattern{Field(signame,false), Constant('! From '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(', proto '), Field(protocol,true), Constant(' (zone '), Field(p0,false)}" -match("MESSAGE#804:00437:01/0", "nwparser.payload", "%{signame}! From %{saddr}:%{sport->} to %{daddr}:%{dport}, proto %{protocol->} (zone %{p0}"); +var part2150 = match("MESSAGE#817:00511:01/1_0", "nwparser.p0", "%{administrator->} (%{fld1})"); -var part2158 = // "Pattern{Field(administrator,true), Constant(' ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#817:00511:01/1_0", "nwparser.p0", "%{administrator->} (%{fld1})"); +var part2151 = match("MESSAGE#835:00515:04/2_1", "nwparser.p0", "ut %{p0}"); -var part2159 = // "Pattern{Constant('ut '), Field(p0,false)}" -match("MESSAGE#835:00515:04/2_1", "nwparser.p0", "ut %{p0}"); +var part2152 = match("MESSAGE#835:00515:04/4_0", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport}"); -var part2160 = // "Pattern{Field(logon_type,true), Constant(' from '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#835:00515:04/4_0", "nwparser.p0", "%{logon_type->} from %{saddr}:%{sport}"); +var part2153 = match("MESSAGE#837:00515:05/1_0", "nwparser.p0", "user %{p0}"); -var part2161 = // "Pattern{Constant('user '), Field(p0,false)}" -match("MESSAGE#837:00515:05/1_0", "nwparser.p0", "user %{p0}"); +var part2154 = match("MESSAGE#837:00515:05/5_0", "nwparser.p0", "the %{logon_type}"); -var part2162 = // "Pattern{Constant('the '), Field(logon_type,false)}" -match("MESSAGE#837:00515:05/5_0", "nwparser.p0", "the %{logon_type}"); +var part2155 = match("MESSAGE#869:00519:01/1_0", "nwparser.p0", "WebAuth user %{p0}"); -var part2163 = // "Pattern{Constant('WebAuth user '), Field(p0,false)}" -match("MESSAGE#869:00519:01/1_0", "nwparser.p0", "WebAuth user %{p0}"); +var part2156 = match("MESSAGE#876:00520:02/1_1", "nwparser.p0", "backup1 %{p0}"); -var part2164 = // "Pattern{Constant('backup1 '), Field(p0,false)}" -match("MESSAGE#876:00520:02/1_1", "nwparser.p0", "backup1 %{p0}"); +var part2157 = match("MESSAGE#876:00520:02/1_2", "nwparser.p0", "backup2 %{p0}"); -var part2165 = // "Pattern{Constant('backup2 '), Field(p0,false)}" -match("MESSAGE#876:00520:02/1_2", "nwparser.p0", "backup2 %{p0}"); +var part2158 = match("MESSAGE#890:00524:13/1_0", "nwparser.p0", ",%{p0}"); -var part2166 = // "Pattern{Constant(','), Field(p0,false)}" -match("MESSAGE#890:00524:13/1_0", "nwparser.p0", ",%{p0}"); +var part2159 = match("MESSAGE#901:00527/1_0", "nwparser.p0", "assigned %{p0}"); -var part2167 = // "Pattern{Constant('assigned '), Field(p0,false)}" -match("MESSAGE#901:00527/1_0", "nwparser.p0", "assigned %{p0}"); +var part2160 = match("MESSAGE#901:00527/3_0", "nwparser.p0", "assigned to %{p0}"); -var part2168 = // "Pattern{Constant('assigned to '), Field(p0,false)}" -match("MESSAGE#901:00527/3_0", "nwparser.p0", "assigned to %{p0}"); +var part2161 = match("MESSAGE#927:00528:15/1_0", "nwparser.p0", "'%{administrator}' %{p0}"); -var part2169 = // "Pattern{Constant('''), Field(administrator,false), Constant('' '), Field(p0,false)}" -match("MESSAGE#927:00528:15/1_0", "nwparser.p0", "'%{administrator}' %{p0}"); +var part2162 = match("MESSAGE#930:00528:18/0", "nwparser.payload", "SSH: P%{p0}"); -var part2170 = // "Pattern{Constant('SSH: P'), Field(p0,false)}" -match("MESSAGE#930:00528:18/0", "nwparser.payload", "SSH: P%{p0}"); +var part2163 = match("MESSAGE#930:00528:18/1_0", "nwparser.p0", "KA %{p0}"); -var part2171 = // "Pattern{Constant('KA '), Field(p0,false)}" -match("MESSAGE#930:00528:18/1_0", "nwparser.p0", "KA %{p0}"); +var part2164 = match("MESSAGE#930:00528:18/1_1", "nwparser.p0", "assword %{p0}"); -var part2172 = // "Pattern{Constant('assword '), Field(p0,false)}" -match("MESSAGE#930:00528:18/1_1", "nwparser.p0", "assword %{p0}"); +var part2165 = match("MESSAGE#930:00528:18/3_0", "nwparser.p0", "\\'%{administrator}\\' %{p0}"); -var part2173 = // "Pattern{Constant('\''), Field(administrator,false), Constant('\' '), Field(p0,false)}" -match("MESSAGE#930:00528:18/3_0", "nwparser.p0", "\\'%{administrator}\\' %{p0}"); +var part2166 = match("MESSAGE#930:00528:18/4", "nwparser.p0", "at host %{saddr}"); -var part2174 = // "Pattern{Constant('at host '), Field(saddr,false)}" -match("MESSAGE#930:00528:18/4", "nwparser.p0", "at host %{saddr}"); +var part2167 = match("MESSAGE#932:00528:19/0", "nwparser.payload", "%{}S%{p0}"); -var part2175 = // "Pattern{Field(,false), Constant('S'), Field(p0,false)}" -match("MESSAGE#932:00528:19/0", "nwparser.payload", "%{}S%{p0}"); +var part2168 = match("MESSAGE#932:00528:19/1_0", "nwparser.p0", "CS %{p0}"); -var part2176 = // "Pattern{Constant('CS '), Field(p0,false)}" -match("MESSAGE#932:00528:19/1_0", "nwparser.p0", "CS %{p0}"); +var part2169 = match("MESSAGE#1060:00553/2", "nwparser.p0", "from server.ini file.%{}"); -var part2177 = // "Pattern{Constant('from server.ini file.'), Field(,false)}" -match("MESSAGE#1060:00553/2", "nwparser.p0", "from server.ini file.%{}"); +var part2170 = match("MESSAGE#1064:00553:04/1_0", "nwparser.p0", "pattern %{p0}"); -var part2178 = // "Pattern{Constant('pattern '), Field(p0,false)}" -match("MESSAGE#1064:00553:04/1_0", "nwparser.p0", "pattern %{p0}"); +var part2171 = match("MESSAGE#1064:00553:04/1_1", "nwparser.p0", "server.ini %{p0}"); -var part2179 = // "Pattern{Constant('server.ini '), Field(p0,false)}" -match("MESSAGE#1064:00553:04/1_1", "nwparser.p0", "server.ini %{p0}"); +var part2172 = match("MESSAGE#1068:00553:08/2", "nwparser.p0", "file.%{}"); -var part2180 = // "Pattern{Constant('file.'), Field(,false)}" -match("MESSAGE#1068:00553:08/2", "nwparser.p0", "file.%{}"); +var part2173 = match("MESSAGE#1087:00554:04/1_1", "nwparser.p0", "AV pattern %{p0}"); -var part2181 = // "Pattern{Constant('AV pattern '), Field(p0,false)}" -match("MESSAGE#1087:00554:04/1_1", "nwparser.p0", "AV pattern %{p0}"); +var part2174 = match("MESSAGE#1116:00556:14/1_0", "nwparser.p0", "added into %{p0}"); -var part2182 = // "Pattern{Constant('added into '), Field(p0,false)}" -match("MESSAGE#1116:00556:14/1_0", "nwparser.p0", "added into %{p0}"); - -var part2183 = // "Pattern{Constant('loader '), Field(p0,false)}" -match("MESSAGE#1157:00767:11/1_0", "nwparser.p0", "loader %{p0}"); +var part2175 = match("MESSAGE#1157:00767:11/1_0", "nwparser.p0", "loader %{p0}"); var select436 = linear_select([ dup10, dup11, ]); -var part2184 = // "Pattern{Constant('Policy ID='), Field(policy_id,true), Constant(' Rate='), Field(fld2,true), Constant(' exceeds threshold')}" -match("MESSAGE#7:00001:07", "nwparser.payload", "Policy ID=%{policy_id->} Rate=%{fld2->} exceeds threshold", processor_chain([ +var part2176 = match("MESSAGE#7:00001:07", "nwparser.payload", "Policy ID=%{policy_id->} Rate=%{fld2->} exceeds threshold", processor_chain([ dup1, dup2, dup3, @@ -25792,8 +23269,7 @@ var select442 = linear_select([ dup72, ]); -var part2185 = // "Pattern{Field(signame,true), Constant(' from '), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' protocol '), Field(protocol,true), Constant(' ('), Field(interface,false), Constant(')')}" -match("MESSAGE#84:00005:04", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{interface})", processor_chain([ +var part2177 = match("MESSAGE#84:00005:04", "nwparser.payload", "%{signame->} from %{saddr}/%{sport->} to %{daddr}/%{dport->} protocol %{protocol->} (%{interface})", processor_chain([ dup58, dup2, dup3, @@ -25899,41 +23375,38 @@ var select461 = linear_select([ ]); var select462 = linear_select([ - dup160, dup161, + dup162, ]); var select463 = linear_select([ dup163, - dup164, + dup103, ]); var select464 = linear_select([ - dup165, - dup103, + dup162, + dup161, ]); var select465 = linear_select([ - dup164, - dup163, + dup46, + dup47, ]); var select466 = linear_select([ - dup46, - dup47, + dup166, + dup167, ]); var select467 = linear_select([ - dup168, - dup169, + dup172, + dup173, ]); var select468 = linear_select([ dup174, dup175, -]); - -var select469 = linear_select([ dup176, dup177, dup178, @@ -25941,47 +23414,44 @@ var select469 = linear_select([ dup180, dup181, dup182, - dup183, - dup184, ]); -var select470 = linear_select([ +var select469 = linear_select([ dup49, dup21, ]); -var select471 = linear_select([ - dup191, - dup192, +var select470 = linear_select([ + dup189, + dup190, ]); -var select472 = linear_select([ +var select471 = linear_select([ dup96, dup152, ]); -var select473 = linear_select([ - dup198, - dup199, +var select472 = linear_select([ + dup196, + dup197, ]); -var select474 = linear_select([ +var select473 = linear_select([ dup24, - dup202, + dup200, ]); -var select475 = linear_select([ +var select474 = linear_select([ dup103, - dup165, + dup163, ]); -var select476 = linear_select([ - dup207, +var select475 = linear_select([ + dup205, dup118, ]); -var part2186 = // "Pattern{Field(change_attribute,true), Constant(' has been changed from '), Field(change_old,true), Constant(' to '), Field(change_new,false)}" -match("MESSAGE#477:00030:02", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ +var part2178 = match("MESSAGE#477:00030:02", "nwparser.payload", "%{change_attribute->} has been changed from %{change_old->} to %{change_new}", processor_chain([ dup1, dup2, dup3, @@ -25989,49 +23459,54 @@ match("MESSAGE#477:00030:02", "nwparser.payload", "%{change_attribute->} has bee dup5, ])); +var select476 = linear_select([ + dup212, + dup213, +]); + var select477 = linear_select([ - dup214, dup215, + dup216, ]); var select478 = linear_select([ - dup217, - dup218, + dup222, + dup215, ]); var select479 = linear_select([ dup224, - dup217, + dup225, ]); var select480 = linear_select([ - dup226, - dup227, + dup231, + dup124, ]); var select481 = linear_select([ - dup233, - dup124, + dup229, + dup230, ]); var select482 = linear_select([ - dup231, - dup232, + dup233, + dup234, ]); var select483 = linear_select([ - dup235, dup236, + dup237, ]); var select484 = linear_select([ - dup238, - dup239, + dup242, + dup243, ]); var select485 = linear_select([ - dup244, dup245, + dup246, ]); var select486 = linear_select([ @@ -26050,27 +23525,21 @@ var select488 = linear_select([ ]); var select489 = linear_select([ - dup253, - dup254, + dup260, + dup261, ]); var select490 = linear_select([ - dup262, - dup263, + dup264, + dup265, ]); var select491 = linear_select([ - dup266, - dup267, -]); - -var select492 = linear_select([ - dup270, - dup271, + dup268, + dup269, ]); -var part2187 = // "Pattern{Constant('The local device '), Field(fld2,true), Constant(' in the Virtual Security Device group '), Field(group,true), Constant(' '), Field(info,false)}" -match("MESSAGE#716:00074", "nwparser.payload", "The local device %{fld2->} in the Virtual Security Device group %{group->} %{info}", processor_chain([ +var part2179 = match("MESSAGE#716:00074", "nwparser.payload", "The local device %{fld2->} in the Virtual Security Device group %{group->} %{info}", processor_chain([ dup1, dup2, dup3, @@ -26078,18 +23547,17 @@ match("MESSAGE#716:00074", "nwparser.payload", "The local device %{fld2->} in th dup5, ])); -var select493 = linear_select([ - dup286, - dup287, +var select492 = linear_select([ + dup284, + dup285, ]); -var select494 = linear_select([ - dup289, - dup290, +var select493 = linear_select([ + dup287, + dup288, ]); -var part2188 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to '), Field(daddr,false), Constant(', using protocol '), Field(protocol,false), Constant(', and arriving at interface '), Field(dinterface,true), Constant(' in zone '), Field(dst_zone,false), Constant('.'), Field(space,false), Constant('The attack occurred '), Field(dclass_counter1,true), Constant(' times.')}" -match("MESSAGE#799:00435", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ +var part2180 = match("MESSAGE#799:00435", "nwparser.payload", "%{signame->} From %{saddr->} to %{daddr}, using protocol %{protocol}, and arriving at interface %{dinterface->} in zone %{dst_zone}.%{space}The attack occurred %{dclass_counter1->} times.", processor_chain([ dup58, dup2, dup59, @@ -26099,8 +23567,7 @@ match("MESSAGE#799:00435", "nwparser.payload", "%{signame->} From %{saddr->} to dup60, ])); -var part2189 = // "Pattern{Field(signame,true), Constant(' From '), Field(saddr,true), Constant(' to zone '), Field(zone,false), Constant(', proto '), Field(protocol,true), Constant(' (int '), Field(interface,false), Constant('). Occurred '), Field(dclass_counter1,true), Constant(' times. ('), Field(fld1,false), Constant(')')}" -match("MESSAGE#814:00442", "nwparser.payload", "%{signame->} From %{saddr->} to zone %{zone}, proto %{protocol->} (int %{interface}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ +var part2181 = match("MESSAGE#814:00442", "nwparser.payload", "%{signame->} From %{saddr->} to zone %{zone}, proto %{protocol->} (int %{interface}). Occurred %{dclass_counter1->} times. (%{fld1})", processor_chain([ dup58, dup4, dup59, @@ -26111,116 +23578,112 @@ match("MESSAGE#814:00442", "nwparser.payload", "%{signame->} From %{saddr->} to dup60, ])); -var select495 = linear_select([ - dup302, +var select494 = linear_select([ + dup300, dup26, ]); -var select496 = linear_select([ +var select495 = linear_select([ dup115, - dup305, + dup303, ]); -var select497 = linear_select([ +var select496 = linear_select([ dup125, dup96, ]); +var select497 = linear_select([ + dup189, + dup308, + dup309, +]); + var select498 = linear_select([ - dup191, dup310, - dup311, + dup16, ]); var select499 = linear_select([ - dup312, - dup16, + dup317, + dup318, ]); var select500 = linear_select([ dup319, - dup320, + dup315, ]); var select501 = linear_select([ - dup321, - dup317, + dup322, + dup250, ]); var select502 = linear_select([ - dup324, - dup252, -]); - -var select503 = linear_select([ + dup327, dup329, - dup331, ]); -var select504 = linear_select([ - dup332, +var select503 = linear_select([ + dup330, dup129, ]); -var part2190 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1196:01269:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup283, +var part2182 = match("MESSAGE#1196:01269:01", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} direction=%{direction->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, + dup275, dup60, - dup284, + dup282, ])); -var part2191 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1197:01269:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup187, +var part2183 = match("MESSAGE#1197:01269:02", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, + dup274, dup3, + dup275, + dup276, dup277, - dup278, - dup279, dup60, ])); -var part2192 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' proto='), Field(protocol,true), Constant(' src zone='), Field(src_zone,true), Constant(' dst zone='), Field(dst_zone,true), Constant(' action='), Field(disposition,true), Constant(' sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' icmp type='), Field(icmptype,false)}" -match("MESSAGE#1198:01269:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ - dup283, +var part2184 = match("MESSAGE#1198:01269:03", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} proto=%{protocol->} src zone=%{src_zone->} dst zone=%{dst_zone->} action=%{disposition->} sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} icmp type=%{icmptype}", processor_chain([ + dup281, dup2, dup4, dup5, - dup276, + dup274, dup3, - dup277, + dup275, dup60, - dup284, + dup282, ])); -var part2193 = // "Pattern{Constant('start_time="'), Field(fld2,false), Constant('" duration='), Field(duration,true), Constant(' policy_id='), Field(policy_id,true), Constant(' service='), Field(service,true), Constant(' ('), Field(fld3,false), Constant(') proto='), Field(protocol,true), Constant(' direction='), Field(direction,true), Constant(' action=Deny sent='), Field(sbytes,true), Constant(' rcvd='), Field(rbytes,true), Constant(' src='), Field(saddr,true), Constant(' dst='), Field(daddr,true), Constant(' src_port='), Field(sport,true), Constant(' dst_port='), Field(dport,false)}" -match("MESSAGE#1203:23184", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ - dup187, +var part2185 = match("MESSAGE#1203:23184", "nwparser.payload", "start_time=\"%{fld2}\" duration=%{duration->} policy_id=%{policy_id->} service=%{service->} (%{fld3}) proto=%{protocol->} direction=%{direction->} action=Deny sent=%{sbytes->} rcvd=%{rbytes->} src=%{saddr->} dst=%{daddr->} src_port=%{sport->} dst_port=%{dport}", processor_chain([ + dup185, dup2, dup4, dup5, - dup276, + dup274, dup3, + dup275, + dup276, dup277, - dup278, - dup279, dup61, ])); -var all397 = all_match({ +var all391 = all_match({ processors: [ - dup265, - dup393, - dup268, + dup263, + dup390, + dup266, ], on_success: processor_chain([ dup1, @@ -26231,11 +23694,11 @@ var all397 = all_match({ ]), }); -var all398 = all_match({ +var all392 = all_match({ processors: [ - dup269, - dup394, - dup272, + dup267, + dup391, + dup270, ], on_success: processor_chain([ dup1, @@ -26246,11 +23709,11 @@ var all398 = all_match({ ]), }); -var all399 = all_match({ +var all393 = all_match({ processors: [ dup80, - dup345, - dup295, + dup343, + dup293, ], on_success: processor_chain([ dup58, @@ -26263,14 +23726,14 @@ var all399 = all_match({ ]), }); -var all400 = all_match({ +var all394 = all_match({ processors: [ - dup298, - dup345, + dup296, + dup343, dup131, ], on_success: processor_chain([ - dup299, + dup297, dup2, dup3, dup9, @@ -26281,14 +23744,14 @@ var all400 = all_match({ ]), }); -var all401 = all_match({ +var all395 = all_match({ processors: [ - dup300, - dup345, + dup298, + dup343, dup131, ], on_success: processor_chain([ - dup299, + dup297, dup2, dup3, dup9, diff --git a/x-pack/filebeat/module/proofpoint/emailsecurity/config/pipeline.js b/x-pack/filebeat/module/proofpoint/emailsecurity/config/pipeline.js index 618356e4723..bc962bd964d 100644 --- a/x-pack/filebeat/module/proofpoint/emailsecurity/config/pipeline.js +++ b/x-pack/filebeat/module/proofpoint/emailsecurity/config/pipeline.js @@ -21,20 +21,15 @@ function DeviceProcessor() { } } -var dup1 = // "Pattern{Constant('info'), Field(p0,false)}" -match("HEADER#0:0024/1_0", "nwparser.p0", "info%{p0}"); +var dup1 = match("HEADER#0:0024/1_0", "nwparser.p0", "info%{p0}"); -var dup2 = // "Pattern{Constant('rprt'), Field(p0,false)}" -match("HEADER#0:0024/1_1", "nwparser.p0", "rprt%{p0}"); +var dup2 = match("HEADER#0:0024/1_1", "nwparser.p0", "rprt%{p0}"); -var dup3 = // "Pattern{Constant('warn'), Field(p0,false)}" -match("HEADER#0:0024/1_2", "nwparser.p0", "warn%{p0}"); +var dup3 = match("HEADER#0:0024/1_2", "nwparser.p0", "warn%{p0}"); -var dup4 = // "Pattern{Constant('err'), Field(p0,false)}" -match("HEADER#0:0024/1_3", "nwparser.p0", "err%{p0}"); +var dup4 = match("HEADER#0:0024/1_3", "nwparser.p0", "err%{p0}"); -var dup5 = // "Pattern{Constant('note'), Field(p0,false)}" -match("HEADER#0:0024/1_4", "nwparser.p0", "note%{p0}"); +var dup5 = match("HEADER#0:0024/1_4", "nwparser.p0", "note%{p0}"); var dup6 = call({ dest: "nwparser.messageid", @@ -74,24 +69,19 @@ var dup12 = setc("dclass_counter1_string","No of attachments:"); var dup13 = setc("dclass_counter2_string","No of recipients:"); -var dup14 = // "Pattern{Field(hostip,true), Constant(' sampling='), Field(fld19,false)}" -match("MESSAGE#11:mail_env_from:ofrom/1_0", "nwparser.p0", "%{hostip->} sampling=%{fld19}"); +var dup14 = match("MESSAGE#11:mail_env_from:ofrom/1_0", "nwparser.p0", "%{hostip->} sampling=%{fld19}"); -var dup15 = // "Pattern{Field(hostip,false)}" -match_copy("MESSAGE#11:mail_env_from:ofrom/1_1", "nwparser.p0", "hostip"); +var dup15 = match_copy("MESSAGE#11:mail_env_from:ofrom/1_1", "nwparser.p0", "hostip"); var dup16 = setc("eventcategory","1207030000"); var dup17 = setc("eventcategory","1207000000"); -var dup18 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#25:session_judge/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} %{p0}"); +var dup18 = match("MESSAGE#25:session_judge/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} %{p0}"); -var dup19 = // "Pattern{Constant('attachment='), Field(fld58,true), Constant(' file='), Field(fld1,true), Constant(' mod='), Field(p0,false)}" -match("MESSAGE#25:session_judge/1_0", "nwparser.p0", "attachment=%{fld58->} file=%{fld1->} mod=%{p0}"); +var dup19 = match("MESSAGE#25:session_judge/1_0", "nwparser.p0", "attachment=%{fld58->} file=%{fld1->} mod=%{p0}"); -var dup20 = // "Pattern{Constant('mod='), Field(p0,false)}" -match("MESSAGE#25:session_judge/1_1", "nwparser.p0", "mod=%{p0}"); +var dup20 = match("MESSAGE#25:session_judge/1_1", "nwparser.p0", "mod=%{p0}"); var dup21 = call({ dest: "nwparser.filename", @@ -103,11 +93,9 @@ var dup21 = call({ var dup22 = setc("eventcategory","1207040200"); -var dup23 = // "Pattern{Constant('vendor='), Field(fld36,true), Constant(' version="'), Field(component_version,false), Constant('" duration='), Field(p0,false)}" -match("MESSAGE#39:av_run:02/1_1", "nwparser.p0", "vendor=%{fld36->} version=\"%{component_version}\" duration=%{p0}"); +var dup23 = match("MESSAGE#39:av_run:02/1_1", "nwparser.p0", "vendor=%{fld36->} version=\"%{component_version}\" duration=%{p0}"); -var dup24 = // "Pattern{Field(duration_string,false)}" -match_copy("MESSAGE#39:av_run:02/2", "nwparser.p0", "duration_string"); +var dup24 = match_copy("MESSAGE#39:av_run:02/2", "nwparser.p0", "duration_string"); var dup25 = setc("eventcategory","1003010000"); @@ -115,29 +103,21 @@ var dup26 = setc("eventcategory","1003000000"); var dup27 = setc("eventcategory","1207040000"); -var dup28 = // "Pattern{Constant('['), Field(daddr,false), Constant('] ['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_0", "nwparser.p0", "[%{daddr}] [%{daddr}],%{p0}"); +var dup28 = match("MESSAGE#98:queued-alert/3_0", "nwparser.p0", "[%{daddr}] [%{daddr}],%{p0}"); -var dup29 = // "Pattern{Constant('['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_1", "nwparser.p0", "[%{daddr}],%{p0}"); +var dup29 = match("MESSAGE#98:queued-alert/3_1", "nwparser.p0", "[%{daddr}],%{p0}"); -var dup30 = // "Pattern{Field(dhost,true), Constant(' ['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_2", "nwparser.p0", "%{dhost->} [%{daddr}],%{p0}"); +var dup30 = match("MESSAGE#98:queued-alert/3_2", "nwparser.p0", "%{dhost->} [%{daddr}],%{p0}"); -var dup31 = // "Pattern{Field(dhost,false), Constant(','), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_3", "nwparser.p0", "%{dhost},%{p0}"); +var dup31 = match("MESSAGE#98:queued-alert/3_3", "nwparser.p0", "%{dhost},%{p0}"); -var dup32 = // "Pattern{Field(,false), Constant('dsn='), Field(resultcode,false), Constant(', stat='), Field(info,false)}" -match("MESSAGE#98:queued-alert/4", "nwparser.p0", "%{}dsn=%{resultcode}, stat=%{info}"); +var dup32 = match("MESSAGE#98:queued-alert/4", "nwparser.p0", "%{}dsn=%{resultcode}, stat=%{info}"); -var dup33 = // "Pattern{Constant('['), Field(daddr,false), Constant(']')}" -match("MESSAGE#99:queued-alert:01/1_1", "nwparser.p0", "[%{daddr}]"); +var dup33 = match("MESSAGE#99:queued-alert:01/1_1", "nwparser.p0", "[%{daddr}]"); -var dup34 = // "Pattern{Field(dhost,true), Constant(' ['), Field(daddr,false), Constant(']')}" -match("MESSAGE#99:queued-alert:01/1_2", "nwparser.p0", "%{dhost->} [%{daddr}]"); +var dup34 = match("MESSAGE#99:queued-alert:01/1_2", "nwparser.p0", "%{dhost->} [%{daddr}]"); -var dup35 = // "Pattern{Field(dhost,false)}" -match_copy("MESSAGE#99:queued-alert:01/1_3", "nwparser.p0", "dhost"); +var dup35 = match_copy("MESSAGE#99:queued-alert:01/1_3", "nwparser.p0", "dhost"); var dup36 = date_time({ dest: "event_time", @@ -147,29 +127,21 @@ var dup36 = date_time({ ], }); -var dup37 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: STARTTLS='), Field(fld1,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#100:queued-alert:02/0", "nwparser.payload", "%{agent}[%{process_id}]: STARTTLS=%{fld1}, relay=%{p0}"); +var dup37 = match("MESSAGE#100:queued-alert:02/0", "nwparser.payload", "%{agent}[%{process_id}]: STARTTLS=%{fld1}, relay=%{p0}"); -var dup38 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld51,false), Constant(': to='), Field(to,false), Constant(', delay='), Field(fld53,false), Constant(', xdelay='), Field(fld54,false), Constant(', mailer='), Field(fld55,false), Constant(', pri='), Field(fld23,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#101:queued-VoltageEncrypt/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); +var dup38 = match("MESSAGE#101:queued-VoltageEncrypt/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); -var dup39 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': from='), Field(from,false), Constant(', size='), Field(bytes,false), Constant(', class='), Field(fld57,false), Constant(', nrcpts='), Field(fld58,false), Constant(', msgid='), Field(id,false), Constant(', proto='), Field(protocol,false), Constant(', daemon='), Field(fld69,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#120:queued-VoltageEncrypt:01/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, relay=%{p0}"); +var dup39 = match("MESSAGE#120:queued-VoltageEncrypt:01/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, relay=%{p0}"); -var dup40 = // "Pattern{Constant('['), Field(daddr,false), Constant('] ['), Field(daddr,false), Constant(']')}" -match("MESSAGE#120:queued-VoltageEncrypt:01/1_0", "nwparser.p0", "[%{daddr}] [%{daddr}]"); +var dup40 = match("MESSAGE#120:queued-VoltageEncrypt:01/1_0", "nwparser.p0", "[%{daddr}] [%{daddr}]"); -var dup41 = // "Pattern{Field(,false), Constant('field='), Field(fld2,false), Constant(', status='), Field(info,false)}" -match("MESSAGE#104:queued-default:02/2", "nwparser.p0", "%{}field=%{fld2}, status=%{info}"); +var dup41 = match("MESSAGE#104:queued-default:02/2", "nwparser.p0", "%{}field=%{fld2}, status=%{info}"); -var dup42 = // "Pattern{Field(,false), Constant('version='), Field(fld55,false), Constant(', verify='), Field(fld57,false), Constant(', cipher='), Field(fld58,false), Constant(', bits='), Field(fld59,false)}" -match("MESSAGE#105:queued-default:03/2", "nwparser.p0", "%{}version=%{fld55}, verify=%{fld57}, cipher=%{fld58}, bits=%{fld59}"); +var dup42 = match("MESSAGE#105:queued-default:03/2", "nwparser.p0", "%{}version=%{fld55}, verify=%{fld57}, cipher=%{fld58}, bits=%{fld59}"); -var dup43 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': from='), Field(from,false), Constant(', size='), Field(bytes,false), Constant(', class='), Field(fld57,false), Constant(', nrcpts='), Field(fld58,false), Constant(', msgid='), Field(id,false), Constant(', proto='), Field(protocol,false), Constant(', daemon='), Field(fld69,false), Constant(', tls_verify='), Field(fld70,false), Constant(', auth='), Field(fld71,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#116:queued-eurort:02/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, tls_verify=%{fld70}, auth=%{fld71}, relay=%{p0}"); +var dup43 = match("MESSAGE#116:queued-eurort:02/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, tls_verify=%{fld70}, auth=%{fld71}, relay=%{p0}"); -var dup44 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': to='), Field(to,false), Constant(', delay='), Field(fld53,false), Constant(', xdelay='), Field(fld54,false), Constant(', mailer='), Field(fld55,false), Constant(', pri='), Field(fld23,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#126:sendmail/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); +var dup44 = match("MESSAGE#126:sendmail/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); var dup45 = linear_select([ dup1, @@ -189,62 +161,52 @@ var dup47 = linear_select([ dup20, ]); -var dup48 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' vendor='), Field(fld36,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,true), Constant(' signatures='), Field(fld94,false)}" -match("MESSAGE#43:av_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} vendor=%{fld36->} engine=%{fld49->} definitions=%{fld50->} signatures=%{fld94}", processor_chain([ +var dup48 = match("MESSAGE#43:av_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} vendor=%{fld36->} engine=%{fld49->} definitions=%{fld50->} signatures=%{fld94}", processor_chain([ dup26, dup9, ])); -var dup49 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#48:access_run:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ +var dup49 = match("MESSAGE#48:access_run:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); -var dup50 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#49:access_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ +var dup50 = match("MESSAGE#49:access_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); -var dup51 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' action='), Field(action,true), Constant(' dict='), Field(fld37,true), Constant(' file='), Field(filename,false)}" -match("MESSAGE#51:access_refresh:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} action=%{action->} dict=%{fld37->} file=%{filename}", processor_chain([ +var dup51 = match("MESSAGE#51:access_refresh:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} action=%{action->} dict=%{fld37->} file=%{filename}", processor_chain([ dup17, dup9, ])); -var dup52 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,false)}" -match("MESSAGE#52:access_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ +var dup52 = match("MESSAGE#52:access_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ dup17, dup9, ])); -var dup53 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,false)}" -match("MESSAGE#64:spam_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} engine=%{fld49->} definitions=%{fld50}", processor_chain([ +var dup53 = match("MESSAGE#64:spam_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} engine=%{fld49->} definitions=%{fld50}", processor_chain([ dup27, dup9, ])); -var dup54 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' version='), Field(fld55,false)}" -match("MESSAGE#71:zerohour_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} version=%{fld55}", processor_chain([ +var dup54 = match("MESSAGE#71:zerohour_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} version=%{fld55}", processor_chain([ dup17, dup9, ])); -var dup55 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' sig='), Field(fld60,false)}" -match("MESSAGE#82:cvtd:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sig=%{fld60}", processor_chain([ +var dup55 = match("MESSAGE#82:cvtd:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sig=%{fld60}", processor_chain([ dup17, dup9, ])); -var dup56 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,false)}" -match("MESSAGE#83:cvtd", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type}", processor_chain([ +var dup56 = match("MESSAGE#83:cvtd", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type}", processor_chain([ dup17, dup9, ])); -var dup57 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' addr='), Field(saddr,false)}" -match("MESSAGE#87:soap_listen", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} addr=%{saddr}", processor_chain([ +var dup57 = match("MESSAGE#87:soap_listen", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} addr=%{saddr}", processor_chain([ dup17, dup9, ])); @@ -263,20 +225,17 @@ var dup59 = linear_select([ dup35, ]); -var dup60 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': timeout waiting for input from '), Field(fld11,true), Constant(' during server cmd read')}" -match("MESSAGE#106:queued-default:04", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: timeout waiting for input from %{fld11->} during server cmd read", processor_chain([ +var dup60 = match("MESSAGE#106:queued-default:04", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: timeout waiting for input from %{fld11->} during server cmd read", processor_chain([ dup17, dup9, ])); -var dup61 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(event_description,false)}" -match("MESSAGE#113:queued-reinject:06", "nwparser.payload", "%{agent}[%{process_id}]: %{event_description}", processor_chain([ +var dup61 = match("MESSAGE#113:queued-reinject:06", "nwparser.payload", "%{agent}[%{process_id}]: %{event_description}", processor_chain([ dup17, dup9, ])); -var dup62 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' pid='), Field(process_id,true), Constant(' '), Field(web_method,true), Constant(' /'), Field(info,false), Constant(': '), Field(resultcode,false)}" -match("MESSAGE#141:info:pid", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} %{web_method->} /%{info}: %{resultcode}", processor_chain([ +var dup62 = match("MESSAGE#141:info:pid", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} %{web_method->} /%{info}: %{resultcode}", processor_chain([ dup17, dup9, ])); @@ -351,8 +310,7 @@ var dup68 = all_match({ ]), }); -var hdr1 = // "Pattern{Field(hdate,false), Constant('T'), Field(htime,false), Constant('.'), Field(hfld1,true), Constant(' '), Field(hfld2,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld3,false), Constant(']: '), Field(p0,false)}" -match("HEADER#0:0024/0", "message", "%{hdate}T%{htime}.%{hfld1->} %{hfld2->} %{hinstance}[%{hfld3}]: %{p0}", processor_chain([ +var hdr1 = match("HEADER#0:0024/0", "message", "%{hdate}T%{htime}.%{hfld1->} %{hfld2->} %{hinstance}[%{hfld3}]: %{p0}", processor_chain([ call({ dest: "nwparser.payload", fn: STRCAT, @@ -366,8 +324,7 @@ match("HEADER#0:0024/0", "message", "%{hdate}T%{htime}.%{hfld1->} %{hfld2->} %{h }), ])); -var part1 = // "Pattern{Field(,false), Constant('s='), Field(hfld4,true), Constant(' cmd=send '), Field(p0,false)}" -match("HEADER#0:0024/2", "nwparser.p0", "%{}s=%{hfld4->} cmd=send %{p0}"); +var part1 = match("HEADER#0:0024/2", "nwparser.p0", "%{}s=%{hfld4->} cmd=send %{p0}"); var all1 = all_match({ processors: [ @@ -381,11 +338,9 @@ var all1 = all_match({ ]), }); -var hdr2 = // "Pattern{Field(hdate,false), Constant('T'), Field(htime,false), Constant('.'), Field(hfld1,true), Constant(' '), Field(hfld2,true), Constant(' '), Field(messageid,false), Constant('['), Field(hfld3,false), Constant(']: '), Field(p0,false)}" -match("HEADER#1:0023/0", "message", "%{hdate}T%{htime}.%{hfld1->} %{hfld2->} %{messageid}[%{hfld3}]: %{p0}"); +var hdr2 = match("HEADER#1:0023/0", "message", "%{hdate}T%{htime}.%{hfld1->} %{hfld2->} %{messageid}[%{hfld3}]: %{p0}"); -var part2 = // "Pattern{Field(,true), Constant(' '), Field(payload,false)}" -match("HEADER#1:0023/2", "nwparser.p0", "%{} %{payload}"); +var part2 = match("HEADER#1:0023/2", "nwparser.p0", "%{} %{payload}"); var all2 = all_match({ processors: [ @@ -398,8 +353,7 @@ var all2 = all_match({ ]), }); -var hdr3 = // "Pattern{Field(hdate,false), Constant('T'), Field(htime,false), Constant('.'), Field(hfld1,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(messageid,false), Constant('['), Field(hfld2,false), Constant(']: '), Field(p0,false)}" -match("HEADER#2:0025", "message", "%{hdate}T%{htime}.%{hfld1->} %{hinstance->} %{messageid}[%{hfld2}]: %{p0}", processor_chain([ +var hdr3 = match("HEADER#2:0025", "message", "%{hdate}T%{htime}.%{hfld1->} %{hinstance->} %{messageid}[%{hfld2}]: %{p0}", processor_chain([ setc("header_id","0025"), call({ dest: "nwparser.payload", @@ -414,8 +368,7 @@ match("HEADER#2:0025", "message", "%{hdate}T%{htime}.%{hfld1->} %{hinstance->} % }), ])); -var hdr4 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hostname,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld4,false), Constant(']: '), Field(hseverity,true), Constant(' s='), Field(hfld1,true), Constant(' m='), Field(hfld2,true), Constant(' x='), Field(hfld3,true), Constant(' attachment='), Field(hfld7,true), Constant(' file='), Field(hfld5,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#3:0026", "message", "%{hmonth->} %{hday->} %{htime->} %{hostname->} %{hinstance}[%{hfld4}]: %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} attachment=%{hfld7->} file=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr4 = match("HEADER#3:0026", "message", "%{hmonth->} %{hday->} %{htime->} %{hostname->} %{hinstance}[%{hfld4}]: %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} attachment=%{hfld7->} file=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0026"), dup6, call({ @@ -447,8 +400,7 @@ match("HEADER#3:0026", "message", "%{hmonth->} %{hday->} %{htime->} %{hostname-> }), ])); -var hdr5 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' s='), Field(hfld1,true), Constant(' m='), Field(hfld2,true), Constant(' x='), Field(hfld3,true), Constant(' attachment='), Field(hfld7,true), Constant(' file='), Field(hfld5,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#4:0003", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} attachment=%{hfld7->} file=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr5 = match("HEADER#4:0003", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} attachment=%{hfld7->} file=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0003"), dup6, call({ @@ -478,8 +430,7 @@ match("HEADER#4:0003", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance- }), ])); -var hdr6 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld2,false), Constant(']: '), Field(hseverity,true), Constant(' s='), Field(hfld3,true), Constant(' m='), Field(hfld4,true), Constant(' x='), Field(hfld5,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#5:0015", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{hseverity->} s=%{hfld3->} m=%{hfld4->} x=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr6 = match("HEADER#5:0015", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{hseverity->} s=%{hfld3->} m=%{hfld4->} x=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0015"), dup6, call({ @@ -507,8 +458,7 @@ match("HEADER#5:0015", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} % }), ])); -var hdr7 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld2,false), Constant(']: '), Field(hseverity,true), Constant(' s='), Field(hfld3,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#6:0016", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{hseverity->} s=%{hfld3->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr7 = match("HEADER#6:0016", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{hseverity->} s=%{hfld3->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0016"), dup6, call({ @@ -532,8 +482,7 @@ match("HEADER#6:0016", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} % }), ])); -var hdr8 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld2,false), Constant(']: '), Field(severity,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' '), Field(p0,false)}" -match("HEADER#7:0017", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{severity->} mod=%{msgIdPart1->} %{p0}", processor_chain([ +var hdr8 = match("HEADER#7:0017", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{severity->} mod=%{msgIdPart1->} %{p0}", processor_chain([ setc("header_id","0017"), call({ dest: "nwparser.messageid", @@ -546,8 +495,7 @@ match("HEADER#7:0017", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} % dup7, ])); -var hdr9 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,false), Constant(': '), Field(hseverity,true), Constant(' s='), Field(hfld2,true), Constant(' m='), Field(hfld3,true), Constant(' x='), Field(hfld4,true), Constant(' cmd='), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#8:0018", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}: %{hseverity->} s=%{hfld2->} m=%{hfld3->} x=%{hfld4->} cmd=%{messageid->} %{p0}", processor_chain([ +var hdr9 = match("HEADER#8:0018", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}: %{hseverity->} s=%{hfld2->} m=%{hfld3->} x=%{hfld4->} cmd=%{messageid->} %{p0}", processor_chain([ setc("header_id","0018"), call({ dest: "nwparser.payload", @@ -570,8 +518,7 @@ match("HEADER#8:0018", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} % }), ])); -var hdr10 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' s='), Field(hfld2,true), Constant(' mod='), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#9:0019", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance->} %{hseverity->} s=%{hfld2->} mod=%{messageid->} %{p0}", processor_chain([ +var hdr10 = match("HEADER#9:0019", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance->} %{hseverity->} s=%{hfld2->} mod=%{messageid->} %{p0}", processor_chain([ setc("header_id","0019"), call({ dest: "nwparser.payload", @@ -590,8 +537,7 @@ match("HEADER#9:0019", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} % }), ])); -var hdr11 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld2,false), Constant(']: '), Field(hseverity,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,false), Constant('='), Field(hfld3,true), Constant(' '), Field(p0,false)}" -match("HEADER#10:0020", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{hseverity->} mod=%{msgIdPart1->} %{msgIdPart2}=%{hfld3->} %{p0}", processor_chain([ +var hdr11 = match("HEADER#10:0020", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{hseverity->} mod=%{msgIdPart1->} %{msgIdPart2}=%{hfld3->} %{p0}", processor_chain([ setc("header_id","0020"), dup6, call({ @@ -615,8 +561,7 @@ match("HEADER#10:0020", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} }), ])); -var hdr12 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld2,false), Constant(']: '), Field(severity,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' '), Field(p0,false)}" -match("HEADER#11:0021", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{severity->} mod=%{msgIdPart1->} %{p0}", processor_chain([ +var hdr12 = match("HEADER#11:0021", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}[%{hfld2}]: %{severity->} mod=%{msgIdPart1->} %{p0}", processor_chain([ setc("header_id","0021"), call({ dest: "nwparser.messageid", @@ -629,8 +574,7 @@ match("HEADER#11:0021", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} dup7, ])); -var hdr13 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld1,true), Constant(' '), Field(hinstance,false), Constant(': '), Field(hseverity,true), Constant(' s='), Field(hfld2,true), Constant(' m='), Field(hfld3,true), Constant(' x='), Field(hfld4,true), Constant(' '), Field(msgIdPart1,false), Constant('='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#12:0022", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}: %{hseverity->} s=%{hfld2->} m=%{hfld3->} x=%{hfld4->} %{msgIdPart1}=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr13 = match("HEADER#12:0022", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} %{hinstance}: %{hseverity->} s=%{hfld2->} m=%{hfld3->} x=%{hfld4->} %{msgIdPart1}=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0022"), dup6, call({ @@ -656,8 +600,7 @@ match("HEADER#12:0022", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld1->} }), ])); -var hdr14 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' s='), Field(hfld1,true), Constant(' m='), Field(hfld2,true), Constant(' x='), Field(hfld3,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#13:0001", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr14 = match("HEADER#13:0001", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0001"), dup6, call({ @@ -683,8 +626,7 @@ match("HEADER#13:0001", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr15 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' s='), Field(hfld1,true), Constant(' m='), Field(hfld2,true), Constant(' x='), Field(hfld3,true), Constant(' cmd='), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#14:0008", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} cmd=%{messageid->} %{p0}", processor_chain([ +var hdr15 = match("HEADER#14:0008", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} m=%{hfld2->} x=%{hfld3->} cmd=%{messageid->} %{p0}", processor_chain([ setc("header_id","0008"), call({ dest: "nwparser.payload", @@ -707,8 +649,7 @@ match("HEADER#14:0008", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr16 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' s='), Field(hfld1,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#15:0002", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr16 = match("HEADER#15:0002", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0002"), dup6, call({ @@ -730,8 +671,7 @@ match("HEADER#15:0002", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr17 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' s='), Field(hfld1,true), Constant(' mod='), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#16:0007", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} mod=%{messageid->} %{p0}", processor_chain([ +var hdr17 = match("HEADER#16:0007", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} mod=%{messageid->} %{p0}", processor_chain([ setc("header_id","0007"), call({ dest: "nwparser.payload", @@ -750,8 +690,7 @@ match("HEADER#16:0007", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr18 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' s='), Field(hfld1,true), Constant(' cmd='), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#17:0012", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} cmd=%{messageid->} %{p0}", processor_chain([ +var hdr18 = match("HEADER#17:0012", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} s=%{hfld1->} cmd=%{messageid->} %{p0}", processor_chain([ setc("header_id","0012"), call({ dest: "nwparser.payload", @@ -770,8 +709,7 @@ match("HEADER#17:0012", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr19 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' type='), Field(hfld5,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#18:0004", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} mod=%{msgIdPart1->} type=%{hfld5->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr19 = match("HEADER#18:0004", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} mod=%{msgIdPart1->} type=%{hfld5->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0004"), dup6, call({ @@ -793,8 +731,7 @@ match("HEADER#18:0004", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr20 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' pid='), Field(hfld5,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#19:0005", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} pid=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr20 = match("HEADER#19:0005", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} pid=%{hfld5->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0005"), dup6, call({ @@ -816,8 +753,7 @@ match("HEADER#19:0005", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr21 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' mod='), Field(msgIdPart1,true), Constant(' cmd='), Field(msgIdPart2,true), Constant(' '), Field(p0,false)}" -match("HEADER#20:0006", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ +var hdr21 = match("HEADER#20:0006", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} mod=%{msgIdPart1->} cmd=%{msgIdPart2->} %{p0}", processor_chain([ setc("header_id","0006"), dup6, call({ @@ -837,8 +773,7 @@ match("HEADER#20:0006", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr22 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(hseverity,true), Constant(' mod='), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#21:0009", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} mod=%{messageid->} %{p0}", processor_chain([ +var hdr22 = match("HEADER#21:0009", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{hseverity->} mod=%{messageid->} %{p0}", processor_chain([ setc("header_id","0009"), call({ dest: "nwparser.payload", @@ -855,8 +790,7 @@ match("HEADER#21:0009", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr23 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hfld2,true), Constant(' '), Field(hinstance,false), Constant('['), Field(hfld1,false), Constant(']: '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#22:0014", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld2->} %{hinstance}[%{hfld1}]: %{messageid->} %{p0}", processor_chain([ +var hdr23 = match("HEADER#22:0014", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld2->} %{hinstance}[%{hfld1}]: %{messageid->} %{p0}", processor_chain([ setc("header_id","0014"), call({ dest: "nwparser.payload", @@ -873,8 +807,7 @@ match("HEADER#22:0014", "message", "%{hmonth->} %{hday->} %{htime->} %{hfld2->} }), ])); -var hdr24 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(messageid,false), Constant('['), Field(hfld1,false), Constant(']: '), Field(p0,false)}" -match("HEADER#23:0013", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{messageid}[%{hfld1}]: %{p0}", processor_chain([ +var hdr24 = match("HEADER#23:0013", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{messageid}[%{hfld1}]: %{p0}", processor_chain([ setc("header_id","0013"), call({ dest: "nwparser.payload", @@ -891,8 +824,7 @@ match("HEADER#23:0013", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr25 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(htime,true), Constant(' '), Field(hinstance,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#24:0011", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{messageid->} %{p0}", processor_chain([ +var hdr25 = match("HEADER#24:0011", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance->} %{messageid->} %{p0}", processor_chain([ setc("header_id","0011"), call({ dest: "nwparser.payload", @@ -907,8 +839,7 @@ match("HEADER#24:0011", "message", "%{hmonth->} %{hday->} %{htime->} %{hinstance }), ])); -var hdr26 = // "Pattern{Field(messageid,false), Constant('['), Field(hfld1,false), Constant(']: '), Field(p0,false)}" -match("HEADER#25:0010", "message", "%{messageid}[%{hfld1}]: %{p0}", processor_chain([ +var hdr26 = match("HEADER#25:0010", "message", "%{messageid}[%{hfld1}]: %{p0}", processor_chain([ setc("header_id","0010"), call({ dest: "nwparser.payload", @@ -952,16 +883,14 @@ var select1 = linear_select([ hdr26, ]); -var part3 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' r='), Field(event_counter,true), Constant(' value='), Field(to,true), Constant(' verified='), Field(fld3,true), Constant(' routes='), Field(fld4,false)}" -match("MESSAGE#0:mail_env_rcpt", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} r=%{event_counter->} value=%{to->} verified=%{fld3->} routes=%{fld4}", processor_chain([ +var part3 = match("MESSAGE#0:mail_env_rcpt", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} r=%{event_counter->} value=%{to->} verified=%{fld3->} routes=%{fld4}", processor_chain([ dup8, dup9, ])); var msg1 = msg("mail_env_rcpt", part3); -var part4 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' r='), Field(event_counter,true), Constant(' value='), Field(to,true), Constant(' verified='), Field(fld3,true), Constant(' routes='), Field(fld4,false)}" -match("MESSAGE#1:mail_env_rcpt:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} r=%{event_counter->} value=%{to->} verified=%{fld3->} routes=%{fld4}", processor_chain([ +var part4 = match("MESSAGE#1:mail_env_rcpt:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} r=%{event_counter->} value=%{to->} verified=%{fld3->} routes=%{fld4}", processor_chain([ dup8, dup9, ])); @@ -973,32 +902,28 @@ var select2 = linear_select([ msg2, ]); -var part5 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' file='), Field(filename,true), Constant(' mime='), Field(content_type,true), Constant(' type='), Field(fld6,true), Constant(' omime='), Field(fld7,true), Constant(' oext='), Field(fld8,true), Constant(' corrupted='), Field(fld9,true), Constant(' protected='), Field(fld10,true), Constant(' size='), Field(bytes,true), Constant(' virtual='), Field(fld11,true), Constant(' a='), Field(fld12,false)}" -match("MESSAGE#2:mail_attachment", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11->} a=%{fld12}", processor_chain([ +var part5 = match("MESSAGE#2:mail_attachment", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11->} a=%{fld12}", processor_chain([ dup10, dup9, ])); var msg3 = msg("mail_attachment", part5); -var part6 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' file='), Field(filename,true), Constant(' mime='), Field(content_type,true), Constant(' type='), Field(fld6,true), Constant(' omime='), Field(fld7,true), Constant(' oext='), Field(fld8,true), Constant(' corrupted='), Field(fld9,true), Constant(' protected='), Field(fld10,true), Constant(' size='), Field(bytes,true), Constant(' virtual='), Field(fld11,true), Constant(' a='), Field(fld12,false)}" -match("MESSAGE#3:mail_attachment:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11->} a=%{fld12}", processor_chain([ +var part6 = match("MESSAGE#3:mail_attachment:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11->} a=%{fld12}", processor_chain([ dup10, dup9, ])); var msg4 = msg("mail_attachment:01", part6); -var part7 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' file='), Field(filename,true), Constant(' mime='), Field(content_type,true), Constant(' type='), Field(fld6,true), Constant(' omime='), Field(fld7,true), Constant(' oext='), Field(fld8,true), Constant(' corrupted='), Field(fld9,true), Constant(' protected='), Field(fld10,true), Constant(' size='), Field(bytes,true), Constant(' virtual='), Field(fld11,false)}" -match("MESSAGE#4:mail_attachment:02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11}", processor_chain([ +var part7 = match("MESSAGE#4:mail_attachment:02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11}", processor_chain([ dup10, dup9, ])); var msg5 = msg("mail_attachment:02", part7); -var part8 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' file='), Field(filename,true), Constant(' mime='), Field(content_type,true), Constant(' type='), Field(fld6,true), Constant(' omime='), Field(fld7,true), Constant(' oext='), Field(fld8,true), Constant(' corrupted='), Field(fld9,true), Constant(' protected='), Field(fld10,true), Constant(' size='), Field(bytes,true), Constant(' virtual='), Field(fld11,false)}" -match("MESSAGE#5:mail_attachment:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11}", processor_chain([ +var part8 = match("MESSAGE#5:mail_attachment:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} file=%{filename->} mime=%{content_type->} type=%{fld6->} omime=%{fld7->} oext=%{fld8->} corrupted=%{fld9->} protected=%{fld10->} size=%{bytes->} virtual=%{fld11}", processor_chain([ dup10, dup9, ])); @@ -1012,8 +937,7 @@ var select3 = linear_select([ msg6, ]); -var part9 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' attachments='), Field(dclass_counter1,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' size='), Field(bytes,true), Constant(' guid='), Field(fld14,true), Constant(' hdr_mid='), Field(id,true), Constant(' qid='), Field(fld15,true), Constant(' subject='), Field(subject,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' virusname='), Field(threat_name,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#6:mail_msg", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} spamscore=%{reputation_num->} virusname=%{threat_name->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part9 = match("MESSAGE#6:mail_msg", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} spamscore=%{reputation_num->} virusname=%{threat_name->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup11, dup9, dup12, @@ -1022,8 +946,7 @@ match("MESSAGE#6:mail_msg", "nwparser.payload", "%{fld0->} %{severity->} s=%{ses var msg7 = msg("mail_msg", part9); -var part10 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' attachments='), Field(dclass_counter1,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' size='), Field(bytes,true), Constant(' guid='), Field(fld14,true), Constant(' hdr_mid='), Field(id,true), Constant(' qid='), Field(fld15,true), Constant(' subject='), Field(subject,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' virusname='), Field(threat_name,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#7:mail_msg:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} spamscore=%{reputation_num->} virusname=%{threat_name->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part10 = match("MESSAGE#7:mail_msg:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} spamscore=%{reputation_num->} virusname=%{threat_name->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup11, dup9, dup12, @@ -1032,8 +955,7 @@ match("MESSAGE#7:mail_msg:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{ var msg8 = msg("mail_msg:01", part10); -var part11 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' attachments='), Field(dclass_counter1,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' size='), Field(bytes,true), Constant(' guid='), Field(fld14,true), Constant(' hdr_mid='), Field(id,true), Constant(' qid='), Field(fld15,true), Constant(' subject='), Field(subject,true), Constant(' virusname='), Field(threat_name,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#8:mail_msg:04", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} virusname=%{threat_name->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part11 = match("MESSAGE#8:mail_msg:04", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} virusname=%{threat_name->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup11, dup9, dup12, @@ -1042,8 +964,7 @@ match("MESSAGE#8:mail_msg:04", "nwparser.payload", "%{fld0->} %{severity->} s=%{ var msg9 = msg("mail_msg:04", part11); -var part12 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' attachments='), Field(dclass_counter1,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' size='), Field(bytes,true), Constant(' guid='), Field(fld14,true), Constant(' hdr_mid='), Field(id,true), Constant(' qid='), Field(fld15,true), Constant(' subject='), Field(subject,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#9:mail_msg:02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part12 = match("MESSAGE#9:mail_msg:02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup11, dup9, dup12, @@ -1052,8 +973,7 @@ match("MESSAGE#9:mail_msg:02", "nwparser.payload", "%{fld0->} %{severity->} s=%{ var msg10 = msg("mail_msg:02", part12); -var part13 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' attachments='), Field(dclass_counter1,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' size='), Field(bytes,true), Constant(' guid='), Field(fld14,true), Constant(' hdr_mid='), Field(id,true), Constant(' qid='), Field(fld15,true), Constant(' subject='), Field(subject,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#10:mail_msg:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part13 = match("MESSAGE#10:mail_msg:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=%{subject->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup11, dup9, dup12, @@ -1070,8 +990,7 @@ var select4 = linear_select([ msg11, ]); -var part14 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' value='), Field(to,true), Constant(' ofrom='), Field(from,true), Constant(' qid='), Field(fld15,true), Constant(' tls='), Field(fld17,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,true), Constant(' host='), Field(hostname,true), Constant(' ip='), Field(p0,false)}" -match("MESSAGE#11:mail_env_from:ofrom/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} value=%{to->} ofrom=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{p0}"); +var part14 = match("MESSAGE#11:mail_env_from:ofrom/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} value=%{to->} ofrom=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{p0}"); var all3 = all_match({ processors: [ @@ -1086,16 +1005,14 @@ var all3 = all_match({ var msg12 = msg("mail_env_from:ofrom", all3); -var part15 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' value='), Field(to,true), Constant(' ofrom='), Field(from,true), Constant(' qid='), Field(fld15,true), Constant(' tls='), Field(fld17,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,true), Constant(' host='), Field(hostname,true), Constant(' ip='), Field(hostip,true), Constant(' sampling='), Field(fld19,false)}" -match("MESSAGE#12:mail_env_from:ofrom:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} value=%{to->} ofrom=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{hostip->} sampling=%{fld19}", processor_chain([ +var part15 = match("MESSAGE#12:mail_env_from:ofrom:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} value=%{to->} ofrom=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{hostip->} sampling=%{fld19}", processor_chain([ dup16, dup9, ])); var msg13 = msg("mail_env_from:ofrom:01", part15); -var part16 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' value='), Field(from,true), Constant(' qid='), Field(fld15,true), Constant(' tls='), Field(fld17,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,true), Constant(' host='), Field(hostname,true), Constant(' ip='), Field(p0,false)}" -match("MESSAGE#13:mail_env_from/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} value=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{p0}"); +var part16 = match("MESSAGE#13:mail_env_from/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} value=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{p0}"); var all4 = all_match({ processors: [ @@ -1110,8 +1027,7 @@ var all4 = all_match({ var msg14 = msg("mail_env_from", all4); -var part17 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' value='), Field(from,true), Constant(' qid='), Field(fld15,true), Constant(' tls='), Field(fld17,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,true), Constant(' host='), Field(hostname,true), Constant(' ip='), Field(hostip,true), Constant(' sampling='), Field(fld19,false)}" -match("MESSAGE#14:mail_env_from:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} value=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{hostip->} sampling=%{fld19}", processor_chain([ +var part17 = match("MESSAGE#14:mail_env_from:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} value=%{from->} qid=%{fld15->} tls=%{fld17->} routes=%{fld4->} notroutes=%{fld18->} host=%{hostname->} ip=%{hostip->} sampling=%{fld19}", processor_chain([ dup16, dup9, ])); @@ -1125,16 +1041,14 @@ var select5 = linear_select([ msg15, ]); -var part18 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' value='), Field(ddomain,true), Constant(' routes='), Field(fld4,false)}" -match("MESSAGE#15:mail_helo", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} value=%{ddomain->} routes=%{fld4}", processor_chain([ +var part18 = match("MESSAGE#15:mail_helo", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} value=%{ddomain->} routes=%{fld4}", processor_chain([ dup17, dup9, ])); var msg16 = msg("mail_helo", part18); -var part19 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' value='), Field(ddomain,true), Constant(' routes='), Field(fld4,false)}" -match("MESSAGE#16:mail_helo:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} value=%{ddomain->} routes=%{fld4}", processor_chain([ +var part19 = match("MESSAGE#16:mail_helo:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} value=%{ddomain->} routes=%{fld4}", processor_chain([ dup17, dup9, ])); @@ -1146,33 +1060,27 @@ var select6 = linear_select([ msg17, ]); -var part20 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' action='), Field(action,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#17:mail_continue-system-sendmail", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} err=%{fld58}", processor_chain([ +var part20 = match("MESSAGE#17:mail_continue-system-sendmail", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} err=%{fld58}", processor_chain([ dup17, dup9, ])); var msg18 = msg("mail_continue-system-sendmail", part20); -var part21 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' status='), Field(result,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#18:mail_release", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} status=%{result->} err=%{fld58}", processor_chain([ +var part21 = match("MESSAGE#18:mail_release", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} status=%{result->} err=%{fld58}", processor_chain([ dup17, dup9, ])); var msg19 = msg("mail_release", part21); -var part22 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#19:session_data/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} %{p0}"); +var part22 = match("MESSAGE#19:session_data/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} %{p0}"); -var part23 = // "Pattern{Constant('rcpt_notroutes='), Field(fld20,true), Constant(' data_routes='), Field(fld21,false)}" -match("MESSAGE#19:session_data/1_0", "nwparser.p0", "rcpt_notroutes=%{fld20->} data_routes=%{fld21}"); +var part23 = match("MESSAGE#19:session_data/1_0", "nwparser.p0", "rcpt_notroutes=%{fld20->} data_routes=%{fld21}"); -var part24 = // "Pattern{Constant('rcpt='), Field(to,true), Constant(' suborg='), Field(fld22,false)}" -match("MESSAGE#19:session_data/1_1", "nwparser.p0", "rcpt=%{to->} suborg=%{fld22}"); +var part24 = match("MESSAGE#19:session_data/1_1", "nwparser.p0", "rcpt=%{to->} suborg=%{fld22}"); -var part25 = // "Pattern{Constant('from='), Field(from,true), Constant(' suborg='), Field(fld22,false)}" -match("MESSAGE#19:session_data/1_2", "nwparser.p0", "from=%{from->} suborg=%{fld22}"); +var part25 = match("MESSAGE#19:session_data/1_2", "nwparser.p0", "from=%{from->} suborg=%{fld22}"); var select7 = linear_select([ part23, @@ -1193,8 +1101,7 @@ var all5 = all_match({ var msg20 = msg("session_data", all5); -var part26 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rcpt_notroutes='), Field(fld20,true), Constant(' data_routes='), Field(fld21,false)}" -match("MESSAGE#20:session_data:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rcpt_notroutes=%{fld20->} data_routes=%{fld21}", processor_chain([ +var part26 = match("MESSAGE#20:session_data:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rcpt_notroutes=%{fld20->} data_routes=%{fld21}", processor_chain([ dup17, dup9, ])); @@ -1206,16 +1113,14 @@ var select8 = linear_select([ msg21, ]); -var part27 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' folder='), Field(fld22,true), Constant(' pri='), Field(fld23,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#21:session_store", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} folder=%{fld22->} pri=%{fld23->} duration=%{duration_string}", processor_chain([ +var part27 = match("MESSAGE#21:session_store", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} folder=%{fld22->} pri=%{fld23->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); var msg22 = msg("session_store", part27); -var part28 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' folder='), Field(fld22,true), Constant(' pri='), Field(fld23,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#22:session_store:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} folder=%{fld22->} pri=%{fld23->} duration=%{duration_string}", processor_chain([ +var part28 = match("MESSAGE#22:session_store:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} folder=%{fld22->} pri=%{fld23->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); @@ -1227,16 +1132,14 @@ var select9 = linear_select([ msg23, ]); -var part29 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,false)}" -match("MESSAGE#23:session_headers", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ +var part29 = match("MESSAGE#23:session_headers", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ dup17, dup9, ])); var msg24 = msg("session_headers", part29); -var part30 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,false)}" -match("MESSAGE#24:session_headers:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ +var part30 = match("MESSAGE#24:session_headers:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ dup17, dup9, ])); @@ -1248,8 +1151,7 @@ var select10 = linear_select([ msg25, ]); -var part31 = // "Pattern{Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,false)}" -match("MESSAGE#25:session_judge/2", "nwparser.p0", "%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename}"); +var part31 = match("MESSAGE#25:session_judge/2", "nwparser.p0", "%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename}"); var all6 = all_match({ processors: [ @@ -1266,8 +1168,7 @@ var all6 = all_match({ var msg26 = msg("session_judge", all6); -var part32 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,false)}" -match("MESSAGE#26:session_judge:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename}", processor_chain([ +var part32 = match("MESSAGE#26:session_judge:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename}", processor_chain([ dup17, dup9, ])); @@ -1279,16 +1180,14 @@ var select11 = linear_select([ msg27, ]); -var part33 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' ip='), Field(hostip,true), Constant(' country='), Field(location_country,true), Constant(' lip='), Field(fld24,true), Constant(' prot='), Field(fld25,true), Constant(' hops_active='), Field(fld26,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,true), Constant(' perlwait='), Field(fld27,false)}" -match("MESSAGE#27:session_connect", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} ip=%{hostip->} country=%{location_country->} lip=%{fld24->} prot=%{fld25->} hops_active=%{fld26->} routes=%{fld4->} notroutes=%{fld18->} perlwait=%{fld27}", processor_chain([ +var part33 = match("MESSAGE#27:session_connect", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} ip=%{hostip->} country=%{location_country->} lip=%{fld24->} prot=%{fld25->} hops_active=%{fld26->} routes=%{fld4->} notroutes=%{fld18->} perlwait=%{fld27}", processor_chain([ dup17, dup9, ])); var msg28 = msg("session_connect", part33); -var part34 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' ip='), Field(hostip,true), Constant(' country='), Field(location_country,true), Constant(' lip='), Field(fld24,true), Constant(' prot='), Field(fld25,true), Constant(' hops_active='), Field(fld26,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,true), Constant(' perlwait='), Field(fld27,false)}" -match("MESSAGE#28:session_connect:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} ip=%{hostip->} country=%{location_country->} lip=%{fld24->} prot=%{fld25->} hops_active=%{fld26->} routes=%{fld4->} notroutes=%{fld18->} perlwait=%{fld27}", processor_chain([ +var part34 = match("MESSAGE#28:session_connect:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} ip=%{hostip->} country=%{location_country->} lip=%{fld24->} prot=%{fld25->} hops_active=%{fld26->} routes=%{fld4->} notroutes=%{fld18->} perlwait=%{fld27}", processor_chain([ dup17, dup9, ])); @@ -1300,16 +1199,14 @@ var select12 = linear_select([ msg29, ]); -var part35 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' host='), Field(hostname,true), Constant(' resolve='), Field(fld28,true), Constant(' reverse='), Field(fld13,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,false)}" -match("MESSAGE#29:session_resolve", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} host=%{hostname->} resolve=%{fld28->} reverse=%{fld13->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ +var part35 = match("MESSAGE#29:session_resolve", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} host=%{hostname->} resolve=%{fld28->} reverse=%{fld13->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ dup17, dup9, ])); var msg30 = msg("session_resolve", part35); -var part36 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' host='), Field(hostname,true), Constant(' resolve='), Field(fld28,true), Constant(' reverse='), Field(fld13,true), Constant(' routes='), Field(fld4,true), Constant(' notroutes='), Field(fld18,false)}" -match("MESSAGE#30:session_resolve:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} host=%{hostname->} resolve=%{fld28->} reverse=%{fld13->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ +var part36 = match("MESSAGE#30:session_resolve:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} host=%{hostname->} resolve=%{fld28->} reverse=%{fld13->} routes=%{fld4->} notroutes=%{fld18}", processor_chain([ dup17, dup9, ])); @@ -1321,16 +1218,14 @@ var select13 = linear_select([ msg31, ]); -var part37 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' ip='), Field(hostip,true), Constant(' rate='), Field(fld29,true), Constant(' crate='), Field(fld30,true), Constant(' limit='), Field(fld31,false)}" -match("MESSAGE#31:session_throttle", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} ip=%{hostip->} rate=%{fld29->} crate=%{fld30->} limit=%{fld31}", processor_chain([ +var part37 = match("MESSAGE#31:session_throttle", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} ip=%{hostip->} rate=%{fld29->} crate=%{fld30->} limit=%{fld31}", processor_chain([ dup17, dup9, ])); var msg32 = msg("session_throttle", part37); -var part38 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' ip='), Field(hostip,true), Constant(' rate='), Field(fld29,true), Constant(' crate='), Field(fld30,true), Constant(' limit='), Field(fld31,false)}" -match("MESSAGE#32:session_throttle:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} ip=%{hostip->} rate=%{fld29->} crate=%{fld30->} limit=%{fld31}", processor_chain([ +var part38 = match("MESSAGE#32:session_throttle:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} ip=%{hostip->} rate=%{fld29->} crate=%{fld30->} limit=%{fld31}", processor_chain([ dup17, dup9, ])); @@ -1342,24 +1237,21 @@ var select14 = linear_select([ msg33, ]); -var part39 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' rate='), Field(fld58,false)}" -match("MESSAGE#33:session_dispose", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} rate=%{fld58}", processor_chain([ +var part39 = match("MESSAGE#33:session_dispose", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} rate=%{fld58}", processor_chain([ dup22, dup9, ])); var msg34 = msg("session_dispose", part39); -var part40 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' rate='), Field(fld58,false)}" -match("MESSAGE#34:session_dispose:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} rate=%{fld58}", processor_chain([ +var part40 = match("MESSAGE#34:session_dispose:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} rate=%{fld58}", processor_chain([ dup22, dup9, ])); var msg35 = msg("session_dispose:01", part40); -var part41 = // "Pattern{Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,false)}" -match("MESSAGE#35:session_dispose:02/2", "nwparser.p0", "%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action}"); +var part41 = match("MESSAGE#35:session_dispose:02/2", "nwparser.p0", "%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action}"); var all7 = all_match({ processors: [ @@ -1376,8 +1268,7 @@ var all7 = all_match({ var msg36 = msg("session_dispose:02", all7); -var part42 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,false)}" -match("MESSAGE#36:session_dispose:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action}", processor_chain([ +var part42 = match("MESSAGE#36:session_dispose:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action}", processor_chain([ dup22, dup9, ])); @@ -1391,8 +1282,7 @@ var select15 = linear_select([ msg37, ]); -var part43 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' helo='), Field(fld32,true), Constant(' msgs='), Field(fld33,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#37:session_disconnect", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} helo=%{fld32->} msgs=%{fld33->} rcpts=%{dclass_counter2->} routes=%{fld4->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part43 = match("MESSAGE#37:session_disconnect", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} helo=%{fld32->} msgs=%{fld33->} rcpts=%{dclass_counter2->} routes=%{fld4->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup17, dup9, dup13, @@ -1400,8 +1290,7 @@ match("MESSAGE#37:session_disconnect", "nwparser.payload", "%{fld0->} %{severity var msg38 = msg("session_disconnect", part43); -var part44 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' helo='), Field(fld32,true), Constant(' msgs='), Field(fld33,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#38:session_disconnect:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} helo=%{fld32->} msgs=%{fld33->} rcpts=%{dclass_counter2->} routes=%{fld4->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part44 = match("MESSAGE#38:session_disconnect:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} helo=%{fld32->} msgs=%{fld33->} rcpts=%{dclass_counter2->} routes=%{fld4->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup17, dup9, dup13, @@ -1414,14 +1303,11 @@ var select16 = linear_select([ msg39, ]); -var part45 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' attachment='), Field(fld58,true), Constant(' file='), Field(fld1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' name='), Field(fld34,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#39:av_run:02/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} attachment=%{fld58->} file=%{fld1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} name=%{fld34->} %{p0}"); +var part45 = match("MESSAGE#39:av_run:02/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} attachment=%{fld58->} file=%{fld1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} name=%{fld34->} %{p0}"); -var part46 = // "Pattern{Constant('cleaned='), Field(fld35,true), Constant(' vendor='), Field(fld36,true), Constant(' duration='), Field(p0,false)}" -match("MESSAGE#39:av_run:02/1_0", "nwparser.p0", "cleaned=%{fld35->} vendor=%{fld36->} duration=%{p0}"); +var part46 = match("MESSAGE#39:av_run:02/1_0", "nwparser.p0", "cleaned=%{fld35->} vendor=%{fld36->} duration=%{p0}"); -var part47 = // "Pattern{Constant('vendor='), Field(fld36,true), Constant(' duration='), Field(p0,false)}" -match("MESSAGE#39:av_run:02/1_2", "nwparser.p0", "vendor=%{fld36->} duration=%{p0}"); +var part47 = match("MESSAGE#39:av_run:02/1_2", "nwparser.p0", "vendor=%{fld36->} duration=%{p0}"); var select17 = linear_select([ part46, @@ -1444,22 +1330,18 @@ var all8 = all_match({ var msg40 = msg("av_run:02", all8); -var part48 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' attachment='), Field(fld58,true), Constant(' file='), Field(filename,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' name='), Field(fld34,true), Constant(' cleaned='), Field(fld35,true), Constant(' vendor='), Field(fld36,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#40:av_run:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} attachment=%{fld58->} file=%{filename->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} name=%{fld34->} cleaned=%{fld35->} vendor=%{fld36->} duration=%{duration_string}", processor_chain([ +var part48 = match("MESSAGE#40:av_run:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} attachment=%{fld58->} file=%{filename->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} name=%{fld34->} cleaned=%{fld35->} vendor=%{fld36->} duration=%{duration_string}", processor_chain([ dup25, dup9, ])); var msg41 = msg("av_run:03", part48); -var part49 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#41:av_run/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} %{p0}"); +var part49 = match("MESSAGE#41:av_run/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} %{p0}"); -var part50 = // "Pattern{Constant('name='), Field(fld34,true), Constant(' cleaned='), Field(fld35,true), Constant(' vendor='), Field(fld36,true), Constant(' duration='), Field(p0,false)}" -match("MESSAGE#41:av_run/1_1", "nwparser.p0", "name=%{fld34->} cleaned=%{fld35->} vendor=%{fld36->} duration=%{p0}"); +var part50 = match("MESSAGE#41:av_run/1_1", "nwparser.p0", "name=%{fld34->} cleaned=%{fld35->} vendor=%{fld36->} duration=%{p0}"); -var part51 = // "Pattern{Constant('name='), Field(fld34,true), Constant(' vendor='), Field(fld36,true), Constant(' duration='), Field(p0,false)}" -match("MESSAGE#41:av_run/1_2", "nwparser.p0", "name=%{fld34->} vendor=%{fld36->} duration=%{p0}"); +var part51 = match("MESSAGE#41:av_run/1_2", "nwparser.p0", "name=%{fld34->} vendor=%{fld36->} duration=%{p0}"); var select18 = linear_select([ dup23, @@ -1481,8 +1363,7 @@ var all9 = all_match({ var msg42 = msg("av_run", all9); -var part52 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' name='), Field(fld34,true), Constant(' cleaned='), Field(fld35,true), Constant(' vendor='), Field(fld36,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#42:av_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} name=%{fld34->} cleaned=%{fld35->} vendor=%{fld36->} duration=%{duration_string}", processor_chain([ +var part52 = match("MESSAGE#42:av_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} name=%{fld34->} cleaned=%{fld35->} vendor=%{fld36->} duration=%{duration_string}", processor_chain([ dup25, dup9, ])); @@ -1500,24 +1381,21 @@ var msg44 = msg("av_refresh", dup48); var msg45 = msg("av_init", dup48); -var part53 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,false)}" -match("MESSAGE#45:av_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ +var part53 = match("MESSAGE#45:av_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ dup26, dup9, ])); var msg46 = msg("av_load", part53); -var part54 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' attachment='), Field(fld58,true), Constant(' file='), Field(filename,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#46:access_run:02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} attachment=%{fld58->} file=%{filename->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ +var part54 = match("MESSAGE#46:access_run:02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} attachment=%{fld58->} file=%{filename->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); var msg47 = msg("access_run:02", part54); -var part55 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' attachment='), Field(fld58,true), Constant(' file='), Field(filename,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#47:access_run:04", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} attachment=%{fld58->} file=%{filename->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ +var part55 = match("MESSAGE#47:access_run:04", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} attachment=%{fld58->} file=%{filename->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); @@ -1535,8 +1413,7 @@ var select20 = linear_select([ msg50, ]); -var part56 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' action='), Field(action,true), Constant(' dict='), Field(fld37,true), Constant(' file='), Field(filename,false)}" -match("MESSAGE#50:access_refresh", "nwparser.payload", "%{fld0->} %{severity->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} action=%{action->} dict=%{fld37->} file=%{filename}", processor_chain([ +var part56 = match("MESSAGE#50:access_refresh", "nwparser.payload", "%{fld0->} %{severity->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} action=%{action->} dict=%{fld37->} file=%{filename}", processor_chain([ dup17, dup9, ])); @@ -1556,36 +1433,29 @@ var msg54 = msg("regulation_init", dup51); var msg55 = msg("regulation_refresh", dup51); -var part57 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' policy='), Field(fld38,true), Constant(' score='), Field(fld39,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#55:spam_run:rule/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} spamscore=%{reputation_num->} %{p0}"); +var part57 = match("MESSAGE#55:spam_run:rule/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} spamscore=%{reputation_num->} %{p0}"); -var part58 = // "Pattern{Constant('ipscore='), Field(fld40,true), Constant(' suspectscore='), Field(p0,false)}" -match("MESSAGE#55:spam_run:rule/1_0", "nwparser.p0", "ipscore=%{fld40->} suspectscore=%{p0}"); +var part58 = match("MESSAGE#55:spam_run:rule/1_0", "nwparser.p0", "ipscore=%{fld40->} suspectscore=%{p0}"); -var part59 = // "Pattern{Constant('suspectscore='), Field(p0,false)}" -match("MESSAGE#55:spam_run:rule/1_1", "nwparser.p0", "suspectscore=%{p0}"); +var part59 = match("MESSAGE#55:spam_run:rule/1_1", "nwparser.p0", "suspectscore=%{p0}"); var select22 = linear_select([ part58, part59, ]); -var part60 = // "Pattern{Field(fld41,true), Constant(' phishscore='), Field(fld42,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#55:spam_run:rule/2", "nwparser.p0", "%{fld41->} phishscore=%{fld42->} %{p0}"); +var part60 = match("MESSAGE#55:spam_run:rule/2", "nwparser.p0", "%{fld41->} phishscore=%{fld42->} %{p0}"); -var part61 = // "Pattern{Constant('bulkscore='), Field(fld43,true), Constant(' adultscore='), Field(fld44,true), Constant(' classifier='), Field(p0,false)}" -match("MESSAGE#55:spam_run:rule/3_0", "nwparser.p0", "bulkscore=%{fld43->} adultscore=%{fld44->} classifier=%{p0}"); +var part61 = match("MESSAGE#55:spam_run:rule/3_0", "nwparser.p0", "bulkscore=%{fld43->} adultscore=%{fld44->} classifier=%{p0}"); -var part62 = // "Pattern{Constant('adultscore='), Field(fld44,true), Constant(' bulkscore='), Field(fld43,true), Constant(' classifier='), Field(p0,false)}" -match("MESSAGE#55:spam_run:rule/3_1", "nwparser.p0", "adultscore=%{fld44->} bulkscore=%{fld43->} classifier=%{p0}"); +var part62 = match("MESSAGE#55:spam_run:rule/3_1", "nwparser.p0", "adultscore=%{fld44->} bulkscore=%{fld43->} classifier=%{p0}"); var select23 = linear_select([ part61, part62, ]); -var part63 = // "Pattern{Field(fld45,true), Constant(' adjust='), Field(fld46,true), Constant(' reason='), Field(fld47,true), Constant(' scancount='), Field(fld48,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,true), Constant(' raw='), Field(fld51,true), Constant(' tests='), Field(fld52,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#55:spam_run:rule/4", "nwparser.p0", "%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}"); +var part63 = match("MESSAGE#55:spam_run:rule/4", "nwparser.p0", "%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}"); var all10 = all_match({ processors: [ @@ -1603,64 +1473,56 @@ var all10 = all_match({ var msg56 = msg("spam_run:rule", all10); -var part64 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' policy='), Field(fld38,true), Constant(' score='), Field(fld39,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' ipscore='), Field(fld40,true), Constant(' suspectscore='), Field(fld41,true), Constant(' phishscore='), Field(fld42,true), Constant(' bulkscore='), Field(fld43,true), Constant(' adultscore='), Field(fld44,true), Constant(' classifier='), Field(fld45,true), Constant(' adjust='), Field(fld46,true), Constant(' reason='), Field(fld47,true), Constant(' scancount='), Field(fld48,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,true), Constant(' raw='), Field(fld51,true), Constant(' tests='), Field(fld52,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#56:spam_run:rule_02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} spamscore=%{reputation_num->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} adultscore=%{fld44->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}", processor_chain([ +var part64 = match("MESSAGE#56:spam_run:rule_02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} spamscore=%{reputation_num->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} adultscore=%{fld44->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}", processor_chain([ dup27, dup9, ])); var msg57 = msg("spam_run:rule_02", part64); -var part65 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' policy='), Field(fld38,true), Constant(' score='), Field(fld39,true), Constant(' ndrscore='), Field(fld57,true), Constant(' ipscore='), Field(fld40,true), Constant(' suspectscore='), Field(fld41,true), Constant(' phishscore='), Field(fld42,true), Constant(' bulkscore='), Field(fld43,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' adjustscore='), Field(fld58,true), Constant(' adultscore='), Field(fld44,true), Constant(' classifier='), Field(fld45,true), Constant(' adjust='), Field(fld46,true), Constant(' reason='), Field(fld47,true), Constant(' scancount='), Field(fld48,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,true), Constant(' raw='), Field(fld51,true), Constant(' tests='), Field(fld52,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#57:spam_run:rule_03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} ndrscore=%{fld57->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} spamscore=%{reputation_num->} adjustscore=%{fld58->} adultscore=%{fld44->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}", processor_chain([ +var part65 = match("MESSAGE#57:spam_run:rule_03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} ndrscore=%{fld57->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} spamscore=%{reputation_num->} adjustscore=%{fld58->} adultscore=%{fld44->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}", processor_chain([ dup27, dup9, ])); var msg58 = msg("spam_run:rule_03", part65); -var part66 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' policy='), Field(fld38,true), Constant(' score='), Field(fld39,true), Constant(' kscore.is_bulkscore='), Field(fld57,true), Constant(' kscore.compositescore='), Field(fld40,true), Constant(' circleOfTrustscore='), Field(fld41,true), Constant(' compositescore='), Field(fld42,true), Constant(' urlsuspect_oldscore='), Field(fld43,true), Constant(' suspectscore='), Field(reputation_num,true), Constant(' recipient_domain_to_sender_totalscore='), Field(fld58,true), Constant(' phishscore='), Field(fld44,true), Constant(' bulkscore='), Field(fld45,true), Constant(' kscore.is_spamscore='), Field(fld46,true), Constant(' recipient_to_sender_totalscore='), Field(fld47,true), Constant(' recipient_domain_to_sender_domain_totalscore='), Field(fld48,true), Constant(' rbsscore='), Field(fld49,true), Constant(' spamscore='), Field(fld50,true), Constant(' recipient_to_sender_domain_totalscore='), Field(fld51,true), Constant(' urlsuspectscore='), Field(fld52,true), Constant(' '), Field(fld53,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#58:spam_run:rule_04", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} kscore.is_bulkscore=%{fld57->} kscore.compositescore=%{fld40->} circleOfTrustscore=%{fld41->} compositescore=%{fld42->} urlsuspect_oldscore=%{fld43->} suspectscore=%{reputation_num->} recipient_domain_to_sender_totalscore=%{fld58->} phishscore=%{fld44->} bulkscore=%{fld45->} kscore.is_spamscore=%{fld46->} recipient_to_sender_totalscore=%{fld47->} recipient_domain_to_sender_domain_totalscore=%{fld48->} rbsscore=%{fld49->} spamscore=%{fld50->} recipient_to_sender_domain_totalscore=%{fld51->} urlsuspectscore=%{fld52->} %{fld53->} duration=%{duration_string}", processor_chain([ +var part66 = match("MESSAGE#58:spam_run:rule_04", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} kscore.is_bulkscore=%{fld57->} kscore.compositescore=%{fld40->} circleOfTrustscore=%{fld41->} compositescore=%{fld42->} urlsuspect_oldscore=%{fld43->} suspectscore=%{reputation_num->} recipient_domain_to_sender_totalscore=%{fld58->} phishscore=%{fld44->} bulkscore=%{fld45->} kscore.is_spamscore=%{fld46->} recipient_to_sender_totalscore=%{fld47->} recipient_domain_to_sender_domain_totalscore=%{fld48->} rbsscore=%{fld49->} spamscore=%{fld50->} recipient_to_sender_domain_totalscore=%{fld51->} urlsuspectscore=%{fld52->} %{fld53->} duration=%{duration_string}", processor_chain([ dup27, dup9, ])); var msg59 = msg("spam_run:rule_04", part66); -var part67 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' policy='), Field(fld38,true), Constant(' score='), Field(fld39,true), Constant(' ndrscore='), Field(fld53,true), Constant(' suspectscore='), Field(fld40,true), Constant(' malwarescore='), Field(fld41,true), Constant(' phishscore='), Field(fld42,true), Constant(' bulkscore='), Field(fld43,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' adjustscore='), Field(fld54,true), Constant(' adultscore='), Field(fld44,true), Constant(' classifier='), Field(fld45,true), Constant(' adjust='), Field(fld46,true), Constant(' reason='), Field(fld47,true), Constant(' scancount='), Field(fld48,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,true), Constant(' raw='), Field(fld51,true), Constant(' tests='), Field(fld52,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#59:spam_run:rule_05", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} ndrscore=%{fld53->} suspectscore=%{fld40->} malwarescore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} spamscore=%{reputation_num->} adjustscore=%{fld54->} adultscore=%{fld44->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}", processor_chain([ +var part67 = match("MESSAGE#59:spam_run:rule_05", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} policy=%{fld38->} score=%{fld39->} ndrscore=%{fld53->} suspectscore=%{fld40->} malwarescore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} spamscore=%{reputation_num->} adjustscore=%{fld54->} adultscore=%{fld44->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50->} raw=%{fld51->} tests=%{fld52->} duration=%{duration_string}", processor_chain([ dup27, dup9, ])); var msg60 = msg("spam_run:rule_05", part67); -var part68 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' mod='), Field(agent,true), Constant(' total_uri_count='), Field(dclass_counter1,true), Constant(' uris_excluded_from_report_info='), Field(dclass_counter2,false)}" -match("MESSAGE#60:spam_run:rule_06", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} mod=%{agent->} total_uri_count=%{dclass_counter1->} uris_excluded_from_report_info=%{dclass_counter2}", processor_chain([ +var part68 = match("MESSAGE#60:spam_run:rule_06", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} mod=%{agent->} total_uri_count=%{dclass_counter1->} uris_excluded_from_report_info=%{dclass_counter2}", processor_chain([ dup27, dup9, ])); var msg61 = msg("spam_run:rule_06", part68); -var part69 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' action='), Field(action,true), Constant(' score='), Field(fld39,true), Constant(' submsgadjust='), Field(fld53,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' ipscore='), Field(fld40,true), Constant(' suspectscore='), Field(fld41,true), Constant(' phishscore='), Field(fld42,true), Constant(' bulkscore='), Field(fld43,true), Constant(' adultscore='), Field(fld44,true), Constant(' tests='), Field(fld52,false)}" -match("MESSAGE#61:spam_run:action_01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} score=%{fld39->} submsgadjust=%{fld53->} spamscore=%{reputation_num->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} adultscore=%{fld44->} tests=%{fld52}", processor_chain([ +var part69 = match("MESSAGE#61:spam_run:action_01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} score=%{fld39->} submsgadjust=%{fld53->} spamscore=%{reputation_num->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} adultscore=%{fld44->} tests=%{fld52}", processor_chain([ dup27, dup9, ])); var msg62 = msg("spam_run:action_01", part69); -var part70 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' action='), Field(action,true), Constant(' score='), Field(fld39,true), Constant(' submsgadjust='), Field(fld53,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' ipscore='), Field(fld40,true), Constant(' suspectscore='), Field(fld41,true), Constant(' phishscore='), Field(fld42,true), Constant(' bulkscore='), Field(fld43,true), Constant(' adultscore='), Field(fld44,true), Constant(' tests='), Field(fld52,false)}" -match("MESSAGE#62:spam_run:action", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} score=%{fld39->} submsgadjust=%{fld53->} spamscore=%{reputation_num->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} adultscore=%{fld44->} tests=%{fld52}", processor_chain([ +var part70 = match("MESSAGE#62:spam_run:action", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} score=%{fld39->} submsgadjust=%{fld53->} spamscore=%{reputation_num->} ipscore=%{fld40->} suspectscore=%{fld41->} phishscore=%{fld42->} bulkscore=%{fld43->} adultscore=%{fld44->} tests=%{fld52}", processor_chain([ dup27, dup9, ])); var msg63 = msg("spam_run:action", part70); -var part71 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' action='), Field(action,true), Constant(' num_domains='), Field(fld53,true), Constant(' num_domains_to_lookup='), Field(fld40,false)}" -match("MESSAGE#63:spam_run:action_02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} num_domains=%{fld53->} num_domains_to_lookup=%{fld40}", processor_chain([ +var part71 = match("MESSAGE#63:spam_run:action_02", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} action=%{action->} num_domains=%{fld53->} num_domains_to_lookup=%{fld40}", processor_chain([ dup27, dup9, ])); @@ -1683,24 +1545,21 @@ var msg65 = msg("spam_refresh", dup53); var msg66 = msg("spam_init", dup53); -var part72 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,false)}" -match("MESSAGE#66:spam_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ +var part72 = match("MESSAGE#66:spam_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ dup27, dup9, ])); var msg67 = msg("spam_load", part72); -var part73 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' policy='), Field(fld38,true), Constant(' address='), Field(fld54,false)}" -match("MESSAGE#67:batv_run", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} policy=%{fld38->} address=%{fld54}", processor_chain([ +var part73 = match("MESSAGE#67:batv_run", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} policy=%{fld38->} address=%{fld54}", processor_chain([ dup17, dup9, ])); var msg68 = msg("batv_run", part73); -var part74 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' policy='), Field(fld38,true), Constant(' address='), Field(fld54,false)}" -match("MESSAGE#68:batv_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} policy=%{fld38->} address=%{fld54}", processor_chain([ +var part74 = match("MESSAGE#68:batv_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} policy=%{fld38->} address=%{fld54}", processor_chain([ dup17, dup9, ])); @@ -1724,16 +1583,14 @@ var msg73 = msg("zerohour_init", dup54); var msg74 = msg("zerohour_load", dup52); -var part75 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' count='), Field(fld2,true), Constant(' name='), Field(fld34,true), Constant(' init_time='), Field(fld3,true), Constant(' init_virusthreat='), Field(fld4,true), Constant(' virusthreat='), Field(fld5,true), Constant(' virusthreatid='), Field(fld6,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#74:zerohour_run", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} count=%{fld2->} name=%{fld34->} init_time=%{fld3->} init_virusthreat=%{fld4->} virusthreat=%{fld5->} virusthreatid=%{fld6->} duration=%{duration_string}", processor_chain([ +var part75 = match("MESSAGE#74:zerohour_run", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} count=%{fld2->} name=%{fld34->} init_time=%{fld3->} init_virusthreat=%{fld4->} virusthreat=%{fld5->} virusthreatid=%{fld6->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); var msg75 = msg("zerohour_run", part75); -var part76 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' count='), Field(fld2,true), Constant(' name='), Field(fld34,true), Constant(' init_time='), Field(fld3,true), Constant(' init_virusthreat='), Field(fld4,true), Constant(' virusthreat='), Field(fld5,true), Constant(' virusthreatid='), Field(fld6,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#75:zerohour_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} count=%{fld2->} name=%{fld34->} init_time=%{fld3->} init_virusthreat=%{fld4->} virusthreat=%{fld5->} virusthreatid=%{fld6->} duration=%{duration_string}", processor_chain([ +var part76 = match("MESSAGE#75:zerohour_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} count=%{fld2->} name=%{fld34->} init_time=%{fld3->} init_virusthreat=%{fld4->} virusthreat=%{fld5->} virusthreatid=%{fld6->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); @@ -1745,40 +1602,35 @@ var select26 = linear_select([ msg76, ]); -var part77 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#76:service_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} duration=%{duration_string}", processor_chain([ +var part77 = match("MESSAGE#76:service_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); var msg77 = msg("service_refresh", part77); -var part78 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#77:perl_clone", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} duration=%{duration_string}", processor_chain([ +var part78 = match("MESSAGE#77:perl_clone", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} id=%{fld5->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); var msg78 = msg("perl_clone", part78); -var part79 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' cset='), Field(fld56,true), Constant(' name='), Field(fld34,true), Constant(' status='), Field(result,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#78:cvt_convert", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} cset=%{fld56->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ +var part79 = match("MESSAGE#78:cvt_convert", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} cset=%{fld56->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ dup17, dup9, ])); var msg79 = msg("cvt_convert", part79); -var part80 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' cset='), Field(fld56,true), Constant(' name='), Field(fld34,true), Constant(' status='), Field(result,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#79:cvt_convert:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} cset=%{fld56->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ +var part80 = match("MESSAGE#79:cvt_convert:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} cset=%{fld56->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ dup17, dup9, ])); var msg80 = msg("cvt_convert:01", part80); -var part81 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' pid='), Field(process_id,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' cset='), Field(fld56,true), Constant(' name='), Field(fld34,true), Constant(' status='), Field(result,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#80:cvt_convert:02", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} mod=%{agent->} cmd=%{obj_type->} cset=%{fld56->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ +var part81 = match("MESSAGE#80:cvt_convert:02", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} mod=%{agent->} cmd=%{obj_type->} cset=%{fld56->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ dup17, dup9, ])); @@ -1791,8 +1643,7 @@ var select27 = linear_select([ msg81, ]); -var part82 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' pid='), Field(process_id,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' name='), Field(fld34,true), Constant(' status='), Field(result,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#81:cvt_detect", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} mod=%{agent->} cmd=%{obj_type->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ +var part82 = match("MESSAGE#81:cvt_detect", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} mod=%{agent->} cmd=%{obj_type->} name=%{fld34->} status=%{result->} err=%{fld58}", processor_chain([ dup17, dup9, ])); @@ -1808,8 +1659,7 @@ var select28 = linear_select([ msg84, ]); -var part83 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' pid='), Field(fld5,true), Constant(' mod='), Field(agent,true), Constant(' encrypted='), Field(fld6,false)}" -match("MESSAGE#84:cvtd_encrypted", "nwparser.payload", "%{fld0->} %{severity->} pid=%{fld5->} mod=%{agent->} encrypted=%{fld6}", processor_chain([ +var part83 = match("MESSAGE#84:cvtd_encrypted", "nwparser.payload", "%{fld0->} %{severity->} pid=%{fld5->} mod=%{agent->} encrypted=%{fld6}", processor_chain([ dup17, dup9, ])); @@ -1829,8 +1679,7 @@ var msg88 = msg("soap_listen", dup57); var msg89 = msg("http_listen", dup57); -var part84 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' '), Field(event_description,false)}" -match("MESSAGE#89:mltr", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} %{event_description}", processor_chain([ +var part84 = match("MESSAGE#89:mltr", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} %{event_description}", processor_chain([ dup17, dup9, ])); @@ -1843,22 +1692,18 @@ var msg92 = msg("smtpsrv_load", dup52); var msg93 = msg("smtpsrv_listen", dup57); -var part85 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#93:smtpsrv_run", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ +var part85 = match("MESSAGE#93:smtpsrv_run", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); var msg94 = msg("smtpsrv_run", part85); -var part86 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#94:smtpsrv/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} %{p0}"); +var part86 = match("MESSAGE#94:smtpsrv/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} %{p0}"); -var part87 = // "Pattern{Field(result,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#94:smtpsrv/1_0", "nwparser.p0", "%{result->} err=%{fld58}"); +var part87 = match("MESSAGE#94:smtpsrv/1_0", "nwparser.p0", "%{result->} err=%{fld58}"); -var part88 = // "Pattern{Field(result,false)}" -match_copy("MESSAGE#94:smtpsrv/1_1", "nwparser.p0", "result"); +var part88 = match_copy("MESSAGE#94:smtpsrv/1_1", "nwparser.p0", "result"); var select30 = linear_select([ part87, @@ -1878,24 +1723,21 @@ var all11 = all_match({ var msg95 = msg("smtpsrv", all11); -var part89 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' cmd='), Field(obj_type,true), Constant(' profile='), Field(fld52,true), Constant(' qid='), Field(fld15,true), Constant(' rcpts='), Field(to,false)}" -match("MESSAGE#95:send", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} cmd=%{obj_type->} profile=%{fld52->} qid=%{fld15->} rcpts=%{to}", processor_chain([ +var part89 = match("MESSAGE#95:send", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} cmd=%{obj_type->} profile=%{fld52->} qid=%{fld15->} rcpts=%{to}", processor_chain([ dup17, dup9, ])); var msg96 = msg("send", part89); -var part90 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' cmd='), Field(obj_type,true), Constant(' profile='), Field(fld52,true), Constant(' qid='), Field(fld15,true), Constant(' rcpts='), Field(to,false)}" -match("MESSAGE#96:send:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} cmd=%{obj_type->} profile=%{fld52->} qid=%{fld15->} rcpts=%{to}", processor_chain([ +var part90 = match("MESSAGE#96:send:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} cmd=%{obj_type->} profile=%{fld52->} qid=%{fld15->} rcpts=%{to}", processor_chain([ dup17, dup9, ])); var msg97 = msg("send:01", part90); -var part91 = // "Pattern{Field(fld0,false), Constant(': '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' cmd='), Field(obj_type,true), Constant(' rcpt='), Field(to,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#97:send:02", "nwparser.payload", "%{fld0}: %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} cmd=%{obj_type->} rcpt=%{to->} err=%{fld58}", processor_chain([ +var part91 = match("MESSAGE#97:send:02", "nwparser.payload", "%{fld0}: %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} cmd=%{obj_type->} rcpt=%{to->} err=%{fld58}", processor_chain([ dup17, dup9, ])); @@ -1908,22 +1750,18 @@ var select31 = linear_select([ msg98, ]); -var part92 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld51,false), Constant(': to='), Field(to,false), Constant(', delay='), Field(fld53,false), Constant(', xdelay='), Field(fld54,false), Constant(', mailer='), Field(p0,false)}" -match("MESSAGE#98:queued-alert/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{p0}"); +var part92 = match("MESSAGE#98:queued-alert/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{p0}"); -var part93 = // "Pattern{Field(fld55,true), Constant(' tls_verify='), Field(fld70,false), Constant(', pri='), Field(p0,false)}" -match("MESSAGE#98:queued-alert/1_0", "nwparser.p0", "%{fld55->} tls_verify=%{fld70}, pri=%{p0}"); +var part93 = match("MESSAGE#98:queued-alert/1_0", "nwparser.p0", "%{fld55->} tls_verify=%{fld70}, pri=%{p0}"); -var part94 = // "Pattern{Field(fld55,false), Constant(', pri='), Field(p0,false)}" -match("MESSAGE#98:queued-alert/1_1", "nwparser.p0", "%{fld55}, pri=%{p0}"); +var part94 = match("MESSAGE#98:queued-alert/1_1", "nwparser.p0", "%{fld55}, pri=%{p0}"); var select32 = linear_select([ part93, part94, ]); -var part95 = // "Pattern{Field(fld23,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#98:queued-alert/2", "nwparser.p0", "%{fld23}, relay=%{p0}"); +var part95 = match("MESSAGE#98:queued-alert/2", "nwparser.p0", "%{fld23}, relay=%{p0}"); var all12 = all_match({ processors: [ @@ -1941,11 +1779,9 @@ var all12 = all_match({ var msg99 = msg("queued-alert", all12); -var part96 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': from='), Field(from,false), Constant(', size='), Field(bytes,false), Constant(', class='), Field(fld57,false), Constant(', nrcpts='), Field(fld58,false), Constant(', msgid='), Field(id,false), Constant(', proto='), Field(protocol,false), Constant(', daemon='), Field(fld69,false), Constant(', tls_verify='), Field(fld70,false), Constant(', auth='), Field(authmethod,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#99:queued-alert:01/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, tls_verify=%{fld70}, auth=%{authmethod}, relay=%{p0}"); +var part96 = match("MESSAGE#99:queued-alert:01/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, tls_verify=%{fld70}, auth=%{authmethod}, relay=%{p0}"); -var part97 = // "Pattern{Constant('['), Field(fld50,false), Constant('] ['), Field(daddr,false), Constant(']')}" -match("MESSAGE#99:queued-alert:01/1_0", "nwparser.p0", "[%{fld50}] [%{daddr}]"); +var part97 = match("MESSAGE#99:queued-alert:01/1_0", "nwparser.p0", "[%{fld50}] [%{daddr}]"); var select33 = linear_select([ part97, @@ -1968,8 +1804,7 @@ var all13 = all_match({ var msg100 = msg("queued-alert:01", all13); -var part98 = // "Pattern{Constant('['), Field(fld50,false), Constant('] ['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#100:queued-alert:02/1_0", "nwparser.p0", "[%{fld50}] [%{daddr}],%{p0}"); +var part98 = match("MESSAGE#100:queued-alert:02/1_0", "nwparser.p0", "[%{fld50}] [%{daddr}],%{p0}"); var select34 = linear_select([ part98, @@ -1978,8 +1813,7 @@ var select34 = linear_select([ dup31, ]); -var part99 = // "Pattern{Field(,false), Constant('version='), Field(version,false), Constant(', verify='), Field(fld57,false), Constant(', cipher='), Field(s_cipher,false), Constant(', bits='), Field(fld59,false)}" -match("MESSAGE#100:queued-alert:02/2", "nwparser.p0", "%{}version=%{version}, verify=%{fld57}, cipher=%{s_cipher}, bits=%{fld59}"); +var part99 = match("MESSAGE#100:queued-alert:02/2", "nwparser.p0", "%{}version=%{version}, verify=%{fld57}, cipher=%{s_cipher}, bits=%{fld59}"); var all14 = all_match({ processors: [ @@ -2037,8 +1871,7 @@ var msg111 = msg("queued-reinject:02", dup65); var msg112 = msg("queued-reinject:03", dup66); -var part100 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': maxrcpts='), Field(fld56,false), Constant(', rcpts='), Field(fld57,false), Constant(', count='), Field(fld58,false), Constant(', ids='), Field(fld59,false)}" -match("MESSAGE#111:queued-reinject:05", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: maxrcpts=%{fld56}, rcpts=%{fld57}, count=%{fld58}, ids=%{fld59}", processor_chain([ +var part100 = match("MESSAGE#111:queued-reinject:05", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: maxrcpts=%{fld56}, rcpts=%{fld57}, count=%{fld58}, ids=%{fld59}", processor_chain([ dup17, dup9, ])); @@ -2059,8 +1892,7 @@ var select38 = linear_select([ msg115, ]); -var part101 = // "Pattern{Field(,false), Constant('version='), Field(version,false), Constant(', verify='), Field(disposition,false), Constant(', cipher='), Field(fld58,false), Constant(', bits='), Field(fld59,false)}" -match("MESSAGE#114:queued-eurort/2", "nwparser.p0", "%{}version=%{version}, verify=%{disposition}, cipher=%{fld58}, bits=%{fld59}"); +var part101 = match("MESSAGE#114:queued-eurort/2", "nwparser.p0", "%{}version=%{version}, verify=%{disposition}, cipher=%{fld58}, bits=%{fld59}"); var all15 = all_match({ processors: [ @@ -2100,16 +1932,14 @@ var select40 = linear_select([ var msg122 = msg("sm-msp-queue", dup66); -var part102 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: starting daemon ('), Field(fld7,false), Constant('): '), Field(fld6,false)}" -match("MESSAGE#122:sm-msp-queue:01", "nwparser.payload", "%{agent}[%{process_id}]: starting daemon (%{fld7}): %{fld6}", processor_chain([ +var part102 = match("MESSAGE#122:sm-msp-queue:01", "nwparser.payload", "%{agent}[%{process_id}]: starting daemon (%{fld7}): %{fld6}", processor_chain([ setc("eventcategory","1605000000"), dup9, ])); var msg123 = msg("sm-msp-queue:01", part102); -var part103 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': to='), Field(to,false), Constant(', ctladdr='), Field(fld13,false), Constant(', delay='), Field(fld53,false), Constant(', xdelay='), Field(fld54,false), Constant(', mailer='), Field(fld55,false), Constant(', pri='), Field(fld23,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#123:sm-msp-queue:02/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, ctladdr=%{fld13}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); +var part103 = match("MESSAGE#123:sm-msp-queue:02/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, ctladdr=%{fld13}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); var all16 = all_match({ processors: [ @@ -2131,14 +1961,11 @@ var select41 = linear_select([ msg124, ]); -var part104 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': to='), Field(to,false), Constant(', delay='), Field(fld53,false), Constant(', xdelay='), Field(fld54,false), Constant(', mailer='), Field(fld55,false), Constant(', tls_verify='), Field(fld24,false), Constant(', pri='), Field(fld23,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#124:sendmail:15/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, tls_verify=%{fld24}, pri=%{fld23}, relay=%{p0}"); +var part104 = match("MESSAGE#124:sendmail:15/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, tls_verify=%{fld24}, pri=%{fld23}, relay=%{p0}"); -var part105 = // "Pattern{Field(dhost,false), Constant('. ['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#124:sendmail:15/1_1", "nwparser.p0", "%{dhost}. [%{daddr}],%{p0}"); +var part105 = match("MESSAGE#124:sendmail:15/1_1", "nwparser.p0", "%{dhost}. [%{daddr}],%{p0}"); -var part106 = // "Pattern{Field(dhost,false), Constant('.,'), Field(p0,false)}" -match("MESSAGE#124:sendmail:15/1_2", "nwparser.p0", "%{dhost}.,%{p0}"); +var part106 = match("MESSAGE#124:sendmail:15/1_2", "nwparser.p0", "%{dhost}.,%{p0}"); var select42 = linear_select([ dup28, @@ -2160,14 +1987,11 @@ var all17 = all_match({ var msg125 = msg("sendmail:15", all17); -var part107 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': from='), Field(from,false), Constant(', size='), Field(bytes,false), Constant(', class='), Field(fld54,false), Constant(', nrcpts='), Field(fld55,false), Constant(', msgid='), Field(id,false), Constant(', proto='), Field(protocol,false), Constant(', daemon='), Field(p0,false)}" -match("MESSAGE#125:sendmail:14/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld54}, nrcpts=%{fld55}, msgid=%{id}, proto=%{protocol}, daemon=%{p0}"); +var part107 = match("MESSAGE#125:sendmail:14/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld54}, nrcpts=%{fld55}, msgid=%{id}, proto=%{protocol}, daemon=%{p0}"); -var part108 = // "Pattern{Field(fld69,false), Constant(', tls_verify='), Field(fld70,false), Constant(', auth='), Field(authmethod,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#125:sendmail:14/1_0", "nwparser.p0", "%{fld69}, tls_verify=%{fld70}, auth=%{authmethod}, relay=%{p0}"); +var part108 = match("MESSAGE#125:sendmail:14/1_0", "nwparser.p0", "%{fld69}, tls_verify=%{fld70}, auth=%{authmethod}, relay=%{p0}"); -var part109 = // "Pattern{Field(fld69,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#125:sendmail:14/1_1", "nwparser.p0", "%{fld69}, relay=%{p0}"); +var part109 = match("MESSAGE#125:sendmail:14/1_1", "nwparser.p0", "%{fld69}, relay=%{p0}"); var select43 = linear_select([ part108, @@ -2190,62 +2014,53 @@ var msg126 = msg("sendmail:14", all18); var msg127 = msg("sendmail", dup68); -var part110 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': available mech='), Field(fld2,false), Constant(', allowed mech='), Field(fld3,false)}" -match("MESSAGE#127:sendmail:01", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: available mech=%{fld2}, allowed mech=%{fld3}", processor_chain([ +var part110 = match("MESSAGE#127:sendmail:01", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: available mech=%{fld2}, allowed mech=%{fld3}", processor_chain([ dup17, dup9, ])); var msg128 = msg("sendmail:01", part110); -var part111 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': milter='), Field(fld2,false), Constant(', action='), Field(action,false), Constant(', reject='), Field(fld3,false)}" -match("MESSAGE#128:sendmail:02", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: milter=%{fld2}, action=%{action}, reject=%{fld3}", processor_chain([ +var part111 = match("MESSAGE#128:sendmail:02", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: milter=%{fld2}, action=%{action}, reject=%{fld3}", processor_chain([ dup17, dup9, ])); var msg129 = msg("sendmail:02", part111); -var part112 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld51,false), Constant(': '), Field(fld57,false), Constant(': host='), Field(hostname,false), Constant(', addr='), Field(saddr,false), Constant(', reject='), Field(fld3,false)}" -match("MESSAGE#129:sendmail:03", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: %{fld57}: host=%{hostname}, addr=%{saddr}, reject=%{fld3}", processor_chain([ +var part112 = match("MESSAGE#129:sendmail:03", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: %{fld57}: host=%{hostname}, addr=%{saddr}, reject=%{fld3}", processor_chain([ dup17, dup9, ])); var msg130 = msg("sendmail:03", part112); -var part113 = // "Pattern{Field(fld10,true), Constant(' '), Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': Milter '), Field(action,false), Constant(': '), Field(fld2,false), Constant(': '), Field(fld3,false), Constant(': vendor='), Field(fld36,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,true), Constant(' signatures='), Field(fld94,false)}" -match("MESSAGE#130:sendmail:08", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: Milter %{action}: %{fld2}: %{fld3}: vendor=%{fld36->} engine=%{fld49->} definitions=%{fld50->} signatures=%{fld94}", processor_chain([ +var part113 = match("MESSAGE#130:sendmail:08", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: Milter %{action}: %{fld2}: %{fld3}: vendor=%{fld36->} engine=%{fld49->} definitions=%{fld50->} signatures=%{fld94}", processor_chain([ dup17, dup9, ])); var msg131 = msg("sendmail:08", part113); -var part114 = // "Pattern{Field(fld10,true), Constant(' '), Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': Milter '), Field(action,false), Constant(': '), Field(fld2,false), Constant(': '), Field(fld3,false), Constant(': rule='), Field(rulename,true), Constant(' policy='), Field(fld38,true), Constant(' score='), Field(fld39,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' suspectscore='), Field(fld41,true), Constant(' phishscore='), Field(fld42,true), Constant(' adultscore='), Field(fld44,true), Constant(' bulkscore='), Field(fld43,true), Constant(' classifier='), Field(fld45,true), Constant(' adjust='), Field(fld46,true), Constant(' reason='), Field(fld47,true), Constant(' scancount='), Field(fld48,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,false)}" -match("MESSAGE#131:sendmail:09", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: Milter %{action}: %{fld2}: %{fld3}: rule=%{rulename->} policy=%{fld38->} score=%{fld39->} spamscore=%{reputation_num->} suspectscore=%{fld41->} phishscore=%{fld42->} adultscore=%{fld44->} bulkscore=%{fld43->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50}", processor_chain([ +var part114 = match("MESSAGE#131:sendmail:09", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: Milter %{action}: %{fld2}: %{fld3}: rule=%{rulename->} policy=%{fld38->} score=%{fld39->} spamscore=%{reputation_num->} suspectscore=%{fld41->} phishscore=%{fld42->} adultscore=%{fld44->} bulkscore=%{fld43->} classifier=%{fld45->} adjust=%{fld46->} reason=%{fld47->} scancount=%{fld48->} engine=%{fld49->} definitions=%{fld50}", processor_chain([ dup17, dup9, ])); var msg132 = msg("sendmail:09", part114); -var part115 = // "Pattern{Field(fld10,true), Constant(' '), Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': Milter '), Field(action,false), Constant(': rcpt'), Field(p0,false)}" -match("MESSAGE#132:sendmail:10/0", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: Milter %{action}: rcpt%{p0}"); +var part115 = match("MESSAGE#132:sendmail:10/0", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: Milter %{action}: rcpt%{p0}"); -var part116 = // "Pattern{Constant(': '), Field(p0,false)}" -match("MESSAGE#132:sendmail:10/1_0", "nwparser.p0", ": %{p0}"); +var part116 = match("MESSAGE#132:sendmail:10/1_0", "nwparser.p0", ": %{p0}"); -var part117 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#132:sendmail:10/1_1", "nwparser.p0", "p0"); +var part117 = match_copy("MESSAGE#132:sendmail:10/1_1", "nwparser.p0", "p0"); var select44 = linear_select([ part116, part117, ]); -var part118 = // "Pattern{Field(,true), Constant(' '), Field(fld2,false)}" -match("MESSAGE#132:sendmail:10/2", "nwparser.p0", "%{} %{fld2}"); +var part118 = match("MESSAGE#132:sendmail:10/2", "nwparser.p0", "%{} %{fld2}"); var all19 = all_match({ processors: [ @@ -2261,8 +2076,7 @@ var all19 = all_match({ var msg133 = msg("sendmail:10", all19); -var part119 = // "Pattern{Field(fld10,true), Constant(' '), Field(agent,false), Constant('['), Field(process_id,false), Constant(']: STARTTLS='), Field(fld1,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#133:sendmail:11/0", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: STARTTLS=%{fld1}, relay=%{p0}"); +var part119 = match("MESSAGE#133:sendmail:11/0", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: STARTTLS=%{fld1}, relay=%{p0}"); var all20 = all_match({ processors: [ @@ -2278,27 +2092,23 @@ var all20 = all_match({ var msg134 = msg("sendmail:11", all20); -var part120 = // "Pattern{Field(fld10,true), Constant(' '), Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': SYSERR('), Field(fld2,false), Constant('): '), Field(action,false), Constant(': '), Field(event_description,true), Constant(' from '), Field(from,false), Constant(', from='), Field(fld3,false)}" -match("MESSAGE#134:sendmail:12", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: SYSERR(%{fld2}): %{action}: %{event_description->} from %{from}, from=%{fld3}", processor_chain([ +var part120 = match("MESSAGE#134:sendmail:12", "nwparser.payload", "%{fld10->} %{agent}[%{process_id}]: %{fld1}: SYSERR(%{fld2}): %{action}: %{event_description->} from %{from}, from=%{fld3}", processor_chain([ dup17, dup9, ])); var msg135 = msg("sendmail:12", part120); -var part121 = // "Pattern{Field(fld10,true), Constant(' '), Field(agent,false), Constant(']'), Field(p0,false)}" -match("MESSAGE#135:sendmail:13/0_0", "nwparser.payload", "%{fld10->} %{agent}]%{p0}"); +var part121 = match("MESSAGE#135:sendmail:13/0_0", "nwparser.payload", "%{fld10->} %{agent}]%{p0}"); -var part122 = // "Pattern{Field(agent,false), Constant(']'), Field(p0,false)}" -match("MESSAGE#135:sendmail:13/0_1", "nwparser.payload", "%{agent}]%{p0}"); +var part122 = match("MESSAGE#135:sendmail:13/0_1", "nwparser.payload", "%{agent}]%{p0}"); var select45 = linear_select([ part121, part122, ]); -var part123 = // "Pattern{Field(process_id,false), Constant('[: '), Field(fld1,false), Constant(': SYSERR('), Field(fld2,false), Constant('): '), Field(action,false), Constant(': '), Field(event_description,true), Constant(' file '), Field(filename,false), Constant(': '), Field(fld3,false)}" -match("MESSAGE#135:sendmail:13/1", "nwparser.p0", "%{process_id}[: %{fld1}: SYSERR(%{fld2}): %{action}: %{event_description->} file %{filename}: %{fld3}"); +var part123 = match("MESSAGE#135:sendmail:13/1", "nwparser.p0", "%{process_id}[: %{fld1}: SYSERR(%{fld2}): %{action}: %{event_description->} file %{filename}: %{fld3}"); var all21 = all_match({ processors: [ @@ -2313,27 +2123,23 @@ var all21 = all_match({ var msg136 = msg("sendmail:13", all21); -var part124 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld51,false), Constant(': '), Field(fld57,false), Constant(':'), Field(event_description,false)}" -match("MESSAGE#136:sendmail:04", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: %{fld57}:%{event_description}", processor_chain([ +var part124 = match("MESSAGE#136:sendmail:04", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: %{fld57}:%{event_description}", processor_chain([ dup17, dup9, ])); var msg137 = msg("sendmail:04", part124); -var part125 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld51,false), Constant(':'), Field(event_description,false)}" -match("MESSAGE#137:sendmail:05", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}:%{event_description}", processor_chain([ +var part125 = match("MESSAGE#137:sendmail:05", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}:%{event_description}", processor_chain([ dup17, dup9, ])); var msg138 = msg("sendmail:05", part125); -var part126 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: AUTH='), Field(authmethod,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#169:sendmail:06/0", "nwparser.payload", "%{agent}[%{process_id}]: AUTH=%{authmethod}, relay=%{p0}"); +var part126 = match("MESSAGE#169:sendmail:06/0", "nwparser.payload", "%{agent}[%{process_id}]: AUTH=%{authmethod}, relay=%{p0}"); -var part127 = // "Pattern{Field(,false), Constant('authid='), Field(uid,false), Constant(', mech='), Field(scheme,false), Constant(', bits='), Field(fld59,false)}" -match("MESSAGE#169:sendmail:06/2", "nwparser.p0", "%{}authid=%{uid}, mech=%{scheme}, bits=%{fld59}"); +var part127 = match("MESSAGE#169:sendmail:06/2", "nwparser.p0", "%{}authid=%{uid}, mech=%{scheme}, bits=%{fld59}"); var all22 = all_match({ processors: [ @@ -2370,24 +2176,21 @@ var select46 = linear_select([ msg140, ]); -var part128 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' eid='), Field(fld4,true), Constant(' pid='), Field(process_id,true), Constant(' status='), Field(fld29,false)}" -match("MESSAGE#138:info:eid_pid_status", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} pid=%{process_id->} status=%{fld29}", processor_chain([ +var part128 = match("MESSAGE#138:info:eid_pid_status", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} pid=%{process_id->} status=%{fld29}", processor_chain([ dup17, dup9, ])); var msg141 = msg("info:eid_pid_status", part128); -var part129 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' eid='), Field(fld4,true), Constant(' status='), Field(fld29,false)}" -match("MESSAGE#139:info:eid_status", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} status=%{fld29}", processor_chain([ +var part129 = match("MESSAGE#139:info:eid_status", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} status=%{fld29}", processor_chain([ dup17, dup9, ])); var msg142 = msg("info:eid_status", part129); -var part130 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' eid='), Field(fld4,true), Constant(' '), Field(info,false)}" -match("MESSAGE#140:info:eid", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} %{info}", processor_chain([ +var part130 = match("MESSAGE#140:info:eid", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} %{info}", processor_chain([ dup17, dup9, ])); @@ -2396,17 +2199,13 @@ var msg143 = msg("info:eid", part130); var msg144 = msg("info:pid", dup62); -var part131 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(p0,false)}" -match("MESSAGE#143:info/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{p0}"); +var part131 = match("MESSAGE#143:info/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{p0}"); -var part132 = // "Pattern{Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' ofrom='), Field(from,false)}" -match("MESSAGE#143:info/1_0", "nwparser.p0", "%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} ofrom=%{from}"); +var part132 = match("MESSAGE#143:info/1_0", "nwparser.p0", "%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} ofrom=%{from}"); -var part133 = // "Pattern{Field(sessionid1,true), Constant(' status='), Field(info,true), Constant(' restquery_stage='), Field(fld3,false)}" -match("MESSAGE#143:info/1_1", "nwparser.p0", "%{sessionid1->} status=%{info->} restquery_stage=%{fld3}"); +var part133 = match("MESSAGE#143:info/1_1", "nwparser.p0", "%{sessionid1->} status=%{info->} restquery_stage=%{fld3}"); -var part134 = // "Pattern{Field(sessionid1,false)}" -match_copy("MESSAGE#143:info/1_2", "nwparser.p0", "sessionid1"); +var part134 = match_copy("MESSAGE#143:info/1_2", "nwparser.p0", "sessionid1"); var select47 = linear_select([ part132, @@ -2427,38 +2226,32 @@ var all23 = all_match({ var msg145 = msg("info", all23); -var part135 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' sys='), Field(fld1,true), Constant(' evt='), Field(action,true), Constant(' active='), Field(fld2,true), Constant(' expires='), Field(fld3,true), Constant(' msg='), Field(event_description,false)}" -match("MESSAGE#144:info:02", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sys=%{fld1->} evt=%{action->} active=%{fld2->} expires=%{fld3->} msg=%{event_description}", processor_chain([ +var part135 = match("MESSAGE#144:info:02", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sys=%{fld1->} evt=%{action->} active=%{fld2->} expires=%{fld3->} msg=%{event_description}", processor_chain([ dup17, dup9, ])); var msg146 = msg("info:02", part135); -var part136 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' server='), Field(saddr,true), Constant(' elapsed='), Field(duration_string,true), Constant(' avgtime='), Field(fld2,true), Constant(' qname='), Field(fld3,true), Constant(' qtype='), Field(fld4,false)}" -match("MESSAGE#145:info:03", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} server=%{saddr->} elapsed=%{duration_string->} avgtime=%{fld2->} qname=%{fld3->} qtype=%{fld4}", processor_chain([ +var part136 = match("MESSAGE#145:info:03", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} server=%{saddr->} elapsed=%{duration_string->} avgtime=%{fld2->} qname=%{fld3->} qtype=%{fld4}", processor_chain([ dup17, dup9, ])); var msg147 = msg("info:03", part136); -var part137 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' '), Field(web_method,true), Constant(' /'), Field(info,false), Constant(': '), Field(resultcode,false)}" -match("MESSAGE#146:info:01", "nwparser.payload", "%{fld0->} %{severity->} %{web_method->} /%{info}: %{resultcode}", processor_chain([ +var part137 = match("MESSAGE#146:info:01", "nwparser.payload", "%{fld0->} %{severity->} %{web_method->} /%{info}: %{resultcode}", processor_chain([ dup17, dup9, ])); var msg148 = msg("info:01", part137); -var part138 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' sys='), Field(fld1,true), Constant(' evt='), Field(p0,false)}" -match("MESSAGE#147:info:04/0", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sys=%{fld1->} evt=%{p0}"); +var part138 = match("MESSAGE#147:info:04/0", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sys=%{fld1->} evt=%{p0}"); -var part139 = // "Pattern{Field(action,true), Constant(' msg='), Field(event_description,false)}" -match("MESSAGE#147:info:04/1_0", "nwparser.p0", "%{action->} msg=%{event_description}"); +var part139 = match("MESSAGE#147:info:04/1_0", "nwparser.p0", "%{action->} msg=%{event_description}"); -var part140 = // "Pattern{Field(action,false)}" -match_copy("MESSAGE#147:info:04/1_1", "nwparser.p0", "action"); +var part140 = match_copy("MESSAGE#147:info:04/1_1", "nwparser.p0", "action"); var select48 = linear_select([ part139, @@ -2478,14 +2271,11 @@ var all24 = all_match({ var msg149 = msg("info:04", all24); -var part141 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#148:info:05/0", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} %{p0}"); +var part141 = match("MESSAGE#148:info:05/0", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} %{p0}"); -var part142 = // "Pattern{Constant('type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,false)}" -match("MESSAGE#148:info:05/1_0", "nwparser.p0", "type=%{fld6->} cmd=%{obj_type->} id=%{fld5}"); +var part142 = match("MESSAGE#148:info:05/1_0", "nwparser.p0", "type=%{fld6->} cmd=%{obj_type->} id=%{fld5}"); -var part143 = // "Pattern{Constant('cmd='), Field(obj_type,false)}" -match("MESSAGE#148:info:05/1_1", "nwparser.p0", "cmd=%{obj_type}"); +var part143 = match("MESSAGE#148:info:05/1_1", "nwparser.p0", "cmd=%{obj_type}"); var select49 = linear_select([ part142, @@ -2520,8 +2310,7 @@ var select50 = linear_select([ var msg151 = msg("note:pid", dup62); -var part144 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' module='), Field(agent,true), Constant(' action='), Field(action,true), Constant(' size='), Field(bytes,false)}" -match("MESSAGE#149:note:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} module=%{agent->} action=%{action->} size=%{bytes}", processor_chain([ +var part144 = match("MESSAGE#149:note:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} module=%{agent->} action=%{action->} size=%{bytes}", processor_chain([ dup17, dup9, ])); @@ -2533,40 +2322,35 @@ var select51 = linear_select([ msg152, ]); -var part145 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' secprofile_name='), Field(fld3,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#150:rprt", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} secprofile_name=%{fld3->} rcpts=%{dclass_counter2->} duration=%{duration_string}", processor_chain([ +var part145 = match("MESSAGE#150:rprt", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} secprofile_name=%{fld3->} rcpts=%{dclass_counter2->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); var msg153 = msg("rprt", part145); -var part146 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' eid='), Field(fld4,true), Constant(' module='), Field(agent,true), Constant(' age='), Field(fld6,true), Constant(' limit='), Field(fld31,false)}" -match("MESSAGE#151:err", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} module=%{agent->} age=%{fld6->} limit=%{fld31}", processor_chain([ +var part146 = match("MESSAGE#151:err", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} module=%{agent->} age=%{fld6->} limit=%{fld31}", processor_chain([ dup17, dup9, ])); var msg154 = msg("err", part146); -var part147 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' eid='), Field(fld4,true), Constant(' result='), Field(result,false)}" -match("MESSAGE#152:warn", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} eid=%{fld4->} result=%{result}", processor_chain([ +var part147 = match("MESSAGE#152:warn", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} eid=%{fld4->} result=%{result}", processor_chain([ dup17, dup9, ])); var msg155 = msg("warn", part147); -var part148 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' eid='), Field(fld4,true), Constant(' status="'), Field(event_state,true), Constant(' file: '), Field(filename,false), Constant('"')}" -match("MESSAGE#153:warn:01", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} status=\"%{event_state->} file: %{filename}\"", processor_chain([ +var part148 = match("MESSAGE#153:warn:01", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} status=\"%{event_state->} file: %{filename}\"", processor_chain([ dup17, dup9, ])); var msg156 = msg("warn:01", part148); -var part149 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' eid='), Field(fld4,true), Constant(' status="'), Field(event_state,true), Constant(' file '), Field(filename,true), Constant(' does not contain enough (or correct) info. Fix this or remove the file."')}" -match("MESSAGE#154:warn:02", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} status=\"%{event_state->} file %{filename->} does not contain enough (or correct) info. Fix this or remove the file.\"", processor_chain([ +var part149 = match("MESSAGE#154:warn:02", "nwparser.payload", "%{fld0->} %{severity->} eid=%{fld4->} status=\"%{event_state->} file %{filename->} does not contain enough (or correct) info. Fix this or remove the file.\"", processor_chain([ dup17, dup9, setc("event_description","does not contain enough (or correct) info. Fix this or remove the file"), @@ -2584,14 +2368,11 @@ var msg158 = msg("queued-aglife", dup68); var msg159 = msg("pdr_run", dup50); -var part150 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' ttl='), Field(fld1,true), Constant(' reply="'), Field(p0,false)}" -match("MESSAGE#157:pdr_ttl/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} ttl=%{fld1->} reply=\"%{p0}"); +var part150 = match("MESSAGE#157:pdr_ttl/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} ttl=%{fld1->} reply=\"%{p0}"); -var part151 = // "Pattern{Constant('\"'), Field(fld2,true), Constant(' rscore='), Field(fld3,false), Constant('\""')}" -match("MESSAGE#157:pdr_ttl/1_0", "nwparser.p0", "\\\"%{fld2->} rscore=%{fld3}\\\"\""); +var part151 = match("MESSAGE#157:pdr_ttl/1_0", "nwparser.p0", "\\\"%{fld2->} rscore=%{fld3}\\\"\""); -var part152 = // "Pattern{Field(fld2,false), Constant('"')}" -match("MESSAGE#157:pdr_ttl/1_1", "nwparser.p0", "%{fld2}\""); +var part152 = match("MESSAGE#157:pdr_ttl/1_1", "nwparser.p0", "%{fld2}\""); var select53 = linear_select([ part151, @@ -2611,16 +2392,14 @@ var all26 = all_match({ var msg160 = msg("pdr_ttl", all26); -var part153 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' signature='), Field(fld1,true), Constant(' identity='), Field(sigid_string,true), Constant(' host='), Field(hostname,true), Constant(' result='), Field(result,true), Constant(' result_detail='), Field(fld2,false)}" -match("MESSAGE#158:dkimv_run:signature", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} signature=%{fld1->} identity=%{sigid_string->} host=%{hostname->} result=%{result->} result_detail=%{fld2}", processor_chain([ +var part153 = match("MESSAGE#158:dkimv_run:signature", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} signature=%{fld1->} identity=%{sigid_string->} host=%{hostname->} result=%{result->} result_detail=%{fld2}", processor_chain([ dup17, dup9, ])); var msg161 = msg("dkimv_run:signature", part153); -var part154 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' status="'), Field(info,false), Constant(', '), Field(event_state,false), Constant('"')}" -match("MESSAGE#159:dkimv_run:status", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} status=\"%{info}, %{event_state}\"", processor_chain([ +var part154 = match("MESSAGE#159:dkimv_run:status", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} status=\"%{info}, %{event_state}\"", processor_chain([ dup17, dup9, ])); @@ -2632,8 +2411,7 @@ var select54 = linear_select([ msg162, ]); -var part155 = // "Pattern{Field(fld0,false), Constant(': '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' unexpected response type='), Field(fld1,false)}" -match("MESSAGE#160:dkimv_type", "nwparser.payload", "%{fld0}: %{severity->} mod=%{agent->} unexpected response type=%{fld1}", processor_chain([ +var part155 = match("MESSAGE#160:dkimv_type", "nwparser.payload", "%{fld0}: %{severity->} mod=%{agent->} unexpected response type=%{fld1}", processor_chain([ dup17, dup9, setc("result","unexpected response"), @@ -2641,8 +2419,7 @@ match("MESSAGE#160:dkimv_type", "nwparser.payload", "%{fld0}: %{severity->} mod= var msg163 = msg("dkimv_type", part155); -var part156 = // "Pattern{Field(fld0,false), Constant(': '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld1,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' publickey_cache_entries='), Field(fld6,false)}" -match("MESSAGE#161:dkimv_type:01", "nwparser.payload", "%{fld0}: %{severity->} mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{fld5->} publickey_cache_entries=%{fld6}", processor_chain([ +var part156 = match("MESSAGE#161:dkimv_type:01", "nwparser.payload", "%{fld0}: %{severity->} mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{fld5->} publickey_cache_entries=%{fld6}", processor_chain([ dup17, dup9, ])); @@ -2656,8 +2433,7 @@ var select55 = linear_select([ var msg165 = msg("dmarc_run:rule", dup49); -var part157 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' result='), Field(result,true), Constant(' result_detail='), Field(fld2,false)}" -match("MESSAGE#163:dmarc_run:result", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} result=%{result->} result_detail=%{fld2}", processor_chain([ +var part157 = match("MESSAGE#163:dmarc_run:result", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} result=%{result->} result_detail=%{fld2}", processor_chain([ dup17, dup9, ])); @@ -2669,8 +2445,7 @@ var select56 = linear_select([ msg166, ]); -var part158 = // "Pattern{Field(fld0,false), Constant(': '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld1,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' policy_cache_entries='), Field(fld6,false)}" -match("MESSAGE#164:dmarc_type", "nwparser.payload", "%{fld0}: %{severity->} mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{fld5->} policy_cache_entries=%{fld6}", processor_chain([ +var part158 = match("MESSAGE#164:dmarc_type", "nwparser.payload", "%{fld0}: %{severity->} mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{fld5->} policy_cache_entries=%{fld6}", processor_chain([ dup17, dup9, ])); @@ -2679,8 +2454,7 @@ var msg167 = msg("dmarc_type", part158); var msg168 = msg("spf_run:rule", dup49); -var part159 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' cmd='), Field(obj_type,true), Constant(' result='), Field(result,false)}" -match("MESSAGE#166:spf_run:cmd", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} cmd=%{obj_type->} result=%{result}", processor_chain([ +var part159 = match("MESSAGE#166:spf_run:cmd", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} cmd=%{obj_type->} result=%{result}", processor_chain([ dup17, dup9, ])); @@ -2692,24 +2466,21 @@ var select57 = linear_select([ msg169, ]); -var part160 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' action='), Field(action,true), Constant(' score='), Field(fld39,true), Constant(' submsgadjust='), Field(fld53,true), Constant(' spamscore='), Field(reputation_num,true), Constant(' suspectscore='), Field(fld41,true), Constant(' malwarescore='), Field(fld49,true), Constant(' phishscore='), Field(fld42,true), Constant(' adultscore='), Field(fld44,true), Constant(' bulkscore='), Field(fld43,true), Constant(' tests='), Field(fld52,false)}" -match("MESSAGE#167:action_checksubmsg", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} action=%{action->} score=%{fld39->} submsgadjust=%{fld53->} spamscore=%{reputation_num->} suspectscore=%{fld41->} malwarescore=%{fld49->} phishscore=%{fld42->} adultscore=%{fld44->} bulkscore=%{fld43->} tests=%{fld52}", processor_chain([ +var part160 = match("MESSAGE#167:action_checksubmsg", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} action=%{action->} score=%{fld39->} submsgadjust=%{fld53->} spamscore=%{reputation_num->} suspectscore=%{fld41->} malwarescore=%{fld49->} phishscore=%{fld42->} adultscore=%{fld44->} bulkscore=%{fld43->} tests=%{fld52}", processor_chain([ dup17, dup9, ])); var msg170 = msg("action_checksubmsg", part160); -var part161 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' authscope='), Field(fld5,true), Constant(' err='), Field(fld58,false)}" -match("MESSAGE#168:rest_oauth", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} authscope=%{fld5->} err=%{fld58}", processor_chain([ +var part161 = match("MESSAGE#168:rest_oauth", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} authscope=%{fld5->} err=%{fld58}", processor_chain([ dup17, dup9, ])); var msg171 = msg("rest_oauth", part161); -var part162 = // "Pattern{Constant('mod='), Field(agent,true), Constant(' type='), Field(fld1,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(id,true), Constant(' load smartid ccard')}" -match("MESSAGE#171:filter_instance1:01", "nwparser.payload", "mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{id->} load smartid ccard", processor_chain([ +var part162 = match("MESSAGE#171:filter_instance1:01", "nwparser.payload", "mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{id->} load smartid ccard", processor_chain([ dup17, dup9, setc("event_description","load smartid ccard"), @@ -2718,8 +2489,7 @@ match("MESSAGE#171:filter_instance1:01", "nwparser.payload", "mod=%{agent->} typ var msg172 = msg("filter_instance1:01", part162); -var part163 = // "Pattern{Constant('mod='), Field(agent,true), Constant(' type='), Field(fld1,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(id,true), Constant(' load smartid jcb')}" -match("MESSAGE#172:filter_instance1:02", "nwparser.payload", "mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{id->} load smartid jcb", processor_chain([ +var part163 = match("MESSAGE#172:filter_instance1:02", "nwparser.payload", "mod=%{agent->} type=%{fld1->} cmd=%{obj_type->} id=%{id->} load smartid jcb", processor_chain([ dup17, dup9, setc("event_description","load smartid jcb"), @@ -2728,22 +2498,18 @@ match("MESSAGE#172:filter_instance1:02", "nwparser.payload", "mod=%{agent->} typ var msg173 = msg("filter_instance1:02", part163); -var part164 = // "Pattern{Constant('s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' attachments='), Field(dclass_counter1,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' size='), Field(bytes,true), Constant(' guid='), Field(fld14,true), Constant(' hdr_mid='), Field(id,true), Constant(' qid='), Field(fld15,true), Constant(' subject="'), Field(subject,false), Constant('" '), Field(p0,false)}" -match("MESSAGE#173:filter_instance1:03/0", "nwparser.payload", "s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=\"%{subject}\" %{p0}"); +var part164 = match("MESSAGE#173:filter_instance1:03/0", "nwparser.payload", "s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} attachments=%{dclass_counter1->} rcpts=%{dclass_counter2->} routes=%{fld4->} size=%{bytes->} guid=%{fld14->} hdr_mid=%{id->} qid=%{fld15->} subject=\"%{subject}\" %{p0}"); -var part165 = // "Pattern{Constant('spamscore='), Field(reputation_num,true), Constant(' virusname='), Field(threat_name,true), Constant(' duration='), Field(p0,false)}" -match("MESSAGE#173:filter_instance1:03/1_0", "nwparser.p0", "spamscore=%{reputation_num->} virusname=%{threat_name->} duration=%{p0}"); +var part165 = match("MESSAGE#173:filter_instance1:03/1_0", "nwparser.p0", "spamscore=%{reputation_num->} virusname=%{threat_name->} duration=%{p0}"); -var part166 = // "Pattern{Constant('duration='), Field(p0,false)}" -match("MESSAGE#173:filter_instance1:03/1_1", "nwparser.p0", "duration=%{p0}"); +var part166 = match("MESSAGE#173:filter_instance1:03/1_1", "nwparser.p0", "duration=%{p0}"); var select58 = linear_select([ part165, part166, ]); -var part167 = // "Pattern{Field(fld16,true), Constant(' elapsed='), Field(duration_string,false)}" -match("MESSAGE#173:filter_instance1:03/2", "nwparser.p0", "%{fld16->} elapsed=%{duration_string}"); +var part167 = match("MESSAGE#173:filter_instance1:03/2", "nwparser.p0", "%{fld16->} elapsed=%{duration_string}"); var all27 = all_match({ processors: [ @@ -2762,8 +2528,7 @@ var all27 = all_match({ var msg174 = msg("filter_instance1:03", all27); -var part168 = // "Pattern{Constant('s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' module='), Field(event_source,true), Constant(' rule='), Field(rulename,true), Constant(' action='), Field(action,true), Constant(' helo='), Field(fld32,true), Constant(' msgs='), Field(fld33,true), Constant(' rcpts='), Field(dclass_counter2,true), Constant(' routes='), Field(fld4,true), Constant(' duration='), Field(duration_string,true), Constant(' elapsed='), Field(fld16,false)}" -match("MESSAGE#174:filter_instance1:04", "nwparser.payload", "s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} helo=%{fld32->} msgs=%{fld33->} rcpts=%{dclass_counter2->} routes=%{fld4->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ +var part168 = match("MESSAGE#174:filter_instance1:04", "nwparser.payload", "s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} module=%{event_source->} rule=%{rulename->} action=%{action->} helo=%{fld32->} msgs=%{fld33->} rcpts=%{dclass_counter2->} routes=%{fld4->} duration=%{duration_string->} elapsed=%{fld16}", processor_chain([ dup17, dup9, dup13, @@ -2772,8 +2537,7 @@ match("MESSAGE#174:filter_instance1:04", "nwparser.payload", "s=%{sessionid->} m var msg175 = msg("filter_instance1:04", part168); -var part169 = // "Pattern{Constant('s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' header.from="\"'), Field(info,false), Constant('\" '), Field(fld4,true), Constant(' <<'), Field(user_address,false), Constant('>"')}" -match("MESSAGE#175:filter_instance1:05", "nwparser.payload", "s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} header.from=\"\\\"%{info}\\\" %{fld4->} \u003c\u003c%{user_address}>\"", processor_chain([ +var part169 = match("MESSAGE#175:filter_instance1:05", "nwparser.payload", "s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} header.from=\"\\\"%{info}\\\" %{fld4->} \u003c\u003c%{user_address}>\"", processor_chain([ dup17, dup9, dup36, @@ -3001,89 +2765,61 @@ var chain1 = processor_chain([ }), ]); -var part171 = // "Pattern{Constant('info'), Field(p0,false)}" -match("HEADER#0:0024/1_0", "nwparser.p0", "info%{p0}"); +var part171 = match("HEADER#0:0024/1_0", "nwparser.p0", "info%{p0}"); -var part172 = // "Pattern{Constant('rprt'), Field(p0,false)}" -match("HEADER#0:0024/1_1", "nwparser.p0", "rprt%{p0}"); +var part172 = match("HEADER#0:0024/1_1", "nwparser.p0", "rprt%{p0}"); -var part173 = // "Pattern{Constant('warn'), Field(p0,false)}" -match("HEADER#0:0024/1_2", "nwparser.p0", "warn%{p0}"); +var part173 = match("HEADER#0:0024/1_2", "nwparser.p0", "warn%{p0}"); -var part174 = // "Pattern{Constant('err'), Field(p0,false)}" -match("HEADER#0:0024/1_3", "nwparser.p0", "err%{p0}"); +var part174 = match("HEADER#0:0024/1_3", "nwparser.p0", "err%{p0}"); -var part175 = // "Pattern{Constant('note'), Field(p0,false)}" -match("HEADER#0:0024/1_4", "nwparser.p0", "note%{p0}"); +var part175 = match("HEADER#0:0024/1_4", "nwparser.p0", "note%{p0}"); -var part176 = // "Pattern{Field(hostip,true), Constant(' sampling='), Field(fld19,false)}" -match("MESSAGE#11:mail_env_from:ofrom/1_0", "nwparser.p0", "%{hostip->} sampling=%{fld19}"); +var part176 = match("MESSAGE#11:mail_env_from:ofrom/1_0", "nwparser.p0", "%{hostip->} sampling=%{fld19}"); -var part177 = // "Pattern{Field(hostip,false)}" -match_copy("MESSAGE#11:mail_env_from:ofrom/1_1", "nwparser.p0", "hostip"); +var part177 = match_copy("MESSAGE#11:mail_env_from:ofrom/1_1", "nwparser.p0", "hostip"); -var part178 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#25:session_judge/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} %{p0}"); +var part178 = match("MESSAGE#25:session_judge/0", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} %{p0}"); -var part179 = // "Pattern{Constant('attachment='), Field(fld58,true), Constant(' file='), Field(fld1,true), Constant(' mod='), Field(p0,false)}" -match("MESSAGE#25:session_judge/1_0", "nwparser.p0", "attachment=%{fld58->} file=%{fld1->} mod=%{p0}"); +var part179 = match("MESSAGE#25:session_judge/1_0", "nwparser.p0", "attachment=%{fld58->} file=%{fld1->} mod=%{p0}"); -var part180 = // "Pattern{Constant('mod='), Field(p0,false)}" -match("MESSAGE#25:session_judge/1_1", "nwparser.p0", "mod=%{p0}"); +var part180 = match("MESSAGE#25:session_judge/1_1", "nwparser.p0", "mod=%{p0}"); -var part181 = // "Pattern{Constant('vendor='), Field(fld36,true), Constant(' version="'), Field(component_version,false), Constant('" duration='), Field(p0,false)}" -match("MESSAGE#39:av_run:02/1_1", "nwparser.p0", "vendor=%{fld36->} version=\"%{component_version}\" duration=%{p0}"); +var part181 = match("MESSAGE#39:av_run:02/1_1", "nwparser.p0", "vendor=%{fld36->} version=\"%{component_version}\" duration=%{p0}"); -var part182 = // "Pattern{Field(duration_string,false)}" -match_copy("MESSAGE#39:av_run:02/2", "nwparser.p0", "duration_string"); +var part182 = match_copy("MESSAGE#39:av_run:02/2", "nwparser.p0", "duration_string"); -var part183 = // "Pattern{Constant('['), Field(daddr,false), Constant('] ['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_0", "nwparser.p0", "[%{daddr}] [%{daddr}],%{p0}"); +var part183 = match("MESSAGE#98:queued-alert/3_0", "nwparser.p0", "[%{daddr}] [%{daddr}],%{p0}"); -var part184 = // "Pattern{Constant('['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_1", "nwparser.p0", "[%{daddr}],%{p0}"); +var part184 = match("MESSAGE#98:queued-alert/3_1", "nwparser.p0", "[%{daddr}],%{p0}"); -var part185 = // "Pattern{Field(dhost,true), Constant(' ['), Field(daddr,false), Constant('],'), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_2", "nwparser.p0", "%{dhost->} [%{daddr}],%{p0}"); +var part185 = match("MESSAGE#98:queued-alert/3_2", "nwparser.p0", "%{dhost->} [%{daddr}],%{p0}"); -var part186 = // "Pattern{Field(dhost,false), Constant(','), Field(p0,false)}" -match("MESSAGE#98:queued-alert/3_3", "nwparser.p0", "%{dhost},%{p0}"); +var part186 = match("MESSAGE#98:queued-alert/3_3", "nwparser.p0", "%{dhost},%{p0}"); -var part187 = // "Pattern{Field(,false), Constant('dsn='), Field(resultcode,false), Constant(', stat='), Field(info,false)}" -match("MESSAGE#98:queued-alert/4", "nwparser.p0", "%{}dsn=%{resultcode}, stat=%{info}"); +var part187 = match("MESSAGE#98:queued-alert/4", "nwparser.p0", "%{}dsn=%{resultcode}, stat=%{info}"); -var part188 = // "Pattern{Constant('['), Field(daddr,false), Constant(']')}" -match("MESSAGE#99:queued-alert:01/1_1", "nwparser.p0", "[%{daddr}]"); +var part188 = match("MESSAGE#99:queued-alert:01/1_1", "nwparser.p0", "[%{daddr}]"); -var part189 = // "Pattern{Field(dhost,true), Constant(' ['), Field(daddr,false), Constant(']')}" -match("MESSAGE#99:queued-alert:01/1_2", "nwparser.p0", "%{dhost->} [%{daddr}]"); +var part189 = match("MESSAGE#99:queued-alert:01/1_2", "nwparser.p0", "%{dhost->} [%{daddr}]"); -var part190 = // "Pattern{Field(dhost,false)}" -match_copy("MESSAGE#99:queued-alert:01/1_3", "nwparser.p0", "dhost"); +var part190 = match_copy("MESSAGE#99:queued-alert:01/1_3", "nwparser.p0", "dhost"); -var part191 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: STARTTLS='), Field(fld1,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#100:queued-alert:02/0", "nwparser.payload", "%{agent}[%{process_id}]: STARTTLS=%{fld1}, relay=%{p0}"); +var part191 = match("MESSAGE#100:queued-alert:02/0", "nwparser.payload", "%{agent}[%{process_id}]: STARTTLS=%{fld1}, relay=%{p0}"); -var part192 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld51,false), Constant(': to='), Field(to,false), Constant(', delay='), Field(fld53,false), Constant(', xdelay='), Field(fld54,false), Constant(', mailer='), Field(fld55,false), Constant(', pri='), Field(fld23,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#101:queued-VoltageEncrypt/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); +var part192 = match("MESSAGE#101:queued-VoltageEncrypt/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld51}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); -var part193 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': from='), Field(from,false), Constant(', size='), Field(bytes,false), Constant(', class='), Field(fld57,false), Constant(', nrcpts='), Field(fld58,false), Constant(', msgid='), Field(id,false), Constant(', proto='), Field(protocol,false), Constant(', daemon='), Field(fld69,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#120:queued-VoltageEncrypt:01/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, relay=%{p0}"); +var part193 = match("MESSAGE#120:queued-VoltageEncrypt:01/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, relay=%{p0}"); -var part194 = // "Pattern{Constant('['), Field(daddr,false), Constant('] ['), Field(daddr,false), Constant(']')}" -match("MESSAGE#120:queued-VoltageEncrypt:01/1_0", "nwparser.p0", "[%{daddr}] [%{daddr}]"); +var part194 = match("MESSAGE#120:queued-VoltageEncrypt:01/1_0", "nwparser.p0", "[%{daddr}] [%{daddr}]"); -var part195 = // "Pattern{Field(,false), Constant('field='), Field(fld2,false), Constant(', status='), Field(info,false)}" -match("MESSAGE#104:queued-default:02/2", "nwparser.p0", "%{}field=%{fld2}, status=%{info}"); +var part195 = match("MESSAGE#104:queued-default:02/2", "nwparser.p0", "%{}field=%{fld2}, status=%{info}"); -var part196 = // "Pattern{Field(,false), Constant('version='), Field(fld55,false), Constant(', verify='), Field(fld57,false), Constant(', cipher='), Field(fld58,false), Constant(', bits='), Field(fld59,false)}" -match("MESSAGE#105:queued-default:03/2", "nwparser.p0", "%{}version=%{fld55}, verify=%{fld57}, cipher=%{fld58}, bits=%{fld59}"); +var part196 = match("MESSAGE#105:queued-default:03/2", "nwparser.p0", "%{}version=%{fld55}, verify=%{fld57}, cipher=%{fld58}, bits=%{fld59}"); -var part197 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': from='), Field(from,false), Constant(', size='), Field(bytes,false), Constant(', class='), Field(fld57,false), Constant(', nrcpts='), Field(fld58,false), Constant(', msgid='), Field(id,false), Constant(', proto='), Field(protocol,false), Constant(', daemon='), Field(fld69,false), Constant(', tls_verify='), Field(fld70,false), Constant(', auth='), Field(fld71,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#116:queued-eurort:02/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, tls_verify=%{fld70}, auth=%{fld71}, relay=%{p0}"); +var part197 = match("MESSAGE#116:queued-eurort:02/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: from=%{from}, size=%{bytes}, class=%{fld57}, nrcpts=%{fld58}, msgid=%{id}, proto=%{protocol}, daemon=%{fld69}, tls_verify=%{fld70}, auth=%{fld71}, relay=%{p0}"); -var part198 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': to='), Field(to,false), Constant(', delay='), Field(fld53,false), Constant(', xdelay='), Field(fld54,false), Constant(', mailer='), Field(fld55,false), Constant(', pri='), Field(fld23,false), Constant(', relay='), Field(p0,false)}" -match("MESSAGE#126:sendmail/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); +var part198 = match("MESSAGE#126:sendmail/0", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: to=%{to}, delay=%{fld53}, xdelay=%{fld54}, mailer=%{fld55}, pri=%{fld23}, relay=%{p0}"); var select60 = linear_select([ dup1, @@ -3103,62 +2839,52 @@ var select62 = linear_select([ dup20, ]); -var part199 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' vendor='), Field(fld36,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,true), Constant(' signatures='), Field(fld94,false)}" -match("MESSAGE#43:av_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} vendor=%{fld36->} engine=%{fld49->} definitions=%{fld50->} signatures=%{fld94}", processor_chain([ +var part199 = match("MESSAGE#43:av_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} vendor=%{fld36->} engine=%{fld49->} definitions=%{fld50->} signatures=%{fld94}", processor_chain([ dup26, dup9, ])); -var part200 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' m='), Field(mail_id,true), Constant(' x='), Field(sessionid1,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#48:access_run:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ +var part200 = match("MESSAGE#48:access_run:03", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} m=%{mail_id->} x=%{sessionid1->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); -var part201 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' s='), Field(sessionid,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' rule='), Field(rulename,true), Constant(' duration='), Field(duration_string,false)}" -match("MESSAGE#49:access_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ +var part201 = match("MESSAGE#49:access_run:01", "nwparser.payload", "%{fld0->} %{severity->} s=%{sessionid->} mod=%{agent->} cmd=%{obj_type->} rule=%{rulename->} duration=%{duration_string}", processor_chain([ dup17, dup9, ])); -var part202 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' action='), Field(action,true), Constant(' dict='), Field(fld37,true), Constant(' file='), Field(filename,false)}" -match("MESSAGE#51:access_refresh:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} action=%{action->} dict=%{fld37->} file=%{filename}", processor_chain([ +var part202 = match("MESSAGE#51:access_refresh:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} action=%{action->} dict=%{fld37->} file=%{filename}", processor_chain([ dup17, dup9, ])); -var part203 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,false)}" -match("MESSAGE#52:access_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ +var part203 = match("MESSAGE#52:access_load", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5}", processor_chain([ dup17, dup9, ])); -var part204 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' engine='), Field(fld49,true), Constant(' definitions='), Field(fld50,false)}" -match("MESSAGE#64:spam_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} engine=%{fld49->} definitions=%{fld50}", processor_chain([ +var part204 = match("MESSAGE#64:spam_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} engine=%{fld49->} definitions=%{fld50}", processor_chain([ dup27, dup9, ])); -var part205 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' type='), Field(fld6,true), Constant(' cmd='), Field(obj_type,true), Constant(' id='), Field(fld5,true), Constant(' version='), Field(fld55,false)}" -match("MESSAGE#71:zerohour_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} version=%{fld55}", processor_chain([ +var part205 = match("MESSAGE#71:zerohour_refresh", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} type=%{fld6->} cmd=%{obj_type->} id=%{fld5->} version=%{fld55}", processor_chain([ dup17, dup9, ])); -var part206 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' sig='), Field(fld60,false)}" -match("MESSAGE#82:cvtd:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sig=%{fld60}", processor_chain([ +var part206 = match("MESSAGE#82:cvtd:01", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} sig=%{fld60}", processor_chain([ dup17, dup9, ])); -var part207 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,false)}" -match("MESSAGE#83:cvtd", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type}", processor_chain([ +var part207 = match("MESSAGE#83:cvtd", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type}", processor_chain([ dup17, dup9, ])); -var part208 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' mod='), Field(agent,true), Constant(' cmd='), Field(obj_type,true), Constant(' addr='), Field(saddr,false)}" -match("MESSAGE#87:soap_listen", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} addr=%{saddr}", processor_chain([ +var part208 = match("MESSAGE#87:soap_listen", "nwparser.payload", "%{fld0->} %{severity->} mod=%{agent->} cmd=%{obj_type->} addr=%{saddr}", processor_chain([ dup17, dup9, ])); @@ -3177,20 +2903,17 @@ var select64 = linear_select([ dup35, ]); -var part209 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(fld1,false), Constant(': timeout waiting for input from '), Field(fld11,true), Constant(' during server cmd read')}" -match("MESSAGE#106:queued-default:04", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: timeout waiting for input from %{fld11->} during server cmd read", processor_chain([ +var part209 = match("MESSAGE#106:queued-default:04", "nwparser.payload", "%{agent}[%{process_id}]: %{fld1}: timeout waiting for input from %{fld11->} during server cmd read", processor_chain([ dup17, dup9, ])); -var part210 = // "Pattern{Field(agent,false), Constant('['), Field(process_id,false), Constant(']: '), Field(event_description,false)}" -match("MESSAGE#113:queued-reinject:06", "nwparser.payload", "%{agent}[%{process_id}]: %{event_description}", processor_chain([ +var part210 = match("MESSAGE#113:queued-reinject:06", "nwparser.payload", "%{agent}[%{process_id}]: %{event_description}", processor_chain([ dup17, dup9, ])); -var part211 = // "Pattern{Field(fld0,true), Constant(' '), Field(severity,true), Constant(' pid='), Field(process_id,true), Constant(' '), Field(web_method,true), Constant(' /'), Field(info,false), Constant(': '), Field(resultcode,false)}" -match("MESSAGE#141:info:pid", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} %{web_method->} /%{info}: %{resultcode}", processor_chain([ +var part211 = match("MESSAGE#141:info:pid", "nwparser.payload", "%{fld0->} %{severity->} pid=%{process_id->} %{web_method->} /%{info}: %{resultcode}", processor_chain([ dup17, dup9, ])); diff --git a/x-pack/filebeat/module/snort/log/config/pipeline.js b/x-pack/filebeat/module/snort/log/config/pipeline.js index d4d6aec1028..18f0ec783e3 100644 --- a/x-pack/filebeat/module/snort/log/config/pipeline.js +++ b/x-pack/filebeat/module/snort/log/config/pipeline.js @@ -46,44 +46,31 @@ var map_getEventLegacyCategoryName = { var dup1 = setc("messageid","FTD_events"); -var dup2 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#2:00010/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); +var dup2 = match("HEADER#2:00010/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); -var dup3 = // "Pattern{Constant('"'), Field(hfld10,false), Constant('" [Impact: '), Field(p0,false)}" -match("HEADER#2:00010/1_0", "nwparser.p0", "\"%{hfld10}\" [Impact: %{p0}"); +var dup3 = match("HEADER#2:00010/1_0", "nwparser.p0", "\"%{hfld10}\" [Impact: %{p0}"); -var dup4 = // "Pattern{Field(hfld10,true), Constant(' [Impact: '), Field(p0,false)}" -match("HEADER#2:00010/1_1", "nwparser.p0", "%{hfld10->} [Impact: %{p0}"); +var dup4 = match("HEADER#2:00010/1_1", "nwparser.p0", "%{hfld10->} [Impact: %{p0}"); -var dup5 = // "Pattern{Field(result,false), Constant('] From '), Field(hfld11,true), Constant(' at '), Field(fld9,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#3:00011/2", "nwparser.p0", "%{result}] From %{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); +var dup5 = match("HEADER#3:00011/2", "nwparser.p0", "%{result}] From %{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); -var dup6 = // "Pattern{Constant('"'), Field(hfld10,false), Constant('" [Classification: '), Field(p0,false)}" -match("HEADER#4:00012/1_0", "nwparser.p0", "\"%{hfld10}\" [Classification: %{p0}"); +var dup6 = match("HEADER#4:00012/1_0", "nwparser.p0", "\"%{hfld10}\" [Classification: %{p0}"); -var dup7 = // "Pattern{Field(hfld10,true), Constant(' [Classification: '), Field(p0,false)}" -match("HEADER#4:00012/1_1", "nwparser.p0", "%{hfld10->} [Classification: %{p0}"); +var dup7 = match("HEADER#4:00012/1_1", "nwparser.p0", "%{hfld10->} [Classification: %{p0}"); -var dup8 = // "Pattern{Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#4:00012/2", "nwparser.p0", "%{sigtype}] [Priority: %{payload}"); +var dup8 = match("HEADER#4:00012/2", "nwparser.p0", "%{sigtype}] [Priority: %{payload}"); -var dup9 = // "Pattern{Constant('"'), Field(hfld10,false), Constant('" ['), Field(p0,false)}" -match("HEADER#5:00013/1_0", "nwparser.p0", "\"%{hfld10}\" [%{p0}"); +var dup9 = match("HEADER#5:00013/1_0", "nwparser.p0", "\"%{hfld10}\" [%{p0}"); -var dup10 = // "Pattern{Field(hfld10,true), Constant(' ['), Field(p0,false)}" -match("HEADER#5:00013/1_1", "nwparser.p0", "%{hfld10->} [%{p0}"); +var dup10 = match("HEADER#5:00013/1_1", "nwparser.p0", "%{hfld10->} [%{p0}"); -var dup11 = // "Pattern{Field(info,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#5:00013/2", "nwparser.p0", "%{info}] [Priority: %{payload}"); +var dup11 = match("HEADER#5:00013/2", "nwparser.p0", "%{info}] [Priority: %{payload}"); -var dup12 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' snort['), Field(hpid,false), Constant(']: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#7:00020/0", "message", "%{month->} %{day->} %{time->} snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); +var dup12 = match("HEADER#7:00020/0", "message", "%{month->} %{day->} %{time->} snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); -var dup13 = // "Pattern{Field(result,false), Constant('] From '), Field(group_object,false), Constant('/'), Field(hfld11,true), Constant(' at '), Field(fld9,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#7:00020/2", "nwparser.p0", "%{result}] From %{group_object}/%{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); +var dup13 = match("HEADER#7:00020/2", "nwparser.p0", "%{result}] From %{group_object}/%{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); -var dup14 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' snort: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#11:00030/0", "message", "%{month->} %{day->} %{time->} snort: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); +var dup14 = match("HEADER#11:00030/0", "message", "%{month->} %{day->} %{time->} snort: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); var dup15 = call({ dest: "nwparser.payload", @@ -135,11 +122,9 @@ var dup19 = call({ ], }); -var dup20 = // "Pattern{Constant('at'), Field(p0,false)}" -match("HEADER#26:0011/1_1", "nwparser.p0", "at%{p0}"); +var dup20 = match("HEADER#26:0011/1_1", "nwparser.p0", "at%{p0}"); -var dup21 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("HEADER#26:0011/2", "nwparser.p0", "%{} %{p0}"); +var dup21 = match("HEADER#26:0011/2", "nwparser.p0", "%{} %{p0}"); var dup22 = call({ dest: "nwparser.messageid", @@ -171,19 +156,15 @@ var dup24 = setc("messageid","HMNOTIFY"); var dup25 = setc("messageid","SystemSettings"); -var dup26 = // "Pattern{Constant('['), Field(hpid,false), Constant(']: ['), Field(p0,false)}" -match("HEADER#41:0024/1_0", "nwparser.p0", "[%{hpid}]: [%{p0}"); +var dup26 = match("HEADER#41:0024/1_0", "nwparser.p0", "[%{hpid}]: [%{p0}"); -var dup27 = // "Pattern{Constant(': ['), Field(p0,false)}" -match("HEADER#41:0024/1_1", "nwparser.p0", ": [%{p0}"); +var dup27 = match("HEADER#41:0024/1_1", "nwparser.p0", ": [%{p0}"); -var dup28 = // "Pattern{Constant(']'), Field(hversion,false), Constant(':'), Field(hfld2,false), Constant(':'), Field(hevent_source,true), Constant(' '), Field(payload,false)}" -match("HEADER#41:0024/2", "nwparser.p0", "]%{hversion}:%{hfld2}:%{hevent_source->} %{payload}"); +var dup28 = match("HEADER#41:0024/2", "nwparser.p0", "]%{hversion}:%{hfld2}:%{hevent_source->} %{payload}"); var dup29 = setc("messageid","Snort_AlertLog"); -var dup30 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(hfld2,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#43:0023/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{hfld2}:%{hversion}] %{p0}"); +var dup30 = match("HEADER#43:0023/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{hfld2}:%{hversion}] %{p0}"); var dup31 = date_time({ dest: "event_time", @@ -195,38 +176,27 @@ var dup31 = date_time({ var dup32 = setf("msg","$MSG"); -var dup33 = // "Pattern{Field(threat_val,true), Constant(' ]:alert {'), Field(p0,false)}" -match("MESSAGE#1:0/0_0", "nwparser.payload", "%{threat_val->} ]:alert {%{p0}"); +var dup33 = match("MESSAGE#1:0/0_0", "nwparser.payload", "%{threat_val->} ]:alert {%{p0}"); -var dup34 = // "Pattern{Field(threat_val,true), Constant(' ]: '), Field(fld1,true), Constant(' {'), Field(p0,false)}" -match("MESSAGE#1:0/0_1", "nwparser.payload", "%{threat_val->} ]: %{fld1->} {%{p0}"); +var dup34 = match("MESSAGE#1:0/0_1", "nwparser.payload", "%{threat_val->} ]: %{fld1->} {%{p0}"); -var dup35 = // "Pattern{Field(threat_val,false), Constant(']: {'), Field(p0,false)}" -match("MESSAGE#1:0/0_2", "nwparser.payload", "%{threat_val}]: {%{p0}"); +var dup35 = match("MESSAGE#1:0/0_2", "nwparser.payload", "%{threat_val}]: {%{p0}"); -var dup36 = // "Pattern{Field(threat_val,true), Constant(' ] {'), Field(p0,false)}" -match("MESSAGE#1:0/0_3", "nwparser.payload", "%{threat_val->} ] {%{p0}"); +var dup36 = match("MESSAGE#1:0/0_3", "nwparser.payload", "%{threat_val->} ] {%{p0}"); -var dup37 = // "Pattern{Field(protocol,false), Constant('} '), Field(p0,false)}" -match("MESSAGE#1:0/1", "nwparser.p0", "%{protocol}} %{p0}"); +var dup37 = match("MESSAGE#1:0/1", "nwparser.p0", "%{protocol}} %{p0}"); -var dup38 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(location_src,false), Constant(') -> '), Field(p0,false)}" -match("MESSAGE#1:0/2_0", "nwparser.p0", "%{saddr}:%{sport->} (%{location_src}) -> %{p0}"); +var dup38 = match("MESSAGE#1:0/2_0", "nwparser.p0", "%{saddr}:%{sport->} (%{location_src}) -> %{p0}"); -var dup39 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' -> '), Field(p0,false)}" -match("MESSAGE#1:0/2_1", "nwparser.p0", "%{saddr}:%{sport->} -> %{p0}"); +var dup39 = match("MESSAGE#1:0/2_1", "nwparser.p0", "%{saddr}:%{sport->} -> %{p0}"); -var dup40 = // "Pattern{Field(saddr,true), Constant(' -> '), Field(p0,false)}" -match("MESSAGE#1:0/2_2", "nwparser.p0", "%{saddr->} -> %{p0}"); +var dup40 = match("MESSAGE#1:0/2_2", "nwparser.p0", "%{saddr->} -> %{p0}"); -var dup41 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(location_dst,false), Constant(')')}" -match("MESSAGE#1:0/3_0", "nwparser.p0", "%{daddr}:%{dport->} (%{location_dst})"); +var dup41 = match("MESSAGE#1:0/3_0", "nwparser.p0", "%{daddr}:%{dport->} (%{location_dst})"); -var dup42 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,false)}" -match("MESSAGE#1:0/3_1", "nwparser.p0", "%{daddr}:%{dport}"); +var dup42 = match("MESSAGE#1:0/3_1", "nwparser.p0", "%{daddr}:%{dport}"); -var dup43 = // "Pattern{Field(daddr,false)}" -match_copy("MESSAGE#1:0/3_2", "nwparser.p0", "daddr"); +var dup43 = match_copy("MESSAGE#1:0/3_2", "nwparser.p0", "daddr"); var dup44 = setc("eventcategory","1003030000"); @@ -266,17 +236,13 @@ var dup56 = date_time({ ], }); -var dup57 = // "Pattern{Field(context,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#2:0:01/0", "nwparser.payload", "%{context->} %{p0}"); +var dup57 = match("MESSAGE#2:0:01/0", "nwparser.payload", "%{context->} %{p0}"); -var dup58 = // "Pattern{Constant('<<'), Field(interface,false), Constant('> '), Field(p0,false)}" -match("MESSAGE#2:0:01/1_0", "nwparser.p0", "\u003c\u003c%{interface}> %{p0}"); +var dup58 = match("MESSAGE#2:0:01/1_0", "nwparser.p0", "\u003c\u003c%{interface}> %{p0}"); -var dup59 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#2:0:01/1_1", "nwparser.p0", "p0"); +var dup59 = match_copy("MESSAGE#2:0:01/1_1", "nwparser.p0", "p0"); -var dup60 = // "Pattern{Constant('{'), Field(protocol,false), Constant('} '), Field(p0,false)}" -match("MESSAGE#2:0:01/2", "nwparser.p0", "{%{protocol}} %{p0}"); +var dup60 = match("MESSAGE#2:0:01/2", "nwparser.p0", "{%{protocol}} %{p0}"); var dup61 = setc("eventcategory","1103000000"); @@ -288,17 +254,13 @@ var dup64 = setc("eventcategory","1002000000"); var dup65 = setc("eventcategory","1001020200"); -var dup66 = // "Pattern{Field(threat_val,true), Constant(' ]'), Field(p0,false)}" -match("MESSAGE#33:10/0", "nwparser.payload", "%{threat_val->} ]%{p0}"); +var dup66 = match("MESSAGE#33:10/0", "nwparser.payload", "%{threat_val->} ]%{p0}"); -var dup67 = // "Pattern{Constant(' <<'), Field(interface,false), Constant('> '), Field(p0,false)}" -match("MESSAGE#33:10/1_0", "nwparser.p0", " \u003c\u003c%{interface}> %{p0}"); +var dup67 = match("MESSAGE#33:10/1_0", "nwparser.p0", " \u003c\u003c%{interface}> %{p0}"); -var dup68 = // "Pattern{Constant(': '), Field(p0,false)}" -match("MESSAGE#33:10/1_1", "nwparser.p0", ": %{p0}"); +var dup68 = match("MESSAGE#33:10/1_1", "nwparser.p0", ": %{p0}"); -var dup69 = // "Pattern{Constant(' '), Field(p0,false)}" -match("MESSAGE#33:10/1_2", "nwparser.p0", " %{p0}"); +var dup69 = match("MESSAGE#33:10/1_2", "nwparser.p0", " %{p0}"); var dup70 = setc("eventcategory","1001020100"); @@ -310,8 +272,7 @@ var dup73 = setc("ec_activity","Detect"); var dup74 = setc("ec_theme","TEV"); -var dup75 = // "Pattern{Field(context,true), Constant(' <<'), Field(interface,false), Constant('> '), Field(protocol,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#80:103:01/0", "nwparser.payload", "%{context->} \u003c\u003c%{interface}> %{protocol->} %{p0}"); +var dup75 = match("MESSAGE#80:103:01/0", "nwparser.payload", "%{context->} \u003c\u003c%{interface}> %{protocol->} %{p0}"); var dup76 = setf("signame","context"); @@ -387,17 +348,13 @@ var dup111 = setc("eventcategory","1001020307"); var dup112 = setc("eventcategory","1401060000"); -var dup113 = // "Pattern{Field(threat_val,true), Constant(' ]:alert '), Field(p0,false)}" -match("MESSAGE#5535:3086/0_0", "nwparser.payload", "%{threat_val->} ]:alert %{p0}"); +var dup113 = match("MESSAGE#5535:3086/0_0", "nwparser.payload", "%{threat_val->} ]:alert %{p0}"); -var dup114 = // "Pattern{Field(threat_val,false), Constant(']: '), Field(p0,false)}" -match("MESSAGE#5535:3086/0_1", "nwparser.payload", "%{threat_val}]: %{p0}"); +var dup114 = match("MESSAGE#5535:3086/0_1", "nwparser.payload", "%{threat_val}]: %{p0}"); -var dup115 = // "Pattern{Field(threat_val,true), Constant(' ] '), Field(p0,false)}" -match("MESSAGE#5535:3086/0_2", "nwparser.payload", "%{threat_val->} ] %{p0}"); +var dup115 = match("MESSAGE#5535:3086/0_2", "nwparser.payload", "%{threat_val->} ] %{p0}"); -var dup116 = // "Pattern{Constant(''), Field(p0,false)}" -match("MESSAGE#5535:3086/1", "nwparser.p0", "%{p0}"); +var dup116 = match("MESSAGE#5535:3086/1", "nwparser.p0", "%{p0}"); var dup117 = setc("eventcategory","1003050000"); @@ -413,14 +370,11 @@ var dup122 = setc("eventcategory","1603090000"); var dup123 = setc("eventcategory","1003040000"); -var dup124 = // "Pattern{Constant(':alert '), Field(p0,false)}" -match("MESSAGE#30119:28015/1_1", "nwparser.p0", ":alert %{p0}"); +var dup124 = match("MESSAGE#30119:28015/1_1", "nwparser.p0", ":alert %{p0}"); -var dup125 = // "Pattern{Constant(''), Field(saddr,true), Constant(' -> '), Field(p0,false)}" -match("MESSAGE#36377:34596/3_1", "nwparser.p0", "%{saddr->} -> %{p0}"); +var dup125 = match("MESSAGE#36377:34596/3_1", "nwparser.p0", "%{saddr->} -> %{p0}"); -var dup126 = // "Pattern{Constant(''), Field(daddr,false)}" -match("MESSAGE#36377:34596/4_1", "nwparser.p0", "%{daddr}"); +var dup126 = match("MESSAGE#36377:34596/4_1", "nwparser.p0", "%{daddr}"); var dup127 = setc("eventcategory","1605000000"); @@ -434,25 +388,19 @@ var dup129 = date_time({ ], }); -var dup130 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' MAC: '), Field(smacaddr,true), Constant(' TTL '), Field(p0,false)}" -match("MESSAGE#38458:MAC_Information_Change/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} MAC: %{smacaddr->} TTL %{p0}"); +var dup130 = match("MESSAGE#38458:MAC_Information_Change/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} MAC: %{smacaddr->} TTL %{p0}"); -var dup131 = // "Pattern{Field(sinterface,true), Constant(' ('), Field(protocol,true), Constant(' detected)')}" -match("MESSAGE#38458:MAC_Information_Change/1_0", "nwparser.p0", "%{sinterface->} (%{protocol->} detected)"); +var dup131 = match("MESSAGE#38458:MAC_Information_Change/1_0", "nwparser.p0", "%{sinterface->} (%{protocol->} detected)"); -var dup132 = // "Pattern{Field(sinterface,false)}" -match_copy("MESSAGE#38458:MAC_Information_Change/1_1", "nwparser.p0", "sinterface"); +var dup132 = match_copy("MESSAGE#38458:MAC_Information_Change/1_1", "nwparser.p0", "sinterface"); -var dup133 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> '), Field(p0,false)}" -match("MESSAGE#38461:New_Host/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> %{p0}"); +var dup133 = match("MESSAGE#38461:New_Host/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> %{p0}"); -var dup134 = // "Pattern{Field(protocol,false)}" -match_copy("MESSAGE#38462:New_Network_Protocol/2", "nwparser.p0", "protocol"); +var dup134 = match_copy("MESSAGE#38462:New_Network_Protocol/2", "nwparser.p0", "protocol"); var dup135 = setc("eventcategory","1605020000"); -var dup136 = // "Pattern{Field(protocol,true), Constant(' Confidence: '), Field(result,false)}" -match("MESSAGE#38468:TCP_Service_Information_Update/1_0", "nwparser.p0", "%{protocol->} Confidence: %{result}"); +var dup136 = match("MESSAGE#38468:TCP_Service_Information_Update/1_0", "nwparser.p0", "%{protocol->} Confidence: %{result}"); var dup137 = setc("ec_subject","User"); @@ -470,19 +418,15 @@ var dup143 = setf("hostip","hfld2"); var dup144 = setc("ec_activity","Logoff"); -var dup145 = // "Pattern{Constant('>'), Field(p0,false)}" -match("MESSAGE#38495:SystemSettings:09/1_0", "nwparser.p0", ">%{p0}"); +var dup145 = match("MESSAGE#38495:SystemSettings:09/1_0", "nwparser.p0", ">%{p0}"); var dup146 = setc("category","Session Expiration"); -var dup147 = // "Pattern{Field(fld1,false), Constant(']['), Field(policyname,false), Constant('] Connection Type: '), Field(event_state,false), Constant(', User: '), Field(username,false), Constant(', Client: '), Field(application,false), Constant(', Application Protocol: '), Field(protocol,false), Constant(', Web App: '), Field(application,false), Constant(', Access Control Rule Name: '), Field(rulename,false), Constant(', Access Control Rule Action: '), Field(action,false), Constant(', Access Control Rule Reasons: '), Field(result,false), Constant(', URL Category: '), Field(category,false), Constant(', URL Reputation: '), Field(p0,false)}" -match("MESSAGE#38514:Primary_Detection_Engine/0", "nwparser.payload", "%{fld1}][%{policyname}] Connection Type: %{event_state}, User: %{username}, Client: %{application}, Application Protocol: %{protocol}, Web App: %{application}, Access Control Rule Name: %{rulename}, Access Control Rule Action: %{action}, Access Control Rule Reasons: %{result}, URL Category: %{category}, URL Reputation: %{p0}"); +var dup147 = match("MESSAGE#38514:Primary_Detection_Engine/0", "nwparser.payload", "%{fld1}][%{policyname}] Connection Type: %{event_state}, User: %{username}, Client: %{application}, Application Protocol: %{protocol}, Web App: %{application}, Access Control Rule Name: %{rulename}, Access Control Rule Action: %{action}, Access Control Rule Reasons: %{result}, URL Category: %{category}, URL Reputation: %{p0}"); -var dup148 = // "Pattern{Constant('Risk unknown, URL: '), Field(p0,false)}" -match("MESSAGE#38514:Primary_Detection_Engine/1_0", "nwparser.p0", "Risk unknown, URL: %{p0}"); +var dup148 = match("MESSAGE#38514:Primary_Detection_Engine/1_0", "nwparser.p0", "Risk unknown, URL: %{p0}"); -var dup149 = // "Pattern{Field(reputation_num,false), Constant(', URL: '), Field(p0,false)}" -match("MESSAGE#38514:Primary_Detection_Engine/1_1", "nwparser.p0", "%{reputation_num}, URL: %{p0}"); +var dup149 = match("MESSAGE#38514:Primary_Detection_Engine/1_1", "nwparser.p0", "%{reputation_num}, URL: %{p0}"); var dup150 = setc("eventcategory","1801000000"); @@ -490,20 +434,15 @@ var dup151 = setc("dclass_counter1_string","Number of File Events"); var dup152 = setc("dclass_counter2_string","Number of IPS Events"); -var dup153 = // "Pattern{Constant('-*> '), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/1_0", "nwparser.p0", "-*> %{p0}"); +var dup153 = match("MESSAGE#38521:Network_Based_Retrospective/1_0", "nwparser.p0", "-*> %{p0}"); -var dup154 = // "Pattern{Constant('> '), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/1_1", "nwparser.p0", "> %{p0}"); +var dup154 = match("MESSAGE#38521:Network_Based_Retrospective/1_1", "nwparser.p0", "> %{p0}"); -var dup155 = // "Pattern{Constant('From "'), Field(sensor,false), Constant('" at '), Field(p0,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/1_0", "nwparser.p0", "From \"%{sensor}\" at %{p0}"); +var dup155 = match("MESSAGE#38522:Network_Based_Retrospective:01/1_0", "nwparser.p0", "From \"%{sensor}\" at %{p0}"); -var dup156 = // "Pattern{Constant('at '), Field(p0,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/1_1", "nwparser.p0", "at %{p0}"); +var dup156 = match("MESSAGE#38522:Network_Based_Retrospective:01/1_1", "nwparser.p0", "at %{p0}"); -var dup157 = // "Pattern{Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC '), Field(p0,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/2", "nwparser.p0", "%{fld6->} %{event_time_string->} UTC %{p0}"); +var dup157 = match("MESSAGE#38522:Network_Based_Retrospective:01/2", "nwparser.p0", "%{fld6->} %{event_time_string->} UTC %{p0}"); var dup158 = date_time({ dest: "event_time", @@ -513,11 +452,9 @@ var dup158 = date_time({ ], }); -var dup159 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' '), Field(network_service,false)}" -match("MESSAGE#38528:Client_Update/4", "nwparser.p0", "IP Address: %{saddr->} %{network_service}"); +var dup159 = match("MESSAGE#38528:Client_Update/4", "nwparser.p0", "IP Address: %{saddr->} %{network_service}"); -var dup160 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,true), Constant(' Service: '), Field(p0,false)}" -match("MESSAGE#38530:UDP_Server_Information_Update/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{sport->} Service: %{p0}"); +var dup160 = match("MESSAGE#38530:UDP_Server_Information_Update/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{sport->} Service: %{p0}"); var dup161 = date_time({ dest: "event_time", @@ -564,8 +501,7 @@ var dup169 = linear_select([ dup10, ]); -var dup170 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': <<*- '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' '), Field(msgIdPart3,true), Constant(' '), Field(p0,false)}" -match("HEADER#26:0011/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{p0}", processor_chain([ +var dup170 = match("HEADER#26:0011/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{p0}", processor_chain([ dup19, ])); @@ -637,8 +573,7 @@ var dup182 = linear_select([ dup132, ]); -var dup183 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' OS: '), Field(version,true), Constant(' Confidence: '), Field(result,false)}" -match("MESSAGE#38465:OS_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS: %{version->} Confidence: %{result}", processor_chain([ +var dup183 = match("MESSAGE#38465:OS_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS: %{version->} Confidence: %{result}", processor_chain([ dup127, dup31, dup32, @@ -646,8 +581,7 @@ match("MESSAGE#38465:OS_Confidence_Update", "nwparser.payload", "%{context->} Fr dup129, ])); -var dup184 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,true), Constant(' Service: '), Field(protocol,true), Constant(' Confidence: '), Field(result,false)}" -match("MESSAGE#38467:TCP_Service_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{protocol->} Confidence: %{result}", processor_chain([ +var dup184 = match("MESSAGE#38467:TCP_Service_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{protocol->} Confidence: %{result}", processor_chain([ dup135, dup31, dup32, @@ -660,8 +594,7 @@ var dup185 = linear_select([ dup134, ]); -var dup186 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' '), Field(product,false)}" -match("MESSAGE#38471:New_Client_Application", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} %{product}", processor_chain([ +var dup186 = match("MESSAGE#38471:New_Client_Application", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} %{product}", processor_chain([ dup135, dup31, dup32, @@ -669,8 +602,7 @@ match("MESSAGE#38471:New_Client_Application", "nwparser.payload", "%{context->} dup129, ])); -var dup187 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,false)}" -match("MESSAGE#38473:New_TCP_Service", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport}", processor_chain([ +var dup187 = match("MESSAGE#38473:New_TCP_Service", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport}", processor_chain([ dup135, dup31, dup32, @@ -678,8 +610,7 @@ match("MESSAGE#38473:New_TCP_Service", "nwparser.payload", "%{context->} From \" dup129, ])); -var dup188 = // "Pattern{Field(context,true), Constant(' From '), Field(sensor,true), Constant(' at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,false)}" -match("MESSAGE#38475:TCP_Port_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr}", processor_chain([ +var dup188 = match("MESSAGE#38475:TCP_Port_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr}", processor_chain([ dup135, dup31, dup32, @@ -4814,34 +4745,28 @@ var dup356 = all_match({ ]), }); -var hdr1 = // "Pattern{Field(hyear,false), Constant('-'), Field(hmonth,false), Constant('-'), Field(day,false), Constant('T'), Field(time,false), Constant('Z %FTD-'), Field(fld2,false), Constant('-'), Field(hfld3,false), Constant(':'), Field(payload,false)}" -match("HEADER#0:0055", "message", "%{hyear}-%{hmonth}-%{day}T%{time}Z %FTD-%{fld2}-%{hfld3}:%{payload}", processor_chain([ +var hdr1 = match("HEADER#0:0055", "message", "%{hyear}-%{hmonth}-%{day}T%{time}Z %FTD-%{fld2}-%{hfld3}:%{payload}", processor_chain([ setc("header_id","0055"), dup1, ])); -var hdr2 = // "Pattern{Field(hyear,false), Constant('-'), Field(hmonth,false), Constant('-'), Field(day,false), Constant('T'), Field(time,false), Constant('Z '), Field(hostname,true), Constant(' '), Field(fld1,true), Constant(' %NGIPS-'), Field(severity,false), Constant('-'), Field(hfld3,false), Constant(':'), Field(payload,false)}" -match("HEADER#1:0056", "message", "%{hyear}-%{hmonth}-%{day}T%{time}Z %{hostname->} %{fld1->} %NGIPS-%{severity}-%{hfld3}:%{payload}", processor_chain([ +var hdr2 = match("HEADER#1:0056", "message", "%{hyear}-%{hmonth}-%{day}T%{time}Z %{hostname->} %{fld1->} %NGIPS-%{severity}-%{hfld3}:%{payload}", processor_chain([ setc("header_id","0056"), setc("messageid","NGIPS_events"), ])); -var part1 = // "Pattern{Field(result,false), Constant('] From '), Field(p0,false)}" -match("HEADER#2:00010/2", "nwparser.p0", "%{result}] From %{p0}"); +var part1 = match("HEADER#2:00010/2", "nwparser.p0", "%{result}] From %{p0}"); -var part2 = // "Pattern{Constant('"'), Field(group_object,false), Constant('/'), Field(hfld11,false), Constant('" at '), Field(p0,false)}" -match("HEADER#2:00010/3_0", "nwparser.p0", "\"%{group_object}/%{hfld11}\" at %{p0}"); +var part2 = match("HEADER#2:00010/3_0", "nwparser.p0", "\"%{group_object}/%{hfld11}\" at %{p0}"); -var part3 = // "Pattern{Field(group_object,false), Constant('/'), Field(hfld11,true), Constant(' at '), Field(p0,false)}" -match("HEADER#2:00010/3_1", "nwparser.p0", "%{group_object}/%{hfld11->} at %{p0}"); +var part3 = match("HEADER#2:00010/3_1", "nwparser.p0", "%{group_object}/%{hfld11->} at %{p0}"); var select1 = linear_select([ part2, part3, ]); -var part4 = // "Pattern{Field(fld9,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#2:00010/4", "nwparser.p0", "%{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); +var part4 = match("HEADER#2:00010/4", "nwparser.p0", "%{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); var all1 = all_match({ processors: [ @@ -4889,8 +4814,7 @@ var all4 = all_match({ ]), }); -var hdr3 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': '), Field(hfld2,false), Constant(':'), Field(hfld3,true), Constant(' at '), Field(hfld4,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant(']'), Field(payload,false)}" -match("HEADER#6:0015", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: %{hfld2}:%{hfld3->} at %{hfld4}: [%{hevent_source}:%{messageid}:%{hversion}]%{payload}", processor_chain([ +var hdr3 = match("HEADER#6:0015", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: %{hfld2}:%{hfld3->} at %{hfld4}: [%{hevent_source}:%{messageid}:%{hversion}]%{payload}", processor_chain([ setc("header_id","0015"), ])); @@ -4982,8 +4906,7 @@ var all12 = all_match({ ]), }); -var hdr4 = // "Pattern{Constant('snort['), Field(hpid,false), Constant(']: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#15:0030/0", "message", "snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); +var hdr4 = match("HEADER#15:0030/0", "message", "snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); var all13 = all_match({ processors: [ @@ -4996,64 +4919,53 @@ var all13 = all_match({ ]), }); -var hdr5 = // "Pattern{Constant('snort['), Field(hpid,false), Constant(']: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(payload,false)}" -match("HEADER#16:0004", "message", "snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ +var hdr5 = match("HEADER#16:0004", "message", "snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ setc("header_id","0004"), ])); -var hdr6 = // "Pattern{Constant('snort: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(payload,false)}" -match("HEADER#17:0005", "message", "snort: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ +var hdr6 = match("HEADER#17:0005", "message", "snort: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ setc("header_id","0005"), ])); -var hdr7 = // "Pattern{Constant('snort['), Field(hpid,false), Constant(']: '), Field(messageid,false), Constant(': '), Field(payload,false)}" -match("HEADER#18:0018", "message", "snort[%{hpid}]: %{messageid}: %{payload}", processor_chain([ +var hdr7 = match("HEADER#18:0018", "message", "snort[%{hpid}]: %{messageid}: %{payload}", processor_chain([ setc("header_id","0018"), ])); -var hdr8 = // "Pattern{Constant('snort: '), Field(messageid,false), Constant(': '), Field(payload,false)}" -match("HEADER#19:0006", "message", "snort: %{messageid}: %{payload}", processor_chain([ +var hdr8 = match("HEADER#19:0006", "message", "snort: %{messageid}: %{payload}", processor_chain([ setc("header_id","0006"), ])); -var hdr9 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' snort['), Field(hpid,false), Constant(']: '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#20:0007", "message", "%{month->} %{day->} %{time->} %{host->} snort[%{hpid}]: %{messageid->} %{p0}", processor_chain([ +var hdr9 = match("HEADER#20:0007", "message", "%{month->} %{day->} %{time->} %{host->} snort[%{hpid}]: %{messageid->} %{p0}", processor_chain([ setc("header_id","0007"), dup15, ])); -var hdr10 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' snort['), Field(hpid,false), Constant(']: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(payload,false)}" -match("HEADER#21:0008", "message", "%{month->} %{day->} %{time->} %{host->} snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ +var hdr10 = match("HEADER#21:0008", "message", "%{month->} %{day->} %{time->} %{host->} snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ setc("header_id","0008"), ])); -var hdr11 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(hostname,true), Constant(' '), Field(hfld1,false), Constant(': [Primary Detection Engine ('), Field(hfld10,false), Constant(')]['), Field(policyname,false), Constant(']['), Field(hfld2,false), Constant(':'), Field(id,false), Constant(':'), Field(hfld3,false), Constant(']'), Field(payload,false)}" -match("HEADER#22:0046", "message", "%{month->} %{day->} %{time->} %{hostname->} %{hfld1}: [Primary Detection Engine (%{hfld10})][%{policyname}][%{hfld2}:%{id}:%{hfld3}]%{payload}", processor_chain([ +var hdr11 = match("HEADER#22:0046", "message", "%{month->} %{day->} %{time->} %{hostname->} %{hfld1}: [Primary Detection Engine (%{hfld10})][%{policyname}][%{hfld2}:%{id}:%{hfld3}]%{payload}", processor_chain([ setc("header_id","0046"), dup16, ])); -var hdr12 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': ['), Field(hpid,false), Constant(']['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(payload,false)}" -match("HEADER#23:0009", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hpid}][%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ +var hdr12 = match("HEADER#23:0009", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hpid}][%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ setc("header_id","0009"), ])); -var hdr13 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hfld2,true), Constant(' '), Field(hfld3,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld5,false), Constant(': '), Field(hfld6,false), Constant(': '), Field(hfld7,false), Constant(': <<*- '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' From '), Field(hsensor,true), Constant(' at '), Field(p0,false)}" -match("HEADER#24:0022", "message", "%{hfld1->} %{hfld2->} %{hfld3->} %{host->} %{hfld5}: %{hfld6}: %{hfld7}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} From %{hsensor->} at %{p0}", processor_chain([ +var hdr13 = match("HEADER#24:0022", "message", "%{hfld1->} %{hfld2->} %{hfld3->} %{host->} %{hfld5}: %{hfld6}: %{hfld7}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} From %{hsensor->} at %{p0}", processor_chain([ setc("header_id","0022"), dup17, dup18, ])); -var hdr14 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': <<*- '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' From '), Field(hsensor,true), Constant(' at '), Field(p0,false)}" -match("HEADER#25:0010", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} From %{hsensor->} at %{p0}", processor_chain([ +var hdr14 = match("HEADER#25:0010", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} From %{hsensor->} at %{p0}", processor_chain([ setc("header_id","0010"), dup17, dup18, ])); -var part5 = // "Pattern{Constant('From '), Field(hsensor,true), Constant(' at'), Field(p0,false)}" -match("HEADER#26:0011/1_0", "nwparser.p0", "From %{hsensor->} at%{p0}"); +var part5 = match("HEADER#26:0011/1_0", "nwparser.p0", "From %{hsensor->} at%{p0}"); var select2 = linear_select([ part5, @@ -5072,8 +4984,7 @@ var all14 = all_match({ ]), }); -var part6 = // "Pattern{Field(fld10,true), Constant(' From '), Field(hsensor,true), Constant(' at'), Field(p0,false)}" -match("HEADER#27:0014/1_0", "nwparser.p0", "%{fld10->} From %{hsensor->} at%{p0}"); +var part6 = match("HEADER#27:0014/1_0", "nwparser.p0", "%{fld10->} From %{hsensor->} at%{p0}"); var select3 = linear_select([ part6, @@ -5092,8 +5003,7 @@ var all15 = all_match({ ]), }); -var hdr15 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': <<*- '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' '), Field(msgIdPart3,true), Constant(' '), Field(msgIdPart4,true), Constant(' From '), Field(hsensor,true), Constant(' at '), Field(p0,false)}" -match("HEADER#28:0012", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{msgIdPart4->} From %{hsensor->} at %{p0}", processor_chain([ +var hdr15 = match("HEADER#28:0012", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{msgIdPart4->} From %{hsensor->} at %{p0}", processor_chain([ setc("header_id","0012"), dup23, call({ @@ -5115,8 +5025,7 @@ match("HEADER#28:0012", "message", "%{month->} %{day->} %{time->} %{host->} %{hf }), ])); -var hdr16 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': <<*- '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' '), Field(msgIdPart3,true), Constant(' '), Field(msgIdPart4,true), Constant(' '), Field(hfld12,true), Constant(' From '), Field(hsensor,true), Constant(' at '), Field(p0,false)}" -match("HEADER#29:0016", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{msgIdPart4->} %{hfld12->} From %{hsensor->} at %{p0}", processor_chain([ +var hdr16 = match("HEADER#29:0016", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{msgIdPart4->} %{hfld12->} From %{hsensor->} at %{p0}", processor_chain([ setc("header_id","0016"), dup23, call({ @@ -5140,72 +5049,60 @@ match("HEADER#29:0016", "message", "%{month->} %{day->} %{time->} %{host->} %{hf }), ])); -var hdr17 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' snort: '), Field(messageid,false), Constant(':'), Field(payload,false)}" -match("HEADER#30:0013", "message", "%{month->} %{day->} %{time->} %{host->} snort: %{messageid}:%{payload}", processor_chain([ +var hdr17 = match("HEADER#30:0013", "message", "%{month->} %{day->} %{time->} %{host->} snort: %{messageid}:%{payload}", processor_chain([ setc("header_id","0013"), ])); -var hdr18 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(fld,false), Constant(': HMNOTIFY: '), Field(payload,false)}" -match("HEADER#31:0020", "message", "%{month->} %{day->} %{time->} %{host->} %{fld}: HMNOTIFY: %{payload}", processor_chain([ +var hdr18 = match("HEADER#31:0020", "message", "%{month->} %{day->} %{time->} %{host->} %{fld}: HMNOTIFY: %{payload}", processor_chain([ setc("header_id","0020"), dup24, ])); -var hdr19 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' : HMNOTIFY: '), Field(payload,false)}" -match("HEADER#32:0035", "message", "%{month->} %{day->} %{time->} %{host->} : HMNOTIFY: %{payload}", processor_chain([ +var hdr19 = match("HEADER#32:0035", "message", "%{month->} %{day->} %{time->} %{host->} : HMNOTIFY: %{payload}", processor_chain([ setc("header_id","0035"), dup24, ])); -var hdr20 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(fld,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(hsigid,false), Constant(':'), Field(hversion,false), Constant('] "'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#33:0017", "message", "%{month->} %{day->} %{time->} %{host->} %{fld}: [%{hevent_source}:%{hsigid}:%{hversion}] \"%{messageid->} %{p0}", processor_chain([ +var hdr20 = match("HEADER#33:0017", "message", "%{month->} %{day->} %{time->} %{host->} %{fld}: [%{hevent_source}:%{hsigid}:%{hversion}] \"%{messageid->} %{p0}", processor_chain([ setc("header_id","0017"), dup15, ])); -var hdr21 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(fld,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(hsigid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#34:0019", "message", "%{month->} %{day->} %{time->} %{host->} %{fld}: [%{hevent_source}:%{hsigid}:%{hversion}] %{messageid->} %{p0}", processor_chain([ +var hdr21 = match("HEADER#34:0019", "message", "%{month->} %{day->} %{time->} %{host->} %{fld}: [%{hevent_source}:%{hsigid}:%{hversion}] %{messageid->} %{p0}", processor_chain([ setc("header_id","0019"), dup15, ])); -var hdr22 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(hostname,true), Constant(' '), Field(hfld1,false), Constant(': [Primary Detection Engine'), Field(payload,false)}" -match("HEADER#35:0041", "message", "%{month->} %{day->} %{time->} %{hostname->} %{hfld1}: [Primary Detection Engine%{payload}", processor_chain([ +var hdr22 = match("HEADER#35:0041", "message", "%{month->} %{day->} %{time->} %{hostname->} %{hfld1}: [Primary Detection Engine%{payload}", processor_chain([ setc("header_id","0041"), dup16, ])); -var hdr23 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': Protocol: '), Field(hprotocol,false), Constant(', '), Field(payload,false)}" -match("HEADER#36:0045", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: Protocol: %{hprotocol}, %{payload}", processor_chain([ +var hdr23 = match("HEADER#36:0045", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: Protocol: %{hprotocol}, %{payload}", processor_chain([ setc("header_id","0045"), setc("messageid","connection_events"), ])); -var hdr24 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(hfld1,false), Constant(': '), Field(hfld4,true), Constant(' '), Field(host,false), Constant(': '), Field(hfld3,false), Constant('@'), Field(hfld2,false), Constant(', '), Field(payload,false)}" -match("HEADER#37:0042", "message", "%{month->} %{day->} %{time->} %{hfld1}: %{hfld4->} %{host}: %{hfld3}@%{hfld2}, %{payload}", processor_chain([ +var hdr24 = match("HEADER#37:0042", "message", "%{month->} %{day->} %{time->} %{hfld1}: %{hfld4->} %{host}: %{hfld3}@%{hfld2}, %{payload}", processor_chain([ setc("header_id","0042"), dup25, ])); -var hdr25 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(hfld1,false), Constant(': ['), Field(hfld5,false), Constant('] '), Field(host,false), Constant(': '), Field(hfld3,false), Constant('@'), Field(hfld2,false), Constant(', '), Field(payload,false)}" -match("HEADER#38:00212", "message", "%{month->} %{day->} %{time->} %{hfld1}: [%{hfld5}] %{host}: %{hfld3}@%{hfld2}, %{payload}", processor_chain([ +var hdr25 = match("HEADER#38:00212", "message", "%{month->} %{day->} %{time->} %{hfld1}: [%{hfld5}] %{host}: %{hfld3}@%{hfld2}, %{payload}", processor_chain([ setc("header_id","00212"), dup25, ])); -var hdr26 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(hfld1,false), Constant(': '), Field(host,false), Constant(': '), Field(hfld3,false), Constant('@'), Field(hfld2,false), Constant(', '), Field(payload,false)}" -match("HEADER#39:0021", "message", "%{month->} %{day->} %{time->} %{hfld1}: %{host}: %{hfld3}@%{hfld2}, %{payload}", processor_chain([ +var hdr26 = match("HEADER#39:0021", "message", "%{month->} %{day->} %{time->} %{hfld1}: %{host}: %{hfld3}@%{hfld2}, %{payload}", processor_chain([ setc("header_id","0021"), dup25, ])); -var hdr27 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(payload,false)}" -match("HEADER#40:0029", "message", "%{month->} %{day->} %{time->} %{host}: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ +var hdr27 = match("HEADER#40:0029", "message", "%{month->} %{day->} %{time->} %{host}: [%{hevent_source}:%{messageid}:%{hversion}] %{payload}", processor_chain([ setc("header_id","0029"), ])); -var hdr28 = // "Pattern{Constant('snort'), Field(p0,false)}" -match("HEADER#41:0024/0", "message", "snort%{p0}"); +var hdr28 = match("HEADER#41:0024/0", "message", "snort%{p0}"); var all16 = all_match({ processors: [ @@ -5219,8 +5116,7 @@ var all16 = all_match({ ]), }); -var hdr29 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' snort'), Field(p0,false)}" -match("HEADER#42:0025/0", "message", "%{month->} %{day->} %{time->} snort%{p0}"); +var hdr29 = match("HEADER#42:0025/0", "message", "%{month->} %{day->} %{time->} snort%{p0}"); var all17 = all_match({ processors: [ @@ -5234,8 +5130,7 @@ var all17 = all_match({ ]), }); -var part7 = // "Pattern{Field(result,false), Constant('] From '), Field(group_object,false), Constant('/'), Field(hfld11,true), Constant(' at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#43:0023/2", "nwparser.p0", "%{result}] From %{group_object}/%{hfld11->} at %{fld6->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); +var part7 = match("HEADER#43:0023/2", "nwparser.p0", "%{result}] From %{group_object}/%{hfld11->} at %{fld6->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); var all18 = all_match({ processors: [ @@ -5249,8 +5144,7 @@ var all18 = all_match({ ]), }); -var part8 = // "Pattern{Field(result,false), Constant('] From '), Field(hfld11,true), Constant(' at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#44:0026/2", "nwparser.p0", "%{result}] From %{hfld11->} at %{fld6->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); +var part8 = match("HEADER#44:0026/2", "nwparser.p0", "%{result}] From %{hfld11->} at %{fld6->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); var all19 = all_match({ processors: [ @@ -5288,8 +5182,7 @@ var all21 = all_match({ ]), }); -var hdr30 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': Sha256:'), Field(hfld2,true), Constant(' Disposition: Malware'), Field(p0,false)}" -match("HEADER#47:0040", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: Sha256:%{hfld2->} Disposition: Malware%{p0}", processor_chain([ +var hdr30 = match("HEADER#47:0040", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: Sha256:%{hfld2->} Disposition: Malware%{p0}", processor_chain([ setc("header_id","0040"), setc("messageid","MALWARE"), call({ @@ -5303,8 +5196,7 @@ match("HEADER#47:0040", "message", "%{month->} %{day->} %{time->} %{host->} %{hf }), ])); -var hdr31 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': <<- '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' '), Field(msgIdPart3,true), Constant(' From '), Field(hsensor,true), Constant(' at '), Field(p0,false)}" -match("HEADER#48:0043", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} From %{hsensor->} at %{p0}", processor_chain([ +var hdr31 = match("HEADER#48:0043", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} From %{hsensor->} at %{p0}", processor_chain([ setc("header_id","0043"), dup22, call({ @@ -5324,27 +5216,22 @@ match("HEADER#48:0043", "message", "%{month->} %{day->} %{time->} %{host->} %{hf }), ])); -var hdr32 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(messageid,false), Constant('['), Field(process_id,false), Constant(']: '), Field(payload,false)}" -match("HEADER#49:0044", "message", "%{month->} %{day->} %{time->} %{host->} %{messageid}[%{process_id}]: %{payload}", processor_chain([ +var hdr32 = match("HEADER#49:0044", "message", "%{month->} %{day->} %{time->} %{host->} %{messageid}[%{process_id}]: %{payload}", processor_chain([ setc("header_id","0044"), ])); -var hdr33 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(hyear,true), Constant(' '), Field(time,true), Constant(' '), Field(p0,false)}" -match("HEADER#50:0057/0", "message", "%{month->} %{day->} %{hyear->} %{time->} %{p0}"); +var hdr33 = match("HEADER#50:0057/0", "message", "%{month->} %{day->} %{hyear->} %{time->} %{p0}"); -var part9 = // "Pattern{Field(hostname,false), Constant(': %FTD-'), Field(p0,false)}" -match("HEADER#50:0057/1_0", "nwparser.p0", "%{hostname}: %FTD-%{p0}"); +var part9 = match("HEADER#50:0057/1_0", "nwparser.p0", "%{hostname}: %FTD-%{p0}"); -var part10 = // "Pattern{Field(hostname,true), Constant(' %FTD-'), Field(p0,false)}" -match("HEADER#50:0057/1_1", "nwparser.p0", "%{hostname->} %FTD-%{p0}"); +var part10 = match("HEADER#50:0057/1_1", "nwparser.p0", "%{hostname->} %FTD-%{p0}"); var select4 = linear_select([ part9, part10, ]); -var part11 = // "Pattern{Field(fld2,false), Constant('-'), Field(hfld3,false), Constant(':'), Field(payload,false)}" -match("HEADER#50:0057/2", "nwparser.p0", "%{fld2}-%{hfld3}:%{payload}"); +var part11 = match("HEADER#50:0057/2", "nwparser.p0", "%{fld2}-%{hfld3}:%{payload}"); var all22 = all_match({ processors: [ @@ -5358,8 +5245,7 @@ var all22 = all_match({ ]), }); -var hdr34 = // "Pattern{Field(hyear,false), Constant('-'), Field(hmonth,false), Constant('-'), Field(day,false), Constant('T'), Field(time,false), Constant('Z '), Field(hostname,true), Constant(' %FTD-'), Field(fld2,false), Constant('-'), Field(hfld3,false), Constant(':'), Field(payload,false)}" -match("HEADER#51:0058", "message", "%{hyear}-%{hmonth}-%{day}T%{time}Z %{hostname->} %FTD-%{fld2}-%{hfld3}:%{payload}", processor_chain([ +var hdr34 = match("HEADER#51:0058", "message", "%{hyear}-%{hmonth}-%{day}T%{time}Z %{hostname->} %FTD-%{fld2}-%{hfld3}:%{payload}", processor_chain([ setc("header_id","0058"), dup1, ])); @@ -5419,8 +5305,7 @@ var select5 = linear_select([ hdr34, ]); -var part12 = // "Pattern{Field(event_type,true), Constant(' (Sensor '), Field(sensor,false), Constant('): Severity:'), Field(severity,false), Constant(': '), Field(result,false)}" -match("MESSAGE#0:HMNOTIFY", "nwparser.payload", "%{event_type->} (Sensor %{sensor}): Severity:%{severity}: %{result}", processor_chain([ +var part12 = match("MESSAGE#0:HMNOTIFY", "nwparser.payload", "%{event_type->} (Sensor %{sensor}): Severity:%{severity}: %{result}", processor_chain([ setc("eventcategory","1604000000"), dup31, dup32, @@ -95633,17 +95518,13 @@ var all66 = all_match({ var msg38452 = msg("snort-sid-template", all66); -var part13 = // "Pattern{Constant('PORTSCAN DETECTED from '), Field(p0,false)}" -match("MESSAGE#38452:spp_portscan/0", "nwparser.payload", "PORTSCAN DETECTED from %{p0}"); +var part13 = match("MESSAGE#38452:spp_portscan/0", "nwparser.payload", "PORTSCAN DETECTED from %{p0}"); -var part14 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(location_src,false), Constant(')(THRESHOLD '), Field(p0,false)}" -match("MESSAGE#38452:spp_portscan/1_0", "nwparser.p0", "%{saddr}:%{sport->} (%{location_src})(THRESHOLD %{p0}"); +var part14 = match("MESSAGE#38452:spp_portscan/1_0", "nwparser.p0", "%{saddr}:%{sport->} (%{location_src})(THRESHOLD %{p0}"); -var part15 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,false), Constant('(THRESHOLD '), Field(p0,false)}" -match("MESSAGE#38452:spp_portscan/1_1", "nwparser.p0", "%{saddr}:%{sport}(THRESHOLD %{p0}"); +var part15 = match("MESSAGE#38452:spp_portscan/1_1", "nwparser.p0", "%{saddr}:%{sport}(THRESHOLD %{p0}"); -var part16 = // "Pattern{Field(saddr,false), Constant('(THRESHOLD '), Field(p0,false)}" -match("MESSAGE#38452:spp_portscan/1_2", "nwparser.p0", "%{saddr}(THRESHOLD %{p0}"); +var part16 = match("MESSAGE#38452:spp_portscan/1_2", "nwparser.p0", "%{saddr}(THRESHOLD %{p0}"); var select2444 = linear_select([ part14, @@ -95651,8 +95532,7 @@ var select2444 = linear_select([ part16, ]); -var part17 = // "Pattern{Field(dclass_counter1,true), Constant(' connections exceeded in '), Field(duration,true), Constant(' seconds)')}" -match("MESSAGE#38452:spp_portscan/2", "nwparser.p0", "%{dclass_counter1->} connections exceeded in %{duration->} seconds)"); +var part17 = match("MESSAGE#38452:spp_portscan/2", "nwparser.p0", "%{dclass_counter1->} connections exceeded in %{duration->} seconds)"); var all67 = all_match({ processors: [ @@ -95676,8 +95556,7 @@ var all67 = all_match({ var msg38453 = msg("spp_portscan", all67); -var part18 = // "Pattern{Constant('portscan status from '), Field(saddr,false), Constant(': '), Field(dclass_counter1,true), Constant(' connections across '), Field(fld1,true), Constant(' hosts: '), Field(fld2,false), Constant(', '), Field(fld3,false)}" -match("MESSAGE#38453:spp_portscan:01", "nwparser.payload", "portscan status from %{saddr}: %{dclass_counter1->} connections across %{fld1->} hosts: %{fld2}, %{fld3}", processor_chain([ +var part18 = match("MESSAGE#38453:spp_portscan:01", "nwparser.payload", "portscan status from %{saddr}: %{dclass_counter1->} connections across %{fld1->} hosts: %{fld2}, %{fld3}", processor_chain([ dup61, dup31, dup32, @@ -95692,8 +95571,7 @@ match("MESSAGE#38453:spp_portscan:01", "nwparser.payload", "portscan status from var msg38454 = msg("spp_portscan:01", part18); -var part19 = // "Pattern{Constant('End of portscan from '), Field(saddr,false), Constant(': TOTAL time('), Field(fld1,false), Constant(') hosts('), Field(fld2,false), Constant(') '), Field(fld3,true), Constant(' '), Field(fld4,false)}" -match("MESSAGE#38454:spp_portscan:02", "nwparser.payload", "End of portscan from %{saddr}: TOTAL time(%{fld1}) hosts(%{fld2}) %{fld3->} %{fld4}", processor_chain([ +var part19 = match("MESSAGE#38454:spp_portscan:02", "nwparser.payload", "End of portscan from %{saddr}: TOTAL time(%{fld1}) hosts(%{fld2}) %{fld3->} %{fld4}", processor_chain([ dup61, dup31, dup32, @@ -95716,8 +95594,7 @@ var select2445 = linear_select([ msg38456, ]); -var part20 = // "Pattern{Constant('Portscan detected from '), Field(saddr,true), Constant(' Talker('), Field(fld1,false), Constant(') Scanner('), Field(fld2,false), Constant(')')}" -match("MESSAGE#38456:Portscan", "nwparser.payload", "Portscan detected from %{saddr->} Talker(%{fld1}) Scanner(%{fld2})", processor_chain([ +var part20 = match("MESSAGE#38456:Portscan", "nwparser.payload", "Portscan detected from %{saddr->} Talker(%{fld1}) Scanner(%{fld2})", processor_chain([ dup61, dup31, dup32, @@ -95725,8 +95602,7 @@ match("MESSAGE#38456:Portscan", "nwparser.payload", "Portscan detected from %{sa var msg38457 = msg("Portscan", part20); -var part21 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Hops: '), Field(result,false)}" -match("MESSAGE#38457:Hops_Change", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Hops: %{result}", processor_chain([ +var part21 = match("MESSAGE#38457:Hops_Change", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Hops: %{result}", processor_chain([ dup127, dup31, dup32, @@ -95740,8 +95616,7 @@ var msg38459 = msg("MAC_Information_Change", dup354); var msg38460 = msg("Additional_MAC_Detected_for", dup354); -var part22 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' NETBIOS Name: '), Field(result,false)}" -match("MESSAGE#38460:NETBIOS_Name_Change", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} NETBIOS Name: %{result}", processor_chain([ +var part22 = match("MESSAGE#38460:NETBIOS_Name_Change", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} NETBIOS Name: %{result}", processor_chain([ dup127, dup31, dup32, @@ -95751,19 +95626,16 @@ match("MESSAGE#38460:NETBIOS_Name_Change", "nwparser.payload", "%{context->} Fro var msg38461 = msg("NETBIOS_Name_Change", part22); -var part23 = // "Pattern{Constant('MAC Address: '), Field(smacaddr,true), Constant(' Host Type: '), Field(p0,false)}" -match("MESSAGE#38461:New_Host/1_0", "nwparser.p0", "MAC Address: %{smacaddr->} Host Type: %{p0}"); +var part23 = match("MESSAGE#38461:New_Host/1_0", "nwparser.p0", "MAC Address: %{smacaddr->} Host Type: %{p0}"); -var part24 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Host Type: '), Field(p0,false)}" -match("MESSAGE#38461:New_Host/1_1", "nwparser.p0", "IP Address: %{saddr->} Host Type: %{p0}"); +var part24 = match("MESSAGE#38461:New_Host/1_1", "nwparser.p0", "IP Address: %{saddr->} Host Type: %{p0}"); var select2446 = linear_select([ part23, part24, ]); -var part25 = // "Pattern{Field(fld7,false)}" -match_copy("MESSAGE#38461:New_Host/2", "nwparser.p0", "fld7"); +var part25 = match_copy("MESSAGE#38461:New_Host/2", "nwparser.p0", "fld7"); var all68 = all_match({ processors: [ @@ -95782,11 +95654,9 @@ var all68 = all_match({ var msg38462 = msg("New_Host", all68); -var part26 = // "Pattern{Constant('MAC Address: '), Field(smacaddr,true), Constant(' Network Protocol: '), Field(p0,false)}" -match("MESSAGE#38462:New_Network_Protocol/1_0", "nwparser.p0", "MAC Address: %{smacaddr->} Network Protocol: %{p0}"); +var part26 = match("MESSAGE#38462:New_Network_Protocol/1_0", "nwparser.p0", "MAC Address: %{smacaddr->} Network Protocol: %{p0}"); -var part27 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Network Protocol: '), Field(p0,false)}" -match("MESSAGE#38462:New_Network_Protocol/1_1", "nwparser.p0", "IP Address: %{saddr->} Network Protocol: %{p0}"); +var part27 = match("MESSAGE#38462:New_Network_Protocol/1_1", "nwparser.p0", "IP Address: %{saddr->} Network Protocol: %{p0}"); var select2447 = linear_select([ part26, @@ -95810,8 +95680,7 @@ var all69 = all_match({ var msg38463 = msg("New_Network_Protocol", all69); -var part28 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Port: '), Field(protocol,false)}" -match("MESSAGE#38463:New_UDP_Service", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{protocol}", processor_chain([ +var part28 = match("MESSAGE#38463:New_UDP_Service", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{protocol}", processor_chain([ dup135, dup31, dup32, @@ -95821,8 +95690,7 @@ match("MESSAGE#38463:New_UDP_Service", "nwparser.payload", "%{context->} From \" var msg38464 = msg("New_UDP_Service", part28); -var part29 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Transport Protocol: '), Field(protocol,false)}" -match("MESSAGE#38464:New_Transport_Protocol", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Transport Protocol: %{protocol}", processor_chain([ +var part29 = match("MESSAGE#38464:New_Transport_Protocol", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Transport Protocol: %{protocol}", processor_chain([ dup135, dup31, dup32, @@ -95838,8 +95706,7 @@ var msg38467 = msg("OS_Information_Update", dup183); var msg38468 = msg("TCP_Service_Confidence_Update", dup184); -var part30 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,true), Constant(' Service: '), Field(p0,false)}" -match("MESSAGE#38468:TCP_Service_Information_Update/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{p0}"); +var part30 = match("MESSAGE#38468:TCP_Service_Information_Update/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{p0}"); var all70 = all_match({ processors: [ @@ -95857,8 +95724,7 @@ var all70 = all_match({ var msg38469 = msg("TCP_Service_Information_Update", all70); -var part31 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> MAC Address: '), Field(saddr,true), Constant(' VLAN ID: '), Field(sport,true), Constant(' Type: '), Field(protocol,true), Constant(' Priority: '), Field(threat_val,false)}" -match("MESSAGE#38469:VLAN_Tag_Information_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> MAC Address: %{saddr->} VLAN ID: %{sport->} Type: %{protocol->} Priority: %{threat_val}", processor_chain([ +var part31 = match("MESSAGE#38469:VLAN_Tag_Information_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> MAC Address: %{saddr->} VLAN ID: %{sport->} Type: %{protocol->} Priority: %{threat_val}", processor_chain([ dup135, dup31, dup32, @@ -95869,14 +95735,11 @@ match("MESSAGE#38469:VLAN_Tag_Information_Update", "nwparser.payload", "%{contex var msg38470 = msg("VLAN_Tag_Information_Update", part31); -var part32 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' OS: '), Field(p0,false)}" -match("MESSAGE#38470:New_OS/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS: %{p0}"); +var part32 = match("MESSAGE#38470:New_OS/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS: %{p0}"); -var part33 = // "Pattern{Field(os,true), Constant(' Device Info: '), Field(fld7,false)}" -match("MESSAGE#38470:New_OS/1_0", "nwparser.p0", "%{os->} Device Info: %{fld7}"); +var part33 = match("MESSAGE#38470:New_OS/1_0", "nwparser.p0", "%{os->} Device Info: %{fld7}"); -var part34 = // "Pattern{Field(os,false)}" -match_copy("MESSAGE#38470:New_OS/1_1", "nwparser.p0", "os"); +var part34 = match_copy("MESSAGE#38470:New_OS/1_1", "nwparser.p0", "os"); var select2448 = linear_select([ part33, @@ -95909,8 +95772,7 @@ var msg38475 = msg("TCP_Port_Closed", dup187); var msg38476 = msg("TCP_Port_Timeout", dup188); -var part35 = // "Pattern{Field(context,true), Constant(' From '), Field(sensor,true), Constant(' at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' web browser '), Field(application,false)}" -match("MESSAGE#38476:Client_Application_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} web browser %{application}", processor_chain([ +var part35 = match("MESSAGE#38476:Client_Application_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} web browser %{application}", processor_chain([ dup135, dup31, dup32, @@ -95922,8 +95784,7 @@ var msg38477 = msg("Client_Application_Timeout", part35); var msg38478 = msg("Host_Timeout", dup188); -var part36 = // "Pattern{Field(context,true), Constant(' From '), Field(sensor,true), Constant(' at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' OS'), Field(os,false)}" -match("MESSAGE#38478:Identity_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS%{os}", processor_chain([ +var part36 = match("MESSAGE#38478:Identity_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS%{os}", processor_chain([ dup135, dup31, dup32, @@ -95933,22 +95794,18 @@ match("MESSAGE#38478:Identity_Timeout", "nwparser.payload", "%{context->} From % var msg38479 = msg("Identity_Timeout", part36); -var part37 = // "Pattern{Field(context,true), Constant(' From '), Field(sensor,true), Constant(' at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Serv'), Field(p0,false)}" -match("MESSAGE#38479:Identity_Timeout:01/0", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Serv%{p0}"); +var part37 = match("MESSAGE#38479:Identity_Timeout:01/0", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Serv%{p0}"); -var part38 = // "Pattern{Constant('ice'), Field(p0,false)}" -match("MESSAGE#38479:Identity_Timeout:01/1_0", "nwparser.p0", "ice%{p0}"); +var part38 = match("MESSAGE#38479:Identity_Timeout:01/1_0", "nwparser.p0", "ice%{p0}"); -var part39 = // "Pattern{Constant('er'), Field(p0,false)}" -match("MESSAGE#38479:Identity_Timeout:01/1_1", "nwparser.p0", "er%{p0}"); +var part39 = match("MESSAGE#38479:Identity_Timeout:01/1_1", "nwparser.p0", "er%{p0}"); var select2449 = linear_select([ part38, part39, ]); -var part40 = // "Pattern{Field(,false), Constant('port: '), Field(sport,false), Constant('/'), Field(protocol,true), Constant(' '), Field(network_service,false)}" -match("MESSAGE#38479:Identity_Timeout:01/2", "nwparser.p0", "%{}port: %{sport}/%{protocol->} %{network_service}"); +var part40 = match("MESSAGE#38479:Identity_Timeout:01/2", "nwparser.p0", "%{}port: %{sport}/%{protocol->} %{network_service}"); var all72 = all_match({ processors: [ @@ -95976,8 +95833,7 @@ var msg38481 = msg("UDP_Port_Timeout", dup188); var msg38482 = msg("UDP_Service_Confidence_Update", dup184); -var part41 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,true), Constant(' Service: '), Field(protocol,true), Constant(' Confidence: '), Field(result,true), Constant(' Subtypes: '), Field(fld1,false)}" -match("MESSAGE#38482:UDP_Service_Information_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{protocol->} Confidence: %{result->} Subtypes: %{fld1}", processor_chain([ +var part41 = match("MESSAGE#38482:UDP_Service_Information_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{protocol->} Confidence: %{result->} Subtypes: %{fld1}", processor_chain([ dup135, dup31, dup32, @@ -95994,17 +95850,13 @@ var select2451 = linear_select([ msg38484, ]); -var part42 = // "Pattern{Field(context,true), Constant(' ['), Field(p0,false)}" -match("MESSAGE#38484:EmergingThreats/0", "nwparser.payload", "%{context->} [%{p0}"); +var part42 = match("MESSAGE#38484:EmergingThreats/0", "nwparser.payload", "%{context->} [%{p0}"); -var part43 = // "Pattern{Constant('Impact: '), Field(result,false), Constant('] From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(p0,false)}" -match("MESSAGE#38484:EmergingThreats/1_0", "nwparser.p0", "Impact: %{result}] From \"%{sensor}\" at %{fld6->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{p0}"); +var part43 = match("MESSAGE#38484:EmergingThreats/1_0", "nwparser.p0", "Impact: %{result}] From \"%{sensor}\" at %{fld6->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{p0}"); -var part44 = // "Pattern{Constant('Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(p0,false)}" -match("MESSAGE#38484:EmergingThreats/1_1", "nwparser.p0", "Classification: %{sigtype}] [Priority: %{p0}"); +var part44 = match("MESSAGE#38484:EmergingThreats/1_1", "nwparser.p0", "Classification: %{sigtype}] [Priority: %{p0}"); -var part45 = // "Pattern{Field(info,false), Constant('] [Priority: '), Field(p0,false)}" -match("MESSAGE#38484:EmergingThreats/1_2", "nwparser.p0", "%{info}] [Priority: %{p0}"); +var part45 = match("MESSAGE#38484:EmergingThreats/1_2", "nwparser.p0", "%{info}] [Priority: %{p0}"); var select2452 = linear_select([ part43, @@ -96012,8 +95864,7 @@ var select2452 = linear_select([ part45, ]); -var part46 = // "Pattern{Field(threat_val,true), Constant(' ]'), Field(p0,false)}" -match("MESSAGE#38484:EmergingThreats/2", "nwparser.p0", "%{threat_val->} ]%{p0}"); +var part46 = match("MESSAGE#38484:EmergingThreats/2", "nwparser.p0", "%{threat_val->} ]%{p0}"); var all73 = all_match({ processors: [ @@ -96043,8 +95894,7 @@ var all73 = all_match({ var msg38485 = msg("EmergingThreats", all73); -var part47 = // "Pattern{Constant('Pruned session from cache that was using '), Field(bytes,true), Constant(' bytes ('), Field(result,false), Constant('). '), Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' --> '), Field(daddr,true), Constant(' '), Field(fld2,true), Constant(' ('), Field(fld3,false), Constant(') : '), Field(info,false)}" -match("MESSAGE#38485:S5", "nwparser.payload", "Pruned session from cache that was using %{bytes->} bytes (%{result}). %{saddr->} %{fld1->} --> %{daddr->} %{fld2->} (%{fld3}) : %{info}", processor_chain([ +var part47 = match("MESSAGE#38485:S5", "nwparser.payload", "Pruned session from cache that was using %{bytes->} bytes (%{result}). %{saddr->} %{fld1->} --> %{daddr->} %{fld2->} (%{fld3}) : %{info}", processor_chain([ dup127, dup31, dup32, @@ -96052,8 +95902,7 @@ match("MESSAGE#38485:S5", "nwparser.payload", "Pruned session from cache that wa var msg38486 = msg("S5", part47); -var part48 = // "Pattern{Constant('Session exceeded configured max bytes to queue '), Field(fld4,true), Constant(' using '), Field(bytes,true), Constant(' bytes ('), Field(result,false), Constant('). '), Field(saddr,true), Constant(' '), Field(fld1,true), Constant(' --> '), Field(daddr,true), Constant(' '), Field(fld2,true), Constant(' ('), Field(fld3,false), Constant(') : '), Field(info,false)}" -match("MESSAGE#38486:S5:01", "nwparser.payload", "Session exceeded configured max bytes to queue %{fld4->} using %{bytes->} bytes (%{result}). %{saddr->} %{fld1->} --> %{daddr->} %{fld2->} (%{fld3}) : %{info}", processor_chain([ +var part48 = match("MESSAGE#38486:S5:01", "nwparser.payload", "Session exceeded configured max bytes to queue %{fld4->} using %{bytes->} bytes (%{result}). %{saddr->} %{fld1->} --> %{daddr->} %{fld2->} (%{fld3}) : %{info}", processor_chain([ dup127, dup31, dup32, @@ -96066,8 +95915,7 @@ var select2453 = linear_select([ msg38487, ]); -var part49 = // "Pattern{Constant('Login, Login Success'), Field(,false)}" -match("MESSAGE#38487:SystemSettings:01", "nwparser.payload", "Login, Login Success%{}", processor_chain([ +var part49 = match("MESSAGE#38487:SystemSettings:01", "nwparser.payload", "Login, Login Success%{}", processor_chain([ dup112, dup31, dup32, @@ -96083,8 +95931,7 @@ match("MESSAGE#38487:SystemSettings:01", "nwparser.payload", "Login, Login Succe var msg38488 = msg("SystemSettings:01", part49); -var part50 = // "Pattern{Constant('Logout, Logout Success'), Field(,false)}" -match("MESSAGE#38488:SystemSettings:02", "nwparser.payload", "Logout, Logout Success%{}", processor_chain([ +var part50 = match("MESSAGE#38488:SystemSettings:02", "nwparser.payload", "Logout, Logout Success%{}", processor_chain([ setc("eventcategory","1802000000"), dup31, dup32, @@ -96100,8 +95947,7 @@ match("MESSAGE#38488:SystemSettings:02", "nwparser.payload", "Logout, Logout Suc var msg38489 = msg("SystemSettings:02", part50); -var part51 = // "Pattern{Constant('System > '), Field(info,false)}" -match("MESSAGE#38489:SystemSettings:03", "nwparser.payload", "System > %{info}", processor_chain([ +var part51 = match("MESSAGE#38489:SystemSettings:03", "nwparser.payload", "System > %{info}", processor_chain([ dup127, dup31, dup32, @@ -96114,8 +95960,7 @@ match("MESSAGE#38489:SystemSettings:03", "nwparser.payload", "System > %{info}", var msg38490 = msg("SystemSettings:03", part51); -var part52 = // "Pattern{Constant('Policies > '), Field(info,false)}" -match("MESSAGE#38490:SystemSettings:04", "nwparser.payload", "Policies > %{info}", processor_chain([ +var part52 = match("MESSAGE#38490:SystemSettings:04", "nwparser.payload", "Policies > %{info}", processor_chain([ dup127, dup31, dup32, @@ -96128,8 +95973,7 @@ match("MESSAGE#38490:SystemSettings:04", "nwparser.payload", "Policies > %{info} var msg38491 = msg("SystemSettings:04", part52); -var part53 = // "Pattern{Constant('Object > '), Field(info,false)}" -match("MESSAGE#38491:SystemSettings:05", "nwparser.payload", "Object > %{info}", processor_chain([ +var part53 = match("MESSAGE#38491:SystemSettings:05", "nwparser.payload", "Object > %{info}", processor_chain([ dup127, dup31, dup32, @@ -96141,8 +95985,7 @@ match("MESSAGE#38491:SystemSettings:05", "nwparser.payload", "Object > %{info}", var msg38492 = msg("SystemSettings:05", part53); -var part54 = // "Pattern{Constant('Overview > '), Field(info,false)}" -match("MESSAGE#38492:SystemSettings:06", "nwparser.payload", "Overview > %{info}", processor_chain([ +var part54 = match("MESSAGE#38492:SystemSettings:06", "nwparser.payload", "Overview > %{info}", processor_chain([ dup127, dup31, dup32, @@ -96154,8 +95997,7 @@ match("MESSAGE#38492:SystemSettings:06", "nwparser.payload", "Overview > %{info} var msg38493 = msg("SystemSettings:06", part54); -var part55 = // "Pattern{Constant('Task Queue, '), Field(info,false)}" -match("MESSAGE#38493:SystemSettings:07", "nwparser.payload", "Task Queue, %{info}", processor_chain([ +var part55 = match("MESSAGE#38493:SystemSettings:07", "nwparser.payload", "Task Queue, %{info}", processor_chain([ dup127, dup31, dup32, @@ -96168,8 +96010,7 @@ match("MESSAGE#38493:SystemSettings:07", "nwparser.payload", "Task Queue, %{info var msg38494 = msg("SystemSettings:07", part55); -var part56 = // "Pattern{Constant('Intrusion Policy > '), Field(info,false)}" -match("MESSAGE#38494:SystemSettings:08", "nwparser.payload", "Intrusion Policy > %{info}", processor_chain([ +var part56 = match("MESSAGE#38494:SystemSettings:08", "nwparser.payload", "Intrusion Policy > %{info}", processor_chain([ dup127, dup31, dup32, @@ -96182,19 +96023,16 @@ match("MESSAGE#38494:SystemSettings:08", "nwparser.payload", "Intrusion Policy > var msg38495 = msg("SystemSettings:08", part56); -var part57 = // "Pattern{Constant('Analysis & Reporting '), Field(p0,false)}" -match("MESSAGE#38495:SystemSettings:09/0", "nwparser.payload", "Analysis \u0026 Reporting %{p0}"); +var part57 = match("MESSAGE#38495:SystemSettings:09/0", "nwparser.payload", "Analysis \u0026 Reporting %{p0}"); -var part58 = // "Pattern{Constant(','), Field(p0,false)}" -match("MESSAGE#38495:SystemSettings:09/1_1", "nwparser.p0", ",%{p0}"); +var part58 = match("MESSAGE#38495:SystemSettings:09/1_1", "nwparser.p0", ",%{p0}"); var select2454 = linear_select([ dup145, part58, ]); -var part59 = // "Pattern{Field(,true), Constant(' '), Field(info,false)}" -match("MESSAGE#38495:SystemSettings:09/2", "nwparser.p0", "%{} %{info}"); +var part59 = match("MESSAGE#38495:SystemSettings:09/2", "nwparser.p0", "%{} %{info}"); var all74 = all_match({ processors: [ @@ -96216,8 +96054,7 @@ var all74 = all_match({ var msg38496 = msg("SystemSettings:09", all74); -var part60 = // "Pattern{Constant('Heartbeat, '), Field(info,false)}" -match("MESSAGE#38496:SystemSettings:10", "nwparser.payload", "Heartbeat, %{info}", processor_chain([ +var part60 = match("MESSAGE#38496:SystemSettings:10", "nwparser.payload", "Heartbeat, %{info}", processor_chain([ dup127, dup31, dup32, @@ -96230,8 +96067,7 @@ match("MESSAGE#38496:SystemSettings:10", "nwparser.payload", "Heartbeat, %{info} var msg38497 = msg("SystemSettings:10", part60); -var part61 = // "Pattern{Constant('FailD, '), Field(info,false)}" -match("MESSAGE#38497:SystemSettings:11", "nwparser.payload", "FailD, %{info}", processor_chain([ +var part61 = match("MESSAGE#38497:SystemSettings:11", "nwparser.payload", "FailD, %{info}", processor_chain([ dup127, dup31, dup32, @@ -96243,8 +96079,7 @@ match("MESSAGE#38497:SystemSettings:11", "nwparser.payload", "FailD, %{info}", p var msg38498 = msg("SystemSettings:11", part61); -var part62 = // "Pattern{Constant('Health > '), Field(info,false)}" -match("MESSAGE#38498:SystemSettings:12", "nwparser.payload", "Health > %{info}", processor_chain([ +var part62 = match("MESSAGE#38498:SystemSettings:12", "nwparser.payload", "Health > %{info}", processor_chain([ dup127, dup31, dup32, @@ -96257,8 +96092,7 @@ match("MESSAGE#38498:SystemSettings:12", "nwparser.payload", "Health > %{info}", var msg38499 = msg("SystemSettings:12", part62); -var part63 = // "Pattern{Constant('Session Expiration, '), Field(info,false)}" -match("MESSAGE#38499:SystemSettings:13", "nwparser.payload", "Session Expiration, %{info}", processor_chain([ +var part63 = match("MESSAGE#38499:SystemSettings:13", "nwparser.payload", "Session Expiration, %{info}", processor_chain([ dup127, dup31, dup32, @@ -96271,8 +96105,7 @@ match("MESSAGE#38499:SystemSettings:13", "nwparser.payload", "Session Expiration var msg38500 = msg("SystemSettings:13", part63); -var part64 = // "Pattern{Constant('Analysis '), Field(info,false)}" -match("MESSAGE#38500:SystemSettings:14", "nwparser.payload", "Analysis %{info}", processor_chain([ +var part64 = match("MESSAGE#38500:SystemSettings:14", "nwparser.payload", "Analysis %{info}", processor_chain([ dup127, dup31, dup32, @@ -96285,8 +96118,7 @@ match("MESSAGE#38500:SystemSettings:14", "nwparser.payload", "Analysis %{info}", var msg38501 = msg("SystemSettings:14", part64); -var part65 = // "Pattern{Constant('Devices '), Field(info,false)}" -match("MESSAGE#38501:SystemSettings:15", "nwparser.payload", "Devices %{info}", processor_chain([ +var part65 = match("MESSAGE#38501:SystemSettings:15", "nwparser.payload", "Devices %{info}", processor_chain([ dup127, dup31, dup32, @@ -96299,8 +96131,7 @@ match("MESSAGE#38501:SystemSettings:15", "nwparser.payload", "Devices %{info}", var msg38502 = msg("SystemSettings:15", part65); -var part66 = // "Pattern{Constant('Intrusion Events,'), Field(info,false)}" -match("MESSAGE#38502:SystemSettings:16", "nwparser.payload", "Intrusion Events,%{info}", processor_chain([ +var part66 = match("MESSAGE#38502:SystemSettings:16", "nwparser.payload", "Intrusion Events,%{info}", processor_chain([ dup127, dup31, dup32, @@ -96313,8 +96144,7 @@ match("MESSAGE#38502:SystemSettings:16", "nwparser.payload", "Intrusion Events,% var msg38503 = msg("SystemSettings:16", part66); -var part67 = // "Pattern{Constant('Login, Login Failed'), Field(,false)}" -match("MESSAGE#38503:SystemSettings:17", "nwparser.payload", "Login, Login Failed%{}", processor_chain([ +var part67 = match("MESSAGE#38503:SystemSettings:17", "nwparser.payload", "Login, Login Failed%{}", processor_chain([ dup91, dup31, dup137, @@ -96331,8 +96161,7 @@ match("MESSAGE#38503:SystemSettings:17", "nwparser.payload", "Login, Login Faile var msg38504 = msg("SystemSettings:17", part67); -var part68 = // "Pattern{Constant('Command Line,'), Field(info,false)}" -match("MESSAGE#38504:SystemSettings:18", "nwparser.payload", "Command Line,%{info}", processor_chain([ +var part68 = match("MESSAGE#38504:SystemSettings:18", "nwparser.payload", "Command Line,%{info}", processor_chain([ dup127, dup31, dup32, @@ -96344,8 +96173,7 @@ match("MESSAGE#38504:SystemSettings:18", "nwparser.payload", "Command Line,%{inf var msg38505 = msg("SystemSettings:18", part68); -var part69 = // "Pattern{Constant('Access Control Policy > '), Field(info,false)}" -match("MESSAGE#38505:SystemSettings:19", "nwparser.payload", "Access Control Policy > %{info}", processor_chain([ +var part69 = match("MESSAGE#38505:SystemSettings:19", "nwparser.payload", "Access Control Policy > %{info}", processor_chain([ dup127, dup31, dup32, @@ -96357,8 +96185,7 @@ match("MESSAGE#38505:SystemSettings:19", "nwparser.payload", "Access Control Pol var msg38506 = msg("SystemSettings:19", part69); -var part70 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#38506:SystemSettings:20", "nwparser.payload", "info", processor_chain([ +var part70 = match_copy("MESSAGE#38506:SystemSettings:20", "nwparser.payload", "info", processor_chain([ dup127, dup31, dup32, @@ -96407,8 +96234,7 @@ var msg38513 = msg("2101867", dup192); var msg38514 = msg("2101918", dup192); -var part71 = // "Pattern{Field(url,false), Constant(', Interface Ingress: '), Field(dinterface,false), Constant(', Interface Egress: '), Field(sinterface,false), Constant(', Security Zone Ingress: '), Field(dst_zone,false), Constant(', Security Zone Egress: '), Field(src_zone,false), Constant(', Security Intelligence Matching IP: '), Field(fld4,false), Constant(', Security Intelligence Category: '), Field(fld5,false), Constant(', Client Version: '), Field(version,false), Constant(', Number of File Events: '), Field(dclass_counter1,false), Constant(', Number of IPS Events: '), Field(dclass_counter2,false), Constant(', TCP Flags: '), Field(fld6,false), Constant(', NetBIOS Domain: '), Field(domain_id,false), Constant(', Initiator Packets: '), Field(fld7,false), Constant(', Responder Packets: '), Field(fld8,false), Constant(', Initiator Bytes: '), Field(rbytes,false), Constant(', Responder Bytes: '), Field(sbytes,false), Constant(', Context: '), Field(context,false), Constant(', SSL Rule Name: '), Field(fld9,false), Constant(', SSL Flow Status: '), Field(fld10,false), Constant(', SSL Cipher Suite: '), Field(fld11,false), Constant(', SSL Certificate: '), Field(fld12,false), Constant(', SSL Subject CN: '), Field(fld13,false), Constant(', SSL Subject Country: '), Field(fld14,false), Constant(', SSL Subject OU: '), Field(fld15,false), Constant(', SSL Subject Org: '), Field(fld16,false), Constant(', SSL Issuer CN: '), Field(fld17,false), Constant(', SSL Issuer Country: '), Field(fld18,false), Constant(', SSL Issuer OU: '), Field(fld19,false), Constant(', SSL Issuer Org: '), Field(fld20,false), Constant(', SSL Valid Start Date: '), Field(fld21,false), Constant(', SSL Valid End Date: '), Field(fld22,false), Constant(', SSL Version: '), Field(fld23,false), Constant(', SSL Server Certificate Status: '), Field(fld24,false), Constant(', SSL Actual Action: '), Field(fld25,false), Constant(', SSL Expected Action: '), Field(fld26,false), Constant(', SSL Server Name: '), Field(fld27,false), Constant(', SSL URL Category: '), Field(fld28,false), Constant(', SSL Session ID: '), Field(fld29,false), Constant(', SSL Ticket Id: '), Field(fld30,false), Constant(', {'), Field(protocol,false), Constant('} '), Field(saddr,true), Constant(' -> '), Field(daddr,false), Constant(', type:'), Field(event_type,false), Constant(', code:'), Field(event_description,false)}" -match("MESSAGE#38514:Primary_Detection_Engine/2", "nwparser.p0", "%{url}, Interface Ingress: %{dinterface}, Interface Egress: %{sinterface}, Security Zone Ingress: %{dst_zone}, Security Zone Egress: %{src_zone}, Security Intelligence Matching IP: %{fld4}, Security Intelligence Category: %{fld5}, Client Version: %{version}, Number of File Events: %{dclass_counter1}, Number of IPS Events: %{dclass_counter2}, TCP Flags: %{fld6}, NetBIOS Domain: %{domain_id}, Initiator Packets: %{fld7}, Responder Packets: %{fld8}, Initiator Bytes: %{rbytes}, Responder Bytes: %{sbytes}, Context: %{context}, SSL Rule Name: %{fld9}, SSL Flow Status: %{fld10}, SSL Cipher Suite: %{fld11}, SSL Certificate: %{fld12}, SSL Subject CN: %{fld13}, SSL Subject Country: %{fld14}, SSL Subject OU: %{fld15}, SSL Subject Org: %{fld16}, SSL Issuer CN: %{fld17}, SSL Issuer Country: %{fld18}, SSL Issuer OU: %{fld19}, SSL Issuer Org: %{fld20}, SSL Valid Start Date: %{fld21}, SSL Valid End Date: %{fld22}, SSL Version: %{fld23}, SSL Server Certificate Status: %{fld24}, SSL Actual Action: %{fld25}, SSL Expected Action: %{fld26}, SSL Server Name: %{fld27}, SSL URL Category: %{fld28}, SSL Session ID: %{fld29}, SSL Ticket Id: %{fld30}, {%{protocol}} %{saddr->} -> %{daddr}, type:%{event_type}, code:%{event_description}"); +var part71 = match("MESSAGE#38514:Primary_Detection_Engine/2", "nwparser.p0", "%{url}, Interface Ingress: %{dinterface}, Interface Egress: %{sinterface}, Security Zone Ingress: %{dst_zone}, Security Zone Egress: %{src_zone}, Security Intelligence Matching IP: %{fld4}, Security Intelligence Category: %{fld5}, Client Version: %{version}, Number of File Events: %{dclass_counter1}, Number of IPS Events: %{dclass_counter2}, TCP Flags: %{fld6}, NetBIOS Domain: %{domain_id}, Initiator Packets: %{fld7}, Responder Packets: %{fld8}, Initiator Bytes: %{rbytes}, Responder Bytes: %{sbytes}, Context: %{context}, SSL Rule Name: %{fld9}, SSL Flow Status: %{fld10}, SSL Cipher Suite: %{fld11}, SSL Certificate: %{fld12}, SSL Subject CN: %{fld13}, SSL Subject Country: %{fld14}, SSL Subject OU: %{fld15}, SSL Subject Org: %{fld16}, SSL Issuer CN: %{fld17}, SSL Issuer Country: %{fld18}, SSL Issuer OU: %{fld19}, SSL Issuer Org: %{fld20}, SSL Valid Start Date: %{fld21}, SSL Valid End Date: %{fld22}, SSL Version: %{fld23}, SSL Server Certificate Status: %{fld24}, SSL Actual Action: %{fld25}, SSL Expected Action: %{fld26}, SSL Server Name: %{fld27}, SSL URL Category: %{fld28}, SSL Session ID: %{fld29}, SSL Ticket Id: %{fld30}, {%{protocol}} %{saddr->} -> %{daddr}, type:%{event_type}, code:%{event_description}"); var all75 = all_match({ processors: [ @@ -96428,8 +96254,7 @@ var all75 = all_match({ var msg38515 = msg("Primary_Detection_Engine", all75); -var part72 = // "Pattern{Field(url,false), Constant(', Interface Ingress: '), Field(dinterface,false), Constant(', Interface Egress: '), Field(sinterface,false), Constant(', Security Zone Ingress: '), Field(dst_zone,false), Constant(', Security Zone Egress: '), Field(src_zone,false), Constant(', Security Intelligence Matching IP: '), Field(fld4,false), Constant(', Security Intelligence Category: '), Field(fld5,false), Constant(', Client Version: '), Field(version,false), Constant(', Number of File Events: '), Field(dclass_counter1,false), Constant(', Number of IPS Events: '), Field(dclass_counter2,false), Constant(', TCP Flags: '), Field(fld6,false), Constant(', NetBIOS Domain: '), Field(domain_id,false), Constant(', Initiator Packets: '), Field(fld7,false), Constant(', Responder Packets: '), Field(fld8,false), Constant(', Initiator Bytes: '), Field(rbytes,false), Constant(', Responder Bytes: '), Field(sbytes,false), Constant(', Context: '), Field(context,false), Constant(', SSL Rule Name: '), Field(fld9,false), Constant(', SSL Flow Status: '), Field(fld10,false), Constant(', SSL Cipher Suite: '), Field(fld11,false), Constant(', SSL Certificate: '), Field(fld12,false), Constant(', SSL Subject CN: '), Field(fld13,false), Constant(', SSL Subject Country: '), Field(fld14,false), Constant(', SSL Subject OU: '), Field(fld15,false), Constant(', SSL Subject Org: '), Field(fld16,false), Constant(', SSL Issuer CN: '), Field(fld17,false), Constant(', SSL Issuer Country: '), Field(fld18,false), Constant(', SSL Issuer OU: '), Field(fld19,false), Constant(', SSL Issuer Org: '), Field(fld20,false), Constant(', SSL Valid Start Date: '), Field(fld21,false), Constant(', SSL Valid End Date: '), Field(fld22,false), Constant(', SSL Version: '), Field(fld23,false), Constant(', SSL Server Certificate Status: '), Field(fld24,false), Constant(', SSL Actual Action: '), Field(fld25,false), Constant(', SSL Expected Action: '), Field(fld26,false), Constant(', SSL Server Name: '), Field(fld27,false), Constant(', SSL URL Category: '), Field(fld28,false), Constant(', SSL Session ID: '), Field(fld29,false), Constant(', SSL Ticket Id: '), Field(fld30,false), Constant(', {'), Field(protocol,false), Constant('} '), Field(p0,false)}" -match("MESSAGE#38515:Primary_Detection_Engine:01/2", "nwparser.p0", "%{url}, Interface Ingress: %{dinterface}, Interface Egress: %{sinterface}, Security Zone Ingress: %{dst_zone}, Security Zone Egress: %{src_zone}, Security Intelligence Matching IP: %{fld4}, Security Intelligence Category: %{fld5}, Client Version: %{version}, Number of File Events: %{dclass_counter1}, Number of IPS Events: %{dclass_counter2}, TCP Flags: %{fld6}, NetBIOS Domain: %{domain_id}, Initiator Packets: %{fld7}, Responder Packets: %{fld8}, Initiator Bytes: %{rbytes}, Responder Bytes: %{sbytes}, Context: %{context}, SSL Rule Name: %{fld9}, SSL Flow Status: %{fld10}, SSL Cipher Suite: %{fld11}, SSL Certificate: %{fld12}, SSL Subject CN: %{fld13}, SSL Subject Country: %{fld14}, SSL Subject OU: %{fld15}, SSL Subject Org: %{fld16}, SSL Issuer CN: %{fld17}, SSL Issuer Country: %{fld18}, SSL Issuer OU: %{fld19}, SSL Issuer Org: %{fld20}, SSL Valid Start Date: %{fld21}, SSL Valid End Date: %{fld22}, SSL Version: %{fld23}, SSL Server Certificate Status: %{fld24}, SSL Actual Action: %{fld25}, SSL Expected Action: %{fld26}, SSL Server Name: %{fld27}, SSL URL Category: %{fld28}, SSL Session ID: %{fld29}, SSL Ticket Id: %{fld30}, {%{protocol}} %{p0}"); +var part72 = match("MESSAGE#38515:Primary_Detection_Engine:01/2", "nwparser.p0", "%{url}, Interface Ingress: %{dinterface}, Interface Egress: %{sinterface}, Security Zone Ingress: %{dst_zone}, Security Zone Egress: %{src_zone}, Security Intelligence Matching IP: %{fld4}, Security Intelligence Category: %{fld5}, Client Version: %{version}, Number of File Events: %{dclass_counter1}, Number of IPS Events: %{dclass_counter2}, TCP Flags: %{fld6}, NetBIOS Domain: %{domain_id}, Initiator Packets: %{fld7}, Responder Packets: %{fld8}, Initiator Bytes: %{rbytes}, Responder Bytes: %{sbytes}, Context: %{context}, SSL Rule Name: %{fld9}, SSL Flow Status: %{fld10}, SSL Cipher Suite: %{fld11}, SSL Certificate: %{fld12}, SSL Subject CN: %{fld13}, SSL Subject Country: %{fld14}, SSL Subject OU: %{fld15}, SSL Subject Org: %{fld16}, SSL Issuer CN: %{fld17}, SSL Issuer Country: %{fld18}, SSL Issuer OU: %{fld19}, SSL Issuer Org: %{fld20}, SSL Valid Start Date: %{fld21}, SSL Valid End Date: %{fld22}, SSL Version: %{fld23}, SSL Server Certificate Status: %{fld24}, SSL Actual Action: %{fld25}, SSL Expected Action: %{fld26}, SSL Server Name: %{fld27}, SSL URL Category: %{fld28}, SSL Session ID: %{fld29}, SSL Ticket Id: %{fld30}, {%{protocol}} %{p0}"); var all76 = all_match({ processors: [ @@ -96451,14 +96276,11 @@ var all76 = all_match({ var msg38516 = msg("Primary_Detection_Engine:01", all76); -var part73 = // "Pattern{Field(url,false), Constant(', Interface Ingress: '), Field(dinterface,false), Constant(', Interface Egress: '), Field(sinterface,false), Constant(', Security Zone Ingress: '), Field(dst_zone,false), Constant(', Security Zone Egress: '), Field(src_zone,false), Constant(', Security Intelligence Matching IP: '), Field(fld4,false), Constant(', Security Intelligence Category: '), Field(fld5,false), Constant(', Client Version: '), Field(version,false), Constant(', Number of File Events: '), Field(dclass_counter1,false), Constant(', Number of IPS Events: '), Field(dclass_counter2,false), Constant(', TCP Flags: '), Field(fld6,false), Constant(', NetBIOS Domain: '), Field(domain_id,false), Constant(', Initiator Packets: '), Field(fld7,false), Constant(', Responder Packets: '), Field(fld8,false), Constant(', Initiator Bytes: '), Field(rbytes,false), Constant(', Responder Bytes: '), Field(p0,false)}" -match("MESSAGE#38516:Primary_Detection_Engine:02/2", "nwparser.p0", "%{url}, Interface Ingress: %{dinterface}, Interface Egress: %{sinterface}, Security Zone Ingress: %{dst_zone}, Security Zone Egress: %{src_zone}, Security Intelligence Matching IP: %{fld4}, Security Intelligence Category: %{fld5}, Client Version: %{version}, Number of File Events: %{dclass_counter1}, Number of IPS Events: %{dclass_counter2}, TCP Flags: %{fld6}, NetBIOS Domain: %{domain_id}, Initiator Packets: %{fld7}, Responder Packets: %{fld8}, Initiator Bytes: %{rbytes}, Responder Bytes: %{p0}"); +var part73 = match("MESSAGE#38516:Primary_Detection_Engine:02/2", "nwparser.p0", "%{url}, Interface Ingress: %{dinterface}, Interface Egress: %{sinterface}, Security Zone Ingress: %{dst_zone}, Security Zone Egress: %{src_zone}, Security Intelligence Matching IP: %{fld4}, Security Intelligence Category: %{fld5}, Client Version: %{version}, Number of File Events: %{dclass_counter1}, Number of IPS Events: %{dclass_counter2}, TCP Flags: %{fld6}, NetBIOS Domain: %{domain_id}, Initiator Packets: %{fld7}, Responder Packets: %{fld8}, Initiator Bytes: %{rbytes}, Responder Bytes: %{p0}"); -var part74 = // "Pattern{Field(sbytes,false), Constant(', Context: '), Field(context,true), Constant(' {'), Field(p0,false)}" -match("MESSAGE#38516:Primary_Detection_Engine:02/3_0", "nwparser.p0", "%{sbytes}, Context: %{context->} {%{p0}"); +var part74 = match("MESSAGE#38516:Primary_Detection_Engine:02/3_0", "nwparser.p0", "%{sbytes}, Context: %{context->} {%{p0}"); -var part75 = // "Pattern{Field(sbytes,true), Constant(' {'), Field(p0,false)}" -match("MESSAGE#38516:Primary_Detection_Engine:02/3_1", "nwparser.p0", "%{sbytes->} {%{p0}"); +var part75 = match("MESSAGE#38516:Primary_Detection_Engine:02/3_1", "nwparser.p0", "%{sbytes->} {%{p0}"); var select2456 = linear_select([ part74, @@ -96487,8 +96309,7 @@ var all77 = all_match({ var msg38517 = msg("Primary_Detection_Engine:02", all77); -var part76 = // "Pattern{Constant('"'), Field(context,false), Constant('" [Classification:'), Field(sigtype,false), Constant('] User:'), Field(username,false), Constant(', Application:'), Field(application,false), Constant(', Client:'), Field(fld12,false), Constant(', App Protocol:'), Field(fld14,false), Constant(', Interface Ingress:'), Field(dinterface,false), Constant(', Interface Egress:'), Field(sinterface,false), Constant(', Security Zone Ingress:'), Field(dst_zone,false), Constant(', Security Zone Egress:'), Field(src_zone,false), Constant(', Context:'), Field(fld13,false), Constant(', SSL Flow Status:'), Field(fld1,false), Constant(', SSL Actual Action:'), Field(fld22,false), Constant(', SSL Certificate:'), Field(fld3,false), Constant(', SSL Subject CN:'), Field(fld4,false), Constant(', SSL Subject Country:'), Field(fld5,false), Constant(', SSL Subject OU:'), Field(fld6,false), Constant(', SSL Subject Org:'), Field(fld7,false), Constant(', SSL Issuer CN:'), Field(fld8,false), Constant(', SSL Issuer Country:'), Field(fld9,false), Constant(', SSL Issuer OU:'), Field(fld10,false), Constant(', SSL Issuer Org:'), Field(fld11,false), Constant(', SSL Valid Start Date:'), Field(fld12,false), Constant(', SSL Valid End Date:'), Field(fld13,false), Constant(', [Priority:'), Field(threat_val,false), Constant('] {'), Field(protocol,false), Constant('}'), Field(saddr,false), Constant(':'), Field(sport,false), Constant('->'), Field(daddr,false), Constant(':'), Field(dport,false)}" -match("MESSAGE#38517:Primary_Detection_Engine:03", "nwparser.payload", "\"%{context}\" [Classification:%{sigtype}] User:%{username}, Application:%{application}, Client:%{fld12}, App Protocol:%{fld14}, Interface Ingress:%{dinterface}, Interface Egress:%{sinterface}, Security Zone Ingress:%{dst_zone}, Security Zone Egress:%{src_zone}, Context:%{fld13}, SSL Flow Status:%{fld1}, SSL Actual Action:%{fld22}, SSL Certificate:%{fld3}, SSL Subject CN:%{fld4}, SSL Subject Country:%{fld5}, SSL Subject OU:%{fld6}, SSL Subject Org:%{fld7}, SSL Issuer CN:%{fld8}, SSL Issuer Country:%{fld9}, SSL Issuer OU:%{fld10}, SSL Issuer Org:%{fld11}, SSL Valid Start Date:%{fld12}, SSL Valid End Date:%{fld13}, [Priority:%{threat_val}] {%{protocol}}%{saddr}:%{sport}->%{daddr}:%{dport}", processor_chain([ +var part76 = match("MESSAGE#38517:Primary_Detection_Engine:03", "nwparser.payload", "\"%{context}\" [Classification:%{sigtype}] User:%{username}, Application:%{application}, Client:%{fld12}, App Protocol:%{fld14}, Interface Ingress:%{dinterface}, Interface Egress:%{sinterface}, Security Zone Ingress:%{dst_zone}, Security Zone Egress:%{src_zone}, Context:%{fld13}, SSL Flow Status:%{fld1}, SSL Actual Action:%{fld22}, SSL Certificate:%{fld3}, SSL Subject CN:%{fld4}, SSL Subject Country:%{fld5}, SSL Subject OU:%{fld6}, SSL Subject Org:%{fld7}, SSL Issuer CN:%{fld8}, SSL Issuer Country:%{fld9}, SSL Issuer OU:%{fld10}, SSL Issuer Org:%{fld11}, SSL Valid Start Date:%{fld12}, SSL Valid End Date:%{fld13}, [Priority:%{threat_val}] {%{protocol}}%{saddr}:%{sport}->%{daddr}:%{dport}", processor_chain([ dup44, dup31, dup32, @@ -96507,8 +96328,7 @@ var select2457 = linear_select([ msg38518, ]); -var part77 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC > Sha256: '), Field(checksum,true), Constant(' Disposition: '), Field(disposition,true), Constant(' Threat name: '), Field(threat_name,true), Constant(' IP Addresses: '), Field(saddr,false), Constant('>'), Field(daddr,false)}" -match("MESSAGE#38518:Network_Based_Malware", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC > Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{saddr}>%{daddr}", processor_chain([ +var part77 = match("MESSAGE#38518:Network_Based_Malware", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC > Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{saddr}>%{daddr}", processor_chain([ dup100, dup31, dup129, @@ -96518,19 +96338,16 @@ match("MESSAGE#38518:Network_Based_Malware", "nwparser.payload", "%{context->} F var msg38519 = msg("Network_Based_Malware", part77); -var part78 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -'), Field(p0,false)}" -match("MESSAGE#38519:Network_Based_Malware:01/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -%{p0}"); +var part78 = match("MESSAGE#38519:Network_Based_Malware:01/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -%{p0}"); -var part79 = // "Pattern{Constant('*>'), Field(p0,false)}" -match("MESSAGE#38519:Network_Based_Malware:01/1_0", "nwparser.p0", "*>%{p0}"); +var part79 = match("MESSAGE#38519:Network_Based_Malware:01/1_0", "nwparser.p0", "*>%{p0}"); var select2458 = linear_select([ part79, dup145, ]); -var part80 = // "Pattern{Field(,true), Constant(' '), Field(space,false), Constant('Sha256: '), Field(checksum,true), Constant(' Disposition: '), Field(disposition,true), Constant(' Threat name: '), Field(threat_name,true), Constant(' IP Addresses: '), Field(daddr,false), Constant('<<-'), Field(saddr,false)}" -match("MESSAGE#38519:Network_Based_Malware:01/2", "nwparser.p0", "%{} %{space}Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{daddr}\u003c\u003c-%{saddr}"); +var part80 = match("MESSAGE#38519:Network_Based_Malware:01/2", "nwparser.p0", "%{} %{space}Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{daddr}\u003c\u003c-%{saddr}"); var all78 = all_match({ processors: [ @@ -96549,8 +96366,7 @@ var all78 = all_match({ var msg38520 = msg("Network_Based_Malware:01", all78); -var part81 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> Sha256: '), Field(checksum,true), Constant(' Disposition: '), Field(disposition,true), Constant(' Threat name: '), Field(threat_name,true), Constant(' IP Addresses: '), Field(saddr,false), Constant('->'), Field(daddr,false)}" -match("MESSAGE#38520:Network_Based_Malware:02", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{saddr}->%{daddr}", processor_chain([ +var part81 = match("MESSAGE#38520:Network_Based_Malware:02", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{saddr}->%{daddr}", processor_chain([ dup100, dup31, dup129, @@ -96566,17 +96382,13 @@ var select2459 = linear_select([ msg38521, ]); -var part82 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC '), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC %{p0}"); +var part82 = match("MESSAGE#38521:Network_Based_Retrospective/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC %{p0}"); -var part83 = // "Pattern{Constant('Sha256: '), Field(checksum,true), Constant(' Disposition: '), Field(disposition,true), Constant(' Threat name: '), Field(threat_name,true), Constant(' IP Addresses: '), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/2", "nwparser.p0", "Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{p0}"); +var part83 = match("MESSAGE#38521:Network_Based_Retrospective/2", "nwparser.p0", "Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{p0}"); -var part84 = // "Pattern{Field(saddr,false), Constant('->'), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/3_0", "nwparser.p0", "%{saddr}->%{p0}"); +var part84 = match("MESSAGE#38521:Network_Based_Retrospective/3_0", "nwparser.p0", "%{saddr}->%{p0}"); -var part85 = // "Pattern{Field(saddr,false), Constant('>'), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/3_1", "nwparser.p0", "%{saddr}>%{p0}"); +var part85 = match("MESSAGE#38521:Network_Based_Retrospective/3_1", "nwparser.p0", "%{saddr}>%{p0}"); var select2460 = linear_select([ part84, @@ -96602,14 +96414,11 @@ var all79 = all_match({ var msg38522 = msg("Network_Based_Retrospective", all79); -var part86 = // "Pattern{Constant('Sha256: '), Field(checksum,true), Constant(' Disposition: '), Field(disposition,true), Constant(' Threat name: '), Field(p0,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/4", "nwparser.p0", "Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{p0}"); +var part86 = match("MESSAGE#38522:Network_Based_Retrospective:01/4", "nwparser.p0", "Sha256: %{checksum->} Disposition: %{disposition->} Threat name: %{p0}"); -var part87 = // "Pattern{Field(threat_name,true), Constant(' IP Addresses: '), Field(daddr,false), Constant('<<-'), Field(saddr,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/5_0", "nwparser.p0", "%{threat_name->} IP Addresses: %{daddr}\u003c\u003c-%{saddr}"); +var part87 = match("MESSAGE#38522:Network_Based_Retrospective:01/5_0", "nwparser.p0", "%{threat_name->} IP Addresses: %{daddr}\u003c\u003c-%{saddr}"); -var part88 = // "Pattern{Field(threat_name,false)}" -match_copy("MESSAGE#38522:Network_Based_Retrospective:01/5_1", "nwparser.p0", "threat_name"); +var part88 = match_copy("MESSAGE#38522:Network_Based_Retrospective:01/5_1", "nwparser.p0", "threat_name"); var select2461 = linear_select([ part87, @@ -96641,8 +96450,7 @@ var select2462 = linear_select([ msg38523, ]); -var part89 = // "Pattern{Field(checksum,true), Constant(' Disposition: '), Field(disposition,true), Constant(' Threat name: '), Field(threat_name,true), Constant(' IP Addresses: '), Field(daddr,false), Constant('<<-'), Field(saddr,false)}" -match("MESSAGE#38523:MALWARE:02", "nwparser.payload", "%{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{daddr}\u003c\u003c-%{saddr}", processor_chain([ +var part89 = match("MESSAGE#38523:MALWARE:02", "nwparser.payload", "%{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{daddr}\u003c\u003c-%{saddr}", processor_chain([ dup100, dup32, dup47, @@ -96651,8 +96459,7 @@ match("MESSAGE#38523:MALWARE:02", "nwparser.payload", "%{checksum->} Disposition var msg38524 = msg("MALWARE:02", part89); -var part90 = // "Pattern{Field(checksum,true), Constant(' Disposition: '), Field(disposition,true), Constant(' Threat name: '), Field(threat_name,true), Constant(' IP Addresses: '), Field(saddr,false), Constant('->'), Field(daddr,false)}" -match("MESSAGE#38524:MALWARE:01", "nwparser.payload", "%{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{saddr}->%{daddr}", processor_chain([ +var part90 = match("MESSAGE#38524:MALWARE:01", "nwparser.payload", "%{checksum->} Disposition: %{disposition->} Threat name: %{threat_name->} IP Addresses: %{saddr}->%{daddr}", processor_chain([ dup100, dup32, dup47, @@ -96661,8 +96468,7 @@ match("MESSAGE#38524:MALWARE:01", "nwparser.payload", "%{checksum->} Disposition var msg38525 = msg("MALWARE:01", part90); -var part91 = // "Pattern{Field(threat_val,false)}" -match_copy("MESSAGE#38537:MALWARE", "nwparser.payload", "threat_val", processor_chain([ +var part91 = match_copy("MESSAGE#38537:MALWARE", "nwparser.payload", "threat_val", processor_chain([ dup71, dup31, dup45, @@ -96704,14 +96510,11 @@ var all81 = all_match({ var msg38527 = msg("Snort_AlertLog", all81); -var part92 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Port: '), Field(p0,false)}" -match("MESSAGE#38526:New_TCP_Port/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{p0}"); +var part92 = match("MESSAGE#38526:New_TCP_Port/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{p0}"); -var part93 = // "Pattern{Field(sport,true), Constant(' Service: '), Field(protocol,true), Constant(' Confidence: '), Field(result,false)}" -match("MESSAGE#38526:New_TCP_Port/5_0", "nwparser.p0", "%{sport->} Service: %{protocol->} Confidence: %{result}"); +var part93 = match("MESSAGE#38526:New_TCP_Port/5_0", "nwparser.p0", "%{sport->} Service: %{protocol->} Confidence: %{result}"); -var part94 = // "Pattern{Field(sport,false)}" -match_copy("MESSAGE#38526:New_TCP_Port/5_1", "nwparser.p0", "sport"); +var part94 = match_copy("MESSAGE#38526:New_TCP_Port/5_1", "nwparser.p0", "sport"); var select2464 = linear_select([ part93, @@ -96737,8 +96540,7 @@ var all82 = all_match({ var msg38528 = msg("New_TCP_Port", all82); -var part95 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,false)}" -match("MESSAGE#38527:New_UDP_Port/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{sport}"); +var part95 = match("MESSAGE#38527:New_UDP_Port/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{sport}"); var all83 = all_match({ processors: [ @@ -96766,8 +96568,7 @@ var msg38532 = msg("UDP_Server_Information_Update", dup356); var msg38533 = msg("TCP_Server_Information_Update", dup356); -var part96 = // "Pattern{Constant('From '), Field(sensor,true), Constant(' at '), Field(p0,false)}" -match("MESSAGE#38532:Client_Timeout/1_1", "nwparser.p0", "From %{sensor->} at %{p0}"); +var part96 = match("MESSAGE#38532:Client_Timeout/1_1", "nwparser.p0", "From %{sensor->} at %{p0}"); var select2465 = linear_select([ dup155, @@ -96793,8 +96594,7 @@ var all84 = all_match({ var msg38534 = msg("Client_Timeout", all84); -var part97 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Category: '), Field(category,true), Constant(' Event Type: '), Field(event_type,false)}" -match("MESSAGE#38533:Host_IOC_Set/4", "nwparser.p0", "IP Address: %{saddr->} Category: %{category->} Event Type: %{event_type}"); +var part97 = match("MESSAGE#38533:Host_IOC_Set/4", "nwparser.p0", "IP Address: %{saddr->} Category: %{category->} Event Type: %{event_type}"); var all85 = all_match({ processors: [ @@ -96814,8 +96614,7 @@ var all85 = all_match({ var msg38535 = msg("Host_IOC_Set", all85); -var part98 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Host Type: '), Field(fld10,false)}" -match("MESSAGE#38534:Host_Type_Changed/4", "nwparser.p0", "IP Address: %{saddr->} Host Type: %{fld10}"); +var part98 = match("MESSAGE#38534:Host_Type_Changed/4", "nwparser.p0", "IP Address: %{saddr->} Host Type: %{fld10}"); var all86 = all_match({ processors: [ @@ -96835,8 +96634,7 @@ var all86 = all_match({ var msg38536 = msg("Host_Type_Changed", all86); -var part99 = // "Pattern{Constant('Login Success'), Field(,false)}" -match("MESSAGE#38535:Login", "nwparser.payload", "Login Success%{}", processor_chain([ +var part99 = match("MESSAGE#38535:Login", "nwparser.payload", "Login Success%{}", processor_chain([ dup112, dup31, dup32, @@ -96849,8 +96647,7 @@ match("MESSAGE#38535:Login", "nwparser.payload", "Login Success%{}", processor_c var msg38537 = msg("Login", part99); -var part100 = // "Pattern{Constant('Logout Success'), Field(,false)}" -match("MESSAGE#38536:Logout", "nwparser.payload", "Logout Success%{}", processor_chain([ +var part100 = match("MESSAGE#38536:Logout", "nwparser.payload", "Logout Success%{}", processor_chain([ setc("eventcategory","1401070000"), dup31, dup32, @@ -96957,8 +96754,7 @@ var part101 = tagval("MESSAGE#38538:connection_events", "nwparser.payload", tvm, var msg38539 = msg("connection_events", part101); -var part102 = // "Pattern{Constant('SrcIP: '), Field(daddr,false), Constant(', DstIP: '), Field(saddr,false), Constant(', SrcPort: '), Field(dport,false), Constant(', DstPort: '), Field(sport,false), Constant(', Protocol: '), Field(protocol,false), Constant(', FileDirection: Download, FileAction: '), Field(action,false), Constant(', FileSHA256: '), Field(checksum,false), Constant(', SHA_Disposition: '), Field(disposition,false), Constant(', SperoDisposition: '), Field(info,false), Constant(', ThreatName: '), Field(threat_name,false), Constant(', ThreatScore: '), Field(fld1,false), Constant(', FileName: '), Field(filename,false), Constant(', FileType: '), Field(filetype,false), Constant(', FileSize: '), Field(filename_size,false), Constant(', ApplicationProtocol: '), Field(protocol,false), Constant(', Client: '), Field(application,false), Constant(', User: '), Field(username,false), Constant(', FirstPacketSecond: '), Field(fld21,false), Constant(', FilePolicy: '), Field(policyname,false), Constant(', FileSandboxStatus: '), Field(result,false), Constant(', URI: '), Field(url,false)}" -match("MESSAGE#38539:FTD_events_01", "nwparser.payload", "SrcIP: %{daddr}, DstIP: %{saddr}, SrcPort: %{dport}, DstPort: %{sport}, Protocol: %{protocol}, FileDirection: Download, FileAction: %{action}, FileSHA256: %{checksum}, SHA_Disposition: %{disposition}, SperoDisposition: %{info}, ThreatName: %{threat_name}, ThreatScore: %{fld1}, FileName: %{filename}, FileType: %{filetype}, FileSize: %{filename_size}, ApplicationProtocol: %{protocol}, Client: %{application}, User: %{username}, FirstPacketSecond: %{fld21}, FilePolicy: %{policyname}, FileSandboxStatus: %{result}, URI: %{url}", processor_chain([ +var part102 = match("MESSAGE#38539:FTD_events_01", "nwparser.payload", "SrcIP: %{daddr}, DstIP: %{saddr}, SrcPort: %{dport}, DstPort: %{sport}, Protocol: %{protocol}, FileDirection: Download, FileAction: %{action}, FileSHA256: %{checksum}, SHA_Disposition: %{disposition}, SperoDisposition: %{info}, ThreatName: %{threat_name}, ThreatScore: %{fld1}, FileName: %{filename}, FileType: %{filetype}, FileSize: %{filename_size}, ApplicationProtocol: %{protocol}, Client: %{application}, User: %{username}, FirstPacketSecond: %{fld21}, FilePolicy: %{policyname}, FileSandboxStatus: %{result}, URI: %{url}", processor_chain([ dup150, dup161, dup162, @@ -96970,8 +96766,7 @@ match("MESSAGE#38539:FTD_events_01", "nwparser.payload", "SrcIP: %{daddr}, DstIP var msg38540 = msg("FTD_events_01", part102); -var part103 = // "Pattern{Constant('SrcIP: '), Field(saddr,false), Constant(', DstIP: '), Field(daddr,false), Constant(', SrcPort: '), Field(sport,false), Constant(', DstPort: '), Field(dport,false), Constant(', Protocol: '), Field(protocol,false), Constant(', FileDirection: Upload, FileAction: '), Field(action,false), Constant(', FileSHA256: '), Field(checksum,false), Constant(', SHA_Disposition: '), Field(disposition,false), Constant(', SperoDisposition: '), Field(info,false), Constant(', ThreatName: '), Field(threat_name,false), Constant(', ThreatScore: '), Field(fld1,false), Constant(', FileName: '), Field(filename,false), Constant(', FileType: '), Field(filetype,false), Constant(', FileSize: '), Field(filename_size,false), Constant(', ApplicationProtocol: '), Field(protocol,false), Constant(', Client: '), Field(application,false), Constant(', User: '), Field(username,false), Constant(', FirstPacketSecond: '), Field(fld21,false), Constant(', FilePolicy: '), Field(policyname,false), Constant(', FileSandboxStatus: '), Field(result,false), Constant(', URI: '), Field(url,false)}" -match("MESSAGE#38540:FTD_events_02", "nwparser.payload", "SrcIP: %{saddr}, DstIP: %{daddr}, SrcPort: %{sport}, DstPort: %{dport}, Protocol: %{protocol}, FileDirection: Upload, FileAction: %{action}, FileSHA256: %{checksum}, SHA_Disposition: %{disposition}, SperoDisposition: %{info}, ThreatName: %{threat_name}, ThreatScore: %{fld1}, FileName: %{filename}, FileType: %{filetype}, FileSize: %{filename_size}, ApplicationProtocol: %{protocol}, Client: %{application}, User: %{username}, FirstPacketSecond: %{fld21}, FilePolicy: %{policyname}, FileSandboxStatus: %{result}, URI: %{url}", processor_chain([ +var part103 = match("MESSAGE#38540:FTD_events_02", "nwparser.payload", "SrcIP: %{saddr}, DstIP: %{daddr}, SrcPort: %{sport}, DstPort: %{dport}, Protocol: %{protocol}, FileDirection: Upload, FileAction: %{action}, FileSHA256: %{checksum}, SHA_Disposition: %{disposition}, SperoDisposition: %{info}, ThreatName: %{threat_name}, ThreatScore: %{fld1}, FileName: %{filename}, FileType: %{filetype}, FileSize: %{filename_size}, ApplicationProtocol: %{protocol}, Client: %{application}, User: %{username}, FirstPacketSecond: %{fld21}, FilePolicy: %{policyname}, FileSandboxStatus: %{result}, URI: %{url}", processor_chain([ dup150, dup161, dup162, @@ -96983,8 +96778,7 @@ match("MESSAGE#38540:FTD_events_02", "nwparser.payload", "SrcIP: %{saddr}, DstIP var msg38541 = msg("FTD_events_02", part103); -var part104 = // "Pattern{Constant('User ''), Field(username,false), Constant('' executed the ''), Field(fld1,false), Constant('' command.')}" -match("MESSAGE#38541:FTD_events_03", "nwparser.payload", "User '%{username}' executed the '%{fld1}' command.", processor_chain([ +var part104 = match("MESSAGE#38541:FTD_events_03", "nwparser.payload", "User '%{username}' executed the '%{fld1}' command.", processor_chain([ dup150, dup162, dup32, @@ -96993,8 +96787,7 @@ match("MESSAGE#38541:FTD_events_03", "nwparser.payload", "User '%{username}' exe var msg38542 = msg("FTD_events_03", part104); -var part105 = // "Pattern{Constant('User ''), Field(username,false), Constant('', running ''), Field(application,false), Constant('' from IP'), Field(hostip,false), Constant(', executed ''), Field(fld1,false), Constant(''')}" -match("MESSAGE#38542:FTD_events_04", "nwparser.payload", "User '%{username}', running '%{application}' from IP%{hostip}, executed '%{fld1}'", processor_chain([ +var part105 = match("MESSAGE#38542:FTD_events_04", "nwparser.payload", "User '%{username}', running '%{application}' from IP%{hostip}, executed '%{fld1}'", processor_chain([ dup150, dup162, dup32, @@ -97003,8 +96796,7 @@ match("MESSAGE#38542:FTD_events_04", "nwparser.payload", "User '%{username}', ru var msg38543 = msg("FTD_events_04", part105); -var part106 = // "Pattern{Field(dclass_counter1,false), Constant('in use,'), Field(fld2,false), Constant('most used')}" -match("MESSAGE#38543:FTD_events_05", "nwparser.payload", "%{dclass_counter1}in use,%{fld2}most used", processor_chain([ +var part106 = match("MESSAGE#38543:FTD_events_05", "nwparser.payload", "%{dclass_counter1}in use,%{fld2}most used", processor_chain([ dup150, dup162, dup32, @@ -97014,8 +96806,7 @@ match("MESSAGE#38543:FTD_events_05", "nwparser.payload", "%{dclass_counter1}in u var msg38544 = msg("FTD_events_05", part106); -var part107 = // "Pattern{Constant('Offloaded TCP Flow for connection'), Field(connectionid,false), Constant('from'), Field(dinterface,false), Constant(':'), Field(daddr,false), Constant('/'), Field(dport,false), Constant('('), Field(dtransaddr,false), Constant('/'), Field(dtransport,false), Constant(') to'), Field(sinterface,false), Constant(':'), Field(saddr,false), Constant('/'), Field(sport,false), Constant('('), Field(stransaddr,false), Constant('/'), Field(stransport,false), Constant(')')}" -match("MESSAGE#38544:FTD_events_06", "nwparser.payload", "Offloaded TCP Flow for connection%{connectionid}from%{dinterface}:%{daddr}/%{dport}(%{dtransaddr}/%{dtransport}) to%{sinterface}:%{saddr}/%{sport}(%{stransaddr}/%{stransport})", processor_chain([ +var part107 = match("MESSAGE#38544:FTD_events_06", "nwparser.payload", "Offloaded TCP Flow for connection%{connectionid}from%{dinterface}:%{daddr}/%{dport}(%{dtransaddr}/%{dtransport}) to%{sinterface}:%{saddr}/%{sport}(%{stransaddr}/%{stransport})", processor_chain([ dup150, dup162, dup32, @@ -97025,8 +96816,7 @@ match("MESSAGE#38544:FTD_events_06", "nwparser.payload", "Offloaded TCP Flow for var msg38545 = msg("FTD_events_06", part107); -var part108 = // "Pattern{Constant('Failed to locate egress interface for '), Field(protocol,true), Constant(' from '), Field(sinterface,false), Constant(':'), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' to '), Field(daddr,false), Constant('/'), Field(dport,false)}" -match("MESSAGE#38545:FTD_events_07", "nwparser.payload", "Failed to locate egress interface for %{protocol->} from %{sinterface}:%{saddr}/%{sport->} to %{daddr}/%{dport}", processor_chain([ +var part108 = match("MESSAGE#38545:FTD_events_07", "nwparser.payload", "Failed to locate egress interface for %{protocol->} from %{sinterface}:%{saddr}/%{sport->} to %{daddr}/%{dport}", processor_chain([ setc("eventcategory","1801010000"), dup162, dup32, @@ -97036,8 +96826,7 @@ match("MESSAGE#38545:FTD_events_07", "nwparser.payload", "Failed to locate egres var msg38546 = msg("FTD_events_07", part108); -var part109 = // "Pattern{Constant('TCP Flow is no longer offloaded for connection '), Field(connectionid,true), Constant(' from '), Field(dinterface,false), Constant(':'), Field(daddr,false), Constant('/'), Field(dport,true), Constant(' ('), Field(dtransaddr,false), Constant('/'), Field(dtransport,false), Constant(') to '), Field(sinterface,false), Constant(':'), Field(saddr,false), Constant('/'), Field(sport,true), Constant(' ('), Field(stransaddr,false), Constant('/'), Field(stransport,false), Constant(')')}" -match("MESSAGE#38546:FTD_events_08", "nwparser.payload", "TCP Flow is no longer offloaded for connection %{connectionid->} from %{dinterface}:%{daddr}/%{dport->} (%{dtransaddr}/%{dtransport}) to %{sinterface}:%{saddr}/%{sport->} (%{stransaddr}/%{stransport})", processor_chain([ +var part109 = match("MESSAGE#38546:FTD_events_08", "nwparser.payload", "TCP Flow is no longer offloaded for connection %{connectionid->} from %{dinterface}:%{daddr}/%{dport->} (%{dtransaddr}/%{dtransport}) to %{sinterface}:%{saddr}/%{sport->} (%{stransaddr}/%{stransport})", processor_chain([ dup150, dup162, dup32, @@ -97047,8 +96836,7 @@ match("MESSAGE#38546:FTD_events_08", "nwparser.payload", "TCP Flow is no longer var msg38547 = msg("FTD_events_08", part109); -var part110 = // "Pattern{Constant('CLOCK: System clock set, source: '), Field(event_source,false), Constant(', IP: '), Field(hostip,false), Constant(', before: '), Field(change_old,false), Constant(', after: '), Field(change_new,false)}" -match("MESSAGE#38547:FTD_events_09", "nwparser.payload", "CLOCK: System clock set, source: %{event_source}, IP: %{hostip}, before: %{change_old}, after: %{change_new}", processor_chain([ +var part110 = match("MESSAGE#38547:FTD_events_09", "nwparser.payload", "CLOCK: System clock set, source: %{event_source}, IP: %{hostip}, before: %{change_old}, after: %{change_new}", processor_chain([ dup150, dup162, dup32, @@ -97148,19 +96936,16 @@ var select2466 = linear_select([ msg38549, ]); -var part112 = // "Pattern{Constant('AccessControlRuleAction:'), Field(action,false), Constant(', AccessControlRuleReason:'), Field(result,false), Constant(', SrcIP:'), Field(saddr,false), Constant(', DstIP:'), Field(daddr,false), Constant(', SrcPort:'), Field(sport,false), Constant(', DstPort:'), Field(dport,false), Constant(', Protocol: '), Field(protocol,false), Constant(', IngressInterface: '), Field(dinterface,false), Constant(', IngressZone:'), Field(dst_zone,false), Constant(', ACPolicy:'), Field(fld44,false), Constant(', AccessControlRuleName:'), Field(rulename,false), Constant(', Prefilter Policy:'), Field(fld2,false), Constant(', User:'), Field(fld48,false), Constant(', Client:'), Field(application,false), Constant(', ApplicationProtocol:'), Field(protocol,false), Constant(', InitiatorPackets:'), Field(fld14,false), Constant(', ResponderPackets:'), Field(fld13,false), Constant(', InitiatorBytes:'), Field(sbytes,false), Constant(', ResponderBytes:'), Field(rbytes,false), Constant(', NAPPolicy:'), Field(policyname,false), Constant(', DNSQuery:'), Field(hostname,false), Constant(', DNSRecordType: a host address,'), Field(p0,false)}" -match("MESSAGE#38549:NGIPS_events_01/0", "nwparser.payload", "AccessControlRuleAction:%{action}, AccessControlRuleReason:%{result}, SrcIP:%{saddr}, DstIP:%{daddr}, SrcPort:%{sport}, DstPort:%{dport}, Protocol: %{protocol}, IngressInterface: %{dinterface}, IngressZone:%{dst_zone}, ACPolicy:%{fld44}, AccessControlRuleName:%{rulename}, Prefilter Policy:%{fld2}, User:%{fld48}, Client:%{application}, ApplicationProtocol:%{protocol}, InitiatorPackets:%{fld14}, ResponderPackets:%{fld13}, InitiatorBytes:%{sbytes}, ResponderBytes:%{rbytes}, NAPPolicy:%{policyname}, DNSQuery:%{hostname}, DNSRecordType: a host address,%{p0}"); +var part112 = match("MESSAGE#38549:NGIPS_events_01/0", "nwparser.payload", "AccessControlRuleAction:%{action}, AccessControlRuleReason:%{result}, SrcIP:%{saddr}, DstIP:%{daddr}, SrcPort:%{sport}, DstPort:%{dport}, Protocol: %{protocol}, IngressInterface: %{dinterface}, IngressZone:%{dst_zone}, ACPolicy:%{fld44}, AccessControlRuleName:%{rulename}, Prefilter Policy:%{fld2}, User:%{fld48}, Client:%{application}, ApplicationProtocol:%{protocol}, InitiatorPackets:%{fld14}, ResponderPackets:%{fld13}, InitiatorBytes:%{sbytes}, ResponderBytes:%{rbytes}, NAPPolicy:%{policyname}, DNSQuery:%{hostname}, DNSRecordType: a host address,%{p0}"); -var part113 = // "Pattern{Constant(' DNS_TTL: '), Field(fld7,false), Constant(','), Field(p0,false)}" -match("MESSAGE#38549:NGIPS_events_01/1_0", "nwparser.p0", " DNS_TTL: %{fld7},%{p0}"); +var part113 = match("MESSAGE#38549:NGIPS_events_01/1_0", "nwparser.p0", " DNS_TTL: %{fld7},%{p0}"); var select2467 = linear_select([ part113, dup59, ]); -var part114 = // "Pattern{Field(,false), Constant('DNSSICategory:'), Field(category,false)}" -match("MESSAGE#38549:NGIPS_events_01/2", "nwparser.p0", "%{}DNSSICategory:%{category}"); +var part114 = match("MESSAGE#38549:NGIPS_events_01/2", "nwparser.p0", "%{}DNSSICategory:%{category}"); var all87 = all_match({ processors: [ @@ -133327,194 +133112,131 @@ var chain1 = processor_chain([ }), ]); -var hdr35 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#2:00010/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); +var hdr35 = match("HEADER#2:00010/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); -var part116 = // "Pattern{Constant('"'), Field(hfld10,false), Constant('" [Impact: '), Field(p0,false)}" -match("HEADER#2:00010/1_0", "nwparser.p0", "\"%{hfld10}\" [Impact: %{p0}"); +var part116 = match("HEADER#2:00010/1_0", "nwparser.p0", "\"%{hfld10}\" [Impact: %{p0}"); -var part117 = // "Pattern{Field(hfld10,true), Constant(' [Impact: '), Field(p0,false)}" -match("HEADER#2:00010/1_1", "nwparser.p0", "%{hfld10->} [Impact: %{p0}"); +var part117 = match("HEADER#2:00010/1_1", "nwparser.p0", "%{hfld10->} [Impact: %{p0}"); -var part118 = // "Pattern{Field(result,false), Constant('] From '), Field(hfld11,true), Constant(' at '), Field(fld9,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#3:00011/2", "nwparser.p0", "%{result}] From %{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); +var part118 = match("HEADER#3:00011/2", "nwparser.p0", "%{result}] From %{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); -var part119 = // "Pattern{Constant('"'), Field(hfld10,false), Constant('" [Classification: '), Field(p0,false)}" -match("HEADER#4:00012/1_0", "nwparser.p0", "\"%{hfld10}\" [Classification: %{p0}"); +var part119 = match("HEADER#4:00012/1_0", "nwparser.p0", "\"%{hfld10}\" [Classification: %{p0}"); -var part120 = // "Pattern{Field(hfld10,true), Constant(' [Classification: '), Field(p0,false)}" -match("HEADER#4:00012/1_1", "nwparser.p0", "%{hfld10->} [Classification: %{p0}"); +var part120 = match("HEADER#4:00012/1_1", "nwparser.p0", "%{hfld10->} [Classification: %{p0}"); -var part121 = // "Pattern{Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#4:00012/2", "nwparser.p0", "%{sigtype}] [Priority: %{payload}"); +var part121 = match("HEADER#4:00012/2", "nwparser.p0", "%{sigtype}] [Priority: %{payload}"); -var part122 = // "Pattern{Constant('"'), Field(hfld10,false), Constant('" ['), Field(p0,false)}" -match("HEADER#5:00013/1_0", "nwparser.p0", "\"%{hfld10}\" [%{p0}"); +var part122 = match("HEADER#5:00013/1_0", "nwparser.p0", "\"%{hfld10}\" [%{p0}"); -var part123 = // "Pattern{Field(hfld10,true), Constant(' ['), Field(p0,false)}" -match("HEADER#5:00013/1_1", "nwparser.p0", "%{hfld10->} [%{p0}"); +var part123 = match("HEADER#5:00013/1_1", "nwparser.p0", "%{hfld10->} [%{p0}"); -var part124 = // "Pattern{Field(info,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#5:00013/2", "nwparser.p0", "%{info}] [Priority: %{payload}"); +var part124 = match("HEADER#5:00013/2", "nwparser.p0", "%{info}] [Priority: %{payload}"); -var hdr36 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' snort['), Field(hpid,false), Constant(']: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#7:00020/0", "message", "%{month->} %{day->} %{time->} snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); +var hdr36 = match("HEADER#7:00020/0", "message", "%{month->} %{day->} %{time->} snort[%{hpid}]: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); -var part125 = // "Pattern{Field(result,false), Constant('] From '), Field(group_object,false), Constant('/'), Field(hfld11,true), Constant(' at '), Field(fld9,true), Constant(' '), Field(event_time_string,true), Constant(' [Classification: '), Field(sigtype,false), Constant('] [Priority: '), Field(payload,false)}" -match("HEADER#7:00020/2", "nwparser.p0", "%{result}] From %{group_object}/%{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); +var part125 = match("HEADER#7:00020/2", "nwparser.p0", "%{result}] From %{group_object}/%{hfld11->} at %{fld9->} %{event_time_string->} [Classification: %{sigtype}] [Priority: %{payload}"); -var hdr37 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' snort: ['), Field(hevent_source,false), Constant(':'), Field(messageid,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#11:00030/0", "message", "%{month->} %{day->} %{time->} snort: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); +var hdr37 = match("HEADER#11:00030/0", "message", "%{month->} %{day->} %{time->} snort: [%{hevent_source}:%{messageid}:%{hversion}] %{p0}"); -var part126 = // "Pattern{Constant('at'), Field(p0,false)}" -match("HEADER#26:0011/1_1", "nwparser.p0", "at%{p0}"); +var part126 = match("HEADER#26:0011/1_1", "nwparser.p0", "at%{p0}"); -var part127 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("HEADER#26:0011/2", "nwparser.p0", "%{} %{p0}"); +var part127 = match("HEADER#26:0011/2", "nwparser.p0", "%{} %{p0}"); -var part128 = // "Pattern{Constant('['), Field(hpid,false), Constant(']: ['), Field(p0,false)}" -match("HEADER#41:0024/1_0", "nwparser.p0", "[%{hpid}]: [%{p0}"); +var part128 = match("HEADER#41:0024/1_0", "nwparser.p0", "[%{hpid}]: [%{p0}"); -var part129 = // "Pattern{Constant(': ['), Field(p0,false)}" -match("HEADER#41:0024/1_1", "nwparser.p0", ": [%{p0}"); +var part129 = match("HEADER#41:0024/1_1", "nwparser.p0", ": [%{p0}"); -var part130 = // "Pattern{Constant(']'), Field(hversion,false), Constant(':'), Field(hfld2,false), Constant(':'), Field(hevent_source,true), Constant(' '), Field(payload,false)}" -match("HEADER#41:0024/2", "nwparser.p0", "]%{hversion}:%{hfld2}:%{hevent_source->} %{payload}"); +var part130 = match("HEADER#41:0024/2", "nwparser.p0", "]%{hversion}:%{hfld2}:%{hevent_source->} %{payload}"); -var hdr38 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': ['), Field(hevent_source,false), Constant(':'), Field(hfld2,false), Constant(':'), Field(hversion,false), Constant('] '), Field(p0,false)}" -match("HEADER#43:0023/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{hfld2}:%{hversion}] %{p0}"); +var hdr38 = match("HEADER#43:0023/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: [%{hevent_source}:%{hfld2}:%{hversion}] %{p0}"); -var part131 = // "Pattern{Field(threat_val,true), Constant(' ]:alert {'), Field(p0,false)}" -match("MESSAGE#1:0/0_0", "nwparser.payload", "%{threat_val->} ]:alert {%{p0}"); +var part131 = match("MESSAGE#1:0/0_0", "nwparser.payload", "%{threat_val->} ]:alert {%{p0}"); -var part132 = // "Pattern{Field(threat_val,true), Constant(' ]: '), Field(fld1,true), Constant(' {'), Field(p0,false)}" -match("MESSAGE#1:0/0_1", "nwparser.payload", "%{threat_val->} ]: %{fld1->} {%{p0}"); +var part132 = match("MESSAGE#1:0/0_1", "nwparser.payload", "%{threat_val->} ]: %{fld1->} {%{p0}"); -var part133 = // "Pattern{Field(threat_val,false), Constant(']: {'), Field(p0,false)}" -match("MESSAGE#1:0/0_2", "nwparser.payload", "%{threat_val}]: {%{p0}"); +var part133 = match("MESSAGE#1:0/0_2", "nwparser.payload", "%{threat_val}]: {%{p0}"); -var part134 = // "Pattern{Field(threat_val,true), Constant(' ] {'), Field(p0,false)}" -match("MESSAGE#1:0/0_3", "nwparser.payload", "%{threat_val->} ] {%{p0}"); +var part134 = match("MESSAGE#1:0/0_3", "nwparser.payload", "%{threat_val->} ] {%{p0}"); -var part135 = // "Pattern{Field(protocol,false), Constant('} '), Field(p0,false)}" -match("MESSAGE#1:0/1", "nwparser.p0", "%{protocol}} %{p0}"); +var part135 = match("MESSAGE#1:0/1", "nwparser.p0", "%{protocol}} %{p0}"); -var part136 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(location_src,false), Constant(') -> '), Field(p0,false)}" -match("MESSAGE#1:0/2_0", "nwparser.p0", "%{saddr}:%{sport->} (%{location_src}) -> %{p0}"); +var part136 = match("MESSAGE#1:0/2_0", "nwparser.p0", "%{saddr}:%{sport->} (%{location_src}) -> %{p0}"); -var part137 = // "Pattern{Field(saddr,false), Constant(':'), Field(sport,true), Constant(' -> '), Field(p0,false)}" -match("MESSAGE#1:0/2_1", "nwparser.p0", "%{saddr}:%{sport->} -> %{p0}"); +var part137 = match("MESSAGE#1:0/2_1", "nwparser.p0", "%{saddr}:%{sport->} -> %{p0}"); -var part138 = // "Pattern{Field(saddr,true), Constant(' -> '), Field(p0,false)}" -match("MESSAGE#1:0/2_2", "nwparser.p0", "%{saddr->} -> %{p0}"); +var part138 = match("MESSAGE#1:0/2_2", "nwparser.p0", "%{saddr->} -> %{p0}"); -var part139 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(location_dst,false), Constant(')')}" -match("MESSAGE#1:0/3_0", "nwparser.p0", "%{daddr}:%{dport->} (%{location_dst})"); +var part139 = match("MESSAGE#1:0/3_0", "nwparser.p0", "%{daddr}:%{dport->} (%{location_dst})"); -var part140 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,false)}" -match("MESSAGE#1:0/3_1", "nwparser.p0", "%{daddr}:%{dport}"); +var part140 = match("MESSAGE#1:0/3_1", "nwparser.p0", "%{daddr}:%{dport}"); -var part141 = // "Pattern{Field(daddr,false)}" -match_copy("MESSAGE#1:0/3_2", "nwparser.p0", "daddr"); +var part141 = match_copy("MESSAGE#1:0/3_2", "nwparser.p0", "daddr"); -var part142 = // "Pattern{Field(context,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#2:0:01/0", "nwparser.payload", "%{context->} %{p0}"); +var part142 = match("MESSAGE#2:0:01/0", "nwparser.payload", "%{context->} %{p0}"); -var part143 = // "Pattern{Constant('<<'), Field(interface,false), Constant('> '), Field(p0,false)}" -match("MESSAGE#2:0:01/1_0", "nwparser.p0", "\u003c\u003c%{interface}> %{p0}"); +var part143 = match("MESSAGE#2:0:01/1_0", "nwparser.p0", "\u003c\u003c%{interface}> %{p0}"); -var part144 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#2:0:01/1_1", "nwparser.p0", "p0"); +var part144 = match_copy("MESSAGE#2:0:01/1_1", "nwparser.p0", "p0"); -var part145 = // "Pattern{Constant('{'), Field(protocol,false), Constant('} '), Field(p0,false)}" -match("MESSAGE#2:0:01/2", "nwparser.p0", "{%{protocol}} %{p0}"); +var part145 = match("MESSAGE#2:0:01/2", "nwparser.p0", "{%{protocol}} %{p0}"); -var part146 = // "Pattern{Field(threat_val,true), Constant(' ]'), Field(p0,false)}" -match("MESSAGE#33:10/0", "nwparser.payload", "%{threat_val->} ]%{p0}"); +var part146 = match("MESSAGE#33:10/0", "nwparser.payload", "%{threat_val->} ]%{p0}"); -var part147 = // "Pattern{Constant(' <<'), Field(interface,false), Constant('> '), Field(p0,false)}" -match("MESSAGE#33:10/1_0", "nwparser.p0", " \u003c\u003c%{interface}> %{p0}"); +var part147 = match("MESSAGE#33:10/1_0", "nwparser.p0", " \u003c\u003c%{interface}> %{p0}"); -var part148 = // "Pattern{Constant(': '), Field(p0,false)}" -match("MESSAGE#33:10/1_1", "nwparser.p0", ": %{p0}"); +var part148 = match("MESSAGE#33:10/1_1", "nwparser.p0", ": %{p0}"); -var part149 = // "Pattern{Constant(' '), Field(p0,false)}" -match("MESSAGE#33:10/1_2", "nwparser.p0", " %{p0}"); +var part149 = match("MESSAGE#33:10/1_2", "nwparser.p0", " %{p0}"); -var part150 = // "Pattern{Field(context,true), Constant(' <<'), Field(interface,false), Constant('> '), Field(protocol,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#80:103:01/0", "nwparser.payload", "%{context->} \u003c\u003c%{interface}> %{protocol->} %{p0}"); +var part150 = match("MESSAGE#80:103:01/0", "nwparser.payload", "%{context->} \u003c\u003c%{interface}> %{protocol->} %{p0}"); -var part151 = // "Pattern{Field(threat_val,true), Constant(' ]:alert '), Field(p0,false)}" -match("MESSAGE#5535:3086/0_0", "nwparser.payload", "%{threat_val->} ]:alert %{p0}"); +var part151 = match("MESSAGE#5535:3086/0_0", "nwparser.payload", "%{threat_val->} ]:alert %{p0}"); -var part152 = // "Pattern{Field(threat_val,false), Constant(']: '), Field(p0,false)}" -match("MESSAGE#5535:3086/0_1", "nwparser.payload", "%{threat_val}]: %{p0}"); +var part152 = match("MESSAGE#5535:3086/0_1", "nwparser.payload", "%{threat_val}]: %{p0}"); -var part153 = // "Pattern{Field(threat_val,true), Constant(' ] '), Field(p0,false)}" -match("MESSAGE#5535:3086/0_2", "nwparser.payload", "%{threat_val->} ] %{p0}"); +var part153 = match("MESSAGE#5535:3086/0_2", "nwparser.payload", "%{threat_val->} ] %{p0}"); -var part154 = // "Pattern{Constant(''), Field(p0,false)}" -match("MESSAGE#5535:3086/1", "nwparser.p0", "%{p0}"); +var part154 = match("MESSAGE#5535:3086/1", "nwparser.p0", "%{p0}"); -var part155 = // "Pattern{Constant(':alert '), Field(p0,false)}" -match("MESSAGE#30119:28015/1_1", "nwparser.p0", ":alert %{p0}"); +var part155 = match("MESSAGE#30119:28015/1_1", "nwparser.p0", ":alert %{p0}"); -var part156 = // "Pattern{Constant(''), Field(saddr,true), Constant(' -> '), Field(p0,false)}" -match("MESSAGE#36377:34596/3_1", "nwparser.p0", "%{saddr->} -> %{p0}"); +var part156 = match("MESSAGE#36377:34596/3_1", "nwparser.p0", "%{saddr->} -> %{p0}"); -var part157 = // "Pattern{Constant(''), Field(daddr,false)}" -match("MESSAGE#36377:34596/4_1", "nwparser.p0", "%{daddr}"); +var part157 = match("MESSAGE#36377:34596/4_1", "nwparser.p0", "%{daddr}"); -var part158 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' MAC: '), Field(smacaddr,true), Constant(' TTL '), Field(p0,false)}" -match("MESSAGE#38458:MAC_Information_Change/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} MAC: %{smacaddr->} TTL %{p0}"); +var part158 = match("MESSAGE#38458:MAC_Information_Change/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} MAC: %{smacaddr->} TTL %{p0}"); -var part159 = // "Pattern{Field(sinterface,true), Constant(' ('), Field(protocol,true), Constant(' detected)')}" -match("MESSAGE#38458:MAC_Information_Change/1_0", "nwparser.p0", "%{sinterface->} (%{protocol->} detected)"); +var part159 = match("MESSAGE#38458:MAC_Information_Change/1_0", "nwparser.p0", "%{sinterface->} (%{protocol->} detected)"); -var part160 = // "Pattern{Field(sinterface,false)}" -match_copy("MESSAGE#38458:MAC_Information_Change/1_1", "nwparser.p0", "sinterface"); +var part160 = match_copy("MESSAGE#38458:MAC_Information_Change/1_1", "nwparser.p0", "sinterface"); -var part161 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> '), Field(p0,false)}" -match("MESSAGE#38461:New_Host/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> %{p0}"); +var part161 = match("MESSAGE#38461:New_Host/0", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> %{p0}"); -var part162 = // "Pattern{Field(protocol,false)}" -match_copy("MESSAGE#38462:New_Network_Protocol/2", "nwparser.p0", "protocol"); +var part162 = match_copy("MESSAGE#38462:New_Network_Protocol/2", "nwparser.p0", "protocol"); -var part163 = // "Pattern{Field(protocol,true), Constant(' Confidence: '), Field(result,false)}" -match("MESSAGE#38468:TCP_Service_Information_Update/1_0", "nwparser.p0", "%{protocol->} Confidence: %{result}"); +var part163 = match("MESSAGE#38468:TCP_Service_Information_Update/1_0", "nwparser.p0", "%{protocol->} Confidence: %{result}"); -var part164 = // "Pattern{Constant('>'), Field(p0,false)}" -match("MESSAGE#38495:SystemSettings:09/1_0", "nwparser.p0", ">%{p0}"); +var part164 = match("MESSAGE#38495:SystemSettings:09/1_0", "nwparser.p0", ">%{p0}"); -var part165 = // "Pattern{Field(fld1,false), Constant(']['), Field(policyname,false), Constant('] Connection Type: '), Field(event_state,false), Constant(', User: '), Field(username,false), Constant(', Client: '), Field(application,false), Constant(', Application Protocol: '), Field(protocol,false), Constant(', Web App: '), Field(application,false), Constant(', Access Control Rule Name: '), Field(rulename,false), Constant(', Access Control Rule Action: '), Field(action,false), Constant(', Access Control Rule Reasons: '), Field(result,false), Constant(', URL Category: '), Field(category,false), Constant(', URL Reputation: '), Field(p0,false)}" -match("MESSAGE#38514:Primary_Detection_Engine/0", "nwparser.payload", "%{fld1}][%{policyname}] Connection Type: %{event_state}, User: %{username}, Client: %{application}, Application Protocol: %{protocol}, Web App: %{application}, Access Control Rule Name: %{rulename}, Access Control Rule Action: %{action}, Access Control Rule Reasons: %{result}, URL Category: %{category}, URL Reputation: %{p0}"); +var part165 = match("MESSAGE#38514:Primary_Detection_Engine/0", "nwparser.payload", "%{fld1}][%{policyname}] Connection Type: %{event_state}, User: %{username}, Client: %{application}, Application Protocol: %{protocol}, Web App: %{application}, Access Control Rule Name: %{rulename}, Access Control Rule Action: %{action}, Access Control Rule Reasons: %{result}, URL Category: %{category}, URL Reputation: %{p0}"); -var part166 = // "Pattern{Constant('Risk unknown, URL: '), Field(p0,false)}" -match("MESSAGE#38514:Primary_Detection_Engine/1_0", "nwparser.p0", "Risk unknown, URL: %{p0}"); +var part166 = match("MESSAGE#38514:Primary_Detection_Engine/1_0", "nwparser.p0", "Risk unknown, URL: %{p0}"); -var part167 = // "Pattern{Field(reputation_num,false), Constant(', URL: '), Field(p0,false)}" -match("MESSAGE#38514:Primary_Detection_Engine/1_1", "nwparser.p0", "%{reputation_num}, URL: %{p0}"); +var part167 = match("MESSAGE#38514:Primary_Detection_Engine/1_1", "nwparser.p0", "%{reputation_num}, URL: %{p0}"); -var part168 = // "Pattern{Constant('-*> '), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/1_0", "nwparser.p0", "-*> %{p0}"); +var part168 = match("MESSAGE#38521:Network_Based_Retrospective/1_0", "nwparser.p0", "-*> %{p0}"); -var part169 = // "Pattern{Constant('> '), Field(p0,false)}" -match("MESSAGE#38521:Network_Based_Retrospective/1_1", "nwparser.p0", "> %{p0}"); +var part169 = match("MESSAGE#38521:Network_Based_Retrospective/1_1", "nwparser.p0", "> %{p0}"); -var part170 = // "Pattern{Constant('From "'), Field(sensor,false), Constant('" at '), Field(p0,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/1_0", "nwparser.p0", "From \"%{sensor}\" at %{p0}"); +var part170 = match("MESSAGE#38522:Network_Based_Retrospective:01/1_0", "nwparser.p0", "From \"%{sensor}\" at %{p0}"); -var part171 = // "Pattern{Constant('at '), Field(p0,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/1_1", "nwparser.p0", "at %{p0}"); +var part171 = match("MESSAGE#38522:Network_Based_Retrospective:01/1_1", "nwparser.p0", "at %{p0}"); -var part172 = // "Pattern{Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC '), Field(p0,false)}" -match("MESSAGE#38522:Network_Based_Retrospective:01/2", "nwparser.p0", "%{fld6->} %{event_time_string->} UTC %{p0}"); +var part172 = match("MESSAGE#38522:Network_Based_Retrospective:01/2", "nwparser.p0", "%{fld6->} %{event_time_string->} UTC %{p0}"); -var part173 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' '), Field(network_service,false)}" -match("MESSAGE#38528:Client_Update/4", "nwparser.p0", "IP Address: %{saddr->} %{network_service}"); +var part173 = match("MESSAGE#38528:Client_Update/4", "nwparser.p0", "IP Address: %{saddr->} %{network_service}"); -var part174 = // "Pattern{Constant('IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,true), Constant(' Service: '), Field(p0,false)}" -match("MESSAGE#38530:UDP_Server_Information_Update/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{sport->} Service: %{p0}"); +var part174 = match("MESSAGE#38530:UDP_Server_Information_Update/4", "nwparser.p0", "IP Address: %{saddr->} Port: %{sport->} Service: %{p0}"); var select2469 = linear_select([ dup3, @@ -133531,8 +133253,7 @@ var select2471 = linear_select([ dup10, ]); -var hdr39 = // "Pattern{Field(month,true), Constant(' '), Field(day,true), Constant(' '), Field(time,true), Constant(' '), Field(host,true), Constant(' '), Field(hfld1,false), Constant(': <<*- '), Field(msgIdPart1,true), Constant(' '), Field(msgIdPart2,true), Constant(' '), Field(msgIdPart3,true), Constant(' '), Field(p0,false)}" -match("HEADER#26:0011/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{p0}", processor_chain([ +var hdr39 = match("HEADER#26:0011/0", "message", "%{month->} %{day->} %{time->} %{host->} %{hfld1}: \u003c\u003c*- %{msgIdPart1->} %{msgIdPart2->} %{msgIdPart3->} %{p0}", processor_chain([ dup19, ])); @@ -133604,8 +133325,7 @@ var select2483 = linear_select([ dup132, ]); -var part175 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' OS: '), Field(version,true), Constant(' Confidence: '), Field(result,false)}" -match("MESSAGE#38465:OS_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS: %{version->} Confidence: %{result}", processor_chain([ +var part175 = match("MESSAGE#38465:OS_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} OS: %{version->} Confidence: %{result}", processor_chain([ dup127, dup31, dup32, @@ -133613,8 +133333,7 @@ match("MESSAGE#38465:OS_Confidence_Update", "nwparser.payload", "%{context->} Fr dup129, ])); -var part176 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,true), Constant(' Service: '), Field(protocol,true), Constant(' Confidence: '), Field(result,false)}" -match("MESSAGE#38467:TCP_Service_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{protocol->} Confidence: %{result}", processor_chain([ +var part176 = match("MESSAGE#38467:TCP_Service_Confidence_Update", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport->} Service: %{protocol->} Confidence: %{result}", processor_chain([ dup135, dup31, dup32, @@ -133627,8 +133346,7 @@ var select2484 = linear_select([ dup134, ]); -var part177 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' '), Field(product,false)}" -match("MESSAGE#38471:New_Client_Application", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} %{product}", processor_chain([ +var part177 = match("MESSAGE#38471:New_Client_Application", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} %{product}", processor_chain([ dup135, dup31, dup32, @@ -133636,8 +133354,7 @@ match("MESSAGE#38471:New_Client_Application", "nwparser.payload", "%{context->} dup129, ])); -var part178 = // "Pattern{Field(context,true), Constant(' From "'), Field(sensor,false), Constant('" at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,true), Constant(' Port: '), Field(sport,false)}" -match("MESSAGE#38473:New_TCP_Service", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport}", processor_chain([ +var part178 = match("MESSAGE#38473:New_TCP_Service", "nwparser.payload", "%{context->} From \"%{sensor}\" at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr->} Port: %{sport}", processor_chain([ dup135, dup31, dup32, @@ -133645,8 +133362,7 @@ match("MESSAGE#38473:New_TCP_Service", "nwparser.payload", "%{context->} From \" dup129, ])); -var part179 = // "Pattern{Field(context,true), Constant(' From '), Field(sensor,true), Constant(' at '), Field(fld6,true), Constant(' '), Field(event_time_string,true), Constant(' UTC -*> IP Address: '), Field(saddr,false)}" -match("MESSAGE#38475:TCP_Port_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr}", processor_chain([ +var part179 = match("MESSAGE#38475:TCP_Port_Timeout", "nwparser.payload", "%{context->} From %{sensor->} at %{fld6->} %{event_time_string->} UTC -*> IP Address: %{saddr}", processor_chain([ dup135, dup31, dup32, diff --git a/x-pack/filebeat/module/sophos/utm/config/pipeline.js b/x-pack/filebeat/module/sophos/utm/config/pipeline.js index 8b482480f25..47802f0ee26 100644 --- a/x-pack/filebeat/module/sophos/utm/config/pipeline.js +++ b/x-pack/filebeat/module/sophos/utm/config/pipeline.js @@ -105,8 +105,7 @@ var dup17 = setc("eventcategory","1702000000"); var dup18 = setc("comments","server certificate has a different hostname from actual hostname"); -var dup19 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#44:reverseproxy:07/1_0", "nwparser.p0", "p0"); +var dup19 = match_copy("MESSAGE#44:reverseproxy:07/1_0", "nwparser.p0", "p0"); var dup20 = setc("eventcategory","1603060000"); @@ -170,35 +169,29 @@ var dup46 = lookup({ key: dup15, }); -var hdr1 = // "Pattern{Field(hfld1,true), Constant(' '), Field(messageid,false), Constant('['), Field(process_id,false), Constant(']: '), Field(payload,false)}" -match("HEADER#0:0001", "message", "%{hfld1->} %{messageid}[%{process_id}]: %{payload}", processor_chain([ +var hdr1 = match("HEADER#0:0001", "message", "%{hfld1->} %{messageid}[%{process_id}]: %{payload}", processor_chain([ setc("header_id","0001"), ])); -var hdr2 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hostname,true), Constant(' '), Field(messageid,false), Constant('['), Field(process_id,false), Constant(']: '), Field(payload,false)}" -match("HEADER#1:0002", "message", "%{hfld1->} %{hostname->} %{messageid}[%{process_id}]: %{payload}", processor_chain([ +var hdr2 = match("HEADER#1:0002", "message", "%{hfld1->} %{hostname->} %{messageid}[%{process_id}]: %{payload}", processor_chain([ setc("header_id","0002"), ])); -var hdr3 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hostname,true), Constant(' reverseproxy: '), Field(payload,false)}" -match("HEADER#2:0003", "message", "%{hfld1->} %{hostname->} reverseproxy: %{payload}", processor_chain([ +var hdr3 = match("HEADER#2:0003", "message", "%{hfld1->} %{hostname->} reverseproxy: %{payload}", processor_chain([ setc("header_id","0003"), setc("messageid","reverseproxy"), ])); -var hdr4 = // "Pattern{Field(hfld1,true), Constant(' '), Field(hostname,true), Constant(' '), Field(messageid,false), Constant(': '), Field(payload,false)}" -match("HEADER#3:0005", "message", "%{hfld1->} %{hostname->} %{messageid}: %{payload}", processor_chain([ +var hdr4 = match("HEADER#3:0005", "message", "%{hfld1->} %{hostname->} %{messageid}: %{payload}", processor_chain([ setc("header_id","0005"), ])); -var hdr5 = // "Pattern{Field(hfld1,true), Constant(' '), Field(id,false), Constant('['), Field(process_id,false), Constant(']: '), Field(payload,false)}" -match("HEADER#4:0004", "message", "%{hfld1->} %{id}[%{process_id}]: %{payload}", processor_chain([ +var hdr5 = match("HEADER#4:0004", "message", "%{hfld1->} %{id}[%{process_id}]: %{payload}", processor_chain([ setc("header_id","0004"), setc("messageid","astarosg_TVM"), ])); -var hdr6 = // "Pattern{Constant('device="'), Field(product,false), Constant('" date='), Field(hdate,true), Constant(' time='), Field(htime,true), Constant(' timezone="'), Field(timezone,false), Constant('" device_name="'), Field(device,false), Constant('" device_id='), Field(hardware_id,true), Constant(' log_id='), Field(id,true), Constant(' '), Field(payload,false)}" -match("HEADER#5:0006", "message", "device=\"%{product}\" date=%{hdate->} time=%{htime->} timezone=\"%{timezone}\" device_name=\"%{device}\" device_id=%{hardware_id->} log_id=%{id->} %{payload}", processor_chain([ +var hdr6 = match("HEADER#5:0006", "message", "device=\"%{product}\" date=%{hdate->} time=%{htime->} timezone=\"%{timezone}\" device_name=\"%{device}\" device_id=%{hardware_id->} log_id=%{id->} %{payload}", processor_chain([ setc("header_id","0006"), setc("messageid","Sophos_Firewall"), ])); @@ -212,8 +205,7 @@ var select1 = linear_select([ hdr6, ]); -var part1 = // "Pattern{Constant('received control channel command ''), Field(action,false), Constant(''')}" -match("MESSAGE#0:named:01", "nwparser.payload", "received control channel command '%{action}'", processor_chain([ +var part1 = match("MESSAGE#0:named:01", "nwparser.payload", "received control channel command '%{action}'", processor_chain([ dup1, dup2, dup3, @@ -221,8 +213,7 @@ match("MESSAGE#0:named:01", "nwparser.payload", "received control channel comman var msg1 = msg("named:01", part1); -var part2 = // "Pattern{Constant('flushing caches in all views '), Field(disposition,false)}" -match("MESSAGE#1:named:02", "nwparser.payload", "flushing caches in all views %{disposition}", processor_chain([ +var part2 = match("MESSAGE#1:named:02", "nwparser.payload", "flushing caches in all views %{disposition}", processor_chain([ dup1, dup2, dup3, @@ -230,8 +221,7 @@ match("MESSAGE#1:named:02", "nwparser.payload", "flushing caches in all views %{ var msg2 = msg("named:02", part2); -var part3 = // "Pattern{Constant('error ('), Field(result,false), Constant(') resolving ''), Field(dhost,false), Constant('': '), Field(daddr,false), Constant('#'), Field(dport,false)}" -match("MESSAGE#2:named:03", "nwparser.payload", "error (%{result}) resolving '%{dhost}': %{daddr}#%{dport}", processor_chain([ +var part3 = match("MESSAGE#2:named:03", "nwparser.payload", "error (%{result}) resolving '%{dhost}': %{daddr}#%{dport}", processor_chain([ dup4, dup2, dup3, @@ -239,8 +229,7 @@ match("MESSAGE#2:named:03", "nwparser.payload", "error (%{result}) resolving '%{ var msg3 = msg("named:03", part3); -var part4 = // "Pattern{Constant('received '), Field(action,true), Constant(' signal to '), Field(fld3,false)}" -match("MESSAGE#3:named:04", "nwparser.payload", "received %{action->} signal to %{fld3}", processor_chain([ +var part4 = match("MESSAGE#3:named:04", "nwparser.payload", "received %{action->} signal to %{fld3}", processor_chain([ dup5, dup2, dup3, @@ -248,8 +237,7 @@ match("MESSAGE#3:named:04", "nwparser.payload", "received %{action->} signal to var msg4 = msg("named:04", part4); -var part5 = // "Pattern{Constant('loading configuration from ''), Field(filename,false), Constant(''')}" -match("MESSAGE#4:named:05", "nwparser.payload", "loading configuration from '%{filename}'", processor_chain([ +var part5 = match("MESSAGE#4:named:05", "nwparser.payload", "loading configuration from '%{filename}'", processor_chain([ dup6, dup2, dup3, @@ -257,8 +245,7 @@ match("MESSAGE#4:named:05", "nwparser.payload", "loading configuration from '%{f var msg5 = msg("named:05", part5); -var part6 = // "Pattern{Constant('no '), Field(protocol,true), Constant(' interfaces found')}" -match("MESSAGE#5:named:06", "nwparser.payload", "no %{protocol->} interfaces found", processor_chain([ +var part6 = match("MESSAGE#5:named:06", "nwparser.payload", "no %{protocol->} interfaces found", processor_chain([ setc("eventcategory","1804000000"), dup2, dup3, @@ -266,8 +253,7 @@ match("MESSAGE#5:named:06", "nwparser.payload", "no %{protocol->} interfaces fou var msg6 = msg("named:06", part6); -var part7 = // "Pattern{Constant('sizing zone task pool based on '), Field(fld3,true), Constant(' zones')}" -match("MESSAGE#6:named:07", "nwparser.payload", "sizing zone task pool based on %{fld3->} zones", processor_chain([ +var part7 = match("MESSAGE#6:named:07", "nwparser.payload", "sizing zone task pool based on %{fld3->} zones", processor_chain([ dup7, dup2, dup3, @@ -275,8 +261,7 @@ match("MESSAGE#6:named:07", "nwparser.payload", "sizing zone task pool based on var msg7 = msg("named:07", part7); -var part8 = // "Pattern{Constant('automatic empty zone: view '), Field(fld3,false), Constant(': '), Field(dns_ptr_record,false)}" -match("MESSAGE#7:named:08", "nwparser.payload", "automatic empty zone: view %{fld3}: %{dns_ptr_record}", processor_chain([ +var part8 = match("MESSAGE#7:named:08", "nwparser.payload", "automatic empty zone: view %{fld3}: %{dns_ptr_record}", processor_chain([ dup8, dup2, dup3, @@ -284,8 +269,7 @@ match("MESSAGE#7:named:08", "nwparser.payload", "automatic empty zone: view %{fl var msg8 = msg("named:08", part8); -var part9 = // "Pattern{Constant('reloading '), Field(obj_type,true), Constant(' '), Field(disposition,false)}" -match("MESSAGE#8:named:09", "nwparser.payload", "reloading %{obj_type->} %{disposition}", processor_chain([ +var part9 = match("MESSAGE#8:named:09", "nwparser.payload", "reloading %{obj_type->} %{disposition}", processor_chain([ dup7, dup2, dup3, @@ -294,8 +278,7 @@ match("MESSAGE#8:named:09", "nwparser.payload", "reloading %{obj_type->} %{dispo var msg9 = msg("named:09", part9); -var part10 = // "Pattern{Constant('zone '), Field(dhost,false), Constant('/'), Field(fld3,false), Constant(': loaded serial '), Field(operation_id,false)}" -match("MESSAGE#9:named:10", "nwparser.payload", "zone %{dhost}/%{fld3}: loaded serial %{operation_id}", processor_chain([ +var part10 = match("MESSAGE#9:named:10", "nwparser.payload", "zone %{dhost}/%{fld3}: loaded serial %{operation_id}", processor_chain([ dup7, dup9, dup2, @@ -304,8 +287,7 @@ match("MESSAGE#9:named:10", "nwparser.payload", "zone %{dhost}/%{fld3}: loaded s var msg10 = msg("named:10", part10); -var part11 = // "Pattern{Constant('all zones loaded'), Field(,false)}" -match("MESSAGE#10:named:11", "nwparser.payload", "all zones loaded%{}", processor_chain([ +var part11 = match("MESSAGE#10:named:11", "nwparser.payload", "all zones loaded%{}", processor_chain([ dup7, dup9, dup2, @@ -315,8 +297,7 @@ match("MESSAGE#10:named:11", "nwparser.payload", "all zones loaded%{}", processo var msg11 = msg("named:11", part11); -var part12 = // "Pattern{Constant('running'), Field(,false)}" -match("MESSAGE#11:named:12", "nwparser.payload", "running%{}", processor_chain([ +var part12 = match("MESSAGE#11:named:12", "nwparser.payload", "running%{}", processor_chain([ dup7, setc("disposition","running"), dup2, @@ -326,8 +307,7 @@ match("MESSAGE#11:named:12", "nwparser.payload", "running%{}", processor_chain([ var msg12 = msg("named:12", part12); -var part13 = // "Pattern{Constant('using built-in root key for view '), Field(fld3,false)}" -match("MESSAGE#12:named:13", "nwparser.payload", "using built-in root key for view %{fld3}", processor_chain([ +var part13 = match("MESSAGE#12:named:13", "nwparser.payload", "using built-in root key for view %{fld3}", processor_chain([ dup7, setc("context","built-in root key"), dup2, @@ -336,8 +316,7 @@ match("MESSAGE#12:named:13", "nwparser.payload", "using built-in root key for vi var msg13 = msg("named:13", part13); -var part14 = // "Pattern{Constant('zone '), Field(dns_ptr_record,false), Constant('/'), Field(fld3,false), Constant(': ('), Field(username,false), Constant(') '), Field(action,false)}" -match("MESSAGE#13:named:14", "nwparser.payload", "zone %{dns_ptr_record}/%{fld3}: (%{username}) %{action}", processor_chain([ +var part14 = match("MESSAGE#13:named:14", "nwparser.payload", "zone %{dns_ptr_record}/%{fld3}: (%{username}) %{action}", processor_chain([ dup8, dup2, dup3, @@ -345,8 +324,7 @@ match("MESSAGE#13:named:14", "nwparser.payload", "zone %{dns_ptr_record}/%{fld3} var msg14 = msg("named:14", part14); -var part15 = // "Pattern{Constant('too many timeouts resolving ''), Field(fld3,false), Constant('' ('), Field(fld4,false), Constant('): disabling EDNS')}" -match("MESSAGE#14:named:15", "nwparser.payload", "too many timeouts resolving '%{fld3}' (%{fld4}): disabling EDNS", processor_chain([ +var part15 = match("MESSAGE#14:named:15", "nwparser.payload", "too many timeouts resolving '%{fld3}' (%{fld4}): disabling EDNS", processor_chain([ dup10, setc("event_description","named:too many timeouts resolving DNS."), dup11, @@ -355,8 +333,7 @@ match("MESSAGE#14:named:15", "nwparser.payload", "too many timeouts resolving '% var msg15 = msg("named:15", part15); -var part16 = // "Pattern{Constant('FORMERR resolving ''), Field(hostname,false), Constant('': '), Field(saddr,false), Constant('#'), Field(fld3,false)}" -match("MESSAGE#15:named:16", "nwparser.payload", "FORMERR resolving '%{hostname}': %{saddr}#%{fld3}", processor_chain([ +var part16 = match("MESSAGE#15:named:16", "nwparser.payload", "FORMERR resolving '%{hostname}': %{saddr}#%{fld3}", processor_chain([ dup10, setc("event_description","named:FORMERR resolving DNS."), dup11, @@ -365,8 +342,7 @@ match("MESSAGE#15:named:16", "nwparser.payload", "FORMERR resolving '%{hostname} var msg16 = msg("named:16", part16); -var part17 = // "Pattern{Constant('unexpected RCODE (SERVFAIL) resolving ''), Field(hostname,false), Constant('': '), Field(saddr,false), Constant('#'), Field(fld3,false)}" -match("MESSAGE#16:named:17", "nwparser.payload", "unexpected RCODE (SERVFAIL) resolving '%{hostname}': %{saddr}#%{fld3}", processor_chain([ +var part17 = match("MESSAGE#16:named:17", "nwparser.payload", "unexpected RCODE (SERVFAIL) resolving '%{hostname}': %{saddr}#%{fld3}", processor_chain([ dup10, setc("event_description","named:unexpected RCODE (SERVFAIL) resolving DNS."), dup11, @@ -395,8 +371,7 @@ var select2 = linear_select([ msg17, ]); -var part18 = // "Pattern{Constant('Integrated HTTP-Proxy '), Field(version,false)}" -match("MESSAGE#17:httpproxy:09", "nwparser.payload", "Integrated HTTP-Proxy %{version}", processor_chain([ +var part18 = match("MESSAGE#17:httpproxy:09", "nwparser.payload", "Integrated HTTP-Proxy %{version}", processor_chain([ dup12, setc("event_description","httpproxy:Integrated HTTP-Proxy."), dup11, @@ -405,8 +380,7 @@ match("MESSAGE#17:httpproxy:09", "nwparser.payload", "Integrated HTTP-Proxy %{ve var msg18 = msg("httpproxy:09", part18); -var part19 = // "Pattern{Constant('['), Field(fld2,false), Constant('] parse_address ('), Field(fld3,false), Constant(') getaddrinfo: passthrough.fw-notify.net: Name or service not known')}" -match("MESSAGE#18:httpproxy:10", "nwparser.payload", "[%{fld2}] parse_address (%{fld3}) getaddrinfo: passthrough.fw-notify.net: Name or service not known", processor_chain([ +var part19 = match("MESSAGE#18:httpproxy:10", "nwparser.payload", "[%{fld2}] parse_address (%{fld3}) getaddrinfo: passthrough.fw-notify.net: Name or service not known", processor_chain([ dup10, setc("event_description","httpproxy:Name or service not known."), dup11, @@ -415,8 +389,7 @@ match("MESSAGE#18:httpproxy:10", "nwparser.payload", "[%{fld2}] parse_address (% var msg19 = msg("httpproxy:10", part19); -var part20 = // "Pattern{Constant('['), Field(fld2,false), Constant('] confd_config_filter ('), Field(fld3,false), Constant(') failed to resolve passthrough.fw-notify.net, using '), Field(saddr,false)}" -match("MESSAGE#19:httpproxy:11", "nwparser.payload", "[%{fld2}] confd_config_filter (%{fld3}) failed to resolve passthrough.fw-notify.net, using %{saddr}", processor_chain([ +var part20 = match("MESSAGE#19:httpproxy:11", "nwparser.payload", "[%{fld2}] confd_config_filter (%{fld3}) failed to resolve passthrough.fw-notify.net, using %{saddr}", processor_chain([ dup10, setc("event_description","httpproxy:failed to resolve passthrough."), dup11, @@ -425,8 +398,7 @@ match("MESSAGE#19:httpproxy:11", "nwparser.payload", "[%{fld2}] confd_config_fil var msg20 = msg("httpproxy:11", part20); -var part21 = // "Pattern{Constant('['), Field(fld2,false), Constant('] ssl_log_errors ('), Field(fld3,false), Constant(') '), Field(fld4,false), Constant('ssl handshake failure'), Field(fld5,false)}" -match("MESSAGE#20:httpproxy:12", "nwparser.payload", "[%{fld2}] ssl_log_errors (%{fld3}) %{fld4}ssl handshake failure%{fld5}", processor_chain([ +var part21 = match("MESSAGE#20:httpproxy:12", "nwparser.payload", "[%{fld2}] ssl_log_errors (%{fld3}) %{fld4}ssl handshake failure%{fld5}", processor_chain([ dup10, setc("event_description","httpproxy:ssl handshake failure."), dup11, @@ -435,8 +407,7 @@ match("MESSAGE#20:httpproxy:12", "nwparser.payload", "[%{fld2}] ssl_log_errors ( var msg21 = msg("httpproxy:12", part21); -var part22 = // "Pattern{Constant('['), Field(fld2,false), Constant('] sc_decrypt ('), Field(fld3,false), Constant(') EVP_DecryptFinal failed')}" -match("MESSAGE#21:httpproxy:13", "nwparser.payload", "[%{fld2}] sc_decrypt (%{fld3}) EVP_DecryptFinal failed", processor_chain([ +var part22 = match("MESSAGE#21:httpproxy:13", "nwparser.payload", "[%{fld2}] sc_decrypt (%{fld3}) EVP_DecryptFinal failed", processor_chain([ dup10, setc("event_description","httpproxy:EVP_DecryptFinal failed."), dup11, @@ -445,8 +416,7 @@ match("MESSAGE#21:httpproxy:13", "nwparser.payload", "[%{fld2}] sc_decrypt (%{fl var msg22 = msg("httpproxy:13", part22); -var part23 = // "Pattern{Constant('['), Field(fld2,false), Constant('] sc_server_cmd ('), Field(fld3,false), Constant(') decrypt failed')}" -match("MESSAGE#22:httpproxy:14", "nwparser.payload", "[%{fld2}] sc_server_cmd (%{fld3}) decrypt failed", processor_chain([ +var part23 = match("MESSAGE#22:httpproxy:14", "nwparser.payload", "[%{fld2}] sc_server_cmd (%{fld3}) decrypt failed", processor_chain([ dup10, setc("event_description","httpproxy:decrypt failed."), dup11, @@ -455,8 +425,7 @@ match("MESSAGE#22:httpproxy:14", "nwparser.payload", "[%{fld2}] sc_server_cmd (% var msg23 = msg("httpproxy:14", part23); -var part24 = // "Pattern{Constant('['), Field(fld2,false), Constant('] clamav_reload ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#23:httpproxy:15", "nwparser.payload", "[%{fld2}] clamav_reload (%{fld3}) %{info}", processor_chain([ +var part24 = match("MESSAGE#23:httpproxy:15", "nwparser.payload", "[%{fld2}] clamav_reload (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:reloading av pattern"), dup11, @@ -465,8 +434,7 @@ match("MESSAGE#23:httpproxy:15", "nwparser.payload", "[%{fld2}] clamav_reload (% var msg24 = msg("httpproxy:15", part24); -var part25 = // "Pattern{Constant('['), Field(fld2,false), Constant('] sc_check_servers ('), Field(fld3,false), Constant(') server ''), Field(hostname,false), Constant('' access time: '), Field(fld4,false)}" -match("MESSAGE#24:httpproxy:16", "nwparser.payload", "[%{fld2}] sc_check_servers (%{fld3}) server '%{hostname}' access time: %{fld4}", processor_chain([ +var part25 = match("MESSAGE#24:httpproxy:16", "nwparser.payload", "[%{fld2}] sc_check_servers (%{fld3}) server '%{hostname}' access time: %{fld4}", processor_chain([ dup12, setc("event_description","httpproxy:sc_check_servers.Server checked."), dup11, @@ -475,8 +443,7 @@ match("MESSAGE#24:httpproxy:16", "nwparser.payload", "[%{fld2}] sc_check_servers var msg25 = msg("httpproxy:16", part25); -var part26 = // "Pattern{Constant('['), Field(fld2,false), Constant('] main ('), Field(fld3,false), Constant(') shutdown finished, exiting')}" -match("MESSAGE#25:httpproxy:17", "nwparser.payload", "[%{fld2}] main (%{fld3}) shutdown finished, exiting", processor_chain([ +var part26 = match("MESSAGE#25:httpproxy:17", "nwparser.payload", "[%{fld2}] main (%{fld3}) shutdown finished, exiting", processor_chain([ dup12, setc("event_description","httpproxy:shutdown finished, exiting."), dup11, @@ -485,8 +452,7 @@ match("MESSAGE#25:httpproxy:17", "nwparser.payload", "[%{fld2}] main (%{fld3}) s var msg26 = msg("httpproxy:17", part26); -var part27 = // "Pattern{Constant('['), Field(fld2,false), Constant('] main ('), Field(fld3,false), Constant(') reading configuration')}" -match("MESSAGE#26:httpproxy:18", "nwparser.payload", "[%{fld2}] main (%{fld3}) reading configuration", processor_chain([ +var part27 = match("MESSAGE#26:httpproxy:18", "nwparser.payload", "[%{fld2}] main (%{fld3}) reading configuration", processor_chain([ dup12, setc("event_description","httpproxy:"), dup11, @@ -495,8 +461,7 @@ match("MESSAGE#26:httpproxy:18", "nwparser.payload", "[%{fld2}] main (%{fld3}) r var msg27 = msg("httpproxy:18", part27); -var part28 = // "Pattern{Constant('['), Field(fld2,false), Constant('] main ('), Field(fld3,false), Constant(') reading profiles')}" -match("MESSAGE#27:httpproxy:19", "nwparser.payload", "[%{fld2}] main (%{fld3}) reading profiles", processor_chain([ +var part28 = match("MESSAGE#27:httpproxy:19", "nwparser.payload", "[%{fld2}] main (%{fld3}) reading profiles", processor_chain([ dup12, setc("event_description","httpproxy:reading profiles"), dup11, @@ -505,8 +470,7 @@ match("MESSAGE#27:httpproxy:19", "nwparser.payload", "[%{fld2}] main (%{fld3}) r var msg28 = msg("httpproxy:19", part28); -var part29 = // "Pattern{Constant('['), Field(fld2,false), Constant('] main ('), Field(fld3,false), Constant(') finished startup')}" -match("MESSAGE#28:httpproxy:20", "nwparser.payload", "[%{fld2}] main (%{fld3}) finished startup", processor_chain([ +var part29 = match("MESSAGE#28:httpproxy:20", "nwparser.payload", "[%{fld2}] main (%{fld3}) finished startup", processor_chain([ dup12, setc("event_description","httpproxy:finished startup"), dup11, @@ -515,8 +479,7 @@ match("MESSAGE#28:httpproxy:20", "nwparser.payload", "[%{fld2}] main (%{fld3}) f var msg29 = msg("httpproxy:20", part29); -var part30 = // "Pattern{Constant('['), Field(fld2,false), Constant('] read_request_headers ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#29:httpproxy:21", "nwparser.payload", "[%{fld2}] read_request_headers (%{fld3}) %{info}", processor_chain([ +var part30 = match("MESSAGE#29:httpproxy:21", "nwparser.payload", "[%{fld2}] read_request_headers (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:read_request_headers related message."), dup11, @@ -525,8 +488,7 @@ match("MESSAGE#29:httpproxy:21", "nwparser.payload", "[%{fld2}] read_request_hea var msg30 = msg("httpproxy:21", part30); -var part31 = // "Pattern{Constant('['), Field(fld2,false), Constant('] epoll_loop ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#30:httpproxy:22", "nwparser.payload", "[%{fld2}] epoll_loop (%{fld3}) %{info}", processor_chain([ +var part31 = match("MESSAGE#30:httpproxy:22", "nwparser.payload", "[%{fld2}] epoll_loop (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:epoll_loop related message."), dup11, @@ -535,8 +497,7 @@ match("MESSAGE#30:httpproxy:22", "nwparser.payload", "[%{fld2}] epoll_loop (%{fl var msg31 = msg("httpproxy:22", part31); -var part32 = // "Pattern{Constant('['), Field(fld2,false), Constant('] scan_exit ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#31:httpproxy:23", "nwparser.payload", "[%{fld2}] scan_exit (%{fld3}) %{info}", processor_chain([ +var part32 = match("MESSAGE#31:httpproxy:23", "nwparser.payload", "[%{fld2}] scan_exit (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:scan_exit related message."), dup11, @@ -545,8 +506,7 @@ match("MESSAGE#31:httpproxy:23", "nwparser.payload", "[%{fld2}] scan_exit (%{fld var msg32 = msg("httpproxy:23", part32); -var part33 = // "Pattern{Constant('['), Field(fld2,false), Constant('] epoll_exit ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#32:httpproxy:24", "nwparser.payload", "[%{fld2}] epoll_exit (%{fld3}) %{info}", processor_chain([ +var part33 = match("MESSAGE#32:httpproxy:24", "nwparser.payload", "[%{fld2}] epoll_exit (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:epoll_exit related message."), dup11, @@ -555,8 +515,7 @@ match("MESSAGE#32:httpproxy:24", "nwparser.payload", "[%{fld2}] epoll_exit (%{fl var msg33 = msg("httpproxy:24", part33); -var part34 = // "Pattern{Constant('['), Field(fld2,false), Constant('] disk_cache_exit ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#33:httpproxy:25", "nwparser.payload", "[%{fld2}] disk_cache_exit (%{fld3}) %{info}", processor_chain([ +var part34 = match("MESSAGE#33:httpproxy:25", "nwparser.payload", "[%{fld2}] disk_cache_exit (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:disk_cache_exit related message."), dup11, @@ -565,8 +524,7 @@ match("MESSAGE#33:httpproxy:25", "nwparser.payload", "[%{fld2}] disk_cache_exit var msg34 = msg("httpproxy:25", part34); -var part35 = // "Pattern{Constant('['), Field(fld2,false), Constant('] disk_cache_zap ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#34:httpproxy:26", "nwparser.payload", "[%{fld2}] disk_cache_zap (%{fld3}) %{info}", processor_chain([ +var part35 = match("MESSAGE#34:httpproxy:26", "nwparser.payload", "[%{fld2}] disk_cache_zap (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:disk_cache_zap related message."), dup11, @@ -575,8 +533,7 @@ match("MESSAGE#34:httpproxy:26", "nwparser.payload", "[%{fld2}] disk_cache_zap ( var msg35 = msg("httpproxy:26", part35); -var part36 = // "Pattern{Constant('['), Field(fld2,false), Constant('] scanner_init ('), Field(fld3,false), Constant(') '), Field(info,false)}" -match("MESSAGE#35:httpproxy:27", "nwparser.payload", "[%{fld2}] scanner_init (%{fld3}) %{info}", processor_chain([ +var part36 = match("MESSAGE#35:httpproxy:27", "nwparser.payload", "[%{fld2}] scanner_init (%{fld3}) %{info}", processor_chain([ dup12, setc("event_description","httpproxy:scanner_init related message."), dup11, @@ -663,8 +620,7 @@ var select3 = linear_select([ msg37, ]); -var part38 = // "Pattern{Constant('T='), Field(fld3,true), Constant(' ------ 1 - [exit] '), Field(action,false), Constant(': '), Field(disposition,false)}" -match("MESSAGE#37:URID:01", "nwparser.payload", "T=%{fld3->} ------ 1 - [exit] %{action}: %{disposition}", processor_chain([ +var part38 = match("MESSAGE#37:URID:01", "nwparser.payload", "T=%{fld3->} ------ 1 - [exit] %{action}: %{disposition}", processor_chain([ dup16, dup2, dup3, @@ -711,8 +667,7 @@ var part39 = tagval("MESSAGE#38:ulogd:01", "nwparser.payload", tvm, { var msg39 = msg("ulogd:01", part39); -var part40 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] ModSecurity for Apache/'), Field(fld5,true), Constant(' ('), Field(fld6,false), Constant(') configured.')}" -match("MESSAGE#39:reverseproxy:01", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] ModSecurity for Apache/%{fld5->} (%{fld6}) configured.", processor_chain([ +var part40 = match("MESSAGE#39:reverseproxy:01", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] ModSecurity for Apache/%{fld5->} (%{fld6}) configured.", processor_chain([ dup6, setc("disposition","configured"), dup2, @@ -721,8 +676,7 @@ match("MESSAGE#39:reverseproxy:01", "nwparser.payload", "[%{fld3}] [%{event_log} var msg40 = msg("reverseproxy:01", part40); -var part41 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] ModSecurity: '), Field(fld5,true), Constant(' compiled version="'), Field(fld6,false), Constant('"; loaded version="'), Field(fld7,false), Constant('"')}" -match("MESSAGE#40:reverseproxy:02", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] ModSecurity: %{fld5->} compiled version=\"%{fld6}\"; loaded version=\"%{fld7}\"", processor_chain([ +var part41 = match("MESSAGE#40:reverseproxy:02", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] ModSecurity: %{fld5->} compiled version=\"%{fld6}\"; loaded version=\"%{fld7}\"", processor_chain([ dup17, dup2, dup3, @@ -730,8 +684,7 @@ match("MESSAGE#40:reverseproxy:02", "nwparser.payload", "[%{fld3}] [%{event_log} var msg41 = msg("reverseproxy:02", part41); -var part42 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] ModSecurity: '), Field(fld5,true), Constant(' compiled version="'), Field(fld6,false), Constant('"')}" -match("MESSAGE#41:reverseproxy:03", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] ModSecurity: %{fld5->} compiled version=\"%{fld6}\"", processor_chain([ +var part42 = match("MESSAGE#41:reverseproxy:03", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] ModSecurity: %{fld5->} compiled version=\"%{fld6}\"", processor_chain([ dup17, dup2, dup3, @@ -739,8 +692,7 @@ match("MESSAGE#41:reverseproxy:03", "nwparser.payload", "[%{fld3}] [%{event_log} var msg42 = msg("reverseproxy:03", part42); -var part43 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] '), Field(fld5,true), Constant(' configured -- '), Field(disposition,true), Constant(' normal operations')}" -match("MESSAGE#42:reverseproxy:04", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] %{fld5->} configured -- %{disposition->} normal operations", processor_chain([ +var part43 = match("MESSAGE#42:reverseproxy:04", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] %{fld5->} configured -- %{disposition->} normal operations", processor_chain([ dup17, setc("event_id","AH00292"), dup2, @@ -749,8 +701,7 @@ match("MESSAGE#42:reverseproxy:04", "nwparser.payload", "[%{fld3}] [%{event_log} var msg43 = msg("reverseproxy:04", part43); -var part44 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] ['), Field(fld5,false), Constant('] Hostname in '), Field(network_service,true), Constant(' request ('), Field(fld6,false), Constant(') does not match the server name ('), Field(ddomain,false), Constant(')')}" -match("MESSAGE#43:reverseproxy:06", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [%{fld5}] Hostname in %{network_service->} request (%{fld6}) does not match the server name (%{ddomain})", processor_chain([ +var part44 = match("MESSAGE#43:reverseproxy:06", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [%{fld5}] Hostname in %{network_service->} request (%{fld6}) does not match the server name (%{ddomain})", processor_chain([ setc("eventcategory","1805010000"), dup18, dup2, @@ -759,15 +710,13 @@ match("MESSAGE#43:reverseproxy:06", "nwparser.payload", "[%{fld3}] [%{event_log} var msg44 = msg("reverseproxy:06", part44); -var part45 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH00297: '), Field(action,true), Constant(' received. Doing'), Field(p0,false)}" -match("MESSAGE#44:reverseproxy:07/0", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00297: %{action->} received. Doing%{p0}"); +var part45 = match("MESSAGE#44:reverseproxy:07/0", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00297: %{action->} received. Doing%{p0}"); var select4 = linear_select([ dup19, ]); -var part46 = // "Pattern{Field(,false), Constant('graceful '), Field(disposition,false)}" -match("MESSAGE#44:reverseproxy:07/2", "nwparser.p0", "%{}graceful %{disposition}"); +var part46 = match("MESSAGE#44:reverseproxy:07/2", "nwparser.p0", "%{}graceful %{disposition}"); var all1 = all_match({ processors: [ @@ -785,8 +734,7 @@ var all1 = all_match({ var msg45 = msg("reverseproxy:07", all1); -var part47 = // "Pattern{Constant('AH00112: Warning: DocumentRoot ['), Field(web_root,false), Constant('] does not exist')}" -match("MESSAGE#45:reverseproxy:08", "nwparser.payload", "AH00112: Warning: DocumentRoot [%{web_root}] does not exist", processor_chain([ +var part47 = match("MESSAGE#45:reverseproxy:08", "nwparser.payload", "AH00112: Warning: DocumentRoot [%{web_root}] does not exist", processor_chain([ dup4, setc("event_id","AH00112"), dup2, @@ -795,8 +743,7 @@ match("MESSAGE#45:reverseproxy:08", "nwparser.payload", "AH00112: Warning: Docum var msg46 = msg("reverseproxy:08", part47); -var part48 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH00094: Command line: ''), Field(web_root,false), Constant(''')}" -match("MESSAGE#46:reverseproxy:09", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00094: Command line: '%{web_root}'", processor_chain([ +var part48 = match("MESSAGE#46:reverseproxy:09", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00094: Command line: '%{web_root}'", processor_chain([ setc("eventcategory","1605010000"), setc("event_id","AH00094"), dup2, @@ -805,8 +752,7 @@ match("MESSAGE#46:reverseproxy:09", "nwparser.payload", "[%{fld3}] [%{event_log} var msg47 = msg("reverseproxy:09", part48); -var part49 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH00291: long lost child came home! (pid '), Field(fld5,false), Constant(')')}" -match("MESSAGE#47:reverseproxy:10", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00291: long lost child came home! (pid %{fld5})", processor_chain([ +var part49 = match("MESSAGE#47:reverseproxy:10", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00291: long lost child came home! (pid %{fld5})", processor_chain([ dup12, setc("event_id","AH00291"), dup2, @@ -815,8 +761,7 @@ match("MESSAGE#47:reverseproxy:10", "nwparser.payload", "[%{fld3}] [%{event_log} var msg48 = msg("reverseproxy:10", part49); -var part50 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH02572: Failed to configure at least one certificate and key for '), Field(fld5,false), Constant(':'), Field(fld6,false)}" -match("MESSAGE#48:reverseproxy:11", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH02572: Failed to configure at least one certificate and key for %{fld5}:%{fld6}", processor_chain([ +var part50 = match("MESSAGE#48:reverseproxy:11", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH02572: Failed to configure at least one certificate and key for %{fld5}:%{fld6}", processor_chain([ dup20, setc("event_id","AH02572"), dup2, @@ -825,8 +770,7 @@ match("MESSAGE#48:reverseproxy:11", "nwparser.payload", "[%{fld3}] [%{event_log} var msg49 = msg("reverseproxy:11", part50); -var part51 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] SSL Library Error: error:'), Field(resultcode,false), Constant(':'), Field(result,false)}" -match("MESSAGE#49:reverseproxy:12", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] SSL Library Error: error:%{resultcode}:%{result}", processor_chain([ +var part51 = match("MESSAGE#49:reverseproxy:12", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] SSL Library Error: error:%{resultcode}:%{result}", processor_chain([ dup20, setc("context","SSL Library Error"), dup2, @@ -835,8 +779,7 @@ match("MESSAGE#49:reverseproxy:12", "nwparser.payload", "[%{fld3}] [%{event_log} var msg50 = msg("reverseproxy:12", part51); -var part52 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH02312: Fatal error initialising mod_ssl, '), Field(disposition,false), Constant('.')}" -match("MESSAGE#50:reverseproxy:13", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH02312: Fatal error initialising mod_ssl, %{disposition}.", processor_chain([ +var part52 = match("MESSAGE#50:reverseproxy:13", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH02312: Fatal error initialising mod_ssl, %{disposition}.", processor_chain([ dup20, setc("result","Fatal error"), setc("event_id","AH02312"), @@ -846,8 +789,7 @@ match("MESSAGE#50:reverseproxy:13", "nwparser.payload", "[%{fld3}] [%{event_log} var msg51 = msg("reverseproxy:13", part52); -var part53 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH00020: Configuration Failed, '), Field(disposition,false)}" -match("MESSAGE#51:reverseproxy:14", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00020: Configuration Failed, %{disposition}", processor_chain([ +var part53 = match("MESSAGE#51:reverseproxy:14", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00020: Configuration Failed, %{disposition}", processor_chain([ dup20, setc("result","Configuration Failed"), setc("event_id","AH00020"), @@ -857,8 +799,7 @@ match("MESSAGE#51:reverseproxy:14", "nwparser.payload", "[%{fld3}] [%{event_log} var msg52 = msg("reverseproxy:14", part53); -var part54 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH00098: pid file '), Field(filename,true), Constant(' overwritten -- Unclean shutdown of previous Apache run?')}" -match("MESSAGE#52:reverseproxy:15", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00098: pid file %{filename->} overwritten -- Unclean shutdown of previous Apache run?", processor_chain([ +var part54 = match("MESSAGE#52:reverseproxy:15", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00098: pid file %{filename->} overwritten -- Unclean shutdown of previous Apache run?", processor_chain([ setc("eventcategory","1609000000"), setc("context","Unclean shutdown"), setc("event_id","AH00098"), @@ -868,8 +809,7 @@ match("MESSAGE#52:reverseproxy:15", "nwparser.payload", "[%{fld3}] [%{event_log} var msg53 = msg("reverseproxy:15", part54); -var part55 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH00295: caught '), Field(action,false), Constant(', '), Field(disposition,false)}" -match("MESSAGE#53:reverseproxy:16", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00295: caught %{action}, %{disposition}", processor_chain([ +var part55 = match("MESSAGE#53:reverseproxy:16", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00295: caught %{action}, %{disposition}", processor_chain([ dup16, setc("event_id","AH00295"), dup2, @@ -878,19 +818,16 @@ match("MESSAGE#53:reverseproxy:16", "nwparser.payload", "[%{fld3}] [%{event_log} var msg54 = msg("reverseproxy:16", part55); -var part56 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(result,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ModSecurity: Warning. '), Field(rulename,true), Constant(' [file "'), Field(filename,false), Constant('"] [line "'), Field(fld5,false), Constant('"] [id "'), Field(rule,false), Constant('"]'), Field(p0,false)}" -match("MESSAGE#54:reverseproxy:17/0", "nwparser.payload", "[%{fld3}] [%{event_log}:%{result}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: Warning. %{rulename->} [file \"%{filename}\"] [line \"%{fld5}\"] [id \"%{rule}\"]%{p0}"); +var part56 = match("MESSAGE#54:reverseproxy:17/0", "nwparser.payload", "[%{fld3}] [%{event_log}:%{result}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: Warning. %{rulename->} [file \"%{filename}\"] [line \"%{fld5}\"] [id \"%{rule}\"]%{p0}"); -var part57 = // "Pattern{Constant(' [rev "'), Field(fld6,false), Constant('"]'), Field(p0,false)}" -match("MESSAGE#54:reverseproxy:17/1_0", "nwparser.p0", " [rev \"%{fld6}\"]%{p0}"); +var part57 = match("MESSAGE#54:reverseproxy:17/1_0", "nwparser.p0", " [rev \"%{fld6}\"]%{p0}"); var select5 = linear_select([ part57, dup19, ]); -var part58 = // "Pattern{Field(,false), Constant('[msg "'), Field(comments,false), Constant('"] [data "'), Field(daddr,false), Constant('"] [severity "'), Field(severity,false), Constant('"] [ver "'), Field(policyname,false), Constant('"] [maturity "'), Field(fld7,false), Constant('"] [accuracy "'), Field(fld8,false), Constant('"] '), Field(context,true), Constant(' [hostname "'), Field(dhost,false), Constant('"] [uri "'), Field(web_root,false), Constant('"] [unique_id "'), Field(operation_id,false), Constant('"]')}" -match("MESSAGE#54:reverseproxy:17/2", "nwparser.p0", "%{}[msg \"%{comments}\"] [data \"%{daddr}\"] [severity \"%{severity}\"] [ver \"%{policyname}\"] [maturity \"%{fld7}\"] [accuracy \"%{fld8}\"] %{context->} [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]"); +var part58 = match("MESSAGE#54:reverseproxy:17/2", "nwparser.p0", "%{}[msg \"%{comments}\"] [data \"%{daddr}\"] [severity \"%{severity}\"] [ver \"%{policyname}\"] [maturity \"%{fld7}\"] [accuracy \"%{fld8}\"] %{context->} [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]"); var all2 = all_match({ processors: [ @@ -907,8 +844,7 @@ var all2 = all_match({ var msg55 = msg("reverseproxy:17", all2); -var part59 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] No signature found, cookie: '), Field(fld5,false)}" -match("MESSAGE#55:reverseproxy:18", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] No signature found, cookie: %{fld5}", processor_chain([ +var part59 = match("MESSAGE#55:reverseproxy:18", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] No signature found, cookie: %{fld5}", processor_chain([ dup4, dup22, dup2, @@ -917,8 +853,7 @@ match("MESSAGE#55:reverseproxy:18", "nwparser.payload", "[%{fld3}] [%{event_log} var msg56 = msg("reverseproxy:18", part59); -var part60 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] '), Field(disposition,true), Constant(' ''), Field(fld5,false), Constant('' from request due to missing/invalid signature')}" -match("MESSAGE#56:reverseproxy:19", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] %{disposition->} '%{fld5}' from request due to missing/invalid signature", processor_chain([ +var part60 = match("MESSAGE#56:reverseproxy:19", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] %{disposition->} '%{fld5}' from request due to missing/invalid signature", processor_chain([ dup23, dup22, dup2, @@ -927,8 +862,7 @@ match("MESSAGE#56:reverseproxy:19", "nwparser.payload", "[%{fld3}] [%{event_log} var msg57 = msg("reverseproxy:19", part60); -var part61 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ModSecurity: Warning. '), Field(rulename,true), Constant(' [file "'), Field(filename,false), Constant('"] [line "'), Field(fld5,false), Constant('"] [id "'), Field(rule,false), Constant('"] [msg "'), Field(comments,false), Constant('"] [hostname "'), Field(dhost,false), Constant('"] [uri "'), Field(web_root,false), Constant('"] [unique_id "'), Field(operation_id,false), Constant('"]')}" -match("MESSAGE#57:reverseproxy:20", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: Warning. %{rulename->} [file \"%{filename}\"] [line \"%{fld5}\"] [id \"%{rule}\"] [msg \"%{comments}\"] [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ +var part61 = match("MESSAGE#57:reverseproxy:20", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: Warning. %{rulename->} [file \"%{filename}\"] [line \"%{fld5}\"] [id \"%{rule}\"] [msg \"%{comments}\"] [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ dup21, dup2, dup3, @@ -936,8 +870,7 @@ match("MESSAGE#57:reverseproxy:20", "nwparser.payload", "[%{fld3}] [%{event_log} var msg58 = msg("reverseproxy:20", part61); -var part62 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH01909: '), Field(daddr,false), Constant(':'), Field(dport,false), Constant(':'), Field(fld5,true), Constant(' server certificate does NOT include an ID which matches the server name')}" -match("MESSAGE#58:reverseproxy:21", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH01909: %{daddr}:%{dport}:%{fld5->} server certificate does NOT include an ID which matches the server name", processor_chain([ +var part62 = match("MESSAGE#58:reverseproxy:21", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH01909: %{daddr}:%{dport}:%{fld5->} server certificate does NOT include an ID which matches the server name", processor_chain([ dup20, dup18, setc("event_id","AH01909"), @@ -947,8 +880,7 @@ match("MESSAGE#58:reverseproxy:21", "nwparser.payload", "[%{fld3}] [%{event_log} var msg59 = msg("reverseproxy:21", part62); -var part63 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH01915: Init: ('), Field(daddr,false), Constant(':'), Field(dport,false), Constant(') You configured '), Field(network_service,false), Constant('('), Field(fld5,false), Constant(') on the '), Field(fld6,false), Constant('('), Field(fld7,false), Constant(') port!')}" -match("MESSAGE#59:reverseproxy:22", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH01915: Init: (%{daddr}:%{dport}) You configured %{network_service}(%{fld5}) on the %{fld6}(%{fld7}) port!", processor_chain([ +var part63 = match("MESSAGE#59:reverseproxy:22", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH01915: Init: (%{daddr}:%{dport}) You configured %{network_service}(%{fld5}) on the %{fld6}(%{fld7}) port!", processor_chain([ dup20, setc("comments","Invalid port configuration"), dup2, @@ -957,8 +889,7 @@ match("MESSAGE#59:reverseproxy:22", "nwparser.payload", "[%{fld3}] [%{event_log} var msg60 = msg("reverseproxy:22", part63); -var part64 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ModSecurity: Rule '), Field(rulename,true), Constant(' [id "'), Field(rule,false), Constant('"][file "'), Field(filename,false), Constant('"][line "'), Field(fld5,false), Constant('"] - Execution error - PCRE limits exceeded ('), Field(fld6,false), Constant('): ('), Field(fld7,false), Constant('). [hostname "'), Field(dhost,false), Constant('"] [uri "'), Field(web_root,false), Constant('"] [unique_id "'), Field(operation_id,false), Constant('"]')}" -match("MESSAGE#60:reverseproxy:23", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: Rule %{rulename->} [id \"%{rule}\"][file \"%{filename}\"][line \"%{fld5}\"] - Execution error - PCRE limits exceeded (%{fld6}): (%{fld7}). [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ +var part64 = match("MESSAGE#60:reverseproxy:23", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: Rule %{rulename->} [id \"%{rule}\"][file \"%{filename}\"][line \"%{fld5}\"] - Execution error - PCRE limits exceeded (%{fld6}): (%{fld7}). [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ dup21, dup2, dup3, @@ -966,8 +897,7 @@ match("MESSAGE#60:reverseproxy:23", "nwparser.payload", "[%{fld3}] [%{event_log} var msg61 = msg("reverseproxy:23", part64); -var part65 = // "Pattern{Constant('rManage\\x22,\\x22manageLiveSystemSettings\\x22,\\x22accessViewJobs\\x22,\\x22exportList\\..."] [ver "'), Field(policyname,false), Constant('"] [maturity "'), Field(fld3,false), Constant('"] [accuracy "'), Field(fld4,false), Constant('"] '), Field(context,true), Constant(' [hostname "'), Field(dhost,false), Constant('"] [uri "'), Field(web_root,false), Constant('"] [unique_id "'), Field(operation_id,false), Constant('"]')}" -match("MESSAGE#61:reverseproxy:24", "nwparser.payload", "rManage\\\\x22,\\\\x22manageLiveSystemSettings\\\\x22,\\\\x22accessViewJobs\\\\x22,\\\\x22exportList\\\\...\"] [ver \"%{policyname}\"] [maturity \"%{fld3}\"] [accuracy \"%{fld4}\"] %{context->} [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ +var part65 = match("MESSAGE#61:reverseproxy:24", "nwparser.payload", "rManage\\\\x22,\\\\x22manageLiveSystemSettings\\\\x22,\\\\x22accessViewJobs\\\\x22,\\\\x22exportList\\\\...\"] [ver \"%{policyname}\"] [maturity \"%{fld3}\"] [accuracy \"%{fld4}\"] %{context->} [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ dup21, dup2, dup3, @@ -975,8 +905,7 @@ match("MESSAGE#61:reverseproxy:24", "nwparser.payload", "rManage\\\\x22,\\\\x22m var msg62 = msg("reverseproxy:24", part65); -var part66 = // "Pattern{Constant('ARGS:userPermissions: [\\x22dashletAccessAlertingRecentAlertsPanel\\x22,\\x22dashletAccessAlerterTopAlertsDashlet\\x22,\\x22accessViewRules\\x22,\\x22deployLiveResources\\x22,\\x22vi..."] [severity [hostname "'), Field(dhost,false), Constant('"] [uri "'), Field(web_root,false), Constant('"] [unique_id "'), Field(operation_id,false), Constant('"]')}" -match("MESSAGE#62:reverseproxy:25", "nwparser.payload", "ARGS:userPermissions: [\\\\x22dashletAccessAlertingRecentAlertsPanel\\\\x22,\\\\x22dashletAccessAlerterTopAlertsDashlet\\\\x22,\\\\x22accessViewRules\\\\x22,\\\\x22deployLiveResources\\\\x22,\\\\x22vi...\"] [severity [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ +var part66 = match("MESSAGE#62:reverseproxy:25", "nwparser.payload", "ARGS:userPermissions: [\\\\x22dashletAccessAlertingRecentAlertsPanel\\\\x22,\\\\x22dashletAccessAlerterTopAlertsDashlet\\\\x22,\\\\x22accessViewRules\\\\x22,\\\\x22deployLiveResources\\\\x22,\\\\x22vi...\"] [severity [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]", processor_chain([ dup21, dup2, dup3, @@ -984,33 +913,27 @@ match("MESSAGE#62:reverseproxy:25", "nwparser.payload", "ARGS:userPermissions: [ var msg63 = msg("reverseproxy:25", part66); -var part67 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ModSecurity: '), Field(disposition,true), Constant(' with code '), Field(resultcode,true), Constant(' ('), Field(fld5,false), Constant('). '), Field(rulename,true), Constant(' [file "'), Field(filename,false), Constant('"] [line "'), Field(fld6,false), Constant('"] [id "'), Field(rule,false), Constant('"]'), Field(p0,false)}" -match("MESSAGE#63:reverseproxy:26/0", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: %{disposition->} with code %{resultcode->} (%{fld5}). %{rulename->} [file \"%{filename}\"] [line \"%{fld6}\"] [id \"%{rule}\"]%{p0}"); +var part67 = match("MESSAGE#63:reverseproxy:26/0", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] ModSecurity: %{disposition->} with code %{resultcode->} (%{fld5}). %{rulename->} [file \"%{filename}\"] [line \"%{fld6}\"] [id \"%{rule}\"]%{p0}"); -var part68 = // "Pattern{Constant(' [rev "'), Field(fld7,false), Constant('"]'), Field(p0,false)}" -match("MESSAGE#63:reverseproxy:26/1_0", "nwparser.p0", " [rev \"%{fld7}\"]%{p0}"); +var part68 = match("MESSAGE#63:reverseproxy:26/1_0", "nwparser.p0", " [rev \"%{fld7}\"]%{p0}"); var select6 = linear_select([ part68, dup19, ]); -var part69 = // "Pattern{Field(,false), Constant('[msg "'), Field(comments,false), Constant('"] [data "Last Matched Data: '), Field(p0,false)}" -match("MESSAGE#63:reverseproxy:26/2", "nwparser.p0", "%{}[msg \"%{comments}\"] [data \"Last Matched Data: %{p0}"); +var part69 = match("MESSAGE#63:reverseproxy:26/2", "nwparser.p0", "%{}[msg \"%{comments}\"] [data \"Last Matched Data: %{p0}"); -var part70 = // "Pattern{Field(daddr,false), Constant(':'), Field(dport,false), Constant('"] [hostname "'), Field(p0,false)}" -match("MESSAGE#63:reverseproxy:26/3_0", "nwparser.p0", "%{daddr}:%{dport}\"] [hostname \"%{p0}"); +var part70 = match("MESSAGE#63:reverseproxy:26/3_0", "nwparser.p0", "%{daddr}:%{dport}\"] [hostname \"%{p0}"); -var part71 = // "Pattern{Field(daddr,false), Constant('"] [hostname "'), Field(p0,false)}" -match("MESSAGE#63:reverseproxy:26/3_1", "nwparser.p0", "%{daddr}\"] [hostname \"%{p0}"); +var part71 = match("MESSAGE#63:reverseproxy:26/3_1", "nwparser.p0", "%{daddr}\"] [hostname \"%{p0}"); var select7 = linear_select([ part70, part71, ]); -var part72 = // "Pattern{Field(dhost,false), Constant('"] [uri "'), Field(web_root,false), Constant('"] [unique_id "'), Field(operation_id,false), Constant('"]')}" -match("MESSAGE#63:reverseproxy:26/4", "nwparser.p0", "%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]"); +var part72 = match("MESSAGE#63:reverseproxy:26/4", "nwparser.p0", "%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]"); var all3 = all_match({ processors: [ @@ -1029,8 +952,7 @@ var all3 = all_match({ var msg64 = msg("reverseproxy:26", all3); -var part73 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] '), Field(disposition,true), Constant(' while reading reply from cssd, referer: '), Field(web_referer,false)}" -match("MESSAGE#64:reverseproxy:27", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] %{disposition->} while reading reply from cssd, referer: %{web_referer}", processor_chain([ +var part73 = match("MESSAGE#64:reverseproxy:27", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] %{disposition->} while reading reply from cssd, referer: %{web_referer}", processor_chain([ dup25, dup2, dup3, @@ -1038,8 +960,7 @@ match("MESSAGE#64:reverseproxy:27", "nwparser.payload", "[%{fld3}] [%{event_log} var msg65 = msg("reverseproxy:27", part73); -var part74 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] virus daemon error found in request '), Field(web_root,false), Constant(', referer: '), Field(web_referer,false)}" -match("MESSAGE#65:reverseproxy:28", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] virus daemon error found in request %{web_root}, referer: %{web_referer}", processor_chain([ +var part74 = match("MESSAGE#65:reverseproxy:28", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] virus daemon error found in request %{web_root}, referer: %{web_referer}", processor_chain([ dup26, setc("result","virus daemon error"), dup2, @@ -1048,8 +969,7 @@ match("MESSAGE#65:reverseproxy:28", "nwparser.payload", "[%{fld3}] [%{event_log} var msg66 = msg("reverseproxy:28", part74); -var part75 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] mod_avscan_input_filter: virus found, referer: '), Field(web_referer,false)}" -match("MESSAGE#66:reverseproxy:29", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] mod_avscan_input_filter: virus found, referer: %{web_referer}", processor_chain([ +var part75 = match("MESSAGE#66:reverseproxy:29", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] mod_avscan_input_filter: virus found, referer: %{web_referer}", processor_chain([ dup27, setc("result","virus found"), dup2, @@ -1058,8 +978,7 @@ match("MESSAGE#66:reverseproxy:29", "nwparser.payload", "[%{fld3}] [%{event_log} var msg67 = msg("reverseproxy:29", part75); -var part76 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] (13)'), Field(result,false), Constant(': [client '), Field(gateway,false), Constant('] AH01095: prefetch request body failed to '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(fld5,false), Constant(') from '), Field(fld6,true), Constant(' (), referer: '), Field(web_referer,false)}" -match("MESSAGE#67:reverseproxy:30", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (13)%{result}: [client %{gateway}] AH01095: prefetch request body failed to %{saddr}:%{sport->} (%{fld5}) from %{fld6->} (), referer: %{web_referer}", processor_chain([ +var part76 = match("MESSAGE#67:reverseproxy:30", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (13)%{result}: [client %{gateway}] AH01095: prefetch request body failed to %{saddr}:%{sport->} (%{fld5}) from %{fld6->} (), referer: %{web_referer}", processor_chain([ dup24, dup28, dup2, @@ -1068,8 +987,7 @@ match("MESSAGE#67:reverseproxy:30", "nwparser.payload", "[%{fld3}] [%{event_log} var msg68 = msg("reverseproxy:30", part76); -var part77 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] cannot read reply: Operation now in progress (115), referer: '), Field(web_referer,false)}" -match("MESSAGE#68:reverseproxy:31", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] cannot read reply: Operation now in progress (115), referer: %{web_referer}", processor_chain([ +var part77 = match("MESSAGE#68:reverseproxy:31", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] cannot read reply: Operation now in progress (115), referer: %{web_referer}", processor_chain([ dup25, setc("result","Cannot read reply"), dup2, @@ -1078,8 +996,7 @@ match("MESSAGE#68:reverseproxy:31", "nwparser.payload", "[%{fld3}] [%{event_log} var msg69 = msg("reverseproxy:31", part77); -var part78 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] cannot connect: '), Field(result,true), Constant(' (111), referer: '), Field(web_referer,false)}" -match("MESSAGE#69:reverseproxy:32", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] cannot connect: %{result->} (111), referer: %{web_referer}", processor_chain([ +var part78 = match("MESSAGE#69:reverseproxy:32", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] cannot connect: %{result->} (111), referer: %{web_referer}", processor_chain([ dup25, dup2, dup3, @@ -1087,8 +1004,7 @@ match("MESSAGE#69:reverseproxy:32", "nwparser.payload", "[%{fld3}] [%{event_log} var msg70 = msg("reverseproxy:32", part78); -var part79 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] cannot connect: '), Field(result,true), Constant(' (111)')}" -match("MESSAGE#70:reverseproxy:33", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] cannot connect: %{result->} (111)", processor_chain([ +var part79 = match("MESSAGE#70:reverseproxy:33", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] cannot connect: %{result->} (111)", processor_chain([ dup25, dup2, dup3, @@ -1096,8 +1012,7 @@ match("MESSAGE#70:reverseproxy:33", "nwparser.payload", "[%{fld3}] [%{event_log} var msg71 = msg("reverseproxy:33", part79); -var part80 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] virus daemon connection problem found in request '), Field(url,false), Constant(', referer: '), Field(web_referer,false)}" -match("MESSAGE#71:reverseproxy:34", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] virus daemon connection problem found in request %{url}, referer: %{web_referer}", processor_chain([ +var part80 = match("MESSAGE#71:reverseproxy:34", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] virus daemon connection problem found in request %{url}, referer: %{web_referer}", processor_chain([ dup26, dup29, dup2, @@ -1106,8 +1021,7 @@ match("MESSAGE#71:reverseproxy:34", "nwparser.payload", "[%{fld3}] [%{event_log} var msg72 = msg("reverseproxy:34", part80); -var part81 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] virus daemon connection problem found in request '), Field(url,false)}" -match("MESSAGE#72:reverseproxy:35", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] virus daemon connection problem found in request %{url}", processor_chain([ +var part81 = match("MESSAGE#72:reverseproxy:35", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] virus daemon connection problem found in request %{url}", processor_chain([ dup26, dup29, dup2, @@ -1116,8 +1030,7 @@ match("MESSAGE#72:reverseproxy:35", "nwparser.payload", "[%{fld3}] [%{event_log} var msg73 = msg("reverseproxy:35", part81); -var part82 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] mod_avscan_input_filter: virus found')}" -match("MESSAGE#73:reverseproxy:36", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] mod_avscan_input_filter: virus found", processor_chain([ +var part82 = match("MESSAGE#73:reverseproxy:36", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] mod_avscan_input_filter: virus found", processor_chain([ dup27, setc("result","Virus found"), dup2, @@ -1126,8 +1039,7 @@ match("MESSAGE#73:reverseproxy:36", "nwparser.payload", "[%{fld3}] [%{event_log} var msg74 = msg("reverseproxy:36", part82); -var part83 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] (13)'), Field(result,false), Constant(': [client '), Field(gateway,false), Constant('] AH01095: prefetch request body failed to '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' ('), Field(fld5,false), Constant(') from '), Field(fld6,true), Constant(' ()')}" -match("MESSAGE#74:reverseproxy:37", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (13)%{result}: [client %{gateway}] AH01095: prefetch request body failed to %{saddr}:%{sport->} (%{fld5}) from %{fld6->} ()", processor_chain([ +var part83 = match("MESSAGE#74:reverseproxy:37", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (13)%{result}: [client %{gateway}] AH01095: prefetch request body failed to %{saddr}:%{sport->} (%{fld5}) from %{fld6->} ()", processor_chain([ dup24, dup28, dup2, @@ -1136,8 +1048,7 @@ match("MESSAGE#74:reverseproxy:37", "nwparser.payload", "[%{fld3}] [%{event_log} var msg75 = msg("reverseproxy:37", part83); -var part84 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] Invalid signature, cookie: JSESSIONID')}" -match("MESSAGE#75:reverseproxy:38", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] Invalid signature, cookie: JSESSIONID", processor_chain([ +var part84 = match("MESSAGE#75:reverseproxy:38", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] Invalid signature, cookie: JSESSIONID", processor_chain([ dup25, dup2, dup3, @@ -1145,8 +1056,7 @@ match("MESSAGE#75:reverseproxy:38", "nwparser.payload", "[%{fld3}] [%{event_log} var msg76 = msg("reverseproxy:38", part84); -var part85 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] Form validation failed: Received unhardened form data, referer: '), Field(web_referer,false)}" -match("MESSAGE#76:reverseproxy:39", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] Form validation failed: Received unhardened form data, referer: %{web_referer}", processor_chain([ +var part85 = match("MESSAGE#76:reverseproxy:39", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] Form validation failed: Received unhardened form data, referer: %{web_referer}", processor_chain([ dup23, setc("result","Form validation failed"), dup2, @@ -1155,8 +1065,7 @@ match("MESSAGE#76:reverseproxy:39", "nwparser.payload", "[%{fld3}] [%{event_log} var msg77 = msg("reverseproxy:39", part85); -var part86 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] sending trickle failed: 103')}" -match("MESSAGE#77:reverseproxy:40", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] sending trickle failed: 103", processor_chain([ +var part86 = match("MESSAGE#77:reverseproxy:40", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] sending trickle failed: 103", processor_chain([ dup25, setc("result","Sending trickle failed"), dup2, @@ -1165,8 +1074,7 @@ match("MESSAGE#77:reverseproxy:40", "nwparser.payload", "[%{fld3}] [%{event_log} var msg78 = msg("reverseproxy:40", part86); -var part87 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] client requesting '), Field(web_root,true), Constant(' has '), Field(disposition,false)}" -match("MESSAGE#78:reverseproxy:41", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] client requesting %{web_root->} has %{disposition}", processor_chain([ +var part87 = match("MESSAGE#78:reverseproxy:41", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] client requesting %{web_root->} has %{disposition}", processor_chain([ dup30, dup2, dup3, @@ -1174,8 +1082,7 @@ match("MESSAGE#78:reverseproxy:41", "nwparser.payload", "[%{fld3}] [%{event_log} var msg79 = msg("reverseproxy:41", part87); -var part88 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] mod_avscan_check_file_single_part() called with parameter filename='), Field(filename,false)}" -match("MESSAGE#79:reverseproxy:42", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] mod_avscan_check_file_single_part() called with parameter filename=%{filename}", processor_chain([ +var part88 = match("MESSAGE#79:reverseproxy:42", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] mod_avscan_check_file_single_part() called with parameter filename=%{filename}", processor_chain([ setc("eventcategory","1603050000"), dup2, dup3, @@ -1183,8 +1090,7 @@ match("MESSAGE#79:reverseproxy:42", "nwparser.payload", "[%{fld3}] [%{event_log} var msg80 = msg("reverseproxy:42", part88); -var part89 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] (70007)The '), Field(disposition,true), Constant(' specified has expired: [client '), Field(gateway,false), Constant('] AH01110: error reading response')}" -match("MESSAGE#80:reverseproxy:43", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (70007)The %{disposition->} specified has expired: [client %{gateway}] AH01110: error reading response", processor_chain([ +var part89 = match("MESSAGE#80:reverseproxy:43", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (70007)The %{disposition->} specified has expired: [client %{gateway}] AH01110: error reading response", processor_chain([ dup30, setc("event_id","AH01110"), setc("result","Error reading response"), @@ -1194,8 +1100,7 @@ match("MESSAGE#80:reverseproxy:43", "nwparser.payload", "[%{fld3}] [%{event_log} var msg81 = msg("reverseproxy:43", part89); -var part90 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] (22)'), Field(result,false), Constant(': [client '), Field(gateway,false), Constant('] No form context found when parsing '), Field(fld5,true), Constant(' tag, referer: '), Field(web_referer,false)}" -match("MESSAGE#81:reverseproxy:44", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (22)%{result}: [client %{gateway}] No form context found when parsing %{fld5->} tag, referer: %{web_referer}", processor_chain([ +var part90 = match("MESSAGE#81:reverseproxy:44", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (22)%{result}: [client %{gateway}] No form context found when parsing %{fld5->} tag, referer: %{web_referer}", processor_chain([ setc("eventcategory","1601020000"), setc("result","No form context found"), dup2, @@ -1204,8 +1109,7 @@ match("MESSAGE#81:reverseproxy:44", "nwparser.payload", "[%{fld3}] [%{event_log} var msg82 = msg("reverseproxy:44", part90); -var part91 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] (111)'), Field(result,false), Constant(': AH00957: '), Field(network_service,false), Constant(': attempt to connect to '), Field(daddr,false), Constant(':'), Field(dport,true), Constant(' ('), Field(fld5,false), Constant(') failed')}" -match("MESSAGE#82:reverseproxy:45", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (111)%{result}: AH00957: %{network_service}: attempt to connect to %{daddr}:%{dport->} (%{fld5}) failed", processor_chain([ +var part91 = match("MESSAGE#82:reverseproxy:45", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] (111)%{result}: AH00957: %{network_service}: attempt to connect to %{daddr}:%{dport->} (%{fld5}) failed", processor_chain([ dup25, setc("event_id","AH00957"), dup2, @@ -1214,8 +1118,7 @@ match("MESSAGE#82:reverseproxy:45", "nwparser.payload", "[%{fld3}] [%{event_log} var msg83 = msg("reverseproxy:45", part91); -var part92 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] AH00959: ap_proxy_connect_backend disabling worker for ('), Field(daddr,false), Constant(') for '), Field(processing_time,false), Constant('s')}" -match("MESSAGE#83:reverseproxy:46", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00959: ap_proxy_connect_backend disabling worker for (%{daddr}) for %{processing_time}s", processor_chain([ +var part92 = match("MESSAGE#83:reverseproxy:46", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] AH00959: ap_proxy_connect_backend disabling worker for (%{daddr}) for %{processing_time}s", processor_chain([ dup16, setc("event_id","AH00959"), setc("result","disabling worker"), @@ -1225,8 +1128,7 @@ match("MESSAGE#83:reverseproxy:46", "nwparser.payload", "[%{fld3}] [%{event_log} var msg84 = msg("reverseproxy:46", part92); -var part93 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ['), Field(fld5,false), Constant('] not all the file sent to the client: '), Field(fld6,false), Constant(', referer: '), Field(web_referer,false)}" -match("MESSAGE#84:reverseproxy:47", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] not all the file sent to the client: %{fld6}, referer: %{web_referer}", processor_chain([ +var part93 = match("MESSAGE#84:reverseproxy:47", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] [%{fld5}] not all the file sent to the client: %{fld6}, referer: %{web_referer}", processor_chain([ setc("eventcategory","1801000000"), setc("context","Not all file sent to client"), dup2, @@ -1235,8 +1137,7 @@ match("MESSAGE#84:reverseproxy:47", "nwparser.payload", "[%{fld3}] [%{event_log} var msg85 = msg("reverseproxy:47", part93); -var part94 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] AH01114: '), Field(network_service,false), Constant(': failed to make connection to backend: '), Field(daddr,false), Constant(', referer: '), Field(web_referer,false)}" -match("MESSAGE#85:reverseproxy:48", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] AH01114: %{network_service}: failed to make connection to backend: %{daddr}, referer: %{web_referer}", processor_chain([ +var part94 = match("MESSAGE#85:reverseproxy:48", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] AH01114: %{network_service}: failed to make connection to backend: %{daddr}, referer: %{web_referer}", processor_chain([ dup25, dup31, dup32, @@ -1246,8 +1147,7 @@ match("MESSAGE#85:reverseproxy:48", "nwparser.payload", "[%{fld3}] [%{event_log} var msg86 = msg("reverseproxy:48", part94); -var part95 = // "Pattern{Constant('['), Field(fld3,false), Constant('] ['), Field(event_log,false), Constant(':'), Field(severity,false), Constant('] [pid '), Field(process_id,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] AH01114: '), Field(network_service,false), Constant(': failed to make connection to backend: '), Field(daddr,false)}" -match("MESSAGE#86:reverseproxy:49", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] AH01114: %{network_service}: failed to make connection to backend: %{daddr}", processor_chain([ +var part95 = match("MESSAGE#86:reverseproxy:49", "nwparser.payload", "[%{fld3}] [%{event_log}:%{severity}] [pid %{process_id}:%{fld4}] [client %{gateway}] AH01114: %{network_service}: failed to make connection to backend: %{daddr}", processor_chain([ dup25, dup31, dup32, @@ -1376,8 +1276,7 @@ var part98 = tagval("MESSAGE#89:confd:01", "nwparser.payload", tvm, { var msg90 = msg("confd:01", part98); -var part99 = // "Pattern{Constant('Frox started'), Field(,false)}" -match("MESSAGE#90:frox", "nwparser.payload", "Frox started%{}", processor_chain([ +var part99 = match("MESSAGE#90:frox", "nwparser.payload", "Frox started%{}", processor_chain([ dup12, setc("event_description","frox:FTP Proxy Frox started."), dup11, @@ -1386,8 +1285,7 @@ match("MESSAGE#90:frox", "nwparser.payload", "Frox started%{}", processor_chain( var msg91 = msg("frox", part99); -var part100 = // "Pattern{Constant('Listening on '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#91:frox:01", "nwparser.payload", "Listening on %{saddr}:%{sport}", processor_chain([ +var part100 = match("MESSAGE#91:frox:01", "nwparser.payload", "Listening on %{saddr}:%{sport}", processor_chain([ dup12, setc("event_description","frox:FTP Proxy listening on port."), dup11, @@ -1396,8 +1294,7 @@ match("MESSAGE#91:frox:01", "nwparser.payload", "Listening on %{saddr}:%{sport}" var msg92 = msg("frox:01", part100); -var part101 = // "Pattern{Constant('Dropped privileges'), Field(,false)}" -match("MESSAGE#92:frox:02", "nwparser.payload", "Dropped privileges%{}", processor_chain([ +var part101 = match("MESSAGE#92:frox:02", "nwparser.payload", "Dropped privileges%{}", processor_chain([ dup12, setc("event_description","frox:FTP Proxy dropped priveleges."), dup11, @@ -1412,8 +1309,7 @@ var select9 = linear_select([ msg93, ]); -var part102 = // "Pattern{Constant('Classifier configuration reloaded successfully'), Field(,false)}" -match("MESSAGE#93:afcd", "nwparser.payload", "Classifier configuration reloaded successfully%{}", processor_chain([ +var part102 = match("MESSAGE#93:afcd", "nwparser.payload", "Classifier configuration reloaded successfully%{}", processor_chain([ dup12, setc("event_description","afcd: IM/P2P Classifier configuration reloaded successfully."), dup11, @@ -1422,8 +1318,7 @@ match("MESSAGE#93:afcd", "nwparser.payload", "Classifier configuration reloaded var msg94 = msg("afcd", part102); -var part103 = // "Pattern{Constant('Starting strongSwan '), Field(fld2,true), Constant(' IPsec [starter]...')}" -match("MESSAGE#94:ipsec_starter", "nwparser.payload", "Starting strongSwan %{fld2->} IPsec [starter]...", processor_chain([ +var part103 = match("MESSAGE#94:ipsec_starter", "nwparser.payload", "Starting strongSwan %{fld2->} IPsec [starter]...", processor_chain([ dup12, setc("event_description","ipsec_starter: Starting strongSwan 4.2.3 IPsec [starter]..."), dup11, @@ -1432,8 +1327,7 @@ match("MESSAGE#94:ipsec_starter", "nwparser.payload", "Starting strongSwan %{fld var msg95 = msg("ipsec_starter", part103); -var part104 = // "Pattern{Constant('IP address or index of physical interface changed -> reinit of ipsec interface'), Field(,false)}" -match("MESSAGE#95:ipsec_starter:01", "nwparser.payload", "IP address or index of physical interface changed -> reinit of ipsec interface%{}", processor_chain([ +var part104 = match("MESSAGE#95:ipsec_starter:01", "nwparser.payload", "IP address or index of physical interface changed -> reinit of ipsec interface%{}", processor_chain([ dup12, setc("event_description","ipsec_starter: IP address or index of physical interface changed."), dup11, @@ -1447,8 +1341,7 @@ var select10 = linear_select([ msg96, ]); -var part105 = // "Pattern{Constant('Starting Pluto ('), Field(info,false), Constant(')')}" -match("MESSAGE#96:pluto", "nwparser.payload", "Starting Pluto (%{info})", processor_chain([ +var part105 = match("MESSAGE#96:pluto", "nwparser.payload", "Starting Pluto (%{info})", processor_chain([ dup12, setc("event_description","pluto: Starting Pluto."), dup11, @@ -1457,8 +1350,7 @@ match("MESSAGE#96:pluto", "nwparser.payload", "Starting Pluto (%{info})", proces var msg97 = msg("pluto", part105); -var part106 = // "Pattern{Constant('including NAT-Traversal patch ('), Field(info,false), Constant(')')}" -match("MESSAGE#97:pluto:01", "nwparser.payload", "including NAT-Traversal patch (%{info})", processor_chain([ +var part106 = match("MESSAGE#97:pluto:01", "nwparser.payload", "including NAT-Traversal patch (%{info})", processor_chain([ dup12, setc("event_description","pluto: including NAT-Traversal patch."), dup11, @@ -1467,8 +1359,7 @@ match("MESSAGE#97:pluto:01", "nwparser.payload", "including NAT-Traversal patch var msg98 = msg("pluto:01", part106); -var part107 = // "Pattern{Constant('ike_alg: Activating '), Field(info,true), Constant(' encryption: Ok')}" -match("MESSAGE#98:pluto:02", "nwparser.payload", "ike_alg: Activating %{info->} encryption: Ok", processor_chain([ +var part107 = match("MESSAGE#98:pluto:02", "nwparser.payload", "ike_alg: Activating %{info->} encryption: Ok", processor_chain([ dup33, setc("event_description","pluto: Activating encryption algorithm."), dup11, @@ -1477,8 +1368,7 @@ match("MESSAGE#98:pluto:02", "nwparser.payload", "ike_alg: Activating %{info->} var msg99 = msg("pluto:02", part107); -var part108 = // "Pattern{Constant('ike_alg: Activating '), Field(info,true), Constant(' hash: Ok')}" -match("MESSAGE#99:pluto:03", "nwparser.payload", "ike_alg: Activating %{info->} hash: Ok", processor_chain([ +var part108 = match("MESSAGE#99:pluto:03", "nwparser.payload", "ike_alg: Activating %{info->} hash: Ok", processor_chain([ dup33, setc("event_description","pluto: Activating hash algorithm."), dup11, @@ -1487,8 +1377,7 @@ match("MESSAGE#99:pluto:03", "nwparser.payload", "ike_alg: Activating %{info->} var msg100 = msg("pluto:03", part108); -var part109 = // "Pattern{Constant('Testing registered IKE encryption algorithms:'), Field(,false)}" -match("MESSAGE#100:pluto:04", "nwparser.payload", "Testing registered IKE encryption algorithms:%{}", processor_chain([ +var part109 = match("MESSAGE#100:pluto:04", "nwparser.payload", "Testing registered IKE encryption algorithms:%{}", processor_chain([ dup12, setc("event_description","pluto: Testing registered IKE encryption algorithms"), dup11, @@ -1497,8 +1386,7 @@ match("MESSAGE#100:pluto:04", "nwparser.payload", "Testing registered IKE encryp var msg101 = msg("pluto:04", part109); -var part110 = // "Pattern{Field(info,true), Constant(' self-test not available')}" -match("MESSAGE#101:pluto:05", "nwparser.payload", "%{info->} self-test not available", processor_chain([ +var part110 = match("MESSAGE#101:pluto:05", "nwparser.payload", "%{info->} self-test not available", processor_chain([ dup12, setc("event_description","pluto: Algorithm self-test not available."), dup11, @@ -1507,8 +1395,7 @@ match("MESSAGE#101:pluto:05", "nwparser.payload", "%{info->} self-test not avail var msg102 = msg("pluto:05", part110); -var part111 = // "Pattern{Field(info,true), Constant(' self-test passed')}" -match("MESSAGE#102:pluto:06", "nwparser.payload", "%{info->} self-test passed", processor_chain([ +var part111 = match("MESSAGE#102:pluto:06", "nwparser.payload", "%{info->} self-test passed", processor_chain([ dup12, setc("event_description","pluto: Algorithm self-test passed."), dup11, @@ -1517,8 +1404,7 @@ match("MESSAGE#102:pluto:06", "nwparser.payload", "%{info->} self-test passed", var msg103 = msg("pluto:06", part111); -var part112 = // "Pattern{Constant('Using KLIPS IPsec interface code'), Field(,false)}" -match("MESSAGE#103:pluto:07", "nwparser.payload", "Using KLIPS IPsec interface code%{}", processor_chain([ +var part112 = match("MESSAGE#103:pluto:07", "nwparser.payload", "Using KLIPS IPsec interface code%{}", processor_chain([ dup12, setc("event_description","pluto: Using KLIPS IPsec interface code"), dup11, @@ -1527,8 +1413,7 @@ match("MESSAGE#103:pluto:07", "nwparser.payload", "Using KLIPS IPsec interface c var msg104 = msg("pluto:07", part112); -var part113 = // "Pattern{Constant('adding interface '), Field(interface,true), Constant(' '), Field(saddr,false), Constant(':'), Field(sport,false)}" -match("MESSAGE#104:pluto:08", "nwparser.payload", "adding interface %{interface->} %{saddr}:%{sport}", processor_chain([ +var part113 = match("MESSAGE#104:pluto:08", "nwparser.payload", "adding interface %{interface->} %{saddr}:%{sport}", processor_chain([ dup12, setc("event_description","pluto: adding interface"), dup11, @@ -1537,8 +1422,7 @@ match("MESSAGE#104:pluto:08", "nwparser.payload", "adding interface %{interface- var msg105 = msg("pluto:08", part113); -var part114 = // "Pattern{Constant('loading secrets from "'), Field(filename,false), Constant('"')}" -match("MESSAGE#105:pluto:09", "nwparser.payload", "loading secrets from \"%{filename}\"", processor_chain([ +var part114 = match("MESSAGE#105:pluto:09", "nwparser.payload", "loading secrets from \"%{filename}\"", processor_chain([ dup34, setc("event_description","pluto: loading secrets"), dup11, @@ -1547,8 +1431,7 @@ match("MESSAGE#105:pluto:09", "nwparser.payload", "loading secrets from \"%{file var msg106 = msg("pluto:09", part114); -var part115 = // "Pattern{Constant('loaded private key file ''), Field(filename,false), Constant('' ('), Field(filename_size,true), Constant(' bytes)')}" -match("MESSAGE#106:pluto:10", "nwparser.payload", "loaded private key file '%{filename}' (%{filename_size->} bytes)", processor_chain([ +var part115 = match("MESSAGE#106:pluto:10", "nwparser.payload", "loaded private key file '%{filename}' (%{filename_size->} bytes)", processor_chain([ dup34, setc("event_description","pluto: loaded private key file"), dup11, @@ -1557,8 +1440,7 @@ match("MESSAGE#106:pluto:10", "nwparser.payload", "loaded private key file '%{fi var msg107 = msg("pluto:10", part115); -var part116 = // "Pattern{Constant('added connection description "'), Field(fld2,false), Constant('"')}" -match("MESSAGE#107:pluto:11", "nwparser.payload", "added connection description \"%{fld2}\"", processor_chain([ +var part116 = match("MESSAGE#107:pluto:11", "nwparser.payload", "added connection description \"%{fld2}\"", processor_chain([ dup12, setc("event_description","pluto: added connection description"), dup11, @@ -1567,8 +1449,7 @@ match("MESSAGE#107:pluto:11", "nwparser.payload", "added connection description var msg108 = msg("pluto:11", part116); -var part117 = // "Pattern{Constant('"'), Field(fld2,false), Constant('" #'), Field(fld3,false), Constant(': initiating Main Mode')}" -match("MESSAGE#108:pluto:12", "nwparser.payload", "\"%{fld2}\" #%{fld3}: initiating Main Mode", processor_chain([ +var part117 = match("MESSAGE#108:pluto:12", "nwparser.payload", "\"%{fld2}\" #%{fld3}: initiating Main Mode", processor_chain([ dup12, dup35, dup11, @@ -1577,8 +1458,7 @@ match("MESSAGE#108:pluto:12", "nwparser.payload", "\"%{fld2}\" #%{fld3}: initiat var msg109 = msg("pluto:12", part117); -var part118 = // "Pattern{Constant('"'), Field(fld2,false), Constant('" #'), Field(fld3,false), Constant(': max number of retransmissions ('), Field(fld4,false), Constant(') reached STATE_MAIN_I1. No response (or no acceptable response) to our first IKE message')}" -match("MESSAGE#109:pluto:13", "nwparser.payload", "\"%{fld2}\" #%{fld3}: max number of retransmissions (%{fld4}) reached STATE_MAIN_I1. No response (or no acceptable response) to our first IKE message", processor_chain([ +var part118 = match("MESSAGE#109:pluto:13", "nwparser.payload", "\"%{fld2}\" #%{fld3}: max number of retransmissions (%{fld4}) reached STATE_MAIN_I1. No response (or no acceptable response) to our first IKE message", processor_chain([ dup10, dup36, dup11, @@ -1587,8 +1467,7 @@ match("MESSAGE#109:pluto:13", "nwparser.payload", "\"%{fld2}\" #%{fld3}: max num var msg110 = msg("pluto:13", part118); -var part119 = // "Pattern{Constant('"'), Field(fld2,false), Constant('" #'), Field(fld3,false), Constant(': starting keying attempt '), Field(fld4,true), Constant(' of an unlimited number')}" -match("MESSAGE#110:pluto:14", "nwparser.payload", "\"%{fld2}\" #%{fld3}: starting keying attempt %{fld4->} of an unlimited number", processor_chain([ +var part119 = match("MESSAGE#110:pluto:14", "nwparser.payload", "\"%{fld2}\" #%{fld3}: starting keying attempt %{fld4->} of an unlimited number", processor_chain([ dup12, dup37, dup11, @@ -1597,8 +1476,7 @@ match("MESSAGE#110:pluto:14", "nwparser.payload", "\"%{fld2}\" #%{fld3}: startin var msg111 = msg("pluto:14", part119); -var part120 = // "Pattern{Constant('forgetting secrets'), Field(,false)}" -match("MESSAGE#111:pluto:15", "nwparser.payload", "forgetting secrets%{}", processor_chain([ +var part120 = match("MESSAGE#111:pluto:15", "nwparser.payload", "forgetting secrets%{}", processor_chain([ dup12, setc("event_description","pluto:forgetting secrets"), dup11, @@ -1607,8 +1485,7 @@ match("MESSAGE#111:pluto:15", "nwparser.payload", "forgetting secrets%{}", proce var msg112 = msg("pluto:15", part120); -var part121 = // "Pattern{Constant('Changing to directory ''), Field(directory,false), Constant(''')}" -match("MESSAGE#112:pluto:17", "nwparser.payload", "Changing to directory '%{directory}'", processor_chain([ +var part121 = match("MESSAGE#112:pluto:17", "nwparser.payload", "Changing to directory '%{directory}'", processor_chain([ dup12, setc("event_description","pluto:Changing to directory"), dup11, @@ -1617,8 +1494,7 @@ match("MESSAGE#112:pluto:17", "nwparser.payload", "Changing to directory '%{dire var msg113 = msg("pluto:17", part121); -var part122 = // "Pattern{Constant('| *time to handle event'), Field(,false)}" -match("MESSAGE#113:pluto:18", "nwparser.payload", "| *time to handle event%{}", processor_chain([ +var part122 = match("MESSAGE#113:pluto:18", "nwparser.payload", "| *time to handle event%{}", processor_chain([ dup12, setc("event_description","pluto:*time to handle event"), dup11, @@ -1627,8 +1503,7 @@ match("MESSAGE#113:pluto:18", "nwparser.payload", "| *time to handle event%{}", var msg114 = msg("pluto:18", part122); -var part123 = // "Pattern{Constant('| *received kernel message'), Field(,false)}" -match("MESSAGE#114:pluto:19", "nwparser.payload", "| *received kernel message%{}", processor_chain([ +var part123 = match("MESSAGE#114:pluto:19", "nwparser.payload", "| *received kernel message%{}", processor_chain([ dup12, setc("event_description","pluto:*received kernel message"), dup11, @@ -1637,8 +1512,7 @@ match("MESSAGE#114:pluto:19", "nwparser.payload", "| *received kernel message%{} var msg115 = msg("pluto:19", part123); -var part124 = // "Pattern{Constant('| rejected packet:'), Field(,false)}" -match("MESSAGE#115:pluto:20", "nwparser.payload", "| rejected packet:%{}", processor_chain([ +var part124 = match("MESSAGE#115:pluto:20", "nwparser.payload", "| rejected packet:%{}", processor_chain([ dup25, setc("event_description","pluto:rejected packet"), dup11, @@ -1647,8 +1521,7 @@ match("MESSAGE#115:pluto:20", "nwparser.payload", "| rejected packet:%{}", proce var msg116 = msg("pluto:20", part124); -var part125 = // "Pattern{Constant('| next event '), Field(event_type,true), Constant(' in '), Field(fld2,true), Constant(' seconds for #'), Field(fld3,false)}" -match("MESSAGE#116:pluto:21", "nwparser.payload", "| next event %{event_type->} in %{fld2->} seconds for #%{fld3}", processor_chain([ +var part125 = match("MESSAGE#116:pluto:21", "nwparser.payload", "| next event %{event_type->} in %{fld2->} seconds for #%{fld3}", processor_chain([ dup12, dup11, dup2, @@ -1656,8 +1529,7 @@ match("MESSAGE#116:pluto:21", "nwparser.payload", "| next event %{event_type->} var msg117 = msg("pluto:21", part125); -var part126 = // "Pattern{Constant('| next event '), Field(event_type,true), Constant(' in '), Field(fld2,true), Constant(' seconds')}" -match("MESSAGE#117:pluto:22", "nwparser.payload", "| next event %{event_type->} in %{fld2->} seconds", processor_chain([ +var part126 = match("MESSAGE#117:pluto:22", "nwparser.payload", "| next event %{event_type->} in %{fld2->} seconds", processor_chain([ dup12, dup11, dup2, @@ -1665,8 +1537,7 @@ match("MESSAGE#117:pluto:22", "nwparser.payload", "| next event %{event_type->} var msg118 = msg("pluto:22", part126); -var part127 = // "Pattern{Constant('| inserting event '), Field(event_type,true), Constant(' in '), Field(fld2,true), Constant(' seconds for #'), Field(fld3,false)}" -match("MESSAGE#118:pluto:23", "nwparser.payload", "| inserting event %{event_type->} in %{fld2->} seconds for #%{fld3}", processor_chain([ +var part127 = match("MESSAGE#118:pluto:23", "nwparser.payload", "| inserting event %{event_type->} in %{fld2->} seconds for #%{fld3}", processor_chain([ dup12, dup11, dup2, @@ -1674,8 +1545,7 @@ match("MESSAGE#118:pluto:23", "nwparser.payload", "| inserting event %{event_typ var msg119 = msg("pluto:23", part127); -var part128 = // "Pattern{Constant('| event after this is '), Field(event_type,true), Constant(' in '), Field(fld2,true), Constant(' seconds')}" -match("MESSAGE#119:pluto:24", "nwparser.payload", "| event after this is %{event_type->} in %{fld2->} seconds", processor_chain([ +var part128 = match("MESSAGE#119:pluto:24", "nwparser.payload", "| event after this is %{event_type->} in %{fld2->} seconds", processor_chain([ dup12, dup11, dup2, @@ -1683,8 +1553,7 @@ match("MESSAGE#119:pluto:24", "nwparser.payload", "| event after this is %{event var msg120 = msg("pluto:24", part128); -var part129 = // "Pattern{Constant('| recent '), Field(action,true), Constant(' activity '), Field(fld2,true), Constant(' seconds ago, '), Field(info,false)}" -match("MESSAGE#120:pluto:25", "nwparser.payload", "| recent %{action->} activity %{fld2->} seconds ago, %{info}", processor_chain([ +var part129 = match("MESSAGE#120:pluto:25", "nwparser.payload", "| recent %{action->} activity %{fld2->} seconds ago, %{info}", processor_chain([ dup12, dup11, dup2, @@ -1692,8 +1561,7 @@ match("MESSAGE#120:pluto:25", "nwparser.payload", "| recent %{action->} activity var msg121 = msg("pluto:25", part129); -var part130 = // "Pattern{Constant('| *received '), Field(rbytes,true), Constant(' bytes from '), Field(saddr,false), Constant(':'), Field(sport,true), Constant(' on '), Field(dinterface,false)}" -match("MESSAGE#121:pluto:26", "nwparser.payload", "| *received %{rbytes->} bytes from %{saddr}:%{sport->} on %{dinterface}", processor_chain([ +var part130 = match("MESSAGE#121:pluto:26", "nwparser.payload", "| *received %{rbytes->} bytes from %{saddr}:%{sport->} on %{dinterface}", processor_chain([ dup12, dup11, dup2, @@ -1701,8 +1569,7 @@ match("MESSAGE#121:pluto:26", "nwparser.payload", "| *received %{rbytes->} bytes var msg122 = msg("pluto:26", part130); -var part131 = // "Pattern{Constant('| received '), Field(action,true), Constant(' notification '), Field(msg,true), Constant(' with seqno = '), Field(fld2,false)}" -match("MESSAGE#122:pluto:27", "nwparser.payload", "| received %{action->} notification %{msg->} with seqno = %{fld2}", processor_chain([ +var part131 = match("MESSAGE#122:pluto:27", "nwparser.payload", "| received %{action->} notification %{msg->} with seqno = %{fld2}", processor_chain([ dup12, dup11, dup2, @@ -1710,8 +1577,7 @@ match("MESSAGE#122:pluto:27", "nwparser.payload", "| received %{action->} notifi var msg123 = msg("pluto:27", part131); -var part132 = // "Pattern{Constant('| sent '), Field(action,true), Constant(' notification '), Field(msg,true), Constant(' with seqno = '), Field(fld2,false)}" -match("MESSAGE#123:pluto:28", "nwparser.payload", "| sent %{action->} notification %{msg->} with seqno = %{fld2}", processor_chain([ +var part132 = match("MESSAGE#123:pluto:28", "nwparser.payload", "| sent %{action->} notification %{msg->} with seqno = %{fld2}", processor_chain([ dup12, dup11, dup2, @@ -1719,8 +1585,7 @@ match("MESSAGE#123:pluto:28", "nwparser.payload", "| sent %{action->} notificati var msg124 = msg("pluto:28", part132); -var part133 = // "Pattern{Constant('| inserting event '), Field(event_type,false), Constant(', timeout in '), Field(fld2,true), Constant(' seconds')}" -match("MESSAGE#124:pluto:29", "nwparser.payload", "| inserting event %{event_type}, timeout in %{fld2->} seconds", processor_chain([ +var part133 = match("MESSAGE#124:pluto:29", "nwparser.payload", "| inserting event %{event_type}, timeout in %{fld2->} seconds", processor_chain([ dup12, dup11, dup2, @@ -1728,8 +1593,7 @@ match("MESSAGE#124:pluto:29", "nwparser.payload", "| inserting event %{event_typ var msg125 = msg("pluto:29", part133); -var part134 = // "Pattern{Constant('| handling event '), Field(event_type,true), Constant(' for '), Field(saddr,true), Constant(' "'), Field(fld2,false), Constant('" #'), Field(fld3,false)}" -match("MESSAGE#125:pluto:30", "nwparser.payload", "| handling event %{event_type->} for %{saddr->} \"%{fld2}\" #%{fld3}", processor_chain([ +var part134 = match("MESSAGE#125:pluto:30", "nwparser.payload", "| handling event %{event_type->} for %{saddr->} \"%{fld2}\" #%{fld3}", processor_chain([ dup12, dup11, dup2, @@ -1737,8 +1601,7 @@ match("MESSAGE#125:pluto:30", "nwparser.payload", "| handling event %{event_type var msg126 = msg("pluto:30", part134); -var part135 = // "Pattern{Constant('| '), Field(event_description,false)}" -match("MESSAGE#126:pluto:31", "nwparser.payload", "| %{event_description}", processor_chain([ +var part135 = match("MESSAGE#126:pluto:31", "nwparser.payload", "| %{event_description}", processor_chain([ dup12, dup11, dup2, @@ -1746,8 +1609,7 @@ match("MESSAGE#126:pluto:31", "nwparser.payload", "| %{event_description}", proc var msg127 = msg("pluto:31", part135); -var part136 = // "Pattern{Field(fld2,false), Constant(': asynchronous network error report on '), Field(interface,true), Constant(' for message to '), Field(daddr,true), Constant(' port '), Field(dport,false), Constant(', complainant '), Field(saddr,false), Constant(': Connection refused [errno '), Field(fld4,false), Constant(', origin ICMP type '), Field(icmptype,true), Constant(' code '), Field(icmpcode,true), Constant(' (not authenticated)]')}" -match("MESSAGE#127:pluto:32", "nwparser.payload", "%{fld2}: asynchronous network error report on %{interface->} for message to %{daddr->} port %{dport}, complainant %{saddr}: Connection refused [errno %{fld4}, origin ICMP type %{icmptype->} code %{icmpcode->} (not authenticated)]", processor_chain([ +var part136 = match("MESSAGE#127:pluto:32", "nwparser.payload", "%{fld2}: asynchronous network error report on %{interface->} for message to %{daddr->} port %{dport}, complainant %{saddr}: Connection refused [errno %{fld4}, origin ICMP type %{icmptype->} code %{icmpcode->} (not authenticated)]", processor_chain([ dup12, setc("event_description","not authenticated"), dup11, @@ -1756,8 +1618,7 @@ match("MESSAGE#127:pluto:32", "nwparser.payload", "%{fld2}: asynchronous network var msg128 = msg("pluto:32", part136); -var part137 = // "Pattern{Constant('"'), Field(fld2,false), Constant('"['), Field(fld4,false), Constant('] '), Field(saddr,true), Constant(' #'), Field(fld3,false), Constant(': initiating Main Mode')}" -match("MESSAGE#128:pluto:33", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr->} #%{fld3}: initiating Main Mode", processor_chain([ +var part137 = match("MESSAGE#128:pluto:33", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr->} #%{fld3}: initiating Main Mode", processor_chain([ dup12, dup35, dup11, @@ -1766,8 +1627,7 @@ match("MESSAGE#128:pluto:33", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr- var msg129 = msg("pluto:33", part137); -var part138 = // "Pattern{Constant('"'), Field(fld2,false), Constant('"['), Field(fld4,false), Constant('] '), Field(saddr,true), Constant(' #'), Field(fld3,false), Constant(': max number of retransmissions ('), Field(fld5,false), Constant(') reached STATE_MAIN_I1. No response (or no acceptable response) to our first IKE message')}" -match("MESSAGE#129:pluto:34", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr->} #%{fld3}: max number of retransmissions (%{fld5}) reached STATE_MAIN_I1. No response (or no acceptable response) to our first IKE message", processor_chain([ +var part138 = match("MESSAGE#129:pluto:34", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr->} #%{fld3}: max number of retransmissions (%{fld5}) reached STATE_MAIN_I1. No response (or no acceptable response) to our first IKE message", processor_chain([ dup12, dup36, dup11, @@ -1776,8 +1636,7 @@ match("MESSAGE#129:pluto:34", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr- var msg130 = msg("pluto:34", part138); -var part139 = // "Pattern{Constant('"'), Field(fld2,false), Constant('"['), Field(fld4,false), Constant('] '), Field(saddr,true), Constant(' #'), Field(fld3,false), Constant(': starting keying attempt '), Field(fld5,true), Constant(' of an unlimited number')}" -match("MESSAGE#130:pluto:35", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr->} #%{fld3}: starting keying attempt %{fld5->} of an unlimited number", processor_chain([ +var part139 = match("MESSAGE#130:pluto:35", "nwparser.payload", "\"%{fld2}\"[%{fld4}] %{saddr->} #%{fld3}: starting keying attempt %{fld5->} of an unlimited number", processor_chain([ dup12, dup37, dup11, @@ -1824,8 +1683,7 @@ var select11 = linear_select([ msg131, ]); -var part140 = // "Pattern{Constant('This binary does not support kernel L2TP.'), Field(,false)}" -match("MESSAGE#131:xl2tpd", "nwparser.payload", "This binary does not support kernel L2TP.%{}", processor_chain([ +var part140 = match("MESSAGE#131:xl2tpd", "nwparser.payload", "This binary does not support kernel L2TP.%{}", processor_chain([ setc("eventcategory","1607000000"), setc("event_description","xl2tpd:This binary does not support kernel L2TP."), dup11, @@ -1834,8 +1692,7 @@ match("MESSAGE#131:xl2tpd", "nwparser.payload", "This binary does not support ke var msg132 = msg("xl2tpd", part140); -var part141 = // "Pattern{Constant('xl2tpd version '), Field(version,true), Constant(' started on PID:'), Field(fld2,false)}" -match("MESSAGE#132:xl2tpd:01", "nwparser.payload", "xl2tpd version %{version->} started on PID:%{fld2}", processor_chain([ +var part141 = match("MESSAGE#132:xl2tpd:01", "nwparser.payload", "xl2tpd version %{version->} started on PID:%{fld2}", processor_chain([ dup12, setc("event_description","xl2tpd:xl2tpd started."), dup11, @@ -1844,8 +1701,7 @@ match("MESSAGE#132:xl2tpd:01", "nwparser.payload", "xl2tpd version %{version->} var msg133 = msg("xl2tpd:01", part141); -var part142 = // "Pattern{Constant('Written by '), Field(info,false)}" -match("MESSAGE#133:xl2tpd:02", "nwparser.payload", "Written by %{info}", processor_chain([ +var part142 = match("MESSAGE#133:xl2tpd:02", "nwparser.payload", "Written by %{info}", processor_chain([ dup12, dup38, dup11, @@ -1854,8 +1710,7 @@ match("MESSAGE#133:xl2tpd:02", "nwparser.payload", "Written by %{info}", process var msg134 = msg("xl2tpd:02", part142); -var part143 = // "Pattern{Constant('Forked by '), Field(info,false)}" -match("MESSAGE#134:xl2tpd:03", "nwparser.payload", "Forked by %{info}", processor_chain([ +var part143 = match("MESSAGE#134:xl2tpd:03", "nwparser.payload", "Forked by %{info}", processor_chain([ dup12, dup38, dup11, @@ -1864,8 +1719,7 @@ match("MESSAGE#134:xl2tpd:03", "nwparser.payload", "Forked by %{info}", processo var msg135 = msg("xl2tpd:03", part143); -var part144 = // "Pattern{Constant('Inherited by '), Field(info,false)}" -match("MESSAGE#135:xl2tpd:04", "nwparser.payload", "Inherited by %{info}", processor_chain([ +var part144 = match("MESSAGE#135:xl2tpd:04", "nwparser.payload", "Inherited by %{info}", processor_chain([ dup12, dup38, dup11, @@ -1874,8 +1728,7 @@ match("MESSAGE#135:xl2tpd:04", "nwparser.payload", "Inherited by %{info}", proce var msg136 = msg("xl2tpd:04", part144); -var part145 = // "Pattern{Constant('Listening on IP address '), Field(saddr,false), Constant(', port '), Field(sport,false)}" -match("MESSAGE#136:xl2tpd:05", "nwparser.payload", "Listening on IP address %{saddr}, port %{sport}", processor_chain([ +var part145 = match("MESSAGE#136:xl2tpd:05", "nwparser.payload", "Listening on IP address %{saddr}, port %{sport}", processor_chain([ dup12, dup38, dup11, @@ -1893,8 +1746,7 @@ var select12 = linear_select([ msg137, ]); -var part146 = // "Pattern{Constant('Exiting'), Field(,false)}" -match("MESSAGE#137:barnyard:01", "nwparser.payload", "Exiting%{}", processor_chain([ +var part146 = match("MESSAGE#137:barnyard:01", "nwparser.payload", "Exiting%{}", processor_chain([ dup12, setc("event_description","barnyard: Exiting"), dup11, @@ -1903,8 +1755,7 @@ match("MESSAGE#137:barnyard:01", "nwparser.payload", "Exiting%{}", processor_cha var msg138 = msg("barnyard:01", part146); -var part147 = // "Pattern{Constant('Initializing daemon mode'), Field(,false)}" -match("MESSAGE#138:barnyard:02", "nwparser.payload", "Initializing daemon mode%{}", processor_chain([ +var part147 = match("MESSAGE#138:barnyard:02", "nwparser.payload", "Initializing daemon mode%{}", processor_chain([ dup12, setc("event_description","barnyard:Initializing daemon mode"), dup11, @@ -1913,8 +1764,7 @@ match("MESSAGE#138:barnyard:02", "nwparser.payload", "Initializing daemon mode%{ var msg139 = msg("barnyard:02", part147); -var part148 = // "Pattern{Constant('Opened spool file ''), Field(filename,false), Constant(''')}" -match("MESSAGE#139:barnyard:03", "nwparser.payload", "Opened spool file '%{filename}'", processor_chain([ +var part148 = match("MESSAGE#139:barnyard:03", "nwparser.payload", "Opened spool file '%{filename}'", processor_chain([ dup12, setc("event_description","barnyard:Opened spool file."), dup11, @@ -1923,8 +1773,7 @@ match("MESSAGE#139:barnyard:03", "nwparser.payload", "Opened spool file '%{filen var msg140 = msg("barnyard:03", part148); -var part149 = // "Pattern{Constant('Waiting for new data'), Field(,false)}" -match("MESSAGE#140:barnyard:04", "nwparser.payload", "Waiting for new data%{}", processor_chain([ +var part149 = match("MESSAGE#140:barnyard:04", "nwparser.payload", "Waiting for new data%{}", processor_chain([ dup12, setc("event_description","barnyard:Waiting for new data"), dup11, @@ -1940,8 +1789,7 @@ var select13 = linear_select([ msg141, ]); -var part150 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' SMTP connection from localhost ('), Field(hostname,false), Constant(') ['), Field(saddr,false), Constant(']:'), Field(sport,true), Constant(' closed by QUIT')}" -match("MESSAGE#141:exim:01", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} SMTP connection from localhost (%{hostname}) [%{saddr}]:%{sport->} closed by QUIT", processor_chain([ +var part150 = match("MESSAGE#141:exim:01", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} SMTP connection from localhost (%{hostname}) [%{saddr}]:%{sport->} closed by QUIT", processor_chain([ dup12, setc("event_description","exim:SMTP connection from localhost closed by QUIT"), dup11, @@ -1950,8 +1798,7 @@ match("MESSAGE#141:exim:01", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg142 = msg("exim:01", part150); -var part151 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' ['), Field(saddr,false), Constant('] F=<<'), Field(from,false), Constant('> R=<<'), Field(to,false), Constant('> Accepted: '), Field(info,false)}" -match("MESSAGE#142:exim:02", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} [%{saddr}] F=\u003c\u003c%{from}> R=\u003c\u003c%{to}> Accepted: %{info}", processor_chain([ +var part151 = match("MESSAGE#142:exim:02", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} [%{saddr}] F=\u003c\u003c%{from}> R=\u003c\u003c%{to}> Accepted: %{info}", processor_chain([ setc("eventcategory","1207010000"), setc("event_description","exim:e-mail accepted from relay."), dup11, @@ -1960,8 +1807,7 @@ match("MESSAGE#142:exim:02", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg143 = msg("exim:02", part151); -var part152 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' '), Field(fld8,true), Constant(' <<= '), Field(from,true), Constant(' H=localhost ('), Field(hostname,false), Constant(') ['), Field(saddr,false), Constant(']:'), Field(sport,true), Constant(' P='), Field(protocol,true), Constant(' S='), Field(fld9,true), Constant(' id='), Field(info,false)}" -match("MESSAGE#143:exim:03", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld8->} \u003c\u003c= %{from->} H=localhost (%{hostname}) [%{saddr}]:%{sport->} P=%{protocol->} S=%{fld9->} id=%{info}", processor_chain([ +var part152 = match("MESSAGE#143:exim:03", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld8->} \u003c\u003c= %{from->} H=localhost (%{hostname}) [%{saddr}]:%{sport->} P=%{protocol->} S=%{fld9->} id=%{info}", processor_chain([ setc("eventcategory","1207000000"), setc("event_description","exim: e-mail sent."), dup11, @@ -1970,8 +1816,7 @@ match("MESSAGE#143:exim:03", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg144 = msg("exim:03", part152); -var part153 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' '), Field(fld8,true), Constant(' == '), Field(from,true), Constant(' R=dnslookup defer ('), Field(fld9,false), Constant('): host lookup did not complete')}" -match("MESSAGE#144:exim:04", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld8->} == %{from->} R=dnslookup defer (%{fld9}): host lookup did not complete", processor_chain([ +var part153 = match("MESSAGE#144:exim:04", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld8->} == %{from->} R=dnslookup defer (%{fld9}): host lookup did not complete", processor_chain([ dup39, setc("event_description","exim: e-mail host lookup did not complete in DNS."), dup11, @@ -1980,8 +1825,7 @@ match("MESSAGE#144:exim:04", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg145 = msg("exim:04", part153); -var part154 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' '), Field(fld8,true), Constant(' == '), Field(from,true), Constant(' routing defer ('), Field(fld9,false), Constant('): retry time not reached')}" -match("MESSAGE#145:exim:05", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld8->} == %{from->} routing defer (%{fld9}): retry time not reached", processor_chain([ +var part154 = match("MESSAGE#145:exim:05", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld8->} == %{from->} routing defer (%{fld9}): retry time not reached", processor_chain([ dup39, setc("event_description","exim: e-mail routing defer:retry time not reached."), dup11, @@ -1990,8 +1834,7 @@ match("MESSAGE#145:exim:05", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg146 = msg("exim:05", part154); -var part155 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' exim '), Field(version,true), Constant(' daemon started: pid='), Field(fld8,false), Constant(', no queue runs, listening for SMTP on port '), Field(sport,true), Constant(' ('), Field(info,false), Constant(') port '), Field(fld9,true), Constant(' ('), Field(fld10,false), Constant(') and for SMTPS on port '), Field(fld11,true), Constant(' ('), Field(fld12,false), Constant(')')}" -match("MESSAGE#146:exim:06", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} exim %{version->} daemon started: pid=%{fld8}, no queue runs, listening for SMTP on port %{sport->} (%{info}) port %{fld9->} (%{fld10}) and for SMTPS on port %{fld11->} (%{fld12})", processor_chain([ +var part155 = match("MESSAGE#146:exim:06", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} exim %{version->} daemon started: pid=%{fld8}, no queue runs, listening for SMTP on port %{sport->} (%{info}) port %{fld9->} (%{fld10}) and for SMTPS on port %{fld11->} (%{fld12})", processor_chain([ dup12, setc("event_description","exim: exim daemon started."), dup11, @@ -2000,8 +1843,7 @@ match("MESSAGE#146:exim:06", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg147 = msg("exim:06", part155); -var part156 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' Start queue run: pid='), Field(fld8,false)}" -match("MESSAGE#147:exim:07", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} Start queue run: pid=%{fld8}", processor_chain([ +var part156 = match("MESSAGE#147:exim:07", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} Start queue run: pid=%{fld8}", processor_chain([ dup12, setc("event_description","exim: Start queue run."), dup11, @@ -2010,8 +1852,7 @@ match("MESSAGE#147:exim:07", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg148 = msg("exim:07", part156); -var part157 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' pid '), Field(fld8,false), Constant(': SIGHUP received: re-exec daemon')}" -match("MESSAGE#148:exim:08", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} pid %{fld8}: SIGHUP received: re-exec daemon", processor_chain([ +var part157 = match("MESSAGE#148:exim:08", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} pid %{fld8}: SIGHUP received: re-exec daemon", processor_chain([ dup12, setc("event_description","exim: SIGHUP received: re-exec daemon."), dup11, @@ -2020,8 +1861,7 @@ match("MESSAGE#148:exim:08", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg149 = msg("exim:08", part157); -var part158 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' SMTP connection from ['), Field(saddr,false), Constant(']:'), Field(sport,true), Constant(' '), Field(info,false)}" -match("MESSAGE#149:exim:09", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} SMTP connection from [%{saddr}]:%{sport->} %{info}", processor_chain([ +var part158 = match("MESSAGE#149:exim:09", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} SMTP connection from [%{saddr}]:%{sport->} %{info}", processor_chain([ dup12, setc("event_description","exim: SMTP connection from host."), dup11, @@ -2030,8 +1870,7 @@ match("MESSAGE#149:exim:09", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg150 = msg("exim:09", part158); -var part159 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' rejected EHLO from ['), Field(saddr,false), Constant(']:'), Field(sport,true), Constant(' '), Field(info,false)}" -match("MESSAGE#150:exim:10", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} rejected EHLO from [%{saddr}]:%{sport->} %{info}", processor_chain([ +var part159 = match("MESSAGE#150:exim:10", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} rejected EHLO from [%{saddr}]:%{sport->} %{info}", processor_chain([ dup12, setc("event_description","exim:rejected EHLO from host."), dup11, @@ -2040,8 +1879,7 @@ match("MESSAGE#150:exim:10", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg151 = msg("exim:10", part159); -var part160 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' SMTP protocol synchronization error ('), Field(result,false), Constant('): '), Field(fld8,true), Constant(' H=['), Field(saddr,false), Constant(']:'), Field(sport,true), Constant(' '), Field(info,false)}" -match("MESSAGE#151:exim:11", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} SMTP protocol synchronization error (%{result}): %{fld8->} H=[%{saddr}]:%{sport->} %{info}", processor_chain([ +var part160 = match("MESSAGE#151:exim:11", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} SMTP protocol synchronization error (%{result}): %{fld8->} H=[%{saddr}]:%{sport->} %{info}", processor_chain([ dup12, setc("event_description","exim:SMTP protocol synchronization error rejected connection from host."), dup11, @@ -2050,8 +1888,7 @@ match("MESSAGE#151:exim:11", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg152 = msg("exim:11", part160); -var part161 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' TLS error on connection from ['), Field(saddr,false), Constant(']:'), Field(sport,true), Constant(' '), Field(info,false)}" -match("MESSAGE#152:exim:12", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} TLS error on connection from [%{saddr}]:%{sport->} %{info}", processor_chain([ +var part161 = match("MESSAGE#152:exim:12", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} TLS error on connection from [%{saddr}]:%{sport->} %{info}", processor_chain([ dup12, setc("event_description","exim:TLS error on connection from host."), dup11, @@ -2060,8 +1897,7 @@ match("MESSAGE#152:exim:12", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg153 = msg("exim:12", part161); -var part162 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' '), Field(fld10,true), Constant(' == '), Field(hostname,true), Constant(' R='), Field(fld8,true), Constant(' T='), Field(fld9,false), Constant(': '), Field(info,false)}" -match("MESSAGE#153:exim:13", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld10->} == %{hostname->} R=%{fld8->} T=%{fld9}: %{info}", processor_chain([ +var part162 = match("MESSAGE#153:exim:13", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld10->} == %{hostname->} R=%{fld8->} T=%{fld9}: %{info}", processor_chain([ dup12, dup40, dup11, @@ -2070,8 +1906,7 @@ match("MESSAGE#153:exim:13", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg154 = msg("exim:13", part162); -var part163 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' '), Field(fld10,true), Constant(' '), Field(hostname,true), Constant(' ['), Field(saddr,false), Constant(']:'), Field(sport,true), Constant(' '), Field(info,false)}" -match("MESSAGE#154:exim:14", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld10->} %{hostname->} [%{saddr}]:%{sport->} %{info}", processor_chain([ +var part163 = match("MESSAGE#154:exim:14", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} %{fld10->} %{hostname->} [%{saddr}]:%{sport->} %{info}", processor_chain([ dup12, dup40, dup11, @@ -2080,8 +1915,7 @@ match("MESSAGE#154:exim:14", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg155 = msg("exim:14", part163); -var part164 = // "Pattern{Field(fld2,false), Constant('-'), Field(fld3,false), Constant('-'), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(':'), Field(fld6,false), Constant(':'), Field(fld7,true), Constant(' End queue run: '), Field(info,false)}" -match("MESSAGE#155:exim:15", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} End queue run: %{info}", processor_chain([ +var part164 = match("MESSAGE#155:exim:15", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fld5}:%{fld6}:%{fld7->} End queue run: %{info}", processor_chain([ dup12, dup40, dup11, @@ -2090,8 +1924,7 @@ match("MESSAGE#155:exim:15", "nwparser.payload", "%{fld2}-%{fld3}-%{fld4->} %{fl var msg156 = msg("exim:15", part164); -var part165 = // "Pattern{Field(fld2,true), Constant(' '), Field(fld3,false)}" -match("MESSAGE#156:exim:16", "nwparser.payload", "%{fld2->} %{fld3}", processor_chain([ +var part165 = match("MESSAGE#156:exim:16", "nwparser.payload", "%{fld2->} %{fld3}", processor_chain([ dup12, dup11, dup2, @@ -2118,8 +1951,7 @@ var select14 = linear_select([ msg157, ]); -var part166 = // "Pattern{Constant('QMGR['), Field(fld2,false), Constant(']: '), Field(fld3,true), Constant(' moved to work queue')}" -match("MESSAGE#157:smtpd:01", "nwparser.payload", "QMGR[%{fld2}]: %{fld3->} moved to work queue", processor_chain([ +var part166 = match("MESSAGE#157:smtpd:01", "nwparser.payload", "QMGR[%{fld2}]: %{fld3->} moved to work queue", processor_chain([ dup12, setc("event_description","smtpd: Process moved to work queue."), dup11, @@ -2128,8 +1960,7 @@ match("MESSAGE#157:smtpd:01", "nwparser.payload", "QMGR[%{fld2}]: %{fld3->} move var msg158 = msg("smtpd:01", part166); -var part167 = // "Pattern{Constant('SCANNER['), Field(fld3,false), Constant(']: id="1000" severity="'), Field(severity,false), Constant('" sys="'), Field(fld4,false), Constant('" sub="'), Field(service,false), Constant('" name="'), Field(event_description,false), Constant('" srcip="'), Field(saddr,false), Constant('" from="'), Field(from,false), Constant('" to="'), Field(to,false), Constant('" subject="'), Field(subject,false), Constant('" queueid="'), Field(fld5,false), Constant('" size="'), Field(rbytes,false), Constant('"')}" -match("MESSAGE#158:smtpd:02", "nwparser.payload", "SCANNER[%{fld3}]: id=\"1000\" severity=\"%{severity}\" sys=\"%{fld4}\" sub=\"%{service}\" name=\"%{event_description}\" srcip=\"%{saddr}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" queueid=\"%{fld5}\" size=\"%{rbytes}\"", processor_chain([ +var part167 = match("MESSAGE#158:smtpd:02", "nwparser.payload", "SCANNER[%{fld3}]: id=\"1000\" severity=\"%{severity}\" sys=\"%{fld4}\" sub=\"%{service}\" name=\"%{event_description}\" srcip=\"%{saddr}\" from=\"%{from}\" to=\"%{to}\" subject=\"%{subject}\" queueid=\"%{fld5}\" size=\"%{rbytes}\"", processor_chain([ setc("eventcategory","1207010100"), dup11, dup2, @@ -2137,8 +1968,7 @@ match("MESSAGE#158:smtpd:02", "nwparser.payload", "SCANNER[%{fld3}]: id=\"1000\" var msg159 = msg("smtpd:02", part167); -var part168 = // "Pattern{Constant('SCANNER['), Field(fld3,false), Constant(']: Nothing to do, exiting.')}" -match("MESSAGE#159:smtpd:03", "nwparser.payload", "SCANNER[%{fld3}]: Nothing to do, exiting.", processor_chain([ +var part168 = match("MESSAGE#159:smtpd:03", "nwparser.payload", "SCANNER[%{fld3}]: Nothing to do, exiting.", processor_chain([ dup12, setc("event_description","smtpd: SCANNER: Nothing to do,exiting."), dup11, @@ -2147,8 +1977,7 @@ match("MESSAGE#159:smtpd:03", "nwparser.payload", "SCANNER[%{fld3}]: Nothing to var msg160 = msg("smtpd:03", part168); -var part169 = // "Pattern{Constant('MASTER['), Field(fld3,false), Constant(']: QR globally disabled, status two set to 'disabled'')}" -match("MESSAGE#160:smtpd:04", "nwparser.payload", "MASTER[%{fld3}]: QR globally disabled, status two set to 'disabled'", processor_chain([ +var part169 = match("MESSAGE#160:smtpd:04", "nwparser.payload", "MASTER[%{fld3}]: QR globally disabled, status two set to 'disabled'", processor_chain([ dup12, setc("event_description","smtpd: MASTER:QR globally disabled, status two set to disabled."), dup11, @@ -2157,8 +1986,7 @@ match("MESSAGE#160:smtpd:04", "nwparser.payload", "MASTER[%{fld3}]: QR globally var msg161 = msg("smtpd:04", part169); -var part170 = // "Pattern{Constant('MASTER['), Field(fld3,false), Constant(']: QR globally disabled, status one set to 'disabled'')}" -match("MESSAGE#161:smtpd:07", "nwparser.payload", "MASTER[%{fld3}]: QR globally disabled, status one set to 'disabled'", processor_chain([ +var part170 = match("MESSAGE#161:smtpd:07", "nwparser.payload", "MASTER[%{fld3}]: QR globally disabled, status one set to 'disabled'", processor_chain([ dup12, setc("event_description","smtpd: MASTER:QR globally disabled, status one set to disabled."), dup11, @@ -2167,8 +1995,7 @@ match("MESSAGE#161:smtpd:07", "nwparser.payload", "MASTER[%{fld3}]: QR globally var msg162 = msg("smtpd:07", part170); -var part171 = // "Pattern{Constant('MASTER['), Field(fld3,false), Constant(']: (Re-)loading configuration from Confd')}" -match("MESSAGE#162:smtpd:05", "nwparser.payload", "MASTER[%{fld3}]: (Re-)loading configuration from Confd", processor_chain([ +var part171 = match("MESSAGE#162:smtpd:05", "nwparser.payload", "MASTER[%{fld3}]: (Re-)loading configuration from Confd", processor_chain([ dup12, setc("event_description","smtpd: MASTER:(Re-)loading configuration from Confd."), dup11, @@ -2177,8 +2004,7 @@ match("MESSAGE#162:smtpd:05", "nwparser.payload", "MASTER[%{fld3}]: (Re-)loading var msg163 = msg("smtpd:05", part171); -var part172 = // "Pattern{Constant('MASTER['), Field(fld3,false), Constant(']: Sending QR one')}" -match("MESSAGE#163:smtpd:06", "nwparser.payload", "MASTER[%{fld3}]: Sending QR one", processor_chain([ +var part172 = match("MESSAGE#163:smtpd:06", "nwparser.payload", "MASTER[%{fld3}]: Sending QR one", processor_chain([ dup12, setc("event_description","smtpd: MASTER:Sending QR one."), dup11, @@ -2197,8 +2023,7 @@ var select15 = linear_select([ msg164, ]); -var part173 = // "Pattern{Constant('Did not receive identification string from '), Field(fld18,false)}" -match("MESSAGE#164:sshd:01", "nwparser.payload", "Did not receive identification string from %{fld18}", processor_chain([ +var part173 = match("MESSAGE#164:sshd:01", "nwparser.payload", "Did not receive identification string from %{fld18}", processor_chain([ dup10, setc("event_description","sshd: Did not receive identification string."), dup11, @@ -2207,8 +2032,7 @@ match("MESSAGE#164:sshd:01", "nwparser.payload", "Did not receive identification var msg165 = msg("sshd:01", part173); -var part174 = // "Pattern{Constant('Received SIGHUP; restarting.'), Field(,false)}" -match("MESSAGE#165:sshd:02", "nwparser.payload", "Received SIGHUP; restarting.%{}", processor_chain([ +var part174 = match("MESSAGE#165:sshd:02", "nwparser.payload", "Received SIGHUP; restarting.%{}", processor_chain([ dup12, setc("event_description","sshd:Received SIGHUP restarting."), dup11, @@ -2217,8 +2041,7 @@ match("MESSAGE#165:sshd:02", "nwparser.payload", "Received SIGHUP; restarting.%{ var msg166 = msg("sshd:02", part174); -var part175 = // "Pattern{Constant('Server listening on '), Field(saddr,true), Constant(' port '), Field(sport,false), Constant('.')}" -match("MESSAGE#166:sshd:03", "nwparser.payload", "Server listening on %{saddr->} port %{sport}.", processor_chain([ +var part175 = match("MESSAGE#166:sshd:03", "nwparser.payload", "Server listening on %{saddr->} port %{sport}.", processor_chain([ dup12, setc("event_description","sshd:Server listening; restarting."), dup11, @@ -2227,8 +2050,7 @@ match("MESSAGE#166:sshd:03", "nwparser.payload", "Server listening on %{saddr->} var msg167 = msg("sshd:03", part175); -var part176 = // "Pattern{Constant('Invalid user admin from '), Field(fld18,false)}" -match("MESSAGE#167:sshd:04", "nwparser.payload", "Invalid user admin from %{fld18}", processor_chain([ +var part176 = match("MESSAGE#167:sshd:04", "nwparser.payload", "Invalid user admin from %{fld18}", processor_chain([ dup41, setc("event_description","sshd:Invalid user admin."), dup11, @@ -2237,8 +2059,7 @@ match("MESSAGE#167:sshd:04", "nwparser.payload", "Invalid user admin from %{fld1 var msg168 = msg("sshd:04", part176); -var part177 = // "Pattern{Constant('Failed none for invalid user admin from '), Field(saddr,true), Constant(' port '), Field(sport,true), Constant(' '), Field(fld3,false)}" -match("MESSAGE#168:sshd:05", "nwparser.payload", "Failed none for invalid user admin from %{saddr->} port %{sport->} %{fld3}", processor_chain([ +var part177 = match("MESSAGE#168:sshd:05", "nwparser.payload", "Failed none for invalid user admin from %{saddr->} port %{sport->} %{fld3}", processor_chain([ dup41, setc("event_description","sshd:Failed none for invalid user admin."), dup11, @@ -2247,8 +2068,7 @@ match("MESSAGE#168:sshd:05", "nwparser.payload", "Failed none for invalid user a var msg169 = msg("sshd:05", part177); -var part178 = // "Pattern{Constant('error: Could not get shadow information for NOUSER'), Field(,false)}" -match("MESSAGE#169:sshd:06", "nwparser.payload", "error: Could not get shadow information for NOUSER%{}", processor_chain([ +var part178 = match("MESSAGE#169:sshd:06", "nwparser.payload", "error: Could not get shadow information for NOUSER%{}", processor_chain([ dup10, setc("event_description","sshd:error:Could not get shadow information for NOUSER"), dup11, @@ -2257,8 +2077,7 @@ match("MESSAGE#169:sshd:06", "nwparser.payload", "error: Could not get shadow in var msg170 = msg("sshd:06", part178); -var part179 = // "Pattern{Constant('Failed password for root from '), Field(saddr,true), Constant(' port '), Field(sport,true), Constant(' '), Field(fld3,false)}" -match("MESSAGE#170:sshd:07", "nwparser.payload", "Failed password for root from %{saddr->} port %{sport->} %{fld3}", processor_chain([ +var part179 = match("MESSAGE#170:sshd:07", "nwparser.payload", "Failed password for root from %{saddr->} port %{sport->} %{fld3}", processor_chain([ dup41, setc("event_description","sshd:Failed password for root."), dup11, @@ -2267,8 +2086,7 @@ match("MESSAGE#170:sshd:07", "nwparser.payload", "Failed password for root from var msg171 = msg("sshd:07", part179); -var part180 = // "Pattern{Constant('Accepted password for loginuser from '), Field(saddr,true), Constant(' port '), Field(sport,true), Constant(' '), Field(fld3,false)}" -match("MESSAGE#171:sshd:08", "nwparser.payload", "Accepted password for loginuser from %{saddr->} port %{sport->} %{fld3}", processor_chain([ +var part180 = match("MESSAGE#171:sshd:08", "nwparser.payload", "Accepted password for loginuser from %{saddr->} port %{sport->} %{fld3}", processor_chain([ setc("eventcategory","1302000000"), setc("event_description","sshd:Accepted password for loginuser."), dup11, @@ -2277,8 +2095,7 @@ match("MESSAGE#171:sshd:08", "nwparser.payload", "Accepted password for loginuse var msg172 = msg("sshd:08", part180); -var part181 = // "Pattern{Constant('subsystem request for sftp failed, subsystem not found'), Field(,false)}" -match("MESSAGE#172:sshd:09", "nwparser.payload", "subsystem request for sftp failed, subsystem not found%{}", processor_chain([ +var part181 = match("MESSAGE#172:sshd:09", "nwparser.payload", "subsystem request for sftp failed, subsystem not found%{}", processor_chain([ dup10, setc("event_description","sshd:subsystem request for sftp failed,subsystem not found."), dup11, @@ -2319,8 +2136,7 @@ var part182 = tagval("MESSAGE#173:aua:01", "nwparser.payload", tvm, { var msg174 = msg("aua:01", part182); -var part183 = // "Pattern{Constant('created new negotiatorchild'), Field(,false)}" -match("MESSAGE#174:sockd:01", "nwparser.payload", "created new negotiatorchild%{}", processor_chain([ +var part183 = match("MESSAGE#174:sockd:01", "nwparser.payload", "created new negotiatorchild%{}", processor_chain([ dup12, setc("event_description","sockd: created new negotiatorchild."), dup11, @@ -2329,8 +2145,7 @@ match("MESSAGE#174:sockd:01", "nwparser.payload", "created new negotiatorchild%{ var msg175 = msg("sockd:01", part183); -var part184 = // "Pattern{Constant('dante/server '), Field(version,true), Constant(' running')}" -match("MESSAGE#175:sockd:02", "nwparser.payload", "dante/server %{version->} running", processor_chain([ +var part184 = match("MESSAGE#175:sockd:02", "nwparser.payload", "dante/server %{version->} running", processor_chain([ dup12, setc("event_description","sockd:dante/server running."), dup11, @@ -2339,8 +2154,7 @@ match("MESSAGE#175:sockd:02", "nwparser.payload", "dante/server %{version->} run var msg176 = msg("sockd:02", part184); -var part185 = // "Pattern{Constant('sockdexit(): terminating on signal '), Field(fld2,false)}" -match("MESSAGE#176:sockd:03", "nwparser.payload", "sockdexit(): terminating on signal %{fld2}", processor_chain([ +var part185 = match("MESSAGE#176:sockd:03", "nwparser.payload", "sockdexit(): terminating on signal %{fld2}", processor_chain([ dup12, setc("event_description","sockd:sockdexit():terminating on signal."), dup11, @@ -2355,8 +2169,7 @@ var select17 = linear_select([ msg177, ]); -var part186 = // "Pattern{Constant('Master started'), Field(,false)}" -match("MESSAGE#177:pop3proxy", "nwparser.payload", "Master started%{}", processor_chain([ +var part186 = match("MESSAGE#177:pop3proxy", "nwparser.payload", "Master started%{}", processor_chain([ dup12, setc("event_description","pop3proxy:Master started."), dup11, @@ -2546,8 +2359,7 @@ var part188 = tagval("MESSAGE#179:httpd", "nwparser.payload", tvm, { var msg180 = msg("httpd", part188); -var part189 = // "Pattern{Constant('['), Field(event_log,false), Constant(':'), Field(result,false), Constant('] [pid '), Field(fld3,false), Constant(':'), Field(fld4,false), Constant('] [client '), Field(gateway,false), Constant('] ModSecurity: Warning. '), Field(rulename,true), Constant(' [file "'), Field(filename,false), Constant('"] [line "'), Field(fld5,false), Constant('"] [id "'), Field(rule,false), Constant('"] [rev "'), Field(fld2,false), Constant('"] [msg "'), Field(event_description,false), Constant('"] [severity "'), Field(severity,false), Constant('"] [ver "'), Field(version,false), Constant('"] [maturity "'), Field(fld22,false), Constant('"] [accuracy "'), Field(fld23,false), Constant('"] [tag "'), Field(fld24,false), Constant('"] [hostname "'), Field(dhost,false), Constant('"] [uri "'), Field(web_root,false), Constant('"] [unique_id "'), Field(operation_id,false), Constant('"]'), Field(fld25,false)}" -match("MESSAGE#180:httpd:01", "nwparser.payload", "[%{event_log}:%{result}] [pid %{fld3}:%{fld4}] [client %{gateway}] ModSecurity: Warning. %{rulename->} [file \"%{filename}\"] [line \"%{fld5}\"] [id \"%{rule}\"] [rev \"%{fld2}\"] [msg \"%{event_description}\"] [severity \"%{severity}\"] [ver \"%{version}\"] [maturity \"%{fld22}\"] [accuracy \"%{fld23}\"] [tag \"%{fld24}\"] [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]%{fld25}", processor_chain([ +var part189 = match("MESSAGE#180:httpd:01", "nwparser.payload", "[%{event_log}:%{result}] [pid %{fld3}:%{fld4}] [client %{gateway}] ModSecurity: Warning. %{rulename->} [file \"%{filename}\"] [line \"%{fld5}\"] [id \"%{rule}\"] [rev \"%{fld2}\"] [msg \"%{event_description}\"] [severity \"%{severity}\"] [ver \"%{version}\"] [maturity \"%{fld22}\"] [accuracy \"%{fld23}\"] [tag \"%{fld24}\"] [hostname \"%{dhost}\"] [uri \"%{web_root}\"] [unique_id \"%{operation_id}\"]%{fld25}", processor_chain([ setc("eventcategory","1502000000"), dup2, dup3, @@ -2663,5 +2475,4 @@ var chain1 = processor_chain([ }), ]); -var part191 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#44:reverseproxy:07/1_0", "nwparser.p0", "p0"); +var part191 = match_copy("MESSAGE#44:reverseproxy:07/1_0", "nwparser.p0", "p0"); diff --git a/x-pack/filebeat/module/symantec/endpointprotection/config/pipeline.js b/x-pack/filebeat/module/symantec/endpointprotection/config/pipeline.js index 8ad35b18ca1..f05bc1b7497 100644 --- a/x-pack/filebeat/module/symantec/endpointprotection/config/pipeline.js +++ b/x-pack/filebeat/module/symantec/endpointprotection/config/pipeline.js @@ -143,11 +143,9 @@ var dup8 = call({ ], }); -var dup9 = // "Pattern{Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#0:Active/1_0", "nwparser.p0", "%{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var dup9 = match("MESSAGE#0:Active/1_0", "nwparser.p0", "%{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); -var dup10 = // "Pattern{Field(domain,false)}" -match_copy("MESSAGE#0:Active/1_1", "nwparser.p0", "domain"); +var dup10 = match_copy("MESSAGE#0:Active/1_1", "nwparser.p0", "domain"); var dup11 = setc("eventcategory","1001020100"); @@ -257,8 +255,7 @@ var dup48 = setc("fld14","1"); var dup49 = field("fld14"); -var dup50 = // "Pattern{Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#15:Somebody:01/1_0", "nwparser.p0", "%{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var dup50 = match("MESSAGE#15:Somebody:01/1_0", "nwparser.p0", "%{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); var dup51 = setc("fld14","0"); @@ -282,29 +279,23 @@ var dup57 = setc("event_description","Proactive Threat Protection has been disab var dup58 = setc("event_description","Application has changed since the last time you opened it"); -var dup59 = // "Pattern{Constant('"Intrusion URL: '), Field(url,false), Constant('",Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#27:Application:06/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}"); +var dup59 = match("MESSAGE#27:Application:06/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}"); -var dup60 = // "Pattern{Constant('Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#27:Application:06/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var dup60 = match("MESSAGE#27:Application:06/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); -var dup61 = // "Pattern{Constant('Intrusion URL: '), Field(url,false)}" -match("MESSAGE#27:Application:06/1_2", "nwparser.p0", "Intrusion URL: %{url}"); +var dup61 = match("MESSAGE#27:Application:06/1_2", "nwparser.p0", "Intrusion URL: %{url}"); var dup62 = setc("event_description","Traffic has been blocked from application."); -var dup63 = // "Pattern{Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#31:scanning:01/1_0", "nwparser.p0", "%{url},Intrusion Payload URL:%{fld25}"); +var dup63 = match("MESSAGE#31:scanning:01/1_0", "nwparser.p0", "%{url},Intrusion Payload URL:%{fld25}"); -var dup64 = // "Pattern{Field(url,false)}" -match_copy("MESSAGE#31:scanning:01/1_1", "nwparser.p0", "url"); +var dup64 = match_copy("MESSAGE#31:scanning:01/1_1", "nwparser.p0", "url"); var dup65 = setc("eventcategory","1401000000"); var dup66 = setc("event_description","Somebody is scanning your computer."); -var dup67 = // "Pattern{Constant('Domain:'), Field(p0,false)}" -match("MESSAGE#33:Informational/1_1", "nwparser.p0", "Domain:%{p0}"); +var dup67 = match("MESSAGE#33:Informational/1_1", "nwparser.p0", "Domain:%{p0}"); var dup68 = setc("event_description","Informational: File Download Hash."); @@ -312,8 +303,7 @@ var dup69 = setc("eventcategory","1001030000"); var dup70 = setc("event_description","Web Attack : Malvertisement Website Redirect"); -var dup71 = // "Pattern{Constant(':'), Field(p0,false)}" -match("MESSAGE#38:Web_Attack:16/1_1", "nwparser.p0", ":%{p0}"); +var dup71 = match("MESSAGE#38:Web_Attack:16/1_1", "nwparser.p0", ":%{p0}"); var dup72 = setc("event_description","Web Attack: Mass Injection Website."); @@ -323,23 +313,17 @@ var dup74 = setc("eventcategory","1603110000"); var dup75 = setc("event_description","The most recent Host Integrity content has not completed a download or cannot be authenticated."); -var dup76 = // "Pattern{Constant('"'), Field(p0,false)}" -match("MESSAGE#307:process:12/1_0", "nwparser.p0", "\"%{p0}"); +var dup76 = match("MESSAGE#307:process:12/1_0", "nwparser.p0", "\"%{p0}"); -var dup77 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#307:process:12/1_1", "nwparser.p0", "p0"); +var dup77 = match_copy("MESSAGE#307:process:12/1_1", "nwparser.p0", "p0"); -var dup78 = // "Pattern{Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(','), Field(p0,false)}" -match("MESSAGE#307:process:12/4", "nwparser.p0", ",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},%{p0}"); +var dup78 = match("MESSAGE#307:process:12/4", "nwparser.p0", ",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},%{p0}"); -var dup79 = // "Pattern{Constant('Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(p0,false)}" -match("MESSAGE#307:process:12/5_0", "nwparser.p0", "Intrusion ID: %{fld33},Begin: %{p0}"); +var dup79 = match("MESSAGE#307:process:12/5_0", "nwparser.p0", "Intrusion ID: %{fld33},Begin: %{p0}"); -var dup80 = // "Pattern{Field(fld33,false), Constant(',Begin: '), Field(p0,false)}" -match("MESSAGE#307:process:12/5_1", "nwparser.p0", "%{fld33},Begin: %{p0}"); +var dup80 = match("MESSAGE#307:process:12/5_1", "nwparser.p0", "%{fld33},Begin: %{p0}"); -var dup81 = // "Pattern{Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#307:process:12/6", "nwparser.p0", "%{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var dup81 = match("MESSAGE#307:process:12/6", "nwparser.p0", "%{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var dup82 = setc("result","Traffic has not been blocked from application."); @@ -357,11 +341,9 @@ var dup88 = setc("event_description","Host Integrity check passed"); var dup89 = setc("event_description","Host Integrity check failed."); -var dup90 = // "Pattern{Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#21:Applied/1_0", "nwparser.p0", ",Event time:%{fld17->} %{fld18}"); +var dup90 = match("MESSAGE#21:Applied/1_0", "nwparser.p0", ",Event time:%{fld17->} %{fld18}"); -var dup91 = // "Pattern{}" -match_copy("MESSAGE#21:Applied/1_1", "nwparser.p0", ""); +var dup91 = match_copy("MESSAGE#21:Applied/1_1", "nwparser.p0", ""); var dup92 = setc("eventcategory","1702010000"); @@ -381,39 +363,29 @@ var dup96 = setc("ec_activity","Create"); var dup97 = setc("ec_theme","Configuration"); -var dup98 = // "Pattern{Constant('"Location: '), Field(p0,false)}" -match("MESSAGE#23:blocked:01/1_0", "nwparser.p0", "\"Location: %{p0}"); +var dup98 = match("MESSAGE#23:blocked:01/1_0", "nwparser.p0", "\"Location: %{p0}"); -var dup99 = // "Pattern{Constant('Location: '), Field(p0,false)}" -match("MESSAGE#23:blocked:01/1_1", "nwparser.p0", "Location: %{p0}"); +var dup99 = match("MESSAGE#23:blocked:01/1_1", "nwparser.p0", "Location: %{p0}"); -var dup100 = // "Pattern{Constant(''), Field(fld2,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#52:blocked/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain}"); +var dup100 = match("MESSAGE#52:blocked/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain}"); -var dup101 = // "Pattern{Field(fld4,false), Constant(',MD-5:'), Field(fld5,false), Constant(',Local:'), Field(p0,false)}" -match("MESSAGE#190:Local::01/0_0", "nwparser.payload", "%{fld4},MD-5:%{fld5},Local:%{p0}"); +var dup101 = match("MESSAGE#190:Local::01/0_0", "nwparser.payload", "%{fld4},MD-5:%{fld5},Local:%{p0}"); -var dup102 = // "Pattern{Constant('Local:'), Field(p0,false)}" -match("MESSAGE#190:Local::01/0_1", "nwparser.payload", "Local:%{p0}"); +var dup102 = match("MESSAGE#190:Local::01/0_1", "nwparser.payload", "Local:%{p0}"); var dup103 = setc("event_description","Active Response"); var dup104 = setc("dclass_counter1_string","Occurrences"); -var dup105 = // "Pattern{Constant('Rule: '), Field(rulename,false), Constant(',Location: '), Field(p0,false)}" -match("MESSAGE#192:Local:/1_0", "nwparser.p0", "Rule: %{rulename},Location: %{p0}"); +var dup105 = match("MESSAGE#192:Local:/1_0", "nwparser.p0", "Rule: %{rulename},Location: %{p0}"); -var dup106 = // "Pattern{Constant(' "Rule: '), Field(rulename,false), Constant('",Location: '), Field(p0,false)}" -match("MESSAGE#192:Local:/1_1", "nwparser.p0", " \"Rule: %{rulename}\",Location: %{p0}"); +var dup106 = match("MESSAGE#192:Local:/1_1", "nwparser.p0", " \"Rule: %{rulename}\",Location: %{p0}"); -var dup107 = // "Pattern{Field(fld11,false), Constant(',User: '), Field(username,false), Constant(','), Field(p0,false)}" -match("MESSAGE#192:Local:/2", "nwparser.p0", "%{fld11},User: %{username},%{p0}"); +var dup107 = match("MESSAGE#192:Local:/2", "nwparser.p0", "%{fld11},User: %{username},%{p0}"); -var dup108 = // "Pattern{Constant('Domain: '), Field(domain,false), Constant(',Action: '), Field(action,false)}" -match("MESSAGE#192:Local:/3_0", "nwparser.p0", "Domain: %{domain},Action: %{action}"); +var dup108 = match("MESSAGE#192:Local:/3_0", "nwparser.p0", "Domain: %{domain},Action: %{action}"); -var dup109 = // "Pattern{Constant(' Domain: '), Field(domain,false)}" -match("MESSAGE#192:Local:/3_1", "nwparser.p0", " Domain: %{domain}"); +var dup109 = match("MESSAGE#192:Local:/3_1", "nwparser.p0", " Domain: %{domain}"); var dup110 = setc("eventcategory","1003010000"); @@ -427,27 +399,21 @@ var dup111 = call({ ], }); -var dup112 = // "Pattern{Constant('"Intrusion URL: '), Field(url,false), Constant('",Intrusion Payload URL:'), Field(p0,false)}" -match("MESSAGE#198:Local::04/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{p0}"); +var dup112 = match("MESSAGE#198:Local::04/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{p0}"); -var dup113 = // "Pattern{Constant('Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(p0,false)}" -match("MESSAGE#198:Local::04/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{p0}"); +var dup113 = match("MESSAGE#198:Local::04/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{p0}"); -var dup114 = // "Pattern{Field(fld25,false)}" -match_copy("MESSAGE#198:Local::04/2", "nwparser.p0", "fld25"); +var dup114 = match_copy("MESSAGE#198:Local::04/2", "nwparser.p0", "fld25"); var dup115 = setc("ec_subject","Virus"); var dup116 = setc("ec_activity","Detect"); -var dup117 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(network_service,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#205:Local::07/0", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var dup117 = match("MESSAGE#205:Local::07/0", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var dup118 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(network_service,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#206:Local::19/0", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var dup118 = match("MESSAGE#206:Local::19/0", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var dup119 = // "Pattern{Constant(''), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#209:Local::03/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain}"); +var dup119 = match("MESSAGE#209:Local::03/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain}"); var dup120 = setc("eventcategory","1801000000"); @@ -499,14 +465,11 @@ var dup137 = setf("domain","hdomain"); var dup138 = setc("event_description","The client has downloaded file successfully."); -var dup139 = // "Pattern{Constant('The client will block traffic from IP address '), Field(fld14,true), Constant(' for the next '), Field(duration_string,true), Constant(' (from '), Field(fld13,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#64:client:05/0", "nwparser.payload", "The client will block traffic from IP address %{fld14->} for the next %{duration_string->} (from %{fld13})%{p0}"); +var dup139 = match("MESSAGE#64:client:05/0", "nwparser.payload", "The client will block traffic from IP address %{fld14->} for the next %{duration_string->} (from %{fld13})%{p0}"); -var dup140 = // "Pattern{Constant('.,'), Field(p0,false)}" -match("MESSAGE#64:client:05/1_0", "nwparser.p0", ".,%{p0}"); +var dup140 = match("MESSAGE#64:client:05/1_0", "nwparser.p0", ".,%{p0}"); -var dup141 = // "Pattern{Constant(' . ,'), Field(p0,false)}" -match("MESSAGE#64:client:05/1_1", "nwparser.p0", " . ,%{p0}"); +var dup141 = match("MESSAGE#64:client:05/1_1", "nwparser.p0", " . ,%{p0}"); var dup142 = setf("shost","hclient"); @@ -514,26 +477,19 @@ var dup143 = setc("event_description","The client will block traffic."); var dup144 = setc("event_description","The client has successfully downloaded and applied a license file"); -var dup145 = // "Pattern{Constant('Commercial application detected,Computer name: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/0", "nwparser.payload", "Commercial application detected,Computer name: %{p0}"); +var dup145 = match("MESSAGE#70:Commercial/0", "nwparser.payload", "Commercial application detected,Computer name: %{p0}"); -var dup146 = // "Pattern{Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',Detection type: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/1_0", "nwparser.p0", "%{shost},IP Address: %{saddr},Detection type: %{p0}"); +var dup146 = match("MESSAGE#70:Commercial/1_0", "nwparser.p0", "%{shost},IP Address: %{saddr},Detection type: %{p0}"); -var dup147 = // "Pattern{Field(shost,false), Constant(',Detection type: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/1_1", "nwparser.p0", "%{shost},Detection type: %{p0}"); +var dup147 = match("MESSAGE#70:Commercial/1_1", "nwparser.p0", "%{shost},Detection type: %{p0}"); -var dup148 = // "Pattern{Field(severity,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld6,false), Constant(',Detection score:'), Field(fld7,false), Constant(',Submission recommendation: '), Field(fld8,false), Constant(',Permitted application reason: '), Field(fld9,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(fld1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#70:Commercial/2", "nwparser.p0", "%{severity},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); +var dup148 = match("MESSAGE#70:Commercial/2", "nwparser.p0", "%{severity},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); -var dup149 = // "Pattern{Constant('"'), Field(filename,false), Constant('",Actual action: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/3_0", "nwparser.p0", "\"%{filename}\",Actual action: %{p0}"); +var dup149 = match("MESSAGE#70:Commercial/3_0", "nwparser.p0", "\"%{filename}\",Actual action: %{p0}"); -var dup150 = // "Pattern{Field(filename,false), Constant(',Actual action: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/3_1", "nwparser.p0", "%{filename},Actual action: %{p0}"); +var dup150 = match("MESSAGE#70:Commercial/3_1", "nwparser.p0", "%{filename},Actual action: %{p0}"); -var dup151 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#70:Commercial/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var dup151 = match("MESSAGE#70:Commercial/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var dup152 = setf("threat_name","virusname"); @@ -557,19 +513,15 @@ var dup155 = setc("event_description","Commercial application detected"); var dup156 = setc("eventcategory","1701030000"); -var dup157 = // "Pattern{Constant('IP Address: '), Field(hostip,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#76:Computer/0", "nwparser.payload", "IP Address: %{hostip},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); +var dup157 = match("MESSAGE#76:Computer/0", "nwparser.payload", "IP Address: %{hostip},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); var dup158 = setf("administrator","husername"); -var dup159 = // "Pattern{Constant('"'), Field(filename,false), Constant('",'), Field(p0,false)}" -match("MESSAGE#78:Computer:03/1_0", "nwparser.p0", "\"%{filename}\",%{p0}"); +var dup159 = match("MESSAGE#78:Computer:03/1_0", "nwparser.p0", "\"%{filename}\",%{p0}"); -var dup160 = // "Pattern{Field(filename,false), Constant(','), Field(p0,false)}" -match("MESSAGE#78:Computer:03/1_1", "nwparser.p0", "%{filename},%{p0}"); +var dup160 = match("MESSAGE#78:Computer:03/1_1", "nwparser.p0", "%{filename},%{p0}"); -var dup161 = // "Pattern{Field(severity,false), Constant(',First Seen: '), Field(fld55,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld13,false), Constant(',Detection score:'), Field(fld7,false), Constant(',COH Engine Version: '), Field(fld41,false), Constant(','), Field(fld53,false), Constant(',Permitted application reason: '), Field(fld54,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',Risk Level: '), Field(fld50,false), Constant(',Detection Source: '), Field(fld52,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(fld22,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#79:Computer:02/2", "nwparser.p0", "%{severity},First Seen: %{fld55},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld13},Detection score:%{fld7},COH Engine Version: %{fld41},%{fld53},Permitted application reason: %{fld54},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var dup161 = match("MESSAGE#79:Computer:02/2", "nwparser.p0", "%{severity},First Seen: %{fld55},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld13},Detection score:%{fld7},COH Engine Version: %{fld41},%{fld53},Permitted application reason: %{fld54},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var dup162 = setc("event_description","Security risk found"); @@ -617,8 +569,7 @@ var dup174 = setc("eventcategory","1301000000"); var dup175 = setc("event_description","Failed to Login to Remote Site"); -var dup176 = // "Pattern{Constant('"'), Field(,false)}" -match("MESSAGE#250:Network:24/1_0", "nwparser.p0", "\"%{}"); +var dup176 = match("MESSAGE#250:Network:24/1_0", "nwparser.p0", "\"%{}"); var dup177 = setc("ec_subject","Group"); @@ -630,18 +581,15 @@ var dup180 = setc("event_description","Host Integrity check is disabled."); var dup181 = setc("event_description","Host Integrity failed but reported as pass"); -var dup182 = // "Pattern{Constant(' Domain:'), Field(p0,false)}" -match("MESSAGE#134:Host:09/1_1", "nwparser.p0", " Domain:%{p0}"); +var dup182 = match("MESSAGE#134:Host:09/1_1", "nwparser.p0", " Domain:%{p0}"); -var dup183 = // "Pattern{Constant('is '), Field(p0,false)}" -match("MESSAGE#135:Intrusion/1_0", "nwparser.p0", "is %{p0}"); +var dup183 = match("MESSAGE#135:Intrusion/1_0", "nwparser.p0", "is %{p0}"); var dup184 = setc("event_description","LiveUpdate"); var dup185 = setc("event_description","Submitting information to Symantec failed."); -var dup186 = // "Pattern{Constant('.,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#145:LiveUpdate:10/1_0", "nwparser.p0", ".,Event time:%{fld17->} %{fld18}"); +var dup186 = match("MESSAGE#145:LiveUpdate:10/1_0", "nwparser.p0", ".,Event time:%{fld17->} %{fld18}"); var dup187 = setc("ec_outcome","Error"); @@ -651,8 +599,7 @@ var dup189 = setf("hostid","hhost"); var dup190 = setc("event_description","The latest SONAR Definitions update failed to load."); -var dup191 = // "Pattern{Constant('",Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#179:LiveUpdate:40/1_0", "nwparser.p0", "\",Event time:%{fld17->} %{fld18}"); +var dup191 = match("MESSAGE#179:LiveUpdate:40/1_0", "nwparser.p0", "\",Event time:%{fld17->} %{fld18}"); var dup192 = date_time({ dest: "event_time", @@ -664,59 +611,43 @@ var dup192 = date_time({ var dup193 = setc("event_description","Virus Found"); -var dup194 = // "Pattern{Constant(' '), Field(p0,false)}" -match("MESSAGE#432:Virus:02/1_1", "nwparser.p0", " %{p0}"); +var dup194 = match("MESSAGE#432:Virus:02/1_1", "nwparser.p0", " %{p0}"); var dup195 = setc("event_description","Virus Definition File Update"); var dup196 = setf("event_description","hfld1"); -var dup197 = // "Pattern{Constant('Virus found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(p0,false)}" -match("MESSAGE#436:Virus:12/0", "nwparser.payload", "Virus found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); +var dup197 = match("MESSAGE#436:Virus:12/0", "nwparser.payload", "Virus found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); -var dup198 = // "Pattern{Constant('"'), Field(fld1,false), Constant('",Actual action: '), Field(p0,false)}" -match("MESSAGE#436:Virus:12/1_0", "nwparser.p0", "\"%{fld1}\",Actual action: %{p0}"); +var dup198 = match("MESSAGE#436:Virus:12/1_0", "nwparser.p0", "\"%{fld1}\",Actual action: %{p0}"); -var dup199 = // "Pattern{Field(fld1,false), Constant(',Actual action: '), Field(p0,false)}" -match("MESSAGE#436:Virus:12/1_1", "nwparser.p0", "%{fld1},Actual action: %{p0}"); +var dup199 = match("MESSAGE#436:Virus:12/1_1", "nwparser.p0", "%{fld1},Actual action: %{p0}"); var dup200 = setc("event_description","Virus found"); -var dup201 = // "Pattern{Constant('Intensive Protection Level: '), Field(fld61,false), Constant(',Certificate issuer: '), Field(fld60,false), Constant(',Certificate signer: '), Field(fld62,false), Constant(',Certificate thumbprint: '), Field(fld63,false), Constant(',Signing timestamp: '), Field(fld64,false), Constant(',Certificate serial number: '), Field(fld65,false), Constant(',Source: '), Field(p0,false)}" -match("MESSAGE#437:Virus:15/1_0", "nwparser.p0", "Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},Source: %{p0}"); +var dup201 = match("MESSAGE#437:Virus:15/1_0", "nwparser.p0", "Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},Source: %{p0}"); -var dup202 = // "Pattern{Constant('Source: '), Field(p0,false)}" -match("MESSAGE#437:Virus:15/1_1", "nwparser.p0", "Source: %{p0}"); +var dup202 = match("MESSAGE#437:Virus:15/1_1", "nwparser.p0", "Source: %{p0}"); -var dup203 = // "Pattern{Constant('"Group: '), Field(group,false), Constant('",Server: '), Field(p0,false)}" -match("MESSAGE#438:Virus:13/3_0", "nwparser.p0", "\"Group: %{group}\",Server: %{p0}"); +var dup203 = match("MESSAGE#438:Virus:13/3_0", "nwparser.p0", "\"Group: %{group}\",Server: %{p0}"); -var dup204 = // "Pattern{Constant('Group: '), Field(group,false), Constant(',Server: '), Field(p0,false)}" -match("MESSAGE#438:Virus:13/3_1", "nwparser.p0", "Group: %{group},Server: %{p0}"); +var dup204 = match("MESSAGE#438:Virus:13/3_1", "nwparser.p0", "Group: %{group},Server: %{p0}"); -var dup205 = // "Pattern{Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(p0,false)}" -match("MESSAGE#438:Virus:13/4", "nwparser.p0", "%{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{p0}"); +var dup205 = match("MESSAGE#438:Virus:13/4", "nwparser.p0", "%{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{p0}"); -var dup206 = // "Pattern{Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(event_type,false)}" -match("MESSAGE#438:Virus:13/5_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{event_type}"); +var dup206 = match("MESSAGE#438:Virus:13/5_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{event_type}"); -var dup207 = // "Pattern{Field(filename_size,false)}" -match_copy("MESSAGE#438:Virus:13/5_1", "nwparser.p0", "filename_size"); +var dup207 = match_copy("MESSAGE#438:Virus:13/5_1", "nwparser.p0", "filename_size"); -var dup208 = // "Pattern{Constant('Virus found,Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(p0,false)}" -match("MESSAGE#440:Virus:14/0", "nwparser.payload", "Virus found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); +var dup208 = match("MESSAGE#440:Virus:14/0", "nwparser.payload", "Virus found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); -var dup209 = // "Pattern{Constant('"'), Field(info,false), Constant('",Actual action: '), Field(p0,false)}" -match("MESSAGE#441:Virus:05/1_0", "nwparser.p0", "\"%{info}\",Actual action: %{p0}"); +var dup209 = match("MESSAGE#441:Virus:05/1_0", "nwparser.p0", "\"%{info}\",Actual action: %{p0}"); -var dup210 = // "Pattern{Field(info,false), Constant(',Actual action: '), Field(p0,false)}" -match("MESSAGE#441:Virus:05/1_1", "nwparser.p0", "%{info},Actual action: %{p0}"); +var dup210 = match("MESSAGE#441:Virus:05/1_1", "nwparser.p0", "%{info},Actual action: %{p0}"); -var dup211 = // "Pattern{Constant(''), Field(info,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#218:Location/3_0", "nwparser.p0", "%{info},Event time:%{fld17->} %{fld18}"); +var dup211 = match("MESSAGE#218:Location/3_0", "nwparser.p0", "%{info},Event time:%{fld17->} %{fld18}"); -var dup212 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#218:Location/3_1", "nwparser.p0", "info"); +var dup212 = match_copy("MESSAGE#218:Location/3_1", "nwparser.p0", "info"); var dup213 = setc("eventcategory","1701060000"); @@ -724,8 +655,7 @@ var dup214 = setc("event_description","Network Audit Search Unagented Hosts From var dup215 = setc("event_description","Network Intrusion Prevention is malfunctioning"); -var dup216 = // "Pattern{Constant(' by policy'), Field(,false)}" -match("MESSAGE#253:Network:27/1_0", "nwparser.p0", " by policy%{}"); +var dup216 = match("MESSAGE#253:Network:27/1_0", "nwparser.p0", " by policy%{}"); var dup217 = setc("event_description","Generic Exploit Mitigation"); @@ -745,16 +675,13 @@ var dup224 = setc("event_description","Policy has been added"); var dup225 = setc("event_description","Policy has been edited"); -var dup226 = // "Pattern{Constant(','), Field(p0,false)}" -match("MESSAGE#296:Policy:deleted/1_0", "nwparser.p0", ",%{p0}"); +var dup226 = match("MESSAGE#296:Policy:deleted/1_0", "nwparser.p0", ",%{p0}"); var dup227 = setc("event_description","Potential risk found"); -var dup228 = // "Pattern{Constant('Potential risk found,Computer name: '), Field(p0,false)}" -match("MESSAGE#298:Potential:02/0", "nwparser.payload", "Potential risk found,Computer name: %{p0}"); +var dup228 = match("MESSAGE#298:Potential:02/0", "nwparser.payload", "Potential risk found,Computer name: %{p0}"); -var dup229 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld20,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#299:Potential/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld20},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var dup229 = match("MESSAGE#299:Potential/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld20},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var dup230 = date_time({ dest: "recorded_time", @@ -764,8 +691,7 @@ var dup230 = date_time({ ], }); -var dup231 = // "Pattern{Field(event_description,false), Constant(', process id: '), Field(process_id,true), Constant(' Filename: '), Field(filename,true), Constant(' The change was denied by user'), Field(fld6,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#308:process:03/0", "nwparser.payload", "%{event_description}, process id: %{process_id->} Filename: %{filename->} The change was denied by user%{fld6}\"%{p0}"); +var dup231 = match("MESSAGE#308:process:03/0", "nwparser.payload", "%{event_description}, process id: %{process_id->} Filename: %{filename->} The change was denied by user%{fld6}\"%{p0}"); var dup232 = setc("eventcategory","1606000000"); @@ -807,17 +733,13 @@ var dup247 = setc("dclass_counter1_string","Risk Count."); var dup248 = setc("dclass_counter2_string","Scan Count."); -var dup249 = // "Pattern{Constant('''), Field(context,false), Constant('','), Field(p0,false)}" -match("MESSAGE#340:Scan:12/1_0", "nwparser.p0", "'%{context}',%{p0}"); +var dup249 = match("MESSAGE#340:Scan:12/1_0", "nwparser.p0", "'%{context}',%{p0}"); -var dup250 = // "Pattern{Constant('Security risk found,Computer name: '), Field(p0,false)}" -match("MESSAGE#343:Security:03/0", "nwparser.payload", "Security risk found,Computer name: %{p0}"); +var dup250 = match("MESSAGE#343:Security:03/0", "nwparser.payload", "Security risk found,Computer name: %{p0}"); -var dup251 = // "Pattern{Constant('Security risk found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(','), Field(p0,false)}" -match("MESSAGE#345:Security:05/0", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},%{p0}"); +var dup251 = match("MESSAGE#345:Security:05/0", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},%{p0}"); -var dup252 = // "Pattern{Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(vendor_event_cat,false)}" -match("MESSAGE#345:Security:05/7_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{vendor_event_cat}"); +var dup252 = match("MESSAGE#345:Security:05/7_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{vendor_event_cat}"); var dup253 = setc("event_description","Compressed File"); @@ -833,39 +755,29 @@ var dup258 = setc("event_description","services failed to start"); var dup259 = setc("eventcategory","1608010000"); -var dup260 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',Symantec AntiVirus,'), Field(p0,false)}" -match("MESSAGE#388:Symantec:26/0", "nwparser.payload", "Category: %{fld22},Symantec AntiVirus,%{p0}"); +var dup260 = match("MESSAGE#388:Symantec:26/0", "nwparser.payload", "Category: %{fld22},Symantec AntiVirus,%{p0}"); -var dup261 = // "Pattern{Constant('[Antivirus'), Field(p0,false)}" -match("MESSAGE#388:Symantec:26/1_0", "nwparser.p0", "[Antivirus%{p0}"); +var dup261 = match("MESSAGE#388:Symantec:26/1_0", "nwparser.p0", "[Antivirus%{p0}"); -var dup262 = // "Pattern{Constant('"[Antivirus'), Field(p0,false)}" -match("MESSAGE#388:Symantec:26/1_1", "nwparser.p0", "\"[Antivirus%{p0}"); +var dup262 = match("MESSAGE#388:Symantec:26/1_1", "nwparser.p0", "\"[Antivirus%{p0}"); -var dup263 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#389:Symantec:39/2", "nwparser.p0", "%{} %{p0}"); +var dup263 = match("MESSAGE#389:Symantec:39/2", "nwparser.p0", "%{} %{p0}"); -var dup264 = // "Pattern{Constant('detection'), Field(p0,false)}" -match("MESSAGE#389:Symantec:39/3_0", "nwparser.p0", "detection%{p0}"); +var dup264 = match("MESSAGE#389:Symantec:39/3_0", "nwparser.p0", "detection%{p0}"); -var dup265 = // "Pattern{Constant('advanced heuristic detection'), Field(p0,false)}" -match("MESSAGE#389:Symantec:39/3_1", "nwparser.p0", "advanced heuristic detection%{p0}"); +var dup265 = match("MESSAGE#389:Symantec:39/3_1", "nwparser.p0", "advanced heuristic detection%{p0}"); -var dup266 = // "Pattern{Constant(' Size (bytes): '), Field(filename_size,false), Constant('.",Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#389:Symantec:39/5_0", "nwparser.p0", " Size (bytes): %{filename_size}.\",Event time:%{fld17->} %{fld18}"); +var dup266 = match("MESSAGE#389:Symantec:39/5_0", "nwparser.p0", " Size (bytes): %{filename_size}.\",Event time:%{fld17->} %{fld18}"); -var dup267 = // "Pattern{Constant('Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#389:Symantec:39/5_2", "nwparser.p0", "Event time:%{fld17->} %{fld18}"); +var dup267 = match("MESSAGE#389:Symantec:39/5_2", "nwparser.p0", "Event time:%{fld17->} %{fld18}"); var dup268 = setc("ec_theme","Communication"); -var dup269 = // "Pattern{Constant(','), Field(p0,false)}" -match("MESSAGE#410:Terminated/0_1", "nwparser.payload", ",%{p0}"); +var dup269 = match("MESSAGE#410:Terminated/0_1", "nwparser.payload", ",%{p0}"); var dup270 = setc("event_description","Traffic from IP address is blocked."); -var dup271 = // "Pattern{Constant(''), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#416:Traffic:02/2", "nwparser.p0", "%{fld6},User: %{username},Domain: %{domain}"); +var dup271 = match("MESSAGE#416:Traffic:02/2", "nwparser.p0", "%{fld6},User: %{username},Domain: %{domain}"); var dup272 = setc("event_description","Unexpected server error."); @@ -873,26 +785,21 @@ var dup273 = setc("event_description","Unsolicited incoming ARP reply detected." var dup274 = setc("event_description","Windows Version info."); -var dup275 = // "Pattern{Constant('"'), Field(filename,false), Constant('",User: '), Field(p0,false)}" -match("MESSAGE#455:Allowed:09/2_0", "nwparser.p0", "\"%{filename}\",User: %{p0}"); +var dup275 = match("MESSAGE#455:Allowed:09/2_0", "nwparser.p0", "\"%{filename}\",User: %{p0}"); -var dup276 = // "Pattern{Field(filename,false), Constant(',User: '), Field(p0,false)}" -match("MESSAGE#455:Allowed:09/2_1", "nwparser.p0", "%{filename},User: %{p0}"); +var dup276 = match("MESSAGE#455:Allowed:09/2_1", "nwparser.p0", "%{filename},User: %{p0}"); var dup277 = setc("event_description","File Write"); -var dup278 = // "Pattern{Field(fld46,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#457:Allowed:10/3_0", "nwparser.p0", "%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); +var dup278 = match("MESSAGE#457:Allowed:10/3_0", "nwparser.p0", "%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); var dup279 = setc("event_description","File Delete"); var dup280 = setc("event_description","File Delete Begin."); -var dup281 = // "Pattern{Constant('""'), Field(action,true), Constant(' . Description: '), Field(p0,false)}" -match("MESSAGE#505:Ping/0_0", "nwparser.payload", "\"\"%{action->} . Description: %{p0}"); +var dup281 = match("MESSAGE#505:Ping/0_0", "nwparser.payload", "\"\"%{action->} . Description: %{p0}"); -var dup282 = // "Pattern{Field(action,true), Constant(' . Description: '), Field(p0,false)}" -match("MESSAGE#505:Ping/0_1", "nwparser.payload", "%{action->} . Description: %{p0}"); +var dup282 = match("MESSAGE#505:Ping/0_1", "nwparser.payload", "%{action->} . Description: %{p0}"); var dup283 = setc("dclass_counter1_string","Virus Count."); @@ -920,17 +827,13 @@ var dup288 = setc("ec_subject","Configuration"); var dup289 = setc("eventcategory","1801030000"); -var dup290 = // "Pattern{Field(event_description,true), Constant(' [name]:'), Field(obj_name,true), Constant(' [class]:'), Field(obj_type,true), Constant(' [guid]:'), Field(hardware_id,true), Constant(' [deviceID]:'), Field(info,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#639:303235080/1_0", "nwparser.p0", "%{event_description->} [name]:%{obj_name->} [class]:%{obj_type->} [guid]:%{hardware_id->} [deviceID]:%{info}^^%{p0}"); +var dup290 = match("MESSAGE#639:303235080/1_0", "nwparser.p0", "%{event_description->} [name]:%{obj_name->} [class]:%{obj_type->} [guid]:%{hardware_id->} [deviceID]:%{info}^^%{p0}"); -var dup291 = // "Pattern{Field(event_description,false), Constant('. '), Field(info,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#639:303235080/1_1", "nwparser.p0", "%{event_description}. %{info}^^%{p0}"); +var dup291 = match("MESSAGE#639:303235080/1_1", "nwparser.p0", "%{event_description}. %{info}^^%{p0}"); -var dup292 = // "Pattern{Field(event_description,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#639:303235080/1_2", "nwparser.p0", "%{event_description}^^%{p0}"); +var dup292 = match("MESSAGE#639:303235080/1_2", "nwparser.p0", "%{event_description}^^%{p0}"); -var dup293 = // "Pattern{Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#639:303235080/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}"); +var dup293 = match("MESSAGE#639:303235080/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}"); var dup294 = setc("eventcategory","1803000000"); @@ -966,8 +869,7 @@ var dup303 = setc("event_description","Block Local File Sharing to external comp var dup304 = setc("event_description","Block all other traffic"); -var dup305 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#674:238/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{p0}"); +var dup305 = match("MESSAGE#674:238/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{p0}"); var dup306 = field("fld11"); @@ -1139,55 +1041,47 @@ var dup341 = linear_select([ dup282, ]); -var dup342 = // "Pattern{Field(id,false), Constant('^^'), Field(event_description,false)}" -match("MESSAGE#524:1281", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ +var dup342 = match("MESSAGE#524:1281", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ dup53, dup15, ])); -var dup343 = // "Pattern{Field(id,false), Constant('^^'), Field(event_description,false)}" -match("MESSAGE#546:4868", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ +var dup343 = match("MESSAGE#546:4868", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ dup43, dup15, ])); -var dup344 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#549:302449153", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var dup344 = match("MESSAGE#549:302449153", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup43, dup15, dup287, ])); -var dup345 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#550:302449153:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var dup345 = match("MESSAGE#550:302449153:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup43, dup15, dup287, ])); -var dup346 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#553:302449155", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var dup346 = match("MESSAGE#553:302449155", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup74, dup15, dup287, ])); -var dup347 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#554:302449155:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var dup347 = match("MESSAGE#554:302449155:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup74, dup15, dup287, ])); -var dup348 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#585:302450432", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var dup348 = match("MESSAGE#585:302450432", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup168, dup15, dup287, ])); -var dup349 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#586:302450432:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var dup349 = match("MESSAGE#586:302450432:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup168, dup15, dup287, @@ -1235,8 +1129,7 @@ var dup356 = lookup({ key: dup306, }); -var dup357 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#664:206", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var dup357 = match("MESSAGE#664:206", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup294, dup295, dup37, @@ -1250,8 +1143,7 @@ match("MESSAGE#664:206", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos dup302, ])); -var dup358 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#665:206:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var dup358 = match("MESSAGE#665:206:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -1265,8 +1157,7 @@ match("MESSAGE#665:206:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{ dup302, ])); -var dup359 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#669:210", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var dup359 = match("MESSAGE#669:210", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup43, dup15, dup353, @@ -1277,8 +1168,7 @@ match("MESSAGE#669:210", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos dup302, ])); -var dup360 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(parent_pid,false), Constant('^^'), Field(parent_process,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(param,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(fld31,false), Constant('^^'), Field(filename_size,false), Constant('^^'), Field(fld32,false), Constant('^^'), Field(fld33,false)}" -match("MESSAGE#676:501", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{username}^^%{sdomain}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}^^%{fld31}^^%{filename_size}^^%{fld32}^^%{fld33}", processor_chain([ +var dup360 = match("MESSAGE#676:501", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{username}^^%{sdomain}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}^^%{fld31}^^%{filename_size}^^%{fld32}^^%{fld33}", processor_chain([ dup43, dup15, dup355, @@ -1289,8 +1179,7 @@ match("MESSAGE#676:501", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id} dup308, ])); -var dup361 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(parent_pid,false), Constant('^^'), Field(parent_process,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(param,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(fld30,false)}" -match("MESSAGE#677:501:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{username}^^%{sdomain}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}", processor_chain([ +var dup361 = match("MESSAGE#677:501:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{username}^^%{sdomain}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}", processor_chain([ dup43, dup15, dup355, @@ -1301,20 +1190,15 @@ match("MESSAGE#677:501:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{ dup308, ])); -var hdr1 = // "Pattern{Constant('%SYMANTECAV '), Field(p0,false)}" -match("HEADER#0:0001/0", "message", "%SYMANTECAV %{p0}"); +var hdr1 = match("HEADER#0:0001/0", "message", "%SYMANTECAV %{p0}"); -var part1 = // "Pattern{Constant('Delete '), Field(p0,false)}" -match("HEADER#0:0001/1_0", "nwparser.p0", "Delete %{p0}"); +var part1 = match("HEADER#0:0001/1_0", "nwparser.p0", "Delete %{p0}"); -var part2 = // "Pattern{Constant('Leave Alone '), Field(p0,false)}" -match("HEADER#0:0001/1_1", "nwparser.p0", "Leave Alone %{p0}"); +var part2 = match("HEADER#0:0001/1_1", "nwparser.p0", "Leave Alone %{p0}"); -var part3 = // "Pattern{Constant('Quarantine '), Field(p0,false)}" -match("HEADER#0:0001/1_2", "nwparser.p0", "Quarantine %{p0}"); +var part3 = match("HEADER#0:0001/1_2", "nwparser.p0", "Quarantine %{p0}"); -var part4 = // "Pattern{Constant('Undefined '), Field(p0,false)}" -match("HEADER#0:0001/1_3", "nwparser.p0", "Undefined %{p0}"); +var part4 = match("HEADER#0:0001/1_3", "nwparser.p0", "Undefined %{p0}"); var select1 = linear_select([ part1, @@ -1323,8 +1207,7 @@ var select1 = linear_select([ part4, ]); -var part5 = // "Pattern{Field(,false), Constant('..Alert: '), Field(messageid,true), Constant(' '), Field(data,false), Constant('..'), Field(p0,false)}" -match("HEADER#0:0001/2", "nwparser.p0", "%{}..Alert: %{messageid->} %{data}..%{p0}", processor_chain([ +var part5 = match("HEADER#0:0001/2", "nwparser.p0", "%{}..Alert: %{messageid->} %{data}..%{p0}", processor_chain([ dup1, ])); @@ -1339,20 +1222,17 @@ var all1 = all_match({ ]), }); -var hdr2 = // "Pattern{Constant('%SYMANTECAV Alert: '), Field(messageid,true), Constant(' '), Field(data,false), Constant('..'), Field(p0,false)}" -match("HEADER#1:0002", "message", "%SYMANTECAV Alert: %{messageid->} %{data}..%{p0}", processor_chain([ +var hdr2 = match("HEADER#1:0002", "message", "%SYMANTECAV Alert: %{messageid->} %{data}..%{p0}", processor_chain([ setc("header_id","0002"), dup1, ])); -var hdr3 = // "Pattern{Constant('%SYMANTECAV ..'), Field(messageid,true), Constant(' '), Field(data,false), Constant('..'), Field(p0,false)}" -match("HEADER#2:0003", "message", "%SYMANTECAV ..%{messageid->} %{data}..%{p0}", processor_chain([ +var hdr3 = match("HEADER#2:0003", "message", "%SYMANTECAV ..%{messageid->} %{data}..%{p0}", processor_chain([ setc("header_id","0003"), dup1, ])); -var hdr4 = // "Pattern{Constant('%SYMANTECAV '), Field(hfld1,true), Constant(' ..'), Field(messageid,true), Constant(' '), Field(hfld2,false), Constant('.. '), Field(p0,false)}" -match("HEADER#3:0004", "message", "%SYMANTECAV %{hfld1->} ..%{messageid->} %{hfld2}.. %{p0}", processor_chain([ +var hdr4 = match("HEADER#3:0004", "message", "%SYMANTECAV %{hfld1->} ..%{messageid->} %{hfld2}.. %{p0}", processor_chain([ setc("header_id","0004"), call({ dest: "nwparser.payload", @@ -1367,8 +1247,7 @@ match("HEADER#3:0004", "message", "%SYMANTECAV %{hfld1->} ..%{messageid->} %{hfl }), ])); -var hdr5 = // "Pattern{Constant('%SYMANTECAV '), Field(hfld1,true), Constant(' '), Field(messageid,true), Constant(' Found '), Field(p0,false)}" -match("HEADER#4:0005", "message", "%SYMANTECAV %{hfld1->} %{messageid->} Found %{p0}", processor_chain([ +var hdr5 = match("HEADER#4:0005", "message", "%SYMANTECAV %{hfld1->} %{messageid->} Found %{p0}", processor_chain([ setc("header_id","0005"), call({ dest: "nwparser.payload", @@ -1381,8 +1260,7 @@ match("HEADER#4:0005", "message", "%SYMANTECAV %{hfld1->} %{messageid->} Found % }), ])); -var hdr6 = // "Pattern{Constant('%SYMANTECAV '), Field(messageid,true), Constant(' '), Field(hfld1,false), Constant('..'), Field(p0,false)}" -match("HEADER#5:0006", "message", "%SYMANTECAV %{messageid->} %{hfld1}..%{p0}", processor_chain([ +var hdr6 = match("HEADER#5:0006", "message", "%SYMANTECAV %{messageid->} %{hfld1}..%{p0}", processor_chain([ setc("header_id","0006"), call({ dest: "nwparser.payload", @@ -1397,242 +1275,202 @@ match("HEADER#5:0006", "message", "%SYMANTECAV %{messageid->} %{hfld1}..%{p0}", }), ])); -var hdr7 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(',Admin: '), Field(husername,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#6:00081", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},%{messageid->} %{p0}", processor_chain([ +var hdr7 = match("HEADER#6:00081", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},%{messageid->} %{p0}", processor_chain([ setc("header_id","00081"), dup2, ])); -var hdr8 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(',Admin: '), Field(husername,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#7:0008", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},%{messageid->} %{p0}", processor_chain([ +var hdr8 = match("HEADER#7:0008", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},%{messageid->} %{p0}", processor_chain([ setc("header_id","0008"), dup2, ])); -var hdr9 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(',The '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#8:00091", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},The %{messageid->} %{p0}", processor_chain([ +var hdr9 = match("HEADER#8:00091", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},The %{messageid->} %{p0}", processor_chain([ setc("header_id","00091"), dup2, ])); -var hdr10 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(',The '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#9:0009", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},The %{messageid->} %{p0}", processor_chain([ +var hdr10 = match("HEADER#9:0009", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},The %{messageid->} %{p0}", processor_chain([ setc("header_id","0009"), dup2, ])); -var hdr11 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(',Admin: '), Field(husername,false), Constant(',The '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#10:00421", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},The %{messageid->} %{p0}", processor_chain([ +var hdr11 = match("HEADER#10:00421", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},The %{messageid->} %{p0}", processor_chain([ setc("header_id","00421"), dup2, ])); -var hdr12 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(',Admin: '), Field(husername,false), Constant(',The '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#11:0042", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},The %{messageid->} %{p0}", processor_chain([ +var hdr12 = match("HEADER#11:0042", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},Admin: %{husername},The %{messageid->} %{p0}", processor_chain([ setc("header_id","0042"), dup2, ])); -var hdr13 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#12:99991", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},%{messageid->} %{p0}", processor_chain([ +var hdr13 = match("HEADER#12:99991", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},%{messageid->} %{p0}", processor_chain([ setc("header_id","99991"), dup2, ])); -var hdr14 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',Domain: '), Field(hdomain,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#13:9999", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},%{messageid->} %{p0}", processor_chain([ +var hdr14 = match("HEADER#13:9999", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},Domain: %{hdomain},%{messageid->} %{p0}", processor_chain([ setc("header_id","9999"), dup2, ])); -var hdr15 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',"'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#14:00101", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},\"%{messageid->} %{p0}", processor_chain([ +var hdr15 = match("HEADER#14:00101", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},\"%{messageid->} %{p0}", processor_chain([ setc("header_id","00101"), dup2, ])); -var hdr16 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',"'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#15:0010", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},\"%{messageid->} %{p0}", processor_chain([ +var hdr16 = match("HEADER#15:0010", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},\"%{messageid->} %{p0}", processor_chain([ setc("header_id","0010"), dup2, ])); -var hdr17 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(','), Field(messageid,false), Constant('.'), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("HEADER#16:00111", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},%{messageid}.%{fld2->} %{p0}", processor_chain([ +var hdr17 = match("HEADER#16:00111", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},%{messageid}.%{fld2->} %{p0}", processor_chain([ setc("header_id","00111"), dup3, ])); -var hdr18 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(','), Field(messageid,false), Constant('.'), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("HEADER#17:0011", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},%{messageid}.%{fld2->} %{p0}", processor_chain([ +var hdr18 = match("HEADER#17:0011", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},%{messageid}.%{fld2->} %{p0}", processor_chain([ setc("header_id","0011"), dup3, ])); -var hdr19 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#18:00121", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},%{messageid->} %{p0}", processor_chain([ +var hdr19 = match("HEADER#18:00121", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},%{messageid->} %{p0}", processor_chain([ setc("header_id","00121"), dup2, ])); -var hdr20 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#19:0012", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},%{messageid->} %{p0}", processor_chain([ +var hdr20 = match("HEADER#19:0012", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},%{messageid->} %{p0}", processor_chain([ setc("header_id","0012"), dup2, ])); -var hdr21 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(','), Field(fld20,true), Constant(' '), Field(fld21,true), Constant(' '), Field(fld23,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#20:11111", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},%{fld20->} %{fld21->} %{fld23->} %{messageid->} %{p0}", processor_chain([ +var hdr21 = match("HEADER#20:11111", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},%{fld20->} %{fld21->} %{fld23->} %{messageid->} %{p0}", processor_chain([ setc("header_id","11111"), dup2, ])); -var hdr22 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(','), Field(fld20,true), Constant(' '), Field(fld21,true), Constant(' '), Field(fld23,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#21:1111", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},%{fld20->} %{fld21->} %{fld23->} %{messageid->} %{p0}", processor_chain([ +var hdr22 = match("HEADER#21:1111", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},%{fld20->} %{fld21->} %{fld23->} %{messageid->} %{p0}", processor_chain([ setc("header_id","1111"), dup2, ])); -var hdr23 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',Category: '), Field(hdata,false), Constant(','), Field(hfld1,false), Constant(',"'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#22:13131", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},Category: %{hdata},%{hfld1},\"%{messageid->} %{p0}", processor_chain([ +var hdr23 = match("HEADER#22:13131", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},Category: %{hdata},%{hfld1},\"%{messageid->} %{p0}", processor_chain([ setc("header_id","13131"), dup2, ])); -var hdr24 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',Category: '), Field(hdata,false), Constant(','), Field(hfld1,false), Constant(',"'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#23:1313", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},Category: %{hdata},%{hfld1},\"%{messageid->} %{p0}", processor_chain([ +var hdr24 = match("HEADER#23:1313", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},Category: %{hdata},%{hfld1},\"%{messageid->} %{p0}", processor_chain([ setc("header_id","1313"), dup2, ])); -var hdr25 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',Category: '), Field(hdata,false), Constant(','), Field(hfld1,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#24:00131", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},Category: %{hdata},%{hfld1},%{messageid->} %{p0}", processor_chain([ +var hdr25 = match("HEADER#24:00131", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},Category: %{hdata},%{hfld1},%{messageid->} %{p0}", processor_chain([ setc("header_id","00131"), dup2, ])); -var hdr26 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',Category: '), Field(hdata,false), Constant(','), Field(hfld1,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#25:0013", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},Category: %{hdata},%{hfld1},%{messageid->} %{p0}", processor_chain([ +var hdr26 = match("HEADER#25:0013", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},Category: %{hdata},%{hfld1},%{messageid->} %{p0}", processor_chain([ setc("header_id","0013"), dup2, ])); -var hdr27 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',"[SID: '), Field(hfld1,false), Constant('] '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#26:13142", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},\"[SID: %{hfld1}] %{messageid->} %{p0}", processor_chain([ +var hdr27 = match("HEADER#26:13142", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},\"[SID: %{hfld1}] %{messageid->} %{p0}", processor_chain([ setc("header_id","13142"), dup2, ])); -var hdr28 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',"[SID: '), Field(hfld1,false), Constant('] '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#27:13141", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"[SID: %{hfld1}] %{messageid->} %{p0}", processor_chain([ +var hdr28 = match("HEADER#27:13141", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"[SID: %{hfld1}] %{messageid->} %{p0}", processor_chain([ setc("header_id","13141"), dup2, ])); -var hdr29 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',"[SID: '), Field(hfld1,false), Constant('] '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#28:1314", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"[SID: %{hfld1}] %{messageid->} %{p0}", processor_chain([ +var hdr29 = match("HEADER#28:1314", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"[SID: %{hfld1}] %{messageid->} %{p0}", processor_chain([ setc("header_id","1314"), dup2, ])); -var hdr30 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',[SID: '), Field(hdata,false), Constant('] '), Field(hfld1,false), Constant('. Traffic has been '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#29:00141", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},[SID: %{hdata}] %{hfld1}. Traffic has been %{messageid->} %{p0}", processor_chain([ +var hdr30 = match("HEADER#29:00141", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},[SID: %{hdata}] %{hfld1}. Traffic has been %{messageid->} %{p0}", processor_chain([ setc("header_id","00141"), dup4, ])); -var hdr31 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',[SID: '), Field(hdata,false), Constant('] '), Field(hfld1,false), Constant('. Traffic has been '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#30:0014", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},[SID: %{hdata}] %{hfld1}. Traffic has been %{messageid->} %{p0}", processor_chain([ +var hdr31 = match("HEADER#30:0014", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},[SID: %{hdata}] %{hfld1}. Traffic has been %{messageid->} %{p0}", processor_chain([ setc("header_id","0014"), dup4, ])); -var hdr32 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#31:00161", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{messageid->} %{p0}", processor_chain([ +var hdr32 = match("HEADER#31:00161", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{messageid->} %{p0}", processor_chain([ setc("header_id","00161"), dup2, ])); -var hdr33 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#32:0016", "message", "%{htime->} SymantecServer %{hhost}: %{messageid->} %{p0}", processor_chain([ +var hdr33 = match("HEADER#32:0016", "message", "%{htime->} SymantecServer %{hhost}: %{messageid->} %{p0}", processor_chain([ setc("header_id","0016"), dup2, ])); -var hdr34 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(','), Field(fld1,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#33:29292", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},%{fld1->} %{messageid->} %{p0}", processor_chain([ +var hdr34 = match("HEADER#33:29292", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},%{fld1->} %{messageid->} %{p0}", processor_chain([ setc("header_id","29292"), dup5, ])); -var hdr35 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(fld1,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#34:29291", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{fld1->} %{messageid->} %{p0}", processor_chain([ +var hdr35 = match("HEADER#34:29291", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{fld1->} %{messageid->} %{p0}", processor_chain([ setc("header_id","29291"), dup5, ])); -var hdr36 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(','), Field(fld1,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#35:2929", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{fld1->} %{messageid->} %{p0}", processor_chain([ +var hdr36 = match("HEADER#35:2929", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{fld1->} %{messageid->} %{p0}", processor_chain([ setc("header_id","2929"), dup5, ])); -var hdr37 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(fld1,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#36:00291", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{fld1->} %{messageid->} %{p0}", processor_chain([ +var hdr37 = match("HEADER#36:00291", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{fld1->} %{messageid->} %{p0}", processor_chain([ setc("header_id","00291"), dup5, ])); -var hdr38 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(fld1,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#37:0029", "message", "%{htime->} SymantecServer %{hhost}: %{fld1->} %{messageid->} %{p0}", processor_chain([ +var hdr38 = match("HEADER#37:0029", "message", "%{htime->} SymantecServer %{hhost}: %{fld1->} %{messageid->} %{p0}", processor_chain([ setc("header_id","0029"), dup5, ])); -var hdr39 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhostip,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#38:00173", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhostip->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},%{messageid->} %{p0}", processor_chain([ +var hdr39 = match("HEADER#38:00173", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhostip->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},%{messageid->} %{p0}", processor_chain([ setc("header_id","00173"), dup2, ])); -var hdr40 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#39:00172", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},%{messageid->} %{p0}", processor_chain([ +var hdr40 = match("HEADER#39:00172", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},SHA-256:%{checksum},MD-5:%{checksum},%{messageid->} %{p0}", processor_chain([ setc("header_id","00172"), dup2, ])); -var hdr41 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#40:00171", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{messageid->} %{p0}", processor_chain([ +var hdr41 = match("HEADER#40:00171", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{messageid->} %{p0}", processor_chain([ setc("header_id","00171"), dup2, ])); -var hdr42 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#41:0017", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{messageid->} %{p0}", processor_chain([ +var hdr42 = match("HEADER#41:0017", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{messageid->} %{p0}", processor_chain([ setc("header_id","0017"), dup2, ])); -var hdr43 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(hname,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#42:00151", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{hname},%{messageid->} %{p0}", processor_chain([ +var hdr43 = match("HEADER#42:00151", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{hname},%{messageid->} %{p0}", processor_chain([ setc("header_id","00151"), dup6, ])); -var hdr44 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(','), Field(hname,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#43:0015", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{hname},%{messageid->} %{p0}", processor_chain([ +var hdr44 = match("HEADER#43:0015", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{hname},%{messageid->} %{p0}", processor_chain([ setc("header_id","0015"), dup6, ])); -var hdr45 = // "Pattern{Constant('%SYMANTECAV Actual Name: '), Field(hfld1,true), Constant(' ..Alert: '), Field(messageid,true), Constant(' '), Field(data,false), Constant('..'), Field(p0,false)}" -match("HEADER#44:0018", "message", "%SYMANTECAV Actual Name: %{hfld1->} ..Alert: %{messageid->} %{data}..%{p0}", processor_chain([ +var hdr45 = match("HEADER#44:0018", "message", "%SYMANTECAV Actual Name: %{hfld1->} ..Alert: %{messageid->} %{data}..%{p0}", processor_chain([ setc("header_id","0018"), dup1, ])); -var hdr46 = // "Pattern{Constant('%SYMANTECAV '), Field(hfld1,true), Constant(' '), Field(hfld2,true), Constant(' '), Field(messageid,true), Constant(' '), Field(hfld3,true), Constant(' '), Field(p0,false)}" -match("HEADER#45:0021", "message", "%SYMANTECAV %{hfld1->} %{hfld2->} %{messageid->} %{hfld3->} %{p0}", processor_chain([ +var hdr46 = match("HEADER#45:0021", "message", "%SYMANTECAV %{hfld1->} %{hfld2->} %{messageid->} %{hfld3->} %{p0}", processor_chain([ setc("header_id","0021"), call({ dest: "nwparser.payload", @@ -1651,8 +1489,7 @@ match("HEADER#45:0021", "message", "%SYMANTECAV %{hfld1->} %{hfld2->} %{messagei }), ])); -var hdr47 = // "Pattern{Constant('%SYMANTECAV '), Field(hfld1,true), Constant(' '), Field(hfld2,true), Constant(' '), Field(hfld3,true), Constant(' '), Field(messageid,true), Constant(' '), Field(hfld4,true), Constant(' '), Field(p0,false)}" -match("HEADER#46:0022", "message", "%SYMANTECAV %{hfld1->} %{hfld2->} %{hfld3->} %{messageid->} %{hfld4->} %{p0}", processor_chain([ +var hdr47 = match("HEADER#46:0022", "message", "%SYMANTECAV %{hfld1->} %{hfld2->} %{hfld3->} %{messageid->} %{hfld4->} %{p0}", processor_chain([ setc("header_id","0022"), call({ dest: "nwparser.payload", @@ -1673,74 +1510,61 @@ match("HEADER#46:0022", "message", "%SYMANTECAV %{hfld1->} %{hfld2->} %{hfld3->} }), ])); -var hdr48 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',Category: '), Field(hdata,false), Constant(','), Field(hfld1,false), Constant(','), Field(fld40,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#47:00191", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},Category: %{hdata},%{hfld1},%{fld40->} %{messageid->} %{p0}", processor_chain([ +var hdr48 = match("HEADER#47:00191", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},Category: %{hdata},%{hfld1},%{fld40->} %{messageid->} %{p0}", processor_chain([ setc("header_id","00191"), dup7, ])); -var hdr49 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',Category: '), Field(hdata,false), Constant(','), Field(hfld1,false), Constant(','), Field(fld40,true), Constant(' '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#48:0019", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},Category: %{hdata},%{hfld1},%{fld40->} %{messageid->} %{p0}", processor_chain([ +var hdr49 = match("HEADER#48:0019", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},Category: %{hdata},%{hfld1},%{fld40->} %{messageid->} %{p0}", processor_chain([ setc("header_id","0019"), dup7, ])); -var hdr50 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',The '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#49:00201", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},The %{messageid->} %{p0}", processor_chain([ +var hdr50 = match("HEADER#49:00201", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hurl},Server: %{hhostid},The %{messageid->} %{p0}", processor_chain([ setc("header_id","00201"), dup2, ])); -var hdr51 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hurl,false), Constant(',Server: '), Field(hhostid,false), Constant(',The '), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#50:0020", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},The %{messageid->} %{p0}", processor_chain([ +var hdr51 = match("HEADER#50:0020", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hurl},Server: %{hhostid},The %{messageid->} %{p0}", processor_chain([ setc("header_id","0020"), dup2, ])); -var hdr52 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',"'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#51:00231", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"%{messageid->} %{p0}", processor_chain([ +var hdr52 = match("HEADER#51:00231", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"%{messageid->} %{p0}", processor_chain([ setc("header_id","00231"), dup2, ])); -var hdr53 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',"'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#52:0023", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"%{messageid->} %{p0}", processor_chain([ +var hdr53 = match("HEADER#52:0023", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"%{messageid->} %{p0}", processor_chain([ setc("header_id","0023"), dup2, ])); -var hdr54 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(messageid,false), Constant(','), Field(payload,false)}" -match("HEADER#53:00241", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{messageid},%{payload}", processor_chain([ +var hdr54 = match("HEADER#53:00241", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{messageid},%{payload}", processor_chain([ setc("header_id","00241"), ])); -var hdr55 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(','), Field(messageid,false), Constant(','), Field(payload,false)}" -match("HEADER#54:0024", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{messageid},%{payload}", processor_chain([ +var hdr55 = match("HEADER#54:0024", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{messageid},%{payload}", processor_chain([ setc("header_id","0024"), ])); -var hdr56 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',"'), Field(haction,true), Constant(' """"'), Field(messageid,true), Constant(' of Death"" '), Field(payload,false)}" -match("HEADER#55:00261", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"%{haction->} \"\"\"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ +var hdr56 = match("HEADER#55:00261", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"%{haction->} \"\"\"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ setc("header_id","00261"), ])); -var hdr57 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',"'), Field(haction,true), Constant(' """"'), Field(messageid,true), Constant(' of Death"" '), Field(payload,false)}" -match("HEADER#56:0026", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"%{haction->} \"\"\"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ +var hdr57 = match("HEADER#56:0026", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"%{haction->} \"\"\"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ setc("header_id","0026"), ])); -var hdr58 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(',"'), Field(haction,true), Constant(' ""'), Field(messageid,true), Constant(' of Death"" '), Field(payload,false)}" -match("HEADER#57:00371", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"%{haction->} \"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ +var hdr58 = match("HEADER#57:00371", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},\"%{haction->} \"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ setc("header_id","00371"), ])); -var hdr59 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(',"'), Field(haction,true), Constant(' ""'), Field(messageid,true), Constant(' of Death"" '), Field(payload,false)}" -match("HEADER#58:0037", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"%{haction->} \"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ +var hdr59 = match("HEADER#58:0037", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},\"%{haction->} \"\"%{messageid->} of Death\"\" %{payload}", processor_chain([ setc("header_id","0037"), ])); -var hdr60 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: Site: '), Field(hsite,false), Constant(','), Field(messageid,false), Constant(': '), Field(p0,false)}" -match("HEADER#59:00271", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hsite},%{messageid}: %{p0}", processor_chain([ +var hdr60 = match("HEADER#59:00271", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: Site: %{hsite},%{messageid}: %{p0}", processor_chain([ setc("header_id","00271"), call({ dest: "nwparser.payload", @@ -1757,8 +1581,7 @@ match("HEADER#59:00271", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hs }), ])); -var hdr61 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': Site: '), Field(hsite,false), Constant(','), Field(messageid,false), Constant(': '), Field(p0,false)}" -match("HEADER#60:0027", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hsite},%{messageid}: %{p0}", processor_chain([ +var hdr61 = match("HEADER#60:0027", "message", "%{htime->} SymantecServer %{hhost}: Site: %{hsite},%{messageid}: %{p0}", processor_chain([ setc("header_id","0027"), call({ dest: "nwparser.payload", @@ -1775,23 +1598,19 @@ match("HEADER#60:0027", "message", "%{htime->} SymantecServer %{hhost}: Site: %{ }), ])); -var hdr62 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(messageid,false), Constant(': '), Field(payload,false)}" -match("HEADER#61:00301", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{messageid}: %{payload}", processor_chain([ +var hdr62 = match("HEADER#61:00301", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{messageid}: %{payload}", processor_chain([ setc("header_id","00301"), ])); -var hdr63 = // "Pattern{Field(htime,true), Constant(' SymantecServer '), Field(hhost,false), Constant(': '), Field(hshost,false), Constant(','), Field(messageid,false), Constant(': '), Field(payload,false)}" -match("HEADER#62:0030", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{messageid}: %{payload}", processor_chain([ +var hdr63 = match("HEADER#62:0030", "message", "%{htime->} SymantecServer %{hhost}: %{hshost},%{messageid}: %{payload}", processor_chain([ setc("header_id","0030"), ])); -var hdr64 = // "Pattern{Field(hmonth,true), Constant(' '), Field(hday,true), Constant(' '), Field(hhour,false), Constant(':'), Field(hmin,false), Constant(':'), Field(hsec,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(hsaddr,false), Constant(','), Field(messageid,false), Constant(','), Field(payload,false)}" -match("HEADER#63:00242", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{hsaddr},%{messageid},%{payload}", processor_chain([ +var hdr64 = match("HEADER#63:00242", "message", "%{hmonth->} %{hday->} %{hhour}:%{hmin}:%{hsec->} %{hhost->} SymantecServer: %{hshost},%{hsaddr},%{messageid},%{payload}", processor_chain([ setc("header_id","00242"), ])); -var hdr65 = // "Pattern{Field(htime,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(hsaddr,false), Constant(','), Field(hfld1,false), Constant(','), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#64:00243", "message", "%{htime->} %{hhost->} SymantecServer: %{hshost},%{hsaddr},%{hfld1},%{messageid->} %{p0}", processor_chain([ +var hdr65 = match("HEADER#64:00243", "message", "%{htime->} %{hhost->} SymantecServer: %{hshost},%{hsaddr},%{hfld1},%{messageid->} %{p0}", processor_chain([ setc("header_id","00243"), call({ dest: "nwparser.payload", @@ -1806,25 +1625,21 @@ match("HEADER#64:00243", "message", "%{htime->} %{hhost->} SymantecServer: %{hsh }), ])); -var hdr66 = // "Pattern{Field(htime,true), Constant(' '), Field(hhost,true), Constant(' SymantecServer: '), Field(hshost,false), Constant(','), Field(hsaddr,false), Constant(','), Field(messageid,false), Constant(','), Field(payload,false)}" -match("HEADER#65:00244", "message", "%{htime->} %{hhost->} SymantecServer: %{hshost},%{hsaddr},%{messageid},%{payload}", processor_chain([ +var hdr66 = match("HEADER#65:00244", "message", "%{htime->} %{hhost->} SymantecServer: %{hshost},%{hsaddr},%{messageid},%{payload}", processor_chain([ setc("header_id","00244"), ])); -var hdr67 = // "Pattern{Constant('%SymantecEP: '), Field(messageid,false), Constant('^^'), Field(hhost,false), Constant('^^'), Field(p0,false)}" -match("HEADER#66:0031", "message", "%SymantecEP: %{messageid}^^%{hhost}^^%{p0}", processor_chain([ +var hdr67 = match("HEADER#66:0031", "message", "%SymantecEP: %{messageid}^^%{hhost}^^%{p0}", processor_chain([ setc("header_id","0031"), dup8, ])); -var hdr68 = // "Pattern{Constant('%SymantecEP-'), Field(hevent,false), Constant(': '), Field(hdomain,false), Constant('^^'), Field(hlevel,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(messageid,true), Constant(' '), Field(p0,false)}" -match("HEADER#67:0032", "message", "%SymantecEP-%{hevent}: %{hdomain}^^%{hlevel}^^%{fld1}^^%{messageid->} %{p0}", processor_chain([ +var hdr68 = match("HEADER#67:0032", "message", "%SymantecEP-%{hevent}: %{hdomain}^^%{hlevel}^^%{fld1}^^%{messageid->} %{p0}", processor_chain([ setc("header_id","0032"), dup2, ])); -var hdr69 = // "Pattern{Constant('%SymantecEP-'), Field(hfld1,false), Constant(': '), Field(hfld2,false), Constant('^^'), Field(hfld3,false), Constant('^^'), Field(hfld4,false), Constant('^^'), Field(hfld5,false), Constant('^^'), Field(hfld6,false), Constant('^^'), Field(hfld7,false), Constant('^^'), Field(messageid,false), Constant('^^'), Field(p0,false)}" -match("HEADER#68:0040", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld5}^^%{hfld6}^^%{hfld7}^^%{messageid}^^%{p0}", processor_chain([ +var hdr69 = match("HEADER#68:0040", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld5}^^%{hfld6}^^%{hfld7}^^%{messageid}^^%{p0}", processor_chain([ setc("header_id","0040"), call({ dest: "nwparser.payload", @@ -1849,14 +1664,12 @@ match("HEADER#68:0040", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{ }), ])); -var hdr70 = // "Pattern{Constant('%SymantecEP-'), Field(hevent,false), Constant(': '), Field(hdomain,false), Constant('^^'), Field(hlevel,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(messageid,false), Constant('.'), Field(fld2,true), Constant(' '), Field(p0,false)}" -match("HEADER#69:0033", "message", "%SymantecEP-%{hevent}: %{hdomain}^^%{hlevel}^^%{fld1}^^%{messageid}.%{fld2->} %{p0}", processor_chain([ +var hdr70 = match("HEADER#69:0033", "message", "%SymantecEP-%{hevent}: %{hdomain}^^%{hlevel}^^%{fld1}^^%{messageid}.%{fld2->} %{p0}", processor_chain([ setc("header_id","0033"), dup3, ])); -var hdr71 = // "Pattern{Constant('%SymantecEP-'), Field(hevent,false), Constant(': '), Field(hdomain,false), Constant('^^'), Field(hlevel,false), Constant('^^'), Field(messageid,false), Constant('^^'), Field(p0,false)}" -match("HEADER#70:0034", "message", "%SymantecEP-%{hevent}: %{hdomain}^^%{hlevel}^^%{messageid}^^%{p0}", processor_chain([ +var hdr71 = match("HEADER#70:0034", "message", "%SymantecEP-%{hevent}: %{hdomain}^^%{hlevel}^^%{messageid}^^%{p0}", processor_chain([ setc("header_id","0034"), call({ dest: "nwparser.payload", @@ -1869,14 +1682,12 @@ match("HEADER#70:0034", "message", "%SymantecEP-%{hevent}: %{hdomain}^^%{hlevel} }), ])); -var hdr72 = // "Pattern{Constant('%SymantecEP-'), Field(hfld1,false), Constant(': '), Field(messageid,false), Constant('^^'), Field(hhost,false), Constant('^^'), Field(p0,false)}" -match("HEADER#71:0035", "message", "%SymantecEP-%{hfld1}: %{messageid}^^%{hhost}^^%{p0}", processor_chain([ +var hdr72 = match("HEADER#71:0035", "message", "%SymantecEP-%{hfld1}: %{messageid}^^%{hhost}^^%{p0}", processor_chain([ setc("header_id","0035"), dup8, ])); -var hdr73 = // "Pattern{Constant('%SymantecEP-'), Field(hfld1,false), Constant(': '), Field(hfld2,false), Constant('^^'), Field(hfld3,false), Constant('^^'), Field(hfld4,false), Constant('^^'), Field(hfld5,false), Constant('^^'), Field(hfld6,false), Constant('^^'), Field(messageid,false), Constant('^^'), Field(p0,false)}" -match("HEADER#72:0038", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld5}^^%{hfld6}^^%{messageid}^^%{p0}", processor_chain([ +var hdr73 = match("HEADER#72:0038", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld5}^^%{hfld6}^^%{messageid}^^%{p0}", processor_chain([ setc("header_id","0038"), call({ dest: "nwparser.payload", @@ -1899,8 +1710,7 @@ match("HEADER#72:0038", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{ }), ])); -var hdr74 = // "Pattern{Constant('%SymantecEP-'), Field(hfld1,false), Constant(': '), Field(hfld2,false), Constant('^^'), Field(hfld3,false), Constant('^^'), Field(hfld4,false), Constant('^^'), Field(messageid,false), Constant('^^'), Field(p0,false)}" -match("HEADER#73:0041", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{messageid}^^%{p0}", processor_chain([ +var hdr74 = match("HEADER#73:0041", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{messageid}^^%{p0}", processor_chain([ setc("header_id","0041"), call({ dest: "nwparser.payload", @@ -1919,8 +1729,7 @@ match("HEADER#73:0041", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{ }), ])); -var hdr75 = // "Pattern{Constant('%SymantecEP-'), Field(hfld1,false), Constant(': '), Field(hfld2,false), Constant('^^'), Field(hfld3,false), Constant('^^'), Field(hfld4,false), Constant('^^'), Field(hfld7,false), Constant('^^'), Field(messageid,false), Constant('^^'), Field(p0,false)}" -match("HEADER#74:0043", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld7}^^%{messageid}^^%{p0}", processor_chain([ +var hdr75 = match("HEADER#74:0043", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld7}^^%{messageid}^^%{p0}", processor_chain([ setc("header_id","0043"), call({ dest: "nwparser.payload", @@ -1941,8 +1750,7 @@ match("HEADER#74:0043", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{ }), ])); -var hdr76 = // "Pattern{Constant('%SymantecEP-'), Field(hfld1,false), Constant(': '), Field(hfld2,false), Constant('^^'), Field(hfld3,false), Constant('^^'), Field(hfld4,false), Constant('^^'), Field(hfld5,false), Constant('^^'), Field(hfld6,false), Constant('^^'), Field(hfld7,false), Constant('^^'), Field(hfld8,false), Constant('^^'), Field(messageid,false), Constant('^^'), Field(p0,false)}" -match("HEADER#75:0039", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld5}^^%{hfld6}^^%{hfld7}^^%{hfld8}^^%{messageid}^^%{p0}", processor_chain([ +var hdr76 = match("HEADER#75:0039", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld5}^^%{hfld6}^^%{hfld7}^^%{hfld8}^^%{messageid}^^%{p0}", processor_chain([ setc("header_id","0039"), call({ dest: "nwparser.payload", @@ -1969,8 +1777,7 @@ match("HEADER#75:0039", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{ }), ])); -var hdr77 = // "Pattern{Constant('%SymantecEP-'), Field(hfld1,false), Constant(': '), Field(hfld2,false), Constant('^^'), Field(hfld3,false), Constant('^^'), Field(hfld4,false), Constant('^^'), Field(hfld7,false), Constant('^^'), Field(hfld8,false), Constant('^^'), Field(messageid,false), Constant('^^'), Field(p0,false)}" -match("HEADER#76:0044", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld7}^^%{hfld8}^^%{messageid}^^%{p0}", processor_chain([ +var hdr77 = match("HEADER#76:0044", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{hfld4}^^%{hfld7}^^%{hfld8}^^%{messageid}^^%{p0}", processor_chain([ setc("header_id","0044"), call({ dest: "nwparser.payload", @@ -1993,8 +1800,7 @@ match("HEADER#76:0044", "message", "%SymantecEP-%{hfld1}: %{hfld2}^^%{hfld3}^^%{ }), ])); -var hdr78 = // "Pattern{Constant('%NICWIN-4-'), Field(msgIdPart1,false), Constant('_'), Field(msgIdPart2,false), Constant('_Symantec: '), Field(payload,false)}" -match("HEADER#77:0045", "message", "%NICWIN-4-%{msgIdPart1}_%{msgIdPart2}_Symantec: %{payload}", processor_chain([ +var hdr78 = match("HEADER#77:0045", "message", "%NICWIN-4-%{msgIdPart1}_%{msgIdPart2}_Symantec: %{payload}", processor_chain([ setc("header_id","0045"), call({ dest: "nwparser.messageid", @@ -2007,8 +1813,7 @@ match("HEADER#77:0045", "message", "%NICWIN-4-%{msgIdPart1}_%{msgIdPart2}_Symant }), ])); -var hdr79 = // "Pattern{Constant('%NICWIN-4-'), Field(messageid,false), Constant('_'), Field(hfld2,false), Constant('_Symantec AntiVirus: '), Field(payload,false)}" -match("HEADER#78:0046", "message", "%NICWIN-4-%{messageid}_%{hfld2}_Symantec AntiVirus: %{payload}", processor_chain([ +var hdr79 = match("HEADER#78:0046", "message", "%NICWIN-4-%{messageid}_%{hfld2}_Symantec AntiVirus: %{payload}", processor_chain([ setc("header_id","0046"), ])); @@ -2094,8 +1899,7 @@ var select2 = linear_select([ hdr79, ]); -var part6 = // "Pattern{Constant('Active Response that started at '), Field(fld1,true), Constant(' is disengaged. The traffic from IP address '), Field(hostip,true), Constant(' was blocked for '), Field(fld2,true), Constant(' second(s).,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld7,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(','), Field(direction,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(', Domain: '), Field(p0,false)}" -match("MESSAGE#0:Active/0", "nwparser.payload", "Active Response that started at %{fld1->} is disengaged. The traffic from IP address %{hostip->} was blocked for %{fld2->} second(s).,Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},%{direction},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); +var part6 = match("MESSAGE#0:Active/0", "nwparser.payload", "Active Response that started at %{fld1->} is disengaged. The traffic from IP address %{hostip->} was blocked for %{fld2->} second(s).,Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},%{direction},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); var all2 = all_match({ processors: [ @@ -2117,8 +1921,7 @@ var all2 = all_match({ var msg1 = msg("Active", all2); -var part7 = // "Pattern{Constant('Active Response that started at '), Field(fld1,true), Constant(' is disengaged. The traffic from IP address '), Field(hostip,true), Constant(' was blocked for '), Field(duration,true), Constant(' second(s). ,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld7,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(','), Field(direction,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(', Domain: '), Field(p0,false)}" -match("MESSAGE#1:Active:01/0", "nwparser.payload", "Active Response that started at %{fld1->} is disengaged. The traffic from IP address %{hostip->} was blocked for %{duration->} second(s). ,Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},%{direction},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); +var part7 = match("MESSAGE#1:Active:01/0", "nwparser.payload", "Active Response that started at %{fld1->} is disengaged. The traffic from IP address %{hostip->} was blocked for %{duration->} second(s). ,Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},%{direction},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); var all3 = all_match({ processors: [ @@ -2145,8 +1948,7 @@ var select3 = linear_select([ msg2, ]); -var part8 = // "Pattern{Constant('Administrator logout'), Field(,false)}" -match("MESSAGE#2:Administrator", "nwparser.payload", "Administrator logout%{}", processor_chain([ +var part8 = match("MESSAGE#2:Administrator", "nwparser.payload", "Administrator logout%{}", processor_chain([ setc("eventcategory","1401070000"), dup12, dup13, @@ -2162,8 +1964,7 @@ match("MESSAGE#2:Administrator", "nwparser.payload", "Administrator logout%{}", var msg3 = msg("Administrator", part8); -var part9 = // "Pattern{Constant('Administrator'), Field(space,false), Constant('log on failed')}" -match("MESSAGE#3:Administrator:01", "nwparser.payload", "Administrator%{space}log on failed", processor_chain([ +var part9 = match("MESSAGE#3:Administrator:01", "nwparser.payload", "Administrator%{space}log on failed", processor_chain([ setc("eventcategory","1401030000"), dup12, dup13, @@ -2179,8 +1980,7 @@ match("MESSAGE#3:Administrator:01", "nwparser.payload", "Administrator%{space}lo var msg4 = msg("Administrator:01", part9); -var part10 = // "Pattern{Constant('Administrator'), Field(space,false), Constant('log on succeeded')}" -match("MESSAGE#4:Administrator:02", "nwparser.payload", "Administrator%{space}log on succeeded", processor_chain([ +var part10 = match("MESSAGE#4:Administrator:02", "nwparser.payload", "Administrator%{space}log on succeeded", processor_chain([ setc("eventcategory","1401060000"), dup12, dup13, @@ -2202,8 +2002,7 @@ var select4 = linear_select([ msg5, ]); -var part11 = // "Pattern{Constant('password of System administrator ''), Field(username,false), Constant('' has been changed.')}" -match("MESSAGE#5:Administrator:03", "nwparser.payload", "password of System administrator '%{username}' has been changed.", processor_chain([ +var part11 = match("MESSAGE#5:Administrator:03", "nwparser.payload", "password of System administrator '%{username}' has been changed.", processor_chain([ dup26, dup12, dup13, @@ -2219,8 +2018,7 @@ match("MESSAGE#5:Administrator:03", "nwparser.payload", "password of System admi var msg6 = msg("Administrator:03", part11); -var part12 = // "Pattern{Constant('password of administrator "'), Field(c_username,false), Constant('" was changed')}" -match("MESSAGE#290:password", "nwparser.payload", "password of administrator \"%{c_username}\" was changed", processor_chain([ +var part12 = match("MESSAGE#290:password", "nwparser.payload", "password of administrator \"%{c_username}\" was changed", processor_chain([ dup26, dup12, dup13, @@ -2236,8 +2034,7 @@ match("MESSAGE#290:password", "nwparser.payload", "password of administrator \"% var msg7 = msg("password", part12); -var part13 = // "Pattern{Constant('password of System administrator "'), Field(c_username,false), Constant('" has been changed')}" -match("MESSAGE#291:password:01", "nwparser.payload", "password of System administrator \"%{c_username}\" has been changed", processor_chain([ +var part13 = match("MESSAGE#291:password:01", "nwparser.payload", "password of System administrator \"%{c_username}\" has been changed", processor_chain([ dup26, dup12, dup13, @@ -2259,8 +2056,7 @@ var select5 = linear_select([ msg8, ]); -var part14 = // "Pattern{Field(fld6,true), Constant(' detected. Traffic has been allowed from this application: '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld7,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID:'), Field(fld23,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#6:allowed", "nwparser.payload", "%{fld6->} detected. Traffic has been allowed from this application: %{fld1},Local: %{daddr},Local: %{fld7},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ +var part14 = match("MESSAGE#6:allowed", "nwparser.payload", "%{fld6->} detected. Traffic has been allowed from this application: %{fld1},Local: %{daddr},Local: %{fld7},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ dup32, dup12, dup13, @@ -2275,8 +2071,7 @@ match("MESSAGE#6:allowed", "nwparser.payload", "%{fld6->} detected. Traffic has var msg9 = msg("allowed", part14); -var part15 = // "Pattern{Field(fld6,true), Constant(' detected. Traffic has been allowed from this application: '), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld7,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID:'), Field(fld23,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#7:allowed:11", "nwparser.payload", "%{fld6->} detected. Traffic has been allowed from this application: %{fld1},Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ +var part15 = match("MESSAGE#7:allowed:11", "nwparser.payload", "%{fld6->} detected. Traffic has been allowed from this application: %{fld1},Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ dup32, dup12, dup13, @@ -2296,8 +2091,7 @@ var select6 = linear_select([ msg10, ]); -var part16 = // "Pattern{Constant('Malicious Site: Malicious Web Site, Domain, or URL ('), Field(fld11,false), Constant(') attack blocked. Traffic has been blocked for this application: '), Field(fld12,false), Constant('",Local: '), Field(daddr,false), Constant(',Local: '), Field(fld7,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID:'), Field(fld23,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld39,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',!ExternalLoggingTask.localport! '), Field(dport,false), Constant(',!ExternalLoggingTask.remoteport! '), Field(sport,false), Constant(',!ExternalLoggingTask.cidssignid! '), Field(sigid,false), Constant(',"!ExternalLoggingTask.strcidssignid! '), Field(sigid_string,false), Constant('",!ExternalLoggingTask.cidssignsubid! '), Field(sigid1,false), Constant(',!ExternalLoggingTask.intrusionurl! '), Field(url,false), Constant(',!ExternalLoggingTask.intrusionpayloadurl! '), Field(fld33,false)}" -match("MESSAGE#8:Malicious", "nwparser.payload", "Malicious Site: Malicious Web Site, Domain, or URL (%{fld11}) attack blocked. Traffic has been blocked for this application: %{fld12}\",Local: %{daddr},Local: %{fld7},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld39},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{dport},!ExternalLoggingTask.remoteport! %{sport},!ExternalLoggingTask.cidssignid! %{sigid},\"!ExternalLoggingTask.strcidssignid! %{sigid_string}\",!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld33}", processor_chain([ +var part16 = match("MESSAGE#8:Malicious", "nwparser.payload", "Malicious Site: Malicious Web Site, Domain, or URL (%{fld11}) attack blocked. Traffic has been blocked for this application: %{fld12}\",Local: %{daddr},Local: %{fld7},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld39},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{dport},!ExternalLoggingTask.remoteport! %{sport},!ExternalLoggingTask.cidssignid! %{sigid},\"!ExternalLoggingTask.strcidssignid! %{sigid_string}\",!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld33}", processor_chain([ dup36, dup12, dup13, @@ -2314,8 +2108,7 @@ match("MESSAGE#8:Malicious", "nwparser.payload", "Malicious Site: Malicious Web var msg11 = msg("Malicious", part16); -var part17 = // "Pattern{Constant('Malicious Site: Malicious Web Site, Domain, or URL ('), Field(fld11,false), Constant(') attack blocked. Traffic has been blocked for this application: '), Field(fld12,false), Constant('",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld7,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID:'), Field(fld23,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld39,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',!ExternalLoggingTask.localport! '), Field(sport,false), Constant(',!ExternalLoggingTask.remoteport! '), Field(dport,false), Constant(',!ExternalLoggingTask.cidssignid! '), Field(sigid,false), Constant(',"!ExternalLoggingTask.strcidssignid! '), Field(sigid_string,false), Constant('",!ExternalLoggingTask.cidssignsubid! '), Field(sigid1,false), Constant(',!ExternalLoggingTask.intrusionurl! '), Field(url,false), Constant(',!ExternalLoggingTask.intrusionpayloadurl! '), Field(fld33,false)}" -match("MESSAGE#9:Malicious:01", "nwparser.payload", "Malicious Site: Malicious Web Site, Domain, or URL (%{fld11}) attack blocked. Traffic has been blocked for this application: %{fld12}\",Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld39},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{sport},!ExternalLoggingTask.remoteport! %{dport},!ExternalLoggingTask.cidssignid! %{sigid},\"!ExternalLoggingTask.strcidssignid! %{sigid_string}\",!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld33}", processor_chain([ +var part17 = match("MESSAGE#9:Malicious:01", "nwparser.payload", "Malicious Site: Malicious Web Site, Domain, or URL (%{fld11}) attack blocked. Traffic has been blocked for this application: %{fld12}\",Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID:%{fld23},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld39},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{sport},!ExternalLoggingTask.remoteport! %{dport},!ExternalLoggingTask.cidssignid! %{sigid},\"!ExternalLoggingTask.strcidssignid! %{sigid_string}\",!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld33}", processor_chain([ dup36, dup12, dup13, @@ -2332,22 +2125,18 @@ match("MESSAGE#9:Malicious:01", "nwparser.payload", "Malicious Site: Malicious W var msg12 = msg("Malicious:01", part17); -var part18 = // "Pattern{Constant('Malicious Site: Malicious Web Site, Domain, or URL ('), Field(fld11,false), Constant(') attack blocked. Traffic has been blocked for this application: '), Field(fld12,false), Constant('",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld7,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(p0,false)}" -match("MESSAGE#10:Malicious:02/0", "nwparser.payload", "Malicious Site: Malicious Web Site, Domain, or URL (%{fld11}) attack blocked. Traffic has been blocked for this application: %{fld12}\",Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Inbound,%{p0}"); +var part18 = match("MESSAGE#10:Malicious:02/0", "nwparser.payload", "Malicious Site: Malicious Web Site, Domain, or URL (%{fld11}) attack blocked. Traffic has been blocked for this application: %{fld12}\",Local: %{saddr},Local: %{fld7},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Inbound,%{p0}"); -var part19 = // "Pattern{Field(protocol,false), Constant(',Intrusion ID:'), Field(fld23,false), Constant(',Begin: '), Field(p0,false)}" -match("MESSAGE#10:Malicious:02/1_0", "nwparser.p0", "%{protocol},Intrusion ID:%{fld23},Begin: %{p0}"); +var part19 = match("MESSAGE#10:Malicious:02/1_0", "nwparser.p0", "%{protocol},Intrusion ID:%{fld23},Begin: %{p0}"); -var part20 = // "Pattern{Field(protocol,false), Constant(',Begin: '), Field(p0,false)}" -match("MESSAGE#10:Malicious:02/1_1", "nwparser.p0", "%{protocol},Begin: %{p0}"); +var part20 = match("MESSAGE#10:Malicious:02/1_1", "nwparser.p0", "%{protocol},Begin: %{p0}"); var select7 = linear_select([ part19, part20, ]); -var part21 = // "Pattern{Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld39,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',"CIDS Signature string: '), Field(sigid_string,false), Constant('",CIDS Signature SubID: '), Field(fld29,false), Constant(',Intrusion URL:'), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#10:Malicious:02/2", "nwparser.p0", "%{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld39},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},\"CIDS Signature string: %{sigid_string}\",CIDS Signature SubID: %{fld29},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}"); +var part21 = match("MESSAGE#10:Malicious:02/2", "nwparser.p0", "%{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld39},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},\"CIDS Signature string: %{sigid_string}\",CIDS Signature SubID: %{fld29},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}"); var all4 = all_match({ processors: [ @@ -2377,8 +2166,7 @@ var select8 = linear_select([ msg13, ]); -var part22 = // "Pattern{Field(product,true), Constant(' definitions '), Field(info,true), Constant(' failed to update.')}" -match("MESSAGE#11:Antivirus", "nwparser.payload", "%{product->} definitions %{info->} failed to update.", processor_chain([ +var part22 = match("MESSAGE#11:Antivirus", "nwparser.payload", "%{product->} definitions %{info->} failed to update.", processor_chain([ dup43, dup12, dup13, @@ -2393,8 +2181,7 @@ match("MESSAGE#11:Antivirus", "nwparser.payload", "%{product->} definitions %{in var msg14 = msg("Antivirus", part22); -var part23 = // "Pattern{Field(product,true), Constant(' definitions '), Field(info,true), Constant(' is up-to-date.')}" -match("MESSAGE#12:Antivirus:01", "nwparser.payload", "%{product->} definitions %{info->} is up-to-date.", processor_chain([ +var part23 = match("MESSAGE#12:Antivirus:01", "nwparser.payload", "%{product->} definitions %{info->} is up-to-date.", processor_chain([ dup43, dup12, dup13, @@ -2405,8 +2192,7 @@ match("MESSAGE#12:Antivirus:01", "nwparser.payload", "%{product->} definitions % var msg15 = msg("Antivirus:01", part23); -var part24 = // "Pattern{Field(product,true), Constant(' definitions '), Field(info,true), Constant(' was successfully updated.')}" -match("MESSAGE#13:Antivirus:02", "nwparser.payload", "%{product->} definitions %{info->} was successfully updated.", processor_chain([ +var part24 = match("MESSAGE#13:Antivirus:02", "nwparser.payload", "%{product->} definitions %{info->} was successfully updated.", processor_chain([ dup43, dup44, dup45, @@ -2424,8 +2210,7 @@ var select9 = linear_select([ msg16, ]); -var part25 = // "Pattern{Field(event_description,false), Constant('",Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',1,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(', Domain: '), Field(p0,false)}" -match("MESSAGE#14:Somebody/0", "nwparser.payload", "%{event_description}\",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},1,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); +var part25 = match("MESSAGE#14:Somebody/0", "nwparser.payload", "%{event_description}\",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},1,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); var all5 = all_match({ processors: [ @@ -2448,8 +2233,7 @@ var all5 = all_match({ var msg17 = msg("Somebody", all5); -var part26 = // "Pattern{Field(event_description,false), Constant('",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',0,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(', Domain: '), Field(p0,false)}" -match("MESSAGE#15:Somebody:01/0", "nwparser.payload", "%{event_description}\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},0,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); +var part26 = match("MESSAGE#15:Somebody:01/0", "nwparser.payload", "%{event_description}\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},0,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); var all6 = all_match({ processors: [ @@ -2472,8 +2256,7 @@ var all6 = all_match({ var msg18 = msg("Somebody:01", all6); -var part27 = // "Pattern{Field(event_description,false), Constant('",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',2,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(', Domain: '), Field(p0,false)}" -match("MESSAGE#16:Somebody:02/0", "nwparser.payload", "%{event_description}\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},2,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); +var part27 = match("MESSAGE#16:Somebody:02/0", "nwparser.payload", "%{event_description}\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},2,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username}, Domain: %{p0}"); var all7 = all_match({ processors: [ @@ -2502,11 +2285,9 @@ var select10 = linear_select([ msg19, ]); -var part28 = // "Pattern{Field(fld44,false), Constant(',Application and Device Control is ready,'), Field(fld8,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(fld7,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(p0,false)}" -match("MESSAGE#17:Application/0", "nwparser.payload", "%{fld44},Application and Device Control is ready,%{fld8},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{fld4},%{fld5},%{fld6},%{fld7},User: %{username},Domain: %{p0}"); +var part28 = match("MESSAGE#17:Application/0", "nwparser.payload", "%{fld44},Application and Device Control is ready,%{fld8},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{fld4},%{fld5},%{fld6},%{fld7},User: %{username},Domain: %{p0}"); -var part29 = // "Pattern{Field(domain,false), Constant(',Action Type:'), Field(fld46,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#17:Application/1_0", "nwparser.p0", "%{domain},Action Type:%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); +var part29 = match("MESSAGE#17:Application/1_0", "nwparser.p0", "%{domain},Action Type:%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); var select11 = linear_select([ part29, @@ -2531,8 +2312,7 @@ var all8 = all_match({ var msg20 = msg("Application", all8); -var part30 = // "Pattern{Field(fld44,false), Constant(',Application and Device Control engine is not verified,'), Field(fld1,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(fld7,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#18:Application:01", "nwparser.payload", "%{fld44},Application and Device Control engine is not verified,%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{fld4},%{fld5},%{fld6},%{fld7},User: %{username},Domain: %{domain}", processor_chain([ +var part30 = match("MESSAGE#18:Application:01", "nwparser.payload", "%{fld44},Application and Device Control engine is not verified,%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{fld4},%{fld5},%{fld6},%{fld7},User: %{username},Domain: %{domain}", processor_chain([ dup53, dup12, dup13, @@ -2545,8 +2325,7 @@ match("MESSAGE#18:Application:01", "nwparser.payload", "%{fld44},Application and var msg21 = msg("Application:01", part30); -var part31 = // "Pattern{Field(fld44,false), Constant('Blocked,['), Field(fld5,false), Constant('] '), Field(event_description,true), Constant(' - Caller MD5='), Field(fld6,false), Constant(',Create Process,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld45,false)}" -match("MESSAGE#19:Application:02", "nwparser.payload", "%{fld44}Blocked,[%{fld5}] %{event_description->} - Caller MD5=%{fld6},Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld45}", processor_chain([ +var part31 = match("MESSAGE#19:Application:02", "nwparser.payload", "%{fld44}Blocked,[%{fld5}] %{event_description->} - Caller MD5=%{fld6},Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld45}", processor_chain([ dup53, dup12, dup13, @@ -2559,8 +2338,7 @@ match("MESSAGE#19:Application:02", "nwparser.payload", "%{fld44}Blocked,[%{fld5} var msg22 = msg("Application:02", part31); -var part32 = // "Pattern{Constant('Application,rn='), Field(fld1,true), Constant(' cid='), Field(fld2,true), Constant(' eid='), Field(fld3,false), Constant(','), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(','), Field(fld6,false), Constant(',Symantec AntiVirus,'), Field(hostname,false), Constant(',Classic,'), Field(shost,false), Constant(','), Field(event_description,false), Constant(',, Scan Complete: Risks: '), Field(fld7,true), Constant(' Scanned: '), Field(fld8,true), Constant(' Omitted: '), Field(fld9,true), Constant(' Trusted Files Skipped: '), Field(fld10,false)}" -match("MESSAGE#683:Application:03", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,%{hostname},Classic,%{shost},%{event_description},, Scan Complete: Risks: %{fld7->} Scanned: %{fld8->} Omitted: %{fld9->} Trusted Files Skipped: %{fld10}", processor_chain([ +var part32 = match("MESSAGE#683:Application:03", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,%{hostname},Classic,%{shost},%{event_description},, Scan Complete: Risks: %{fld7->} Scanned: %{fld8->} Omitted: %{fld9->} Trusted Files Skipped: %{fld10}", processor_chain([ dup43, dup15, dup55, @@ -2568,8 +2346,7 @@ match("MESSAGE#683:Application:03", "nwparser.payload", "Application,rn=%{fld1-> var msg23 = msg("Application:03", part32); -var part33 = // "Pattern{Constant('Application,rn='), Field(fld1,true), Constant(' cid='), Field(fld2,true), Constant(' eid='), Field(fld3,false), Constant(','), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(','), Field(fld6,false), Constant(',Symantec AntiVirus,'), Field(hostname,false), Constant(',Classic,'), Field(shost,false), Constant(','), Field(event_description,false), Constant(',, '), Field(info,false), Constant('.')}" -match("MESSAGE#684:Application:04", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,%{hostname},Classic,%{shost},%{event_description},, %{info}.", processor_chain([ +var part33 = match("MESSAGE#684:Application:04", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,%{hostname},Classic,%{shost},%{event_description},, %{info}.", processor_chain([ dup43, dup15, dup55, @@ -2577,8 +2354,7 @@ match("MESSAGE#684:Application:04", "nwparser.payload", "Application,rn=%{fld1-> var msg24 = msg("Application:04", part33); -var part34 = // "Pattern{Constant('Application,rn='), Field(fld1,true), Constant(' cid='), Field(fld2,true), Constant(' eid='), Field(fld3,false), Constant(','), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(','), Field(fld6,false), Constant(',Symantec AntiVirus,'), Field(hostname,false), Constant(',Classic,'), Field(shost,false), Constant(','), Field(fld22,false), Constant(',,'), Field(space,false), Constant('Proactive Threat Protection has been disabled')}" -match("MESSAGE#685:Application:05", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,%{hostname},Classic,%{shost},%{fld22},,%{space}Proactive Threat Protection has been disabled", processor_chain([ +var part34 = match("MESSAGE#685:Application:05", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,%{hostname},Classic,%{shost},%{fld22},,%{space}Proactive Threat Protection has been disabled", processor_chain([ dup43, dup56, dup15, @@ -2597,8 +2373,7 @@ var select12 = linear_select([ msg25, ]); -var part35 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',"Application has changed since the last time you opened it, process id:'), Field(process_id,true), Constant(' Filename: '), Field(fld8,true), Constant(' The change was denied by user.",Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld11,false), Constant(',Inbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#20:Application:07", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},\"Application has changed since the last time you opened it, process id:%{process_id->} Filename: %{fld8->} The change was denied by user.\",Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld11},Inbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part35 = match("MESSAGE#20:Application:07", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},\"Application has changed since the last time you opened it, process id:%{process_id->} Filename: %{fld8->} The change was denied by user.\",Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld11},Inbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup53, dup34, dup58, @@ -2613,8 +2388,7 @@ match("MESSAGE#20:Application:07", "nwparser.payload", "SHA-256:%{checksum},MD-5 var msg26 = msg("Application:07", part35); -var part36 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',"Application has changed since the last time you opened it, process id: '), Field(process_id,true), Constant(' Filename: '), Field(filename,true), Constant(' '), Field(fld1,false), Constant('",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#27:Application:06/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},\"Application has changed since the last time you opened it, process id: %{process_id->} Filename: %{filename->} %{fld1}\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part36 = match("MESSAGE#27:Application:06/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},\"Application has changed since the last time you opened it, process id: %{process_id->} Filename: %{filename->} %{fld1}\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all9 = all_match({ processors: [ @@ -2637,8 +2411,7 @@ var all9 = all_match({ var msg27 = msg("Application:06", all9); -var part37 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',REMEDIATION WAS NEEDED - '), Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Unknown,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#28:REMEDIATION/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},REMEDIATION WAS NEEDED - %{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Unknown,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part37 = match("MESSAGE#28:REMEDIATION/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},REMEDIATION WAS NEEDED - %{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Unknown,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all10 = all_match({ processors: [ @@ -2658,8 +2431,7 @@ var all10 = all_match({ var msg28 = msg("REMEDIATION", all10); -var part38 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,true), Constant(' Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#29:blocked:06/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part38 = match("MESSAGE#29:blocked:06/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all11 = all_match({ processors: [ @@ -2682,8 +2454,7 @@ var all11 = all_match({ var msg29 = msg("blocked:06", all11); -var part39 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,true), Constant(' Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#30:blocked:16/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part39 = match("MESSAGE#30:blocked:16/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all12 = all_match({ processors: [ @@ -2706,8 +2477,7 @@ var all12 = all_match({ var msg30 = msg("blocked:16", all12); -var part40 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,"Somebody is scanning your computer. Your computer's TCP ports: '), Field(fld60,false), Constant(', '), Field(fld61,false), Constant(', '), Field(fld62,false), Constant(', '), Field(fld63,true), Constant(' and '), Field(fld64,true), Constant(' have been scanned from '), Field(fld65,false), Constant('.",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#31:scanning:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,\"Somebody is scanning your computer. Your computer's TCP ports: %{fld60}, %{fld61}, %{fld62}, %{fld63->} and %{fld64->} have been scanned from %{fld65}.\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part40 = match("MESSAGE#31:scanning:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,\"Somebody is scanning your computer. Your computer's TCP ports: %{fld60}, %{fld61}, %{fld62}, %{fld63->} and %{fld64->} have been scanned from %{fld65}.\",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all13 = all_match({ processors: [ @@ -2730,8 +2500,7 @@ var all13 = all_match({ var msg31 = msg("scanning:01", all13); -var part41 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,"Somebody is scanning your computer. Your computer's TCP ports: '), Field(fld60,false), Constant(', '), Field(fld61,false), Constant(', '), Field(fld62,false), Constant(', '), Field(fld63,true), Constant(' and '), Field(fld64,true), Constant(' have been scanned from '), Field(fld65,false), Constant('.",Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#32:scanning/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,\"Somebody is scanning your computer. Your computer's TCP ports: %{fld60}, %{fld61}, %{fld62}, %{fld63->} and %{fld64->} have been scanned from %{fld65}.\",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part41 = match("MESSAGE#32:scanning/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,\"Somebody is scanning your computer. Your computer's TCP ports: %{fld60}, %{fld61}, %{fld62}, %{fld63->} and %{fld64->} have been scanned from %{fld65}.\",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all14 = all_match({ processors: [ @@ -2754,19 +2523,16 @@ var all14 = all_match({ var msg32 = msg("scanning", all14); -var part42 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,Informational: File Download Hash,Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(','), Field(p0,false)}" -match("MESSAGE#33:Informational/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,Informational: File Download Hash,Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},%{p0}"); +var part42 = match("MESSAGE#33:Informational/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,Informational: File Download Hash,Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},%{p0}"); -var part43 = // "Pattern{Constant(' Domain: '), Field(p0,false)}" -match("MESSAGE#33:Informational/1_0", "nwparser.p0", " Domain: %{p0}"); +var part43 = match("MESSAGE#33:Informational/1_0", "nwparser.p0", " Domain: %{p0}"); var select13 = linear_select([ part43, dup67, ]); -var part44 = // "Pattern{Field(,true), Constant(' '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#33:Informational/2", "nwparser.p0", "%{} %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part44 = match("MESSAGE#33:Informational/2", "nwparser.p0", "%{} %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all15 = all_match({ processors: [ @@ -2791,8 +2557,7 @@ var all15 = all_match({ var msg33 = msg("Informational", all15); -var part45 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,Informational: File Download Hash,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#34:Informational:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,Informational: File Download Hash,Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part45 = match("MESSAGE#34:Informational:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,Informational: File Download Hash,Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all16 = all_match({ processors: [ @@ -2815,8 +2580,7 @@ var all16 = all_match({ var msg34 = msg("Informational:01", all16); -var part46 = // "Pattern{Field(shost,false), Constant(', SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',CCD Notification: REMEDIATION NOT REQUIRED,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote:'), Field(fld2,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application:'), Field(fld6,false), Constant(',Location: '), Field(fld7,false), Constant(',User: '), Field(username,false), Constant(', Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string:'), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(url,false), Constant(',Intrusion Payload URL:')}" -match("MESSAGE#35:SHA-256::01", "nwparser.payload", "%{shost}, SHA-256:%{checksum},MD-5:%{checksum},CCD Notification: REMEDIATION NOT REQUIRED,Local: %{saddr},Local: %{fld1},Remote:%{fld2},Remote: %{daddr},Remote: %{fld3},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application:%{fld6},Location: %{fld7},User: %{username}, Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string:%{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:", processor_chain([ +var part46 = match("MESSAGE#35:SHA-256::01", "nwparser.payload", "%{shost}, SHA-256:%{checksum},MD-5:%{checksum},CCD Notification: REMEDIATION NOT REQUIRED,Local: %{saddr},Local: %{fld1},Remote:%{fld2},Remote: %{daddr},Remote: %{fld3},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application:%{fld6},Location: %{fld7},User: %{username}, Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string:%{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:", processor_chain([ dup53, dup12, dup13, @@ -2831,8 +2595,7 @@ match("MESSAGE#35:SHA-256::01", "nwparser.payload", "%{shost}, SHA-256:%{checksu var msg35 = msg("SHA-256::01", part46); -var part47 = // "Pattern{Field(fld3,false), Constant(', SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,Web Attack : Malvertisement Website Redirect '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#36:Web_Attack/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack : Malvertisement Website Redirect %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part47 = match("MESSAGE#36:Web_Attack/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack : Malvertisement Website Redirect %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all17 = all_match({ processors: [ @@ -2855,8 +2618,7 @@ var all17 = all_match({ var msg36 = msg("Web_Attack", all17); -var part48 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Web Attack: Fake Flash Player Download '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#37:Web_Attack:13/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack: Fake Flash Player Download %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part48 = match("MESSAGE#37:Web_Attack:13/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack: Fake Flash Player Download %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all18 = all_match({ processors: [ @@ -2879,19 +2641,16 @@ var all18 = all_match({ var msg37 = msg("Web_Attack:13", all18); -var part49 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] Web Attack'), Field(p0,false)}" -match("MESSAGE#38:Web_Attack:16/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] Web Attack%{p0}"); +var part49 = match("MESSAGE#38:Web_Attack:16/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] Web Attack%{p0}"); -var part50 = // "Pattern{Constant(' : '), Field(p0,false)}" -match("MESSAGE#38:Web_Attack:16/1_0", "nwparser.p0", " : %{p0}"); +var part50 = match("MESSAGE#38:Web_Attack:16/1_0", "nwparser.p0", " : %{p0}"); var select14 = linear_select([ part50, dup71, ]); -var part51 = // "Pattern{Field(,false), Constant('JSCoinminer Download '), Field(fld21,true), Constant(' attack blocked. Traffic has been blocked for this application: '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',"Intrusion URL: '), Field(url,false), Constant('",Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#38:Web_Attack:16/2", "nwparser.p0", "%{}JSCoinminer Download %{fld21->} attack blocked. Traffic has been blocked for this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,OTHERS,,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}"); +var part51 = match("MESSAGE#38:Web_Attack:16/2", "nwparser.p0", "%{}JSCoinminer Download %{fld21->} attack blocked. Traffic has been blocked for this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,OTHERS,,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}"); var all19 = all_match({ processors: [ @@ -2915,8 +2674,7 @@ var all19 = all_match({ var msg38 = msg("Web_Attack:16", all19); -var part52 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,[SID: '), Field(fld26,false), Constant('] Web Attack: Apache Struts2 devMode OGNL Execution attack detected but not blocked. '), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',"Intrusion URL: '), Field(url,false), Constant('",Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#39:Web_Attack:03", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,[SID: %{fld26}] Web Attack: Apache Struts2 devMode OGNL Execution attack detected but not blocked. %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}", processor_chain([ +var part52 = match("MESSAGE#39:Web_Attack:03", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum->} ,[SID: %{fld26}] Web Attack: Apache Struts2 devMode OGNL Execution attack detected but not blocked. %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}", processor_chain([ dup69, dup12, dup13, @@ -2931,8 +2689,7 @@ match("MESSAGE#39:Web_Attack:03", "nwparser.payload", "SHA-256:%{checksum},MD-5: var msg39 = msg("Web_Attack:03", part52); -var part53 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] Web Attack : Malvertisement Website Redirect '), Field(fld2,true), Constant(' attack blocked. Traffic has been blocked for this application: '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',"Intrusion URL: '), Field(url,false), Constant('",Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#40:Web_Attack:15", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] Web Attack : Malvertisement Website Redirect %{fld2->} attack blocked. Traffic has been blocked for this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,OTHERS,,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}", processor_chain([ +var part53 = match("MESSAGE#40:Web_Attack:15", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] Web Attack : Malvertisement Website Redirect %{fld2->} attack blocked. Traffic has been blocked for this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,OTHERS,,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}", processor_chain([ dup69, dup12, dup13, @@ -2947,8 +2704,7 @@ match("MESSAGE#40:Web_Attack:15", "nwparser.payload", "SHA-256:%{checksum},MD-5: var msg40 = msg("Web_Attack:15", part53); -var part54 = // "Pattern{Field(fld3,false), Constant(', SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,Web Attack : Malvertisement Website Redirect '), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#41:Web_Attack:11/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack : Malvertisement Website Redirect %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part54 = match("MESSAGE#41:Web_Attack:11/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack : Malvertisement Website Redirect %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all20 = all_match({ processors: [ @@ -2971,8 +2727,7 @@ var all20 = all_match({ var msg41 = msg("Web_Attack:11", all20); -var part55 = // "Pattern{Field(fld3,false), Constant(', SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,Web Attack: Mass Injection Website '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#42:Web_Attack:01/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack: Mass Injection Website %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part55 = match("MESSAGE#42:Web_Attack:01/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack: Mass Injection Website %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all21 = all_match({ processors: [ @@ -2995,8 +2750,7 @@ var all21 = all_match({ var msg42 = msg("Web_Attack:01", all21); -var part56 = // "Pattern{Field(fld3,false), Constant(', SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,Web Attack: Mass Injection Website '), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#43:Web_Attack:12/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack: Mass Injection Website %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part56 = match("MESSAGE#43:Web_Attack:12/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Web Attack: Mass Injection Website %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all22 = all_match({ processors: [ @@ -3019,8 +2773,7 @@ var all22 = all_match({ var msg43 = msg("Web_Attack:12", all22); -var part57 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Web Attack: Mass Injection Website '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#44:Web_Attack:14/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack: Mass Injection Website %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part57 = match("MESSAGE#44:Web_Attack:14/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack: Mass Injection Website %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all23 = all_match({ processors: [ @@ -3043,8 +2796,7 @@ var all23 = all_match({ var msg44 = msg("Web_Attack:14", all23); -var part58 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Web Attack : Malvertisement Website Redirect '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#45:Web_Attack:17/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack : Malvertisement Website Redirect %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part58 = match("MESSAGE#45:Web_Attack:17/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack : Malvertisement Website Redirect %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all24 = all_match({ processors: [ @@ -3067,8 +2819,7 @@ var all24 = all_match({ var msg45 = msg("Web_Attack:17", all24); -var part59 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Web Attack: Fake Tech Support Website '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#46:Web_Attack:18/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack: Fake Tech Support Website %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part59 = match("MESSAGE#46:Web_Attack:18/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Web Attack: Fake Tech Support Website %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all25 = all_match({ processors: [ @@ -3091,8 +2842,7 @@ var all25 = all_match({ var msg46 = msg("Web_Attack:18", all25); -var part60 = // "Pattern{Field(fld3,false), Constant(', SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Fake App Attack: Misleading Application Website'), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#47:App_Attack/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum},Fake App Attack: Misleading Application Website%{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part60 = match("MESSAGE#47:App_Attack/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum},Fake App Attack: Misleading Application Website%{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all26 = all_match({ processors: [ @@ -3115,8 +2865,7 @@ var all26 = all_match({ var msg47 = msg("App_Attack", all26); -var part61 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Fake App Attack: Misleading Application Website'), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#48:App_Attack:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Fake App Attack: Misleading Application Website%{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part61 = match("MESSAGE#48:App_Attack:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Fake App Attack: Misleading Application Website%{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all27 = all_match({ processors: [ @@ -3139,8 +2888,7 @@ var all27 = all_match({ var msg48 = msg("App_Attack:02", all27); -var part62 = // "Pattern{Field(fld3,false), Constant(', SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,true), Constant(' ,Fake App Attack: Misleading Application Website'), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#49:App_Attack:01/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Fake App Attack: Misleading Application Website%{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part62 = match("MESSAGE#49:App_Attack:01/0", "nwparser.payload", "%{fld3}, SHA-256:%{checksum},MD-5:%{checksum->} ,Fake App Attack: Misleading Application Website%{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all28 = all_match({ processors: [ @@ -3163,8 +2911,7 @@ var all28 = all_match({ var msg49 = msg("App_Attack:01", all28); -var part63 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',The most recent Host Integrity content has not completed a download or cannot be authenticated.,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Unknown,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#50:Host_Integrity/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},The most recent Host Integrity content has not completed a download or cannot be authenticated.,Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Unknown,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part63 = match("MESSAGE#50:Host_Integrity/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},The most recent Host Integrity content has not completed a download or cannot be authenticated.,Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Unknown,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all29 = all_match({ processors: [ @@ -3186,11 +2933,9 @@ var all29 = all_match({ var msg50 = msg("Host_Integrity", all29); -var part64 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',"'), Field(p0,false)}" -match("MESSAGE#307:process:12/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},\"%{p0}"); +var part64 = match("MESSAGE#307:process:12/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},\"%{p0}"); -var part65 = // "Pattern{Field(event_description,false), Constant(', process id: '), Field(process_id,true), Constant(' Filename: '), Field(filename,true), Constant(' The change was allowed by profile'), Field(fld6,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#307:process:12/2", "nwparser.p0", "%{event_description}, process id: %{process_id->} Filename: %{filename->} The change was allowed by profile%{fld6}\"%{p0}"); +var part65 = match("MESSAGE#307:process:12/2", "nwparser.p0", "%{event_description}, process id: %{process_id->} Filename: %{filename->} The change was allowed by profile%{fld6}\"%{p0}"); var all30 = all_match({ processors: [ @@ -3218,8 +2963,7 @@ var all30 = all_match({ var msg51 = msg("process:12", all30); -var part66 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,false), Constant('attack detected but not blocked. Application path:'), Field(fld27,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#461:Audit:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}attack detected but not blocked. Application path:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part66 = match("MESSAGE#461:Audit:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}attack detected but not blocked. Application path:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all31 = all_match({ processors: [ @@ -3242,8 +2986,7 @@ var all31 = all_match({ var msg52 = msg("Audit:01", all31); -var part67 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,false), Constant('attack detected but not blocked. Application path:'), Field(fld27,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#462:Audit:11/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}attack detected but not blocked. Application path:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part67 = match("MESSAGE#462:Audit:11/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}attack detected but not blocked. Application path:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all32 = all_match({ processors: [ @@ -3266,8 +3009,7 @@ var all32 = all_match({ var msg53 = msg("Audit:11", all32); -var part68 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,false), Constant('. Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(','), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#463:Audit:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}. Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},%{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part68 = match("MESSAGE#463:Audit:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}. Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},%{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all33 = all_match({ processors: [ @@ -3290,8 +3032,7 @@ var all33 = all_match({ var msg54 = msg("Audit:02", all33); -var part69 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,false), Constant('. Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(','), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#464:Audit:12/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}. Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},%{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part69 = match("MESSAGE#464:Audit:12/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld26}] %{category}: %{event_description}. Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},%{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all34 = all_match({ processors: [ @@ -3314,8 +3055,7 @@ var all34 = all_match({ var msg55 = msg("Audit:12", all34); -var part70 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld111,false), Constant('] '), Field(category,false), Constant(':'), Field(event_description,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#507:Attack:03/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld111}] %{category}:%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part70 = match("MESSAGE#507:Attack:03/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld111}] %{category}:%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all35 = all_match({ processors: [ @@ -3337,8 +3077,7 @@ var all35 = all_match({ var msg56 = msg("Attack:03", all35); -var part71 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',[SID: '), Field(fld111,false), Constant('] '), Field(category,false), Constant(':'), Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#508:Attack:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld111}] %{category}:%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part71 = match("MESSAGE#508:Attack:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},[SID: %{fld111}] %{category}:%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all36 = all_match({ processors: [ @@ -3360,8 +3099,7 @@ var all36 = all_match({ var msg57 = msg("Attack:02", all36); -var part72 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Auto-Block Event,Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#710:Auto-block/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Auto-Block Event,Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part72 = match("MESSAGE#710:Auto-block/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Auto-Block Event,Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all37 = all_match({ processors: [ @@ -3383,8 +3121,7 @@ var all37 = all_match({ var msg58 = msg("Auto-block", all37); -var part73 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Denial of Service 'Smurf' attack detected. Description: '), Field(info,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#711:Denial/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Denial of Service 'Smurf' attack detected. Description: %{info},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part73 = match("MESSAGE#711:Denial/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Denial of Service 'Smurf' attack detected. Description: %{info},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all38 = all_match({ processors: [ @@ -3407,8 +3144,7 @@ var all38 = all_match({ var msg59 = msg("Denial", all38); -var part74 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Denial of Service 'Smurf' attack detected. Description: '), Field(info,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#712:Denial:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Denial of Service 'Smurf' attack detected. Description: %{info},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part74 = match("MESSAGE#712:Denial:01/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Denial of Service 'Smurf' attack detected. Description: %{info},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all39 = all_match({ processors: [ @@ -3431,8 +3167,7 @@ var all39 = all_match({ var msg60 = msg("Denial:01", all39); -var part75 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(','Denial of Service ''Smurf'' attack detected. Description: '), Field(info,false), Constant('',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#713:Denial:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Denial of Service ''Smurf'' attack detected. Description: %{info}',Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part75 = match("MESSAGE#713:Denial:02/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Denial of Service ''Smurf'' attack detected. Description: %{info}',Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all40 = all_match({ processors: [ @@ -3455,8 +3190,7 @@ var all40 = all_match({ var msg61 = msg("Denial:02", all40); -var part76 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(','Denial of Service ''Smurf'' attack detected. Description: '), Field(info,false), Constant('',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#714:Denial:03/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Denial of Service ''Smurf'' attack detected. Description: %{info}',Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part76 = match("MESSAGE#714:Denial:03/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Denial of Service ''Smurf'' attack detected. Description: %{info}',Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all41 = all_match({ processors: [ @@ -3479,8 +3213,7 @@ var all41 = all_match({ var msg62 = msg("Denial:03", all41); -var part77 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(','Host Integrity check passed'), Field(space,false), Constant('Requirement: '), Field(fld11,true), Constant(' passed ',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld41,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld55,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#715:Host:18", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Host Integrity check passed%{space}Requirement: %{fld11->} passed ',Local: %{saddr},Local: %{fld3},Remote: %{fld41},Remote: %{daddr},Remote: %{fld55},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part77 = match("MESSAGE#715:Host:18", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Host Integrity check passed%{space}Requirement: %{fld11->} passed ',Local: %{saddr},Local: %{fld3},Remote: %{fld41},Remote: %{daddr},Remote: %{fld55},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup86, dup87, dup12, @@ -3494,8 +3227,7 @@ match("MESSAGE#715:Host:18", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{che var msg63 = msg("Host:18", part77); -var part78 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(','Host Integrity check failed Requirement: '''), Field(fld11,false), Constant(''' passed Requirement: '''), Field(fld12,false), Constant(''' failed ',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld41,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld55,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#716:Host:19", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Host Integrity check failed Requirement: ''%{fld11}'' passed Requirement: ''%{fld12}'' failed ',Local: %{saddr},Local: %{fld3},Remote: %{fld41},Remote: %{daddr},Remote: %{fld55},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part78 = match("MESSAGE#716:Host:19", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},'Host Integrity check failed Requirement: ''%{fld11}'' passed Requirement: ''%{fld12}'' failed ',Local: %{saddr},Local: %{fld3},Remote: %{fld41},Remote: %{daddr},Remote: %{fld55},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup86, dup12, dup13, @@ -3508,8 +3240,7 @@ match("MESSAGE#716:Host:19", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{che var msg64 = msg("Host:19", part78); -var part79 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',DLP version is latest,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld41,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld55,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#719:DLP_version", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},DLP version is latest,Local: %{saddr},Local: %{fld3},Remote: %{fld41},Remote: %{daddr},Remote: %{fld55},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part79 = match("MESSAGE#719:DLP_version", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},DLP version is latest,Local: %{saddr},Local: %{fld3},Remote: %{fld41},Remote: %{daddr},Remote: %{fld55},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup53, dup12, dup13, @@ -3524,8 +3255,7 @@ match("MESSAGE#719:DLP_version", "nwparser.payload", "SHA-256:%{checksum},MD-5:% var msg65 = msg("DLP_version", part79); -var part80 = // "Pattern{Constant('SHA-256:'), Field(checksum,false), Constant(',MD-5:'), Field(checksum,false), Constant(',Brute force remote login,Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld27,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#720:Brute_force/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Brute force remote login,Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld27},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part80 = match("MESSAGE#720:Brute_force/0", "nwparser.payload", "SHA-256:%{checksum},MD-5:%{checksum},Brute force remote login,Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld27},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all42 = all_match({ processors: [ @@ -3592,8 +3322,7 @@ var select15 = linear_select([ msg66, ]); -var part81 = // "Pattern{Constant('Applied new policy with '), Field(info,false), Constant('successfully.'), Field(p0,false)}" -match("MESSAGE#21:Applied/0", "nwparser.payload", "Applied new policy with %{info}successfully.%{p0}"); +var part81 = match("MESSAGE#21:Applied/0", "nwparser.payload", "Applied new policy with %{info}successfully.%{p0}"); var all43 = all_match({ processors: [ @@ -3613,8 +3342,7 @@ var all43 = all_match({ var msg67 = msg("Applied", all43); -var part82 = // "Pattern{Constant('Applied new profile with serial number '), Field(fld23,true), Constant(' successfully.')}" -match("MESSAGE#700:Smc:04", "nwparser.payload", "Applied new profile with serial number %{fld23->} successfully.", processor_chain([ +var part82 = match("MESSAGE#700:Smc:04", "nwparser.payload", "Applied new profile with serial number %{fld23->} successfully.", processor_chain([ dup53, dup94, dup13, @@ -3630,8 +3358,7 @@ var select16 = linear_select([ msg68, ]); -var part83 = // "Pattern{Constant('Add shared policy upon system install,LiveUpdate Settings policy'), Field(,false)}" -match("MESSAGE#22:Add", "nwparser.payload", "Add shared policy upon system install,LiveUpdate Settings policy%{}", processor_chain([ +var part83 = match("MESSAGE#22:Add", "nwparser.payload", "Add shared policy upon system install,LiveUpdate Settings policy%{}", processor_chain([ dup95, dup12, dup13, @@ -3645,11 +3372,9 @@ match("MESSAGE#22:Add", "nwparser.payload", "Add shared policy upon system insta var msg69 = msg("Add", part83); -var part84 = // "Pattern{Constant('System Infected: '), Field(threat_name,true), Constant(' detected. Traffic has been blocked from this application: '), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld51,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#23:blocked:01/0", "nwparser.payload", "System Infected: %{threat_name->} detected. Traffic has been blocked from this application: %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld15},Remote: %{daddr},Remote: %{fld51},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part84 = match("MESSAGE#23:blocked:01/0", "nwparser.payload", "System Infected: %{threat_name->} detected. Traffic has been blocked from this application: %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld15},Remote: %{daddr},Remote: %{fld51},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var part85 = // "Pattern{Constant(''), Field(fld2,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#23:blocked:01/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); +var part85 = match("MESSAGE#23:blocked:01/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); var all44 = all_match({ processors: [ @@ -3673,11 +3398,9 @@ var all44 = all_match({ var msg70 = msg("blocked:01", all44); -var part86 = // "Pattern{Constant('System Infected: '), Field(threat_name,true), Constant(' detected. Traffic has been blocked from this application: '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld51,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#24:blocked:12/0", "nwparser.payload", "System Infected: %{threat_name->} detected. Traffic has been blocked from this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld51},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part86 = match("MESSAGE#24:blocked:12/0", "nwparser.payload", "System Infected: %{threat_name->} detected. Traffic has been blocked from this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld51},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var part87 = // "Pattern{Constant(''), Field(fld2,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#24:blocked:12/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); +var part87 = match("MESSAGE#24:blocked:12/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); var all45 = all_match({ processors: [ @@ -3701,11 +3424,9 @@ var all45 = all_match({ var msg71 = msg("blocked:12", all45); -var part88 = // "Pattern{Field(fld28,true), Constant(' detected. Traffic has been blocked from this application: '), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(fld51,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#25:blocked:05/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{daddr},Remote: %{fld15},Remote: %{fld51},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part88 = match("MESSAGE#25:blocked:05/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{daddr},Remote: %{fld15},Remote: %{fld51},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var part89 = // "Pattern{Constant(''), Field(fld2,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#25:blocked:05/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part89 = match("MESSAGE#25:blocked:05/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); var all46 = all_match({ processors: [ @@ -3729,11 +3450,9 @@ var all46 = all_match({ var msg72 = msg("blocked:05", all46); -var part90 = // "Pattern{Field(fld28,true), Constant(' detected. Traffic has been blocked from this application: '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(fld51,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#26:blocked:15/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{saddr},Remote: %{fld15},Remote: %{fld51},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part90 = match("MESSAGE#26:blocked:15/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{saddr},Remote: %{fld15},Remote: %{fld51},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var part91 = // "Pattern{Constant(''), Field(fld2,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#26:blocked:15/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part91 = match("MESSAGE#26:blocked:15/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); var all47 = all_match({ processors: [ @@ -3757,8 +3476,7 @@ var all47 = all_match({ var msg73 = msg("blocked:15", all47); -var part92 = // "Pattern{Field(fld28,true), Constant(' detected. Traffic has been blocked from this application: '), Field(fld1,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld51,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#52:blocked/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld15},Remote: %{daddr},Remote: %{fld51},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part92 = match("MESSAGE#52:blocked/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{saddr},Local: %{fld12},Remote: %{fld15},Remote: %{daddr},Remote: %{fld51},Outbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); var all48 = all_match({ processors: [ @@ -3782,8 +3500,7 @@ var all48 = all_match({ var msg74 = msg("blocked", all48); -var part93 = // "Pattern{Field(fld28,true), Constant(' detected. Traffic has been blocked from this application: '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld51,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld52,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#53:blocked:11/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld51},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part93 = match("MESSAGE#53:blocked:11/0", "nwparser.payload", "%{fld28->} detected. Traffic has been blocked from this application: %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld51},Inbound,%{protocol},Intrusion ID: %{fld52},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); var all49 = all_match({ processors: [ @@ -3816,8 +3533,7 @@ var select17 = linear_select([ msg75, ]); -var part94 = // "Pattern{Constant('The most recent Host Integrity content has not completed a download or cannot be authenticated.,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Unknown,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#51:Host_Integrity:01/0", "nwparser.payload", "The most recent Host Integrity content has not completed a download or cannot be authenticated.,Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Unknown,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part94 = match("MESSAGE#51:Host_Integrity:01/0", "nwparser.payload", "The most recent Host Integrity content has not completed a download or cannot be authenticated.,Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Unknown,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all50 = all_match({ processors: [ @@ -3839,8 +3555,7 @@ var all50 = all_match({ var msg76 = msg("Host_Integrity:01", all50); -var part95 = // "Pattern{Field(,true), Constant(' '), Field(daddr,false), Constant(',Local: '), Field(dport,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(sport,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(',Inbound,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Rule: '), Field(rulename,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action: '), Field(action,false)}" -match("MESSAGE#190:Local::01/1", "nwparser.p0", "%{} %{daddr},Local: %{dport},Local: %{fld12},Remote: %{saddr},Remote: %{fld13},Remote: %{sport},Remote: %{fld15},%{protocol},Inbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Rule: %{rulename},Location: %{fld11},User: %{username},Domain: %{domain},Action: %{action}"); +var part95 = match("MESSAGE#190:Local::01/1", "nwparser.p0", "%{} %{daddr},Local: %{dport},Local: %{fld12},Remote: %{saddr},Remote: %{fld13},Remote: %{sport},Remote: %{fld15},%{protocol},Inbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Rule: %{rulename},Location: %{fld11},User: %{username},Domain: %{domain},Action: %{action}"); var all51 = all_match({ processors: [ @@ -3863,8 +3578,7 @@ var all51 = all_match({ var msg77 = msg("Local::01", all51); -var part96 = // "Pattern{Field(,true), Constant(' '), Field(saddr,false), Constant(',Local: '), Field(sport,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(dport,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(',Outbound,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Rule: '), Field(rulename,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action: '), Field(action,false)}" -match("MESSAGE#191:Local::13/1", "nwparser.p0", "%{} %{saddr},Local: %{sport},Local: %{fld12},Remote: %{daddr},Remote: %{fld13},Remote: %{dport},Remote: %{fld15},%{protocol},Outbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Rule: %{rulename},Location: %{fld11},User: %{username},Domain: %{domain},Action: %{action}"); +var part96 = match("MESSAGE#191:Local::13/1", "nwparser.p0", "%{} %{saddr},Local: %{sport},Local: %{fld12},Remote: %{daddr},Remote: %{fld13},Remote: %{dport},Remote: %{fld15},%{protocol},Outbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Rule: %{rulename},Location: %{fld11},User: %{username},Domain: %{domain},Action: %{action}"); var all52 = all_match({ processors: [ @@ -3887,8 +3601,7 @@ var all52 = all_match({ var msg78 = msg("Local::13", all52); -var part97 = // "Pattern{Constant('Local: '), Field(saddr,false), Constant(',Local: '), Field(sport,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(dport,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(',Outbound,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(','), Field(p0,false)}" -match("MESSAGE#192:Local:/0", "nwparser.payload", "Local: %{saddr},Local: %{sport},Local: %{fld12},Remote: %{daddr},Remote: %{fld13},Remote: %{dport},Remote: %{fld15},%{protocol},Outbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},%{p0}"); +var part97 = match("MESSAGE#192:Local:/0", "nwparser.payload", "Local: %{saddr},Local: %{sport},Local: %{fld12},Remote: %{daddr},Remote: %{fld13},Remote: %{dport},Remote: %{fld15},%{protocol},Outbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},%{p0}"); var all53 = all_match({ processors: [ @@ -3913,8 +3626,7 @@ var all53 = all_match({ var msg79 = msg("Local:", all53); -var part98 = // "Pattern{Constant('Local: '), Field(daddr,false), Constant(',Local: '), Field(dport,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(sport,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(',Inbound,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(','), Field(p0,false)}" -match("MESSAGE#193:Local:11/0", "nwparser.payload", "Local: %{daddr},Local: %{dport},Local: %{fld12},Remote: %{saddr},Remote: %{fld13},Remote: %{sport},Remote: %{fld15},%{protocol},Inbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},%{p0}"); +var part98 = match("MESSAGE#193:Local:11/0", "nwparser.payload", "Local: %{daddr},Local: %{dport},Local: %{fld12},Remote: %{saddr},Remote: %{fld13},Remote: %{sport},Remote: %{fld15},%{protocol},Inbound,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},%{p0}"); var all54 = all_match({ processors: [ @@ -3939,8 +3651,7 @@ var all54 = all_match({ var msg80 = msg("Local:11", all54); -var part99 = // "Pattern{Constant('[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,true), Constant(' Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,true), Constant(' CVE-'), Field(cve,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#194:Local::09", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string->} CVE-%{cve},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part99 = match("MESSAGE#194:Local::09", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string->} CVE-%{cve},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup110, dup12, dup13, @@ -3955,8 +3666,7 @@ match("MESSAGE#194:Local::09", "nwparser.payload", "[SID: %{fld26}] %{category}: var msg81 = msg("Local::09", part99); -var part100 = // "Pattern{Constant('[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,true), Constant(' Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,true), Constant(' CVE-'), Field(cve,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#195:Local::20", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string->} CVE-%{cve},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part100 = match("MESSAGE#195:Local::20", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string->} CVE-%{cve},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup110, dup12, dup13, @@ -3971,8 +3681,7 @@ match("MESSAGE#195:Local::20", "nwparser.payload", "[SID: %{fld26}] %{category}: var msg82 = msg("Local::20", part100); -var part101 = // "Pattern{Constant('[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,true), Constant(' Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#196:Local::08", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part101 = match("MESSAGE#196:Local::08", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup110, dup12, dup13, @@ -3986,8 +3695,7 @@ match("MESSAGE#196:Local::08", "nwparser.payload", "[SID: %{fld26}] %{category}: var msg83 = msg("Local::08", part101); -var part102 = // "Pattern{Constant('[SID: '), Field(fld26,false), Constant('] '), Field(category,false), Constant(': '), Field(event_description,true), Constant(' Traffic has been blocked for this application:'), Field(fld27,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#197:Local::18", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part102 = match("MESSAGE#197:Local::18", "nwparser.payload", "[SID: %{fld26}] %{category}: %{event_description->} Traffic has been blocked for this application:%{fld27},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup110, dup12, dup13, @@ -4001,8 +3709,7 @@ match("MESSAGE#197:Local::18", "nwparser.payload", "[SID: %{fld26}] %{category}: var msg84 = msg("Local::18", part102); -var part103 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#198:Local::04/0", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part103 = match("MESSAGE#198:Local::04/0", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all55 = all_match({ processors: [ @@ -4028,8 +3735,7 @@ var all55 = all_match({ var msg85 = msg("Local::04", all55); -var part104 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(','), Field(p0,false)}" -match("MESSAGE#199:Local::17/0", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); +var part104 = match("MESSAGE#199:Local::17/0", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},%{p0}"); var all56 = all_match({ processors: [ @@ -4055,8 +3761,7 @@ var all56 = all_match({ var msg86 = msg("Local::17", all56); -var part105 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant('Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',!ExternalLoggingTask.localport! '), Field(dport,false), Constant(',!ExternalLoggingTask.remoteport! '), Field(sport,false), Constant(',!ExternalLoggingTask.cidssignid! '), Field(sigid,false), Constant(',!ExternalLoggingTask.strcidssignid! '), Field(sigid_string,false), Constant(',!ExternalLoggingTask.cidssignsubid! '), Field(sigid1,false), Constant(',!ExternalLoggingTask.intrusionurl! '), Field(url,false), Constant(',!ExternalLoggingTask.intrusionpayloadurl! '), Field(fld23,false)}" -match("MESSAGE#200:Local::06", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol}Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{dport},!ExternalLoggingTask.remoteport! %{sport},!ExternalLoggingTask.cidssignid! %{sigid},!ExternalLoggingTask.strcidssignid! %{sigid_string},!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld23}", processor_chain([ +var part105 = match("MESSAGE#200:Local::06", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol}Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{dport},!ExternalLoggingTask.remoteport! %{sport},!ExternalLoggingTask.cidssignid! %{sigid},!ExternalLoggingTask.strcidssignid! %{sigid_string},!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld23}", processor_chain([ dup86, dup12, dup13, @@ -4070,8 +3775,7 @@ match("MESSAGE#200:Local::06", "nwparser.payload", "%{event_description},Local: var msg87 = msg("Local::06", part105); -var part106 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',!ExternalLoggingTask.localport! '), Field(sport,false), Constant(',!ExternalLoggingTask.remoteport! '), Field(dport,false), Constant(',!ExternalLoggingTask.cidssignid! '), Field(sigid,false), Constant(',!ExternalLoggingTask.strcidssignid! '), Field(sigid_string,false), Constant(',!ExternalLoggingTask.cidssignsubid! '), Field(sigid1,false), Constant(',!ExternalLoggingTask.intrusionurl! '), Field(url,false), Constant(',!ExternalLoggingTask.intrusionpayloadurl! '), Field(fld23,false)}" -match("MESSAGE#201:Local::16", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{sport},!ExternalLoggingTask.remoteport! %{dport},!ExternalLoggingTask.cidssignid! %{sigid},!ExternalLoggingTask.strcidssignid! %{sigid_string},!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld23}", processor_chain([ +var part106 = match("MESSAGE#201:Local::16", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},!ExternalLoggingTask.localport! %{sport},!ExternalLoggingTask.remoteport! %{dport},!ExternalLoggingTask.cidssignid! %{sigid},!ExternalLoggingTask.strcidssignid! %{sigid_string},!ExternalLoggingTask.cidssignsubid! %{sigid1},!ExternalLoggingTask.intrusionurl! %{url},!ExternalLoggingTask.intrusionpayloadurl! %{fld23}", processor_chain([ dup86, dup12, dup13, @@ -4085,8 +3789,7 @@ match("MESSAGE#201:Local::16", "nwparser.payload", "%{event_description},Local: var msg88 = msg("Local::16", part106); -var part107 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(',0,Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#202:Local::02", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},0,Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ +var part107 = match("MESSAGE#202:Local::02", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},0,Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ dup86, dup12, dup13, @@ -4101,8 +3804,7 @@ match("MESSAGE#202:Local::02", "nwparser.payload", "%{event_description},Local: var msg89 = msg("Local::02", part107); -var part108 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(',1,Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#203:Local::22", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},%{protocol},1,Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ +var part108 = match("MESSAGE#203:Local::22", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},%{protocol},1,Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ dup86, dup12, dup13, @@ -4117,8 +3819,7 @@ match("MESSAGE#203:Local::22", "nwparser.payload", "%{event_description},Local: var msg90 = msg("Local::22", part108); -var part109 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(','), Field(protocol,false), Constant(',2,Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#204:Local::23", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},2,Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ +var part109 = match("MESSAGE#204:Local::23", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},%{protocol},2,Intrusion ID: %{fld33},Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain}", processor_chain([ dup86, dup12, dup13, @@ -4133,8 +3834,7 @@ match("MESSAGE#204:Local::23", "nwparser.payload", "%{event_description},Local: var msg91 = msg("Local::23", part109); -var part110 = // "Pattern{Constant(''), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(': '), Field(fld22,true), Constant(' CVE-'), Field(cve,true), Constant(' '), Field(fld26,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#205:Local::07/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string}: %{fld22->} CVE-%{cve->} %{fld26},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part110 = match("MESSAGE#205:Local::07/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string}: %{fld22->} CVE-%{cve->} %{fld26},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); var all57 = all_match({ processors: [ @@ -4157,8 +3857,7 @@ var all57 = all_match({ var msg92 = msg("Local::07", all57); -var part111 = // "Pattern{Constant(''), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(': '), Field(fld22,true), Constant(' CVE-'), Field(cve,true), Constant(' '), Field(fld26,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#206:Local::19/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string}: %{fld22->} CVE-%{cve->} %{fld26},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part111 = match("MESSAGE#206:Local::19/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string}: %{fld22->} CVE-%{cve->} %{fld26},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); var all58 = all_match({ processors: [ @@ -4181,8 +3880,7 @@ var all58 = all_match({ var msg93 = msg("Local::19", all58); -var part112 = // "Pattern{Constant(''), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#207:Local::05/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); +var part112 = match("MESSAGE#207:Local::05/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); var all59 = all_match({ processors: [ @@ -4208,8 +3906,7 @@ var all59 = all_match({ var msg94 = msg("Local::05", all59); -var part113 = // "Pattern{Constant(''), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#208:Local::15/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); +var part113 = match("MESSAGE#208:Local::15/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}"); var all60 = all_match({ processors: [ @@ -4283,8 +3980,7 @@ var all62 = all_match({ var msg97 = msg("Local::14", all62); -var part114 = // "Pattern{Constant('Local: '), Field(daddr,false), Constant(',Local: '), Field(dport,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(sport,false), Constant(',Inbound,Application: '), Field(application,false), Constant(',Action: '), Field(action,false)}" -match("MESSAGE#211:Local::10", "nwparser.payload", "Local: %{daddr},Local: %{dport},Remote: %{saddr},Remote: %{fld13},Remote: %{sport},Inbound,Application: %{application},Action: %{action}", processor_chain([ +var part114 = match("MESSAGE#211:Local::10", "nwparser.payload", "Local: %{daddr},Local: %{dport},Remote: %{saddr},Remote: %{fld13},Remote: %{sport},Inbound,Application: %{application},Action: %{action}", processor_chain([ dup86, dup12, dup13, @@ -4296,8 +3992,7 @@ match("MESSAGE#211:Local::10", "nwparser.payload", "Local: %{daddr},Local: %{dpo var msg98 = msg("Local::10", part114); -var part115 = // "Pattern{Constant('Local: '), Field(saddr,false), Constant(',Local: '), Field(sport,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(dport,false), Constant(',Outbound,Application: '), Field(application,false), Constant(',Action: '), Field(action,false)}" -match("MESSAGE#212:Local::21", "nwparser.payload", "Local: %{saddr},Local: %{sport},Remote: %{daddr},Remote: %{fld13},Remote: %{dport},Outbound,Application: %{application},Action: %{action}", processor_chain([ +var part115 = match("MESSAGE#212:Local::21", "nwparser.payload", "Local: %{saddr},Local: %{sport},Remote: %{daddr},Remote: %{fld13},Remote: %{dport},Outbound,Application: %{application},Action: %{action}", processor_chain([ dup86, dup12, dup13, @@ -4309,8 +4004,7 @@ match("MESSAGE#212:Local::21", "nwparser.payload", "Local: %{saddr},Local: %{spo var msg99 = msg("Local::21", part115); -var part116 = // "Pattern{Constant('Event Description: '), Field(event_description,false), Constant(',Local: '), Field(daddr,false), Constant(',Local Host MAC: '), Field(dmacaddr,false), Constant(',Remote Host Name: '), Field(fld3,false), Constant(',Remote Host IP: '), Field(saddr,false), Constant(',Remote Host MAC: '), Field(smacaddr,false), Constant(',Inbound,'), Field(protocol,false), Constant(',Intrusion ID: 0,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port: '), Field(dport,false), Constant(',Remote Port: '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL: '), Field(fld12,false), Constant(',SHA-256: '), Field(checksum,false), Constant(',MD-5: '), Field(checksum,false)}" -match("MESSAGE#213:Local::24", "nwparser.payload", "Event Description: %{event_description},Local: %{daddr},Local Host MAC: %{dmacaddr},Remote Host Name: %{fld3},Remote Host IP: %{saddr},Remote Host MAC: %{smacaddr},Inbound,%{protocol},Intrusion ID: 0,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port: %{dport},Remote Port: %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL: %{fld12},SHA-256: %{checksum},MD-5: %{checksum}", processor_chain([ +var part116 = match("MESSAGE#213:Local::24", "nwparser.payload", "Event Description: %{event_description},Local: %{daddr},Local Host MAC: %{dmacaddr},Remote Host Name: %{fld3},Remote Host IP: %{saddr},Remote Host MAC: %{smacaddr},Inbound,%{protocol},Intrusion ID: 0,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port: %{dport},Remote Port: %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL: %{fld12},SHA-256: %{checksum},MD-5: %{checksum}", processor_chain([ dup120, dup12, dup13, @@ -4321,8 +4015,7 @@ match("MESSAGE#213:Local::24", "nwparser.payload", "Event Description: %{event_d var msg100 = msg("Local::24", part116); -var part117 = // "Pattern{Constant('Event Description: '), Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local Host MAC: '), Field(smacaddr,false), Constant(',Remote Host Name: '), Field(fld3,false), Constant(',Remote Host IP: '), Field(daddr,false), Constant(',Remote Host MAC: '), Field(dmacaddr,false), Constant(',Outbound,'), Field(protocol,false), Constant(',Intrusion ID: 0,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port: '), Field(sport,false), Constant(',Remote Port: '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL: '), Field(fld12,false), Constant(',SHA-256: '), Field(checksum,false), Constant(',MD-5: '), Field(checksum,false)}" -match("MESSAGE#214:Local::25", "nwparser.payload", "Event Description: %{event_description},Local: %{saddr},Local Host MAC: %{smacaddr},Remote Host Name: %{fld3},Remote Host IP: %{daddr},Remote Host MAC: %{dmacaddr},Outbound,%{protocol},Intrusion ID: 0,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port: %{sport},Remote Port: %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL: %{fld12},SHA-256: %{checksum},MD-5: %{checksum}", processor_chain([ +var part117 = match("MESSAGE#214:Local::25", "nwparser.payload", "Event Description: %{event_description},Local: %{saddr},Local Host MAC: %{smacaddr},Remote Host Name: %{fld3},Remote Host IP: %{daddr},Remote Host MAC: %{dmacaddr},Outbound,%{protocol},Intrusion ID: 0,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port: %{sport},Remote Port: %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL: %{fld12},SHA-256: %{checksum},MD-5: %{checksum}", processor_chain([ dup36, dup12, dup13, @@ -4333,8 +4026,7 @@ match("MESSAGE#214:Local::25", "nwparser.payload", "Event Description: %{event_d var msg101 = msg("Local::25", part117); -var part118 = // "Pattern{Constant('Event Description: '), Field(event_description,true), Constant(' [Volume]: '), Field(disk_volume,true), Constant(' [Model]: '), Field(product,true), Constant(' [Access]: '), Field(accesses,false), Constant(',Local: '), Field(saddr,false), Constant(',Local Host MAC: '), Field(smacaddr,false), Constant(',Remote Host Name: '), Field(fld3,false), Constant(',Remote Host IP: '), Field(daddr,false), Constant(',Remote Host MAC: '), Field(dmacaddr,false), Constant(','), Field(direction,false), Constant(','), Field(fld2,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port: '), Field(sport,false), Constant(',Remote Port: '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL: '), Field(fld12,false), Constant(',SHA-256: '), Field(checksum,false), Constant(',MD-5: '), Field(checksum,false)}" -match("MESSAGE#215:Local::26", "nwparser.payload", "Event Description: %{event_description->} [Volume]: %{disk_volume->} [Model]: %{product->} [Access]: %{accesses},Local: %{saddr},Local Host MAC: %{smacaddr},Remote Host Name: %{fld3},Remote Host IP: %{daddr},Remote Host MAC: %{dmacaddr},%{direction},%{fld2},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port: %{sport},Remote Port: %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL: %{fld12},SHA-256: %{checksum},MD-5: %{checksum}", processor_chain([ +var part118 = match("MESSAGE#215:Local::26", "nwparser.payload", "Event Description: %{event_description->} [Volume]: %{disk_volume->} [Model]: %{product->} [Access]: %{accesses},Local: %{saddr},Local Host MAC: %{smacaddr},Remote Host Name: %{fld3},Remote Host IP: %{daddr},Remote Host MAC: %{dmacaddr},%{direction},%{fld2},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port: %{sport},Remote Port: %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL: %{fld12},SHA-256: %{checksum},MD-5: %{checksum}", processor_chain([ dup53, dup12, dup13, @@ -4374,8 +4066,7 @@ var select18 = linear_select([ msg102, ]); -var part119 = // "Pattern{Constant('Blocked Attack: Memory Heap Spray attack against '), Field(fld1,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld15,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld51,false), Constant(',Inbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld2,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#54:Blocked:13/0", "nwparser.payload", "Blocked Attack: Memory Heap Spray attack against %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld51},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld2},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part119 = match("MESSAGE#54:Blocked:13/0", "nwparser.payload", "Blocked Attack: Memory Heap Spray attack against %{fld1},Local: %{daddr},Local: %{fld12},Remote: %{fld15},Remote: %{saddr},Remote: %{fld51},Inbound,%{protocol},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld2},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all63 = all_match({ processors: [ @@ -4398,8 +4089,7 @@ var all63 = all_match({ var msg103 = msg("Blocked:13", all63); -var part120 = // "Pattern{Constant('"'), Field(fld23,false), Constant(',",File Read,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#483:File:01", "nwparser.payload", "\"%{fld23},\",File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain}", processor_chain([ +var part120 = match("MESSAGE#483:File:01", "nwparser.payload", "\"%{fld23},\",File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4415,8 +4105,7 @@ match("MESSAGE#483:File:01", "nwparser.payload", "\"%{fld23},\",File Read,Begin: var msg104 = msg("File:01", part120); -var part121 = // "Pattern{Constant('"'), Field(info,false), Constant('",Create Process,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld1,false), Constant(','), Field(process,false), Constant(','), Field(fld3,false), Constant(','), Field(fld4,false), Constant(','), Field(application,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld6,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#484:File:11", "nwparser.payload", "\"%{info}\",Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld1},%{process},%{fld3},%{fld4},%{application},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ +var part121 = match("MESSAGE#484:File:11", "nwparser.payload", "\"%{info}\",Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld1},%{process},%{fld3},%{fld4},%{application},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -4429,8 +4118,7 @@ match("MESSAGE#484:File:11", "nwparser.payload", "\"%{info}\",Create Process,Beg var msg105 = msg("File:11", part121); -var part122 = // "Pattern{Constant('"'), Field(info,false), Constant('",Create Process,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld1,false), Constant(','), Field(process,false), Constant(','), Field(fld3,false), Constant(','), Field(fld4,false), Constant(','), Field(application,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#485:File:02", "nwparser.payload", "\"%{info}\",Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld1},%{process},%{fld3},%{fld4},%{application},User: %{username},Domain: %{domain}", processor_chain([ +var part122 = match("MESSAGE#485:File:02", "nwparser.payload", "\"%{info}\",Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld1},%{process},%{fld3},%{fld4},%{application},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4443,8 +4131,7 @@ match("MESSAGE#485:File:02", "nwparser.payload", "\"%{info}\",Create Process,Beg var msg106 = msg("File:02", part122); -var part123 = // "Pattern{Field(fld1,false), Constant(',File Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#486:File:03", "nwparser.payload", "%{fld1},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain}", processor_chain([ +var part123 = match("MESSAGE#486:File:03", "nwparser.payload", "%{fld1},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4459,8 +4146,7 @@ match("MESSAGE#486:File:03", "nwparser.payload", "%{fld1},File Write,Begin: %{fl var msg107 = msg("File:03", part123); -var part124 = // "Pattern{Field(info,false), Constant('.'), Field(fld1,false), Constant(',File Read,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld46,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#487:Blocked:04", "nwparser.payload", "%{info}.%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld46},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ +var part124 = match("MESSAGE#487:Blocked:04", "nwparser.payload", "%{info}.%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld46},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -4476,8 +4162,7 @@ match("MESSAGE#487:Blocked:04", "nwparser.payload", "%{info}.%{fld1},File Read,B var msg108 = msg("Blocked:04", part124); -var part125 = // "Pattern{Field(fld1,false), Constant(',File Read,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld46,false)}" -match("MESSAGE#488:File:05", "nwparser.payload", "%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld46}", processor_chain([ +var part125 = match("MESSAGE#488:File:05", "nwparser.payload", "%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld46}", processor_chain([ dup121, dup12, dup13, @@ -4492,8 +4177,7 @@ match("MESSAGE#488:File:05", "nwparser.payload", "%{fld1},File Read,Begin: %{fld var msg109 = msg("File:05", part125); -var part126 = // "Pattern{Constant('"'), Field(fld23,false), Constant('",,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#489:File:04", "nwparser.payload", "\"%{fld23}\",,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},,%{filename},User: %{username},Domain: %{domain}", processor_chain([ +var part126 = match("MESSAGE#489:File:04", "nwparser.payload", "\"%{fld23}\",,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},,%{filename},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4507,8 +4191,7 @@ match("MESSAGE#489:File:04", "nwparser.payload", "\"%{fld23}\",,Begin: %{fld50-> var msg110 = msg("File:04", part126); -var part127 = // "Pattern{Field(fld1,false), Constant(',File Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',"Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#490:File:06", "nwparser.payload", "%{fld1},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},\"Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain}", processor_chain([ +var part127 = match("MESSAGE#490:File:06", "nwparser.payload", "%{fld1},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},\"Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4523,8 +4206,7 @@ match("MESSAGE#490:File:06", "nwparser.payload", "%{fld1},File Write,Begin: %{fl var msg111 = msg("File:06", part127); -var part128 = // "Pattern{Constant('''), Field(fld23,false), Constant('',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#491:File:07", "nwparser.payload", "'%{fld23}',,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},,%{filename},User: %{username},Domain: %{domain}", processor_chain([ +var part128 = match("MESSAGE#491:File:07", "nwparser.payload", "'%{fld23}',,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},,%{filename},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4538,8 +4220,7 @@ match("MESSAGE#491:File:07", "nwparser.payload", "'%{fld23}',,Begin: %{fld50->} var msg112 = msg("File:07", part128); -var part129 = // "Pattern{Field(fld23,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(process_id,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld6,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#492:File:12", "nwparser.payload", "%{fld23},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{process_id},%{process},%{fld4},,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ +var part129 = match("MESSAGE#492:File:12", "nwparser.payload", "%{fld23},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{process_id},%{process},%{fld4},,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -4550,8 +4231,7 @@ match("MESSAGE#492:File:12", "nwparser.payload", "%{fld23},,Begin: %{fld50->} %{ var msg113 = msg("File:12", part129); -var part130 = // "Pattern{Field(fld1,false), Constant(','), Field(fld7,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',"Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#493:File:08", "nwparser.payload", "%{fld1},%{fld7},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},\"Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain}", processor_chain([ +var part130 = match("MESSAGE#493:File:08", "nwparser.payload", "%{fld1},%{fld7},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},\"Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4564,8 +4244,7 @@ match("MESSAGE#493:File:08", "nwparser.payload", "%{fld1},%{fld7},Begin: %{fld50 var msg114 = msg("File:08", part130); -var part131 = // "Pattern{Field(fld1,false), Constant(',File Delete,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld6,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#494:File:09", "nwparser.payload", "%{fld1},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ +var part131 = match("MESSAGE#494:File:09", "nwparser.payload", "%{fld1},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -4580,8 +4259,7 @@ match("MESSAGE#494:File:09", "nwparser.payload", "%{fld1},File Delete,Begin: %{f var msg115 = msg("File:09", part131); -var part132 = // "Pattern{Constant('Unauthorized NT call rejected by protection driver.,'), Field(fld22,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(filename,false), Constant(','), Field(fld4,false), Constant(','), Field(fld23,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#496:Blocked", "nwparser.payload", "Unauthorized NT call rejected by protection driver.,%{fld22},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},%{fld23},User: %{username},Domain: %{domain}", processor_chain([ +var part132 = match("MESSAGE#496:Blocked", "nwparser.payload", "Unauthorized NT call rejected by protection driver.,%{fld22},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},%{fld23},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -4596,8 +4274,7 @@ match("MESSAGE#496:Blocked", "nwparser.payload", "Unauthorized NT call rejected var msg116 = msg("Blocked", part132); -var part133 = // "Pattern{Constant(',Create Process,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld4,false), Constant(','), Field(process,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(info,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld8,false)}" -match("MESSAGE#497:Blocked:01", "nwparser.payload", ",Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ +var part133 = match("MESSAGE#497:Blocked:01", "nwparser.payload", ",Create Process,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ dup121, dup12, dup13, @@ -4610,8 +4287,7 @@ match("MESSAGE#497:Blocked:01", "nwparser.payload", ",Create Process,Begin: %{fl var msg117 = msg("Blocked:01", part133); -var part134 = // "Pattern{Field(fld5,true), Constant(' - Caller MD5='), Field(fld6,false), Constant(',Registry Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false)}" -match("MESSAGE#498:Blocked:02", "nwparser.payload", "%{fld5->} - Caller MD5=%{fld6},Registry Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ +var part134 = match("MESSAGE#498:Blocked:02", "nwparser.payload", "%{fld5->} - Caller MD5=%{fld6},Registry Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ dup121, dup12, dup13, @@ -4624,19 +4300,16 @@ match("MESSAGE#498:Blocked:02", "nwparser.payload", "%{fld5->} - Caller MD5=%{fl var msg118 = msg("Blocked:02", part134); -var part135 = // "Pattern{Field(fld21,true), Constant(' - Caller MD5='), Field(fld22,false), Constant(',Create Process'), Field(p0,false)}" -match("MESSAGE#499:Blocked:03/0_0", "nwparser.payload", "%{fld21->} - Caller MD5=%{fld22},Create Process%{p0}"); +var part135 = match("MESSAGE#499:Blocked:03/0_0", "nwparser.payload", "%{fld21->} - Caller MD5=%{fld22},Create Process%{p0}"); -var part136 = // "Pattern{Field(fld23,false), Constant(',Load Dll'), Field(p0,false)}" -match("MESSAGE#499:Blocked:03/0_1", "nwparser.payload", "%{fld23},Load Dll%{p0}"); +var part136 = match("MESSAGE#499:Blocked:03/0_1", "nwparser.payload", "%{fld23},Load Dll%{p0}"); var select19 = linear_select([ part135, part136, ]); -var part137 = // "Pattern{Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld24,false), Constant(','), Field(process,false), Constant(','), Field(fld25,false), Constant(','), Field(fld26,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld8,false), Constant(',File size (bytes):'), Field(filename_size,false), Constant(',Device ID:'), Field(device,false)}" -match("MESSAGE#499:Blocked:03/1", "nwparser.p0", ",Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld24},%{process},%{fld25},%{fld26},%{filename},User: %{username},Domain: %{domain},Action Type: %{fld8},File size (bytes):%{filename_size},Device ID:%{device}"); +var part137 = match("MESSAGE#499:Blocked:03/1", "nwparser.p0", ",Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld24},%{process},%{fld25},%{fld26},%{filename},User: %{username},Domain: %{domain},Action Type: %{fld8},File size (bytes):%{filename_size},Device ID:%{device}"); var all64 = all_match({ processors: [ @@ -4658,8 +4331,7 @@ var all64 = all_match({ var msg119 = msg("Blocked:03", all64); -var part138 = // "Pattern{Field(event_description,true), Constant(' - Caller MD5='), Field(checksum,false), Constant(','), Field(fld1,false), Constant(',Begin: '), Field(fld2,true), Constant(' '), Field(fld3,false), Constant(',End: '), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(process_id,false), Constant(','), Field(process,false), Constant(','), Field(fld6,false), Constant(','), Field(fld7,false), Constant(','), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(sdomain,false), Constant(',Action Type: '), Field(fld9,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID:')}" -match("MESSAGE#500:Blocked:05", "nwparser.payload", "%{event_description->} - Caller MD5=%{checksum},%{fld1},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{sdomain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID:", processor_chain([ +var part138 = match("MESSAGE#500:Blocked:05", "nwparser.payload", "%{event_description->} - Caller MD5=%{checksum},%{fld1},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{sdomain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID:", processor_chain([ dup121, dup12, dup13, @@ -4671,8 +4343,7 @@ match("MESSAGE#500:Blocked:05", "nwparser.payload", "%{event_description->} - Ca var msg120 = msg("Blocked:05", part138); -var part139 = // "Pattern{Constant('['), Field(id,false), Constant('] '), Field(event_description,true), Constant(' - '), Field(fld11,false), Constant(','), Field(fld1,false), Constant(',Begin: '), Field(fld2,true), Constant(' '), Field(fld3,false), Constant(',End: '), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(process_id,false), Constant(','), Field(process,false), Constant(','), Field(fld6,false), Constant(','), Field(fld7,false), Constant(','), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld9,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#501:Blocked:06", "nwparser.payload", "[%{id}] %{event_description->} - %{fld11},%{fld1},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{domain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID: %{device}", processor_chain([ +var part139 = match("MESSAGE#501:Blocked:06", "nwparser.payload", "[%{id}] %{event_description->} - %{fld11},%{fld1},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{domain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -4684,8 +4355,7 @@ match("MESSAGE#501:Blocked:06", "nwparser.payload", "[%{id}] %{event_description var msg121 = msg("Blocked:06", part139); -var part140 = // "Pattern{Constant('['), Field(id,false), Constant('] '), Field(event_description,false), Constant(','), Field(fld1,false), Constant(',Begin: '), Field(fld2,true), Constant(' '), Field(fld3,false), Constant(',End: '), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(process_id,false), Constant(','), Field(process,false), Constant(','), Field(fld6,false), Constant(','), Field(fld7,false), Constant(','), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld9,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#502:Blocked:07", "nwparser.payload", "[%{id}] %{event_description},%{fld1},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{domain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID: %{device}", processor_chain([ +var part140 = match("MESSAGE#502:Blocked:07", "nwparser.payload", "[%{id}] %{event_description},%{fld1},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{domain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -4697,23 +4367,17 @@ match("MESSAGE#502:Blocked:07", "nwparser.payload", "[%{id}] %{event_description var msg122 = msg("Blocked:07", part140); -var part141 = // "Pattern{Field(fld11,true), Constant(' - Target MD5='), Field(fld6,true), Constant(' - Target Arguments='), Field(fld7,false), Constant('/service''), Field(fld33,true), Constant(' ,Create Process,Begin: '), Field(p0,false)}" -match("MESSAGE#504:Blocked:09/0_0", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7}/service'%{fld33->} ,Create Process,Begin: %{p0}"); +var part141 = match("MESSAGE#504:Blocked:09/0_0", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7}/service'%{fld33->} ,Create Process,Begin: %{p0}"); -var part142 = // "Pattern{Field(fld11,true), Constant(' - Target MD5='), Field(fld6,true), Constant(' - Target Arguments='), Field(fld7,false), Constant('chrome-extension:'), Field(fld99,false), Constant('''), Field(fld33,true), Constant(' ,Create Process,Begin: '), Field(p0,false)}" -match("MESSAGE#504:Blocked:09/0_1", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7}chrome-extension:%{fld99}'%{fld33->} ,Create Process,Begin: %{p0}"); +var part142 = match("MESSAGE#504:Blocked:09/0_1", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7}chrome-extension:%{fld99}'%{fld33->} ,Create Process,Begin: %{p0}"); -var part143 = // "Pattern{Field(fld11,true), Constant(' - Target MD5='), Field(fld6,true), Constant(' - Target Arguments='), Field(fld7,false), Constant('-ServerName:'), Field(hostid,false), Constant('''), Field(fld33,true), Constant(' ,Create Process,Begin: '), Field(p0,false)}" -match("MESSAGE#504:Blocked:09/0_2", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7}-ServerName:%{hostid}'%{fld33->} ,Create Process,Begin: %{p0}"); +var part143 = match("MESSAGE#504:Blocked:09/0_2", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7}-ServerName:%{hostid}'%{fld33->} ,Create Process,Begin: %{p0}"); -var part144 = // "Pattern{Constant('- Target MD5='), Field(fld6,true), Constant(' - Target Arguments='), Field(fld7,false), Constant('-ServerName:'), Field(hostid,false), Constant('' ,Create Process,Begin: '), Field(p0,false)}" -match("MESSAGE#504:Blocked:09/0_3", "nwparser.payload", "- Target MD5=%{fld6->} - Target Arguments=%{fld7}-ServerName:%{hostid}' ,Create Process,Begin: %{p0}"); +var part144 = match("MESSAGE#504:Blocked:09/0_3", "nwparser.payload", "- Target MD5=%{fld6->} - Target Arguments=%{fld7}-ServerName:%{hostid}' ,Create Process,Begin: %{p0}"); -var part145 = // "Pattern{Field(fld11,true), Constant(' - Target MD5='), Field(fld6,true), Constant(' - Target Arguments='), Field(fld7,true), Constant(' ,Create Process,Begin: '), Field(p0,false)}" -match("MESSAGE#504:Blocked:09/0_4", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7->} ,Create Process,Begin: %{p0}"); +var part145 = match("MESSAGE#504:Blocked:09/0_4", "nwparser.payload", "%{fld11->} - Target MD5=%{fld6->} - Target Arguments=%{fld7->} ,Create Process,Begin: %{p0}"); -var part146 = // "Pattern{Constant('- Target MD5='), Field(fld6,false), Constant(',Create Process,Begin: '), Field(p0,false)}" -match("MESSAGE#504:Blocked:09/0_5", "nwparser.payload", "- Target MD5=%{fld6},Create Process,Begin: %{p0}"); +var part146 = match("MESSAGE#504:Blocked:09/0_5", "nwparser.payload", "- Target MD5=%{fld6},Create Process,Begin: %{p0}"); var select20 = linear_select([ part141, @@ -4724,8 +4388,7 @@ var select20 = linear_select([ part146, ]); -var part147 = // "Pattern{Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,true), Constant(' ,File size ('), Field(fld10,false), Constant('):'), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#504:Blocked:09/1", "nwparser.p0", "%{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44->} ,File size (%{fld10}):%{filename_size},Device ID: %{device}"); +var part147 = match("MESSAGE#504:Blocked:09/1", "nwparser.p0", "%{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44->} ,File size (%{fld10}):%{filename_size},Device ID: %{device}"); var all65 = all_match({ processors: [ @@ -4770,8 +4433,7 @@ var select21 = linear_select([ msg123, ]); -var part148 = // "Pattern{Constant('Changed value ''), Field(change_attribute,false), Constant('' from ''), Field(change_old,false), Constant('' to ''), Field(change_new,false), Constant('''), Field(p0,false)}" -match("MESSAGE#55:Changed/0", "nwparser.payload", "Changed value '%{change_attribute}' from '%{change_old}' to '%{change_new}'%{p0}"); +var part148 = match("MESSAGE#55:Changed/0", "nwparser.payload", "Changed value '%{change_attribute}' from '%{change_old}' to '%{change_new}'%{p0}"); var all66 = all_match({ processors: [ @@ -4795,8 +4457,7 @@ var all66 = all_match({ var msg124 = msg("Changed", all66); -var part149 = // "Pattern{Constant('Cleaned up '), Field(dclass_counter1,true), Constant(' LiveUpdate downloaded content')}" -match("MESSAGE#56:Cleaned", "nwparser.payload", "Cleaned up %{dclass_counter1->} LiveUpdate downloaded content", processor_chain([ +var part149 = match("MESSAGE#56:Cleaned", "nwparser.payload", "Cleaned up %{dclass_counter1->} LiveUpdate downloaded content", processor_chain([ dup43, dup12, dup13, @@ -4808,8 +4469,7 @@ match("MESSAGE#56:Cleaned", "nwparser.payload", "Cleaned up %{dclass_counter1->} var msg125 = msg("Cleaned", part149); -var part150 = // "Pattern{Constant('Client has downloaded the issued Command,'), Field(username,false)}" -match("MESSAGE#57:Client", "nwparser.payload", "Client has downloaded the issued Command,%{username}", processor_chain([ +var part150 = match("MESSAGE#57:Client", "nwparser.payload", "Client has downloaded the issued Command,%{username}", processor_chain([ dup53, dup12, dup13, @@ -4821,14 +4481,11 @@ match("MESSAGE#57:Client", "nwparser.payload", "Client has downloaded the issued var msg126 = msg("Client", part150); -var part151 = // "Pattern{Field(event_description,false), Constant(', type SymDelta version'), Field(version,true), Constant(' filesize'), Field(filename_size,false), Constant('.",Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#58:Client:01/0_0", "nwparser.payload", "%{event_description}, type SymDelta version%{version->} filesize%{filename_size}.\",Event time:%{fld17->} %{fld18}"); +var part151 = match("MESSAGE#58:Client:01/0_0", "nwparser.payload", "%{event_description}, type SymDelta version%{version->} filesize%{filename_size}.\",Event time:%{fld17->} %{fld18}"); -var part152 = // "Pattern{Field(event_description,false), Constant(', type full version'), Field(version,true), Constant(' filesize'), Field(filename_size,false), Constant('.",Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#58:Client:01/0_1", "nwparser.payload", "%{event_description}, type full version%{version->} filesize%{filename_size}.\",Event time:%{fld17->} %{fld18}"); +var part152 = match("MESSAGE#58:Client:01/0_1", "nwparser.payload", "%{event_description}, type full version%{version->} filesize%{filename_size}.\",Event time:%{fld17->} %{fld18}"); -var part153 = // "Pattern{Field(event_description,false)}" -match_copy("MESSAGE#58:Client:01/0_2", "nwparser.payload", "event_description"); +var part153 = match_copy("MESSAGE#58:Client:01/0_2", "nwparser.payload", "event_description"); var select22 = linear_select([ part151, @@ -4857,17 +4514,13 @@ var select23 = linear_select([ msg127, ]); -var part154 = // "Pattern{Constant('client has downloaded the '), Field(p0,false)}" -match("MESSAGE#59:client/0", "nwparser.payload", "client has downloaded the %{p0}"); +var part154 = match("MESSAGE#59:client/0", "nwparser.payload", "client has downloaded the %{p0}"); -var part155 = // "Pattern{Constant('content package'), Field(p0,false)}" -match("MESSAGE#59:client/1_0", "nwparser.p0", "content package%{p0}"); +var part155 = match("MESSAGE#59:client/1_0", "nwparser.p0", "content package%{p0}"); -var part156 = // "Pattern{Constant('policy'), Field(p0,false)}" -match("MESSAGE#59:client/1_1", "nwparser.p0", "policy%{p0}"); +var part156 = match("MESSAGE#59:client/1_1", "nwparser.p0", "policy%{p0}"); -var part157 = // "Pattern{Constant('Intrusion Prevention policy'), Field(p0,false)}" -match("MESSAGE#59:client/1_2", "nwparser.p0", "Intrusion Prevention policy%{p0}"); +var part157 = match("MESSAGE#59:client/1_2", "nwparser.p0", "Intrusion Prevention policy%{p0}"); var select24 = linear_select([ part155, @@ -4875,8 +4528,7 @@ var select24 = linear_select([ part157, ]); -var part158 = // "Pattern{Field(,false), Constant('successfully,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#59:client/2", "nwparser.p0", "%{}successfully,%{shost},%{username},%{group}"); +var part158 = match("MESSAGE#59:client/2", "nwparser.p0", "%{}successfully,%{shost},%{username},%{group}"); var all68 = all_match({ processors: [ @@ -4896,8 +4548,7 @@ var all68 = all_match({ var msg128 = msg("client", all68); -var part159 = // "Pattern{Constant('client has reconnected with the management server,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#60:client:01", "nwparser.payload", "client has reconnected with the management server,%{shost},%{username},%{group}", processor_chain([ +var part159 = match("MESSAGE#60:client:01", "nwparser.payload", "client has reconnected with the management server,%{shost},%{username},%{group}", processor_chain([ dup43, dup12, dup13, @@ -4908,8 +4559,7 @@ match("MESSAGE#60:client:01", "nwparser.payload", "client has reconnected with t var msg129 = msg("client:01", part159); -var part160 = // "Pattern{Constant('client has downloaded '), Field(filename,true), Constant(' successfully,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#61:client:02", "nwparser.payload", "client has downloaded %{filename->} successfully,%{shost},%{username},%{group}", processor_chain([ +var part160 = match("MESSAGE#61:client:02", "nwparser.payload", "client has downloaded %{filename->} successfully,%{shost},%{username},%{group}", processor_chain([ dup43, dup12, dup13, @@ -4920,8 +4570,7 @@ match("MESSAGE#61:client:02", "nwparser.payload", "client has downloaded %{filen var msg130 = msg("client:02", part160); -var part161 = // "Pattern{Constant('client registered with the management server successfully,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#62:client:03", "nwparser.payload", "client registered with the management server successfully,%{shost},%{username},%{group}", processor_chain([ +var part161 = match("MESSAGE#62:client:03", "nwparser.payload", "client registered with the management server successfully,%{shost},%{username},%{group}", processor_chain([ dup43, dup12, dup13, @@ -4932,8 +4581,7 @@ match("MESSAGE#62:client:03", "nwparser.payload", "client registered with the ma var msg131 = msg("client:03", part161); -var part162 = // "Pattern{Constant('client has downloaded '), Field(filename,false), Constant(','), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#63:client:04", "nwparser.payload", "client has downloaded %{filename},%{shost},%{username},%{group}", processor_chain([ +var part162 = match("MESSAGE#63:client:04", "nwparser.payload", "client has downloaded %{filename},%{shost},%{username},%{group}", processor_chain([ dup43, dup12, dup13, @@ -4944,8 +4592,7 @@ match("MESSAGE#63:client:04", "nwparser.payload", "client has downloaded %{filen var msg132 = msg("client:04", part162); -var part163 = // "Pattern{Constant('Local: '), Field(daddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld25,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Inbound,'), Field(fld5,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld12,false)}" -match("MESSAGE#64:client:05/2", "nwparser.p0", "Local: %{daddr},Local: %{fld1},Remote: %{fld25},Remote: %{saddr},Remote: %{fld3},Inbound,%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}"); +var part163 = match("MESSAGE#64:client:05/2", "nwparser.p0", "Local: %{daddr},Local: %{fld1},Remote: %{fld25},Remote: %{saddr},Remote: %{fld3},Inbound,%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}"); var all69 = all_match({ processors: [ @@ -4970,8 +4617,7 @@ var all69 = all_match({ var msg133 = msg("client:05", all69); -var part164 = // "Pattern{Constant('Local: '), Field(saddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld25,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Outbound,'), Field(fld5,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld12,false)}" -match("MESSAGE#65:client:15/2", "nwparser.p0", "Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},Outbound,%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}"); +var part164 = match("MESSAGE#65:client:15/2", "nwparser.p0", "Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},Outbound,%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}"); var all70 = all_match({ processors: [ @@ -4996,8 +4642,7 @@ var all70 = all_match({ var msg134 = msg("client:15", all70); -var part165 = // "Pattern{Constant('client computer has been added to the group,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#66:client:06", "nwparser.payload", "client computer has been added to the group,%{shost},%{username},%{group}", processor_chain([ +var part165 = match("MESSAGE#66:client:06", "nwparser.payload", "client computer has been added to the group,%{shost},%{username},%{group}", processor_chain([ dup43, dup12, dup13, @@ -5008,8 +4653,7 @@ match("MESSAGE#66:client:06", "nwparser.payload", "client computer has been adde var msg135 = msg("client:06", part165); -var part166 = // "Pattern{Constant('client computer has been renamed,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(sdomain,false)}" -match("MESSAGE#67:client:07", "nwparser.payload", "client computer has been renamed,%{shost},%{username},%{sdomain}", processor_chain([ +var part166 = match("MESSAGE#67:client:07", "nwparser.payload", "client computer has been renamed,%{shost},%{username},%{sdomain}", processor_chain([ dup43, dup12, dup13, @@ -5020,8 +4664,7 @@ match("MESSAGE#67:client:07", "nwparser.payload", "client computer has been rena var msg136 = msg("client:07", part166); -var part167 = // "Pattern{Constant('The client does not have a paid license. The current license cannot be used to obtain a client authentication token.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#68:client:08", "nwparser.payload", "The client does not have a paid license. The current license cannot be used to obtain a client authentication token.,Event time: %{event_time_string}", processor_chain([ +var part167 = match("MESSAGE#68:client:08", "nwparser.payload", "The client does not have a paid license. The current license cannot be used to obtain a client authentication token.,Event time: %{event_time_string}", processor_chain([ dup43, dup12, dup13, @@ -5032,8 +4675,7 @@ match("MESSAGE#68:client:08", "nwparser.payload", "The client does not have a pa var msg137 = msg("client:08", part167); -var part168 = // "Pattern{Constant('The client has successfully downloaded and applied a license from the server.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#69:client:09", "nwparser.payload", "The client has successfully downloaded and applied a license from the server.,Event time: %{event_time_string}", processor_chain([ +var part168 = match("MESSAGE#69:client:09", "nwparser.payload", "The client has successfully downloaded and applied a license from the server.,Event time: %{event_time_string}", processor_chain([ dup43, dup12, dup13, @@ -5050,22 +4692,18 @@ match("MESSAGE#69:client:09", "nwparser.payload", "The client has successfully d var msg138 = msg("client:09", part168); -var part169 = // "Pattern{Constant('The client opted to download a full definitions package for AV definitions from the management server or GUP '), Field(p0,false)}" -match("MESSAGE#693:SYLINK:01/0", "nwparser.payload", "The client opted to download a full definitions package for AV definitions from the management server or GUP %{p0}"); +var part169 = match("MESSAGE#693:SYLINK:01/0", "nwparser.payload", "The client opted to download a full definitions package for AV definitions from the management server or GUP %{p0}"); -var part170 = // "Pattern{Constant('because LiveUpdate had no AV updates available'), Field(p0,false)}" -match("MESSAGE#693:SYLINK:01/1_0", "nwparser.p0", "because LiveUpdate had no AV updates available%{p0}"); +var part170 = match("MESSAGE#693:SYLINK:01/1_0", "nwparser.p0", "because LiveUpdate had no AV updates available%{p0}"); -var part171 = // "Pattern{Constant('rather than download a large package from LiveUpdate'), Field(p0,false)}" -match("MESSAGE#693:SYLINK:01/1_1", "nwparser.p0", "rather than download a large package from LiveUpdate%{p0}"); +var part171 = match("MESSAGE#693:SYLINK:01/1_1", "nwparser.p0", "rather than download a large package from LiveUpdate%{p0}"); var select25 = linear_select([ part170, part171, ]); -var part172 = // "Pattern{Constant('.'), Field(p0,false)}" -match("MESSAGE#693:SYLINK:01/2", "nwparser.p0", ".%{p0}"); +var part172 = match("MESSAGE#693:SYLINK:01/2", "nwparser.p0", ".%{p0}"); var all71 = all_match({ processors: [ @@ -5084,8 +4722,7 @@ var all71 = all_match({ var msg139 = msg("SYLINK:01", all71); -var part173 = // "Pattern{Constant('The client opted to download an update for AV definitions from LiveUpdate rather than download a full definitions package from the management server or GUP.'), Field(,false)}" -match("MESSAGE#694:SYLINK:02", "nwparser.payload", "The client opted to download an update for AV definitions from LiveUpdate rather than download a full definitions package from the management server or GUP.%{}", processor_chain([ +var part173 = match("MESSAGE#694:SYLINK:02", "nwparser.payload", "The client opted to download an update for AV definitions from LiveUpdate rather than download a full definitions package from the management server or GUP.%{}", processor_chain([ dup43, dup15, setc("event_description","The client opted to download an update for AV definitions from LiveUpdate"), @@ -5093,8 +4730,7 @@ match("MESSAGE#694:SYLINK:02", "nwparser.payload", "The client opted to download var msg140 = msg("SYLINK:02", part173); -var part174 = // "Pattern{Constant('The client has obtained an invalid license file ('), Field(filename,false), Constant(') from the server.,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#695:SYLINK:04", "nwparser.payload", "The client has obtained an invalid license file (%{filename}) from the server.,Event time:%{fld17->} %{fld18}", processor_chain([ +var part174 = match("MESSAGE#695:SYLINK:04", "nwparser.payload", "The client has obtained an invalid license file (%{filename}) from the server.,Event time:%{fld17->} %{fld18}", processor_chain([ dup121, dup12, dup13, @@ -5105,8 +4741,7 @@ match("MESSAGE#695:SYLINK:04", "nwparser.payload", "The client has obtained an i var msg141 = msg("SYLINK:04", part174); -var part175 = // "Pattern{Constant('The client has successfully downloaded a license file ('), Field(filename,false), Constant(') from the server.')}" -match("MESSAGE#697:Smc", "nwparser.payload", "The client has successfully downloaded a license file (%{filename}) from the server.", processor_chain([ +var part175 = match("MESSAGE#697:Smc", "nwparser.payload", "The client has successfully downloaded a license file (%{filename}) from the server.", processor_chain([ dup121, dup12, dup13, @@ -5117,8 +4752,7 @@ match("MESSAGE#697:Smc", "nwparser.payload", "The client has successfully downlo var msg142 = msg("Smc", part175); -var part176 = // "Pattern{Constant('The client has successfully downloaded and applied a license file ('), Field(filename,false), Constant(') from the server.'), Field(p0,false)}" -match("MESSAGE#698:Smc:01/0", "nwparser.payload", "The client has successfully downloaded and applied a license file (%{filename}) from the server.%{p0}"); +var part176 = match("MESSAGE#698:Smc:01/0", "nwparser.payload", "The client has successfully downloaded and applied a license file (%{filename}) from the server.%{p0}"); var all72 = all_match({ processors: [ @@ -5138,8 +4772,7 @@ var all72 = all_match({ var msg143 = msg("Smc:01", all72); -var part177 = // "Pattern{Constant('"The client has successfully downloaded and applied a license file ('), Field(filename,false), Constant(', Serial: '), Field(serial_number,false), Constant(') from the server."'), Field(p0,false)}" -match("MESSAGE#701:Smc:05/0", "nwparser.payload", "\"The client has successfully downloaded and applied a license file (%{filename}, Serial: %{serial_number}) from the server.\"%{p0}"); +var part177 = match("MESSAGE#701:Smc:05/0", "nwparser.payload", "\"The client has successfully downloaded and applied a license file (%{filename}, Serial: %{serial_number}) from the server.\"%{p0}"); var all73 = all_match({ processors: [ @@ -5203,19 +4836,16 @@ var all74 = all_match({ var msg145 = msg("Commercial", all74); -var part178 = // "Pattern{Field(severity,false), Constant(',First Seen: '), Field(fld50,false), Constant(',Application name: '), Field(p0,false)}" -match("MESSAGE#71:Commercial:02/2_0", "nwparser.p0", "%{severity},First Seen: %{fld50},Application name: %{p0}"); +var part178 = match("MESSAGE#71:Commercial:02/2_0", "nwparser.p0", "%{severity},First Seen: %{fld50},Application name: %{p0}"); -var part179 = // "Pattern{Field(severity,false), Constant(',Application name: '), Field(p0,false)}" -match("MESSAGE#71:Commercial:02/2_1", "nwparser.p0", "%{severity},Application name: %{p0}"); +var part179 = match("MESSAGE#71:Commercial:02/2_1", "nwparser.p0", "%{severity},Application name: %{p0}"); var select27 = linear_select([ part178, part179, ]); -var part180 = // "Pattern{Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld6,false), Constant(',Detection score:'), Field(fld7,false), Constant(',COH Engine Version: '), Field(fld41,false), Constant(',Detection Submissions No,Permitted application reason: '), Field(fld42,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',Risk Level: '), Field(fld50,false), Constant(',Detection Source: '), Field(fld52,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(fld1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#71:Commercial:02/3", "nwparser.p0", "%{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},COH Engine Version: %{fld41},Detection Submissions No,Permitted application reason: %{fld42},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); +var part180 = match("MESSAGE#71:Commercial:02/3", "nwparser.p0", "%{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},COH Engine Version: %{fld41},Detection Submissions No,Permitted application reason: %{fld42},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); var all75 = all_match({ processors: [ @@ -5242,8 +4872,7 @@ var all75 = all_match({ var msg146 = msg("Commercial:02", all75); -var part181 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',"Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#72:Commercial:01/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},\"Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part181 = match("MESSAGE#72:Commercial:01/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},\"Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var all76 = all_match({ processors: [ @@ -5275,8 +4904,7 @@ var select28 = linear_select([ msg147, ]); -var part182 = // "Pattern{Constant('Computer has been deleted'), Field(,false)}" -match("MESSAGE#73:Computer:deleted", "nwparser.payload", "Computer has been deleted%{}", processor_chain([ +var part182 = match("MESSAGE#73:Computer:deleted", "nwparser.payload", "Computer has been deleted%{}", processor_chain([ dup156, dup12, dup13, @@ -5291,8 +4919,7 @@ match("MESSAGE#73:Computer:deleted", "nwparser.payload", "Computer has been dele var msg148 = msg("Computer:deleted", part182); -var part183 = // "Pattern{Constant('Computer has been moved'), Field(,false)}" -match("MESSAGE#74:Computer:moved", "nwparser.payload", "Computer has been moved%{}", processor_chain([ +var part183 = match("MESSAGE#74:Computer:moved", "nwparser.payload", "Computer has been moved%{}", processor_chain([ dup136, dup12, dup13, @@ -5307,8 +4934,7 @@ match("MESSAGE#74:Computer:moved", "nwparser.payload", "Computer has been moved% var msg149 = msg("Computer:moved", part183); -var part184 = // "Pattern{Constant('Computer properties have been changed'), Field(,false)}" -match("MESSAGE#75:Computer:propertieschanged", "nwparser.payload", "Computer properties have been changed%{}", processor_chain([ +var part184 = match("MESSAGE#75:Computer:propertieschanged", "nwparser.payload", "Computer properties have been changed%{}", processor_chain([ dup136, dup12, dup13, @@ -5323,19 +4949,16 @@ match("MESSAGE#75:Computer:propertieschanged", "nwparser.payload", "Computer pro var msg150 = msg("Computer:propertieschanged", part184); -var part185 = // "Pattern{Constant('"'), Field(filename,false), Constant('","'), Field(p0,false)}" -match("MESSAGE#76:Computer/1_0", "nwparser.p0", "\"%{filename}\",\"%{p0}"); +var part185 = match("MESSAGE#76:Computer/1_0", "nwparser.p0", "\"%{filename}\",\"%{p0}"); -var part186 = // "Pattern{Field(filename,false), Constant(',"'), Field(p0,false)}" -match("MESSAGE#76:Computer/1_1", "nwparser.p0", "%{filename},\"%{p0}"); +var part186 = match("MESSAGE#76:Computer/1_1", "nwparser.p0", "%{filename},\"%{p0}"); var select29 = linear_select([ part185, part186, ]); -var part187 = // "Pattern{Field(fld1,false), Constant('",Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Last update time: '), Field(fld52,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld58,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false)}" -match("MESSAGE#76:Computer/2", "nwparser.p0", "%{fld1}\",Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld52},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}"); +var part187 = match("MESSAGE#76:Computer/2", "nwparser.p0", "%{fld1}\",Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld52},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}"); var all77 = all_match({ processors: [ @@ -5355,19 +4978,16 @@ var all77 = all_match({ var msg151 = msg("Computer", all77); -var part188 = // "Pattern{Constant('"'), Field(filename,false), Constant('",''), Field(p0,false)}" -match("MESSAGE#77:Computer:01/1_0", "nwparser.p0", "\"%{filename}\",'%{p0}"); +var part188 = match("MESSAGE#77:Computer:01/1_0", "nwparser.p0", "\"%{filename}\",'%{p0}"); -var part189 = // "Pattern{Field(filename,false), Constant(',''), Field(p0,false)}" -match("MESSAGE#77:Computer:01/1_1", "nwparser.p0", "%{filename},'%{p0}"); +var part189 = match("MESSAGE#77:Computer:01/1_1", "nwparser.p0", "%{filename},'%{p0}"); var select30 = linear_select([ part188, part189, ]); -var part190 = // "Pattern{Field(fld1,false), Constant('',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Last update time: '), Field(fld52,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld58,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(event_type,false)}" -match("MESSAGE#77:Computer:01/2", "nwparser.p0", "%{fld1}',Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld52},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{event_type}"); +var part190 = match("MESSAGE#77:Computer:01/2", "nwparser.p0", "%{fld1}',Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld52},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{event_type}"); var all78 = all_match({ processors: [ @@ -5387,11 +5007,9 @@ var all78 = all_match({ var msg152 = msg("Computer:01", all78); -var part191 = // "Pattern{Constant('IP Address: '), Field(hostip,false), Constant(',Computer name: '), Field(shost,false), Constant(',Intensive Protection Level: '), Field(fld55,false), Constant(',Certificate issuer: '), Field(cert_subject,false), Constant(',Certificate signer: '), Field(fld68,false), Constant(',Certificate thumbprint: '), Field(fld57,false), Constant(',Signing timestamp: '), Field(fld69,false), Constant(',Certificate serial number: '), Field(cert.serial,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#78:Computer:03/0", "nwparser.payload", "IP Address: %{hostip},Computer name: %{shost},Intensive Protection Level: %{fld55},Certificate issuer: %{cert_subject},Certificate signer: %{fld68},Certificate thumbprint: %{fld57},Signing timestamp: %{fld69},Certificate serial number: %{cert.serial},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); +var part191 = match("MESSAGE#78:Computer:03/0", "nwparser.payload", "IP Address: %{hostip},Computer name: %{shost},Intensive Protection Level: %{fld55},Certificate issuer: %{cert_subject},Certificate signer: %{fld68},Certificate thumbprint: %{fld57},Signing timestamp: %{fld69},Certificate serial number: %{cert.serial},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); -var part192 = // "Pattern{Field(fld1,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Last update time: '), Field(fld52,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(','), Field(fld67,false), Constant(',First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld58,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(event_type,false), Constant(',Location:'), Field(fld65,false)}" -match("MESSAGE#78:Computer:03/2", "nwparser.p0", "%{fld1},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld52},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},%{fld67},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{event_type},Location:%{fld65}"); +var part192 = match("MESSAGE#78:Computer:03/2", "nwparser.p0", "%{fld1},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld52},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},%{fld67},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{event_type},Location:%{fld65}"); var all79 = all_match({ processors: [ @@ -5411,8 +5029,7 @@ var all79 = all_match({ var msg153 = msg("Computer:03", all79); -var part193 = // "Pattern{Constant('Computer name: '), Field(p0,false)}" -match("MESSAGE#79:Computer:02/0", "nwparser.payload", "Computer name: %{p0}"); +var part193 = match("MESSAGE#79:Computer:02/0", "nwparser.payload", "Computer name: %{p0}"); var all80 = all_match({ processors: [ @@ -5449,8 +5066,7 @@ var select31 = linear_select([ msg154, ]); -var part194 = // "Pattern{Constant('Configuration Change..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Time: '), Field(fld6,false), Constant('..Description: '), Field(event_description,true), Constant(' ..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#80:Configuration", "nwparser.payload", "Configuration Change..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Description: %{event_description->} ..Severity: %{severity}..Source: %{product}", processor_chain([ +var part194 = match("MESSAGE#80:Configuration", "nwparser.payload", "Configuration Change..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Description: %{event_description->} ..Severity: %{severity}..Source: %{product}", processor_chain([ dup165, dup166, dup15, @@ -5458,8 +5074,7 @@ match("MESSAGE#80:Configuration", "nwparser.payload", "Configuration Change..Com var msg155 = msg("Configuration", part194); -var part195 = // "Pattern{Constant('Configuration Change..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('........'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,true), Constant(' '), Field(fld7,false), Constant('..')}" -match("MESSAGE#81:Configuration:01", "nwparser.payload", "Configuration Change..%{shost}..%{fld5}........%{severity}..%{product}..%{fld6->} %{fld7}..", processor_chain([ +var part195 = match("MESSAGE#81:Configuration:01", "nwparser.payload", "Configuration Change..%{shost}..%{fld5}........%{severity}..%{product}..%{fld6->} %{fld7}..", processor_chain([ dup165, dup166, setc("event_description","Configuration Change"), @@ -5468,8 +5083,7 @@ match("MESSAGE#81:Configuration:01", "nwparser.payload", "Configuration Change.. var msg156 = msg("Configuration:01", part195); -var part196 = // "Pattern{Constant('Configuration Change..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Description: '), Field(event_description,false), Constant('..Time: '), Field(fld6,true), Constant(' '), Field(fld7,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#82:Configuration:02", "nwparser.payload", "Configuration Change..Computer: %{shost}..Date: %{fld5}..Description: %{event_description}..Time: %{fld6->} %{fld7}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part196 = match("MESSAGE#82:Configuration:02", "nwparser.payload", "Configuration Change..Computer: %{shost}..Date: %{fld5}..Description: %{event_description}..Time: %{fld6->} %{fld7}..Severity: %{severity}..Source: %{product}", processor_chain([ dup165, dup166, dup15, @@ -5483,14 +5097,11 @@ var select32 = linear_select([ msg157, ]); -var part197 = // "Pattern{Constant('Connected to Symantec Endpoint Protection Manager '), Field(p0,false)}" -match("MESSAGE#83:Connected/0", "nwparser.payload", "Connected to Symantec Endpoint Protection Manager %{p0}"); +var part197 = match("MESSAGE#83:Connected/0", "nwparser.payload", "Connected to Symantec Endpoint Protection Manager %{p0}"); -var part198 = // "Pattern{Field(fld11,true), Constant(' ,Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#83:Connected/1_0", "nwparser.p0", "%{fld11->} ,Event time: %{fld17->} %{fld18}"); +var part198 = match("MESSAGE#83:Connected/1_0", "nwparser.p0", "%{fld11->} ,Event time: %{fld17->} %{fld18}"); -var part199 = // "Pattern{Constant(''), Field(fld11,false)}" -match("MESSAGE#83:Connected/1_1", "nwparser.p0", "%{fld11}"); +var part199 = match("MESSAGE#83:Connected/1_1", "nwparser.p0", "%{fld11}"); var select33 = linear_select([ part198, @@ -5515,8 +5126,7 @@ var all81 = all_match({ var msg158 = msg("Connected", all81); -var part200 = // "Pattern{Constant('Connected to Management Server '), Field(hostip,false), Constant('.')}" -match("MESSAGE#686:Connected:01", "nwparser.payload", "Connected to Management Server %{hostip}.", processor_chain([ +var part200 = match("MESSAGE#686:Connected:01", "nwparser.payload", "Connected to Management Server %{hostip}.", processor_chain([ dup43, dup12, dup13, @@ -5532,8 +5142,7 @@ var select34 = linear_select([ msg159, ]); -var part201 = // "Pattern{Constant('Connection reset'), Field(,false)}" -match("MESSAGE#84:Connection", "nwparser.payload", "Connection reset%{}", processor_chain([ +var part201 = match("MESSAGE#84:Connection", "nwparser.payload", "Connection reset%{}", processor_chain([ dup43, dup12, dup13, @@ -5544,8 +5153,7 @@ match("MESSAGE#84:Connection", "nwparser.payload", "Connection reset%{}", proces var msg160 = msg("Connection", part201); -var part202 = // "Pattern{Constant('Could '), Field(space,false), Constant('not start Service Engine err='), Field(resultcode,false)}" -match("MESSAGE#85:Could", "nwparser.payload", "Could %{space}not start Service Engine err=%{resultcode}", processor_chain([ +var part202 = match("MESSAGE#85:Could", "nwparser.payload", "Could %{space}not start Service Engine err=%{resultcode}", processor_chain([ dup86, dup12, dup13, @@ -5556,8 +5164,7 @@ match("MESSAGE#85:Could", "nwparser.payload", "Could %{space}not start Service E var msg161 = msg("Could", part202); -var part203 = // "Pattern{Constant('Could not scan '), Field(dclass_counter1,true), Constant(' files inside '), Field(directory,true), Constant(' due to extraction errors encountered by the Decomposer Engines.')}" -match("MESSAGE#86:Could:01", "nwparser.payload", "Could not scan %{dclass_counter1->} files inside %{directory->} due to extraction errors encountered by the Decomposer Engines.", processor_chain([ +var part203 = match("MESSAGE#86:Could:01", "nwparser.payload", "Could not scan %{dclass_counter1->} files inside %{directory->} due to extraction errors encountered by the Decomposer Engines.", processor_chain([ dup86, dup12, dup13, @@ -5574,8 +5181,7 @@ var select35 = linear_select([ msg162, ]); -var part204 = // "Pattern{Constant('Create trident engine failed.'), Field(,false)}" -match("MESSAGE#87:Create", "nwparser.payload", "Create trident engine failed.%{}", processor_chain([ +var part204 = match("MESSAGE#87:Create", "nwparser.payload", "Create trident engine failed.%{}", processor_chain([ dup168, dup12, dup13, @@ -5586,8 +5192,7 @@ match("MESSAGE#87:Create", "nwparser.payload", "Create trident engine failed.%{} var msg163 = msg("Create", part204); -var part205 = // "Pattern{Constant('Database Maintenance Finished Successfully'), Field(,false)}" -match("MESSAGE#88:Database", "nwparser.payload", "Database Maintenance Finished Successfully%{}", processor_chain([ +var part205 = match("MESSAGE#88:Database", "nwparser.payload", "Database Maintenance Finished Successfully%{}", processor_chain([ dup43, dup12, dup13, @@ -5598,8 +5203,7 @@ match("MESSAGE#88:Database", "nwparser.payload", "Database Maintenance Finished var msg164 = msg("Database", part205); -var part206 = // "Pattern{Constant('Database maintenance started.'), Field(,false)}" -match("MESSAGE#89:Database:01", "nwparser.payload", "Database maintenance started.%{}", processor_chain([ +var part206 = match("MESSAGE#89:Database:01", "nwparser.payload", "Database maintenance started.%{}", processor_chain([ dup43, dup15, setc("event_description","Database maintenance started."), @@ -5607,8 +5211,7 @@ match("MESSAGE#89:Database:01", "nwparser.payload", "Database maintenance starte var msg165 = msg("Database:01", part206); -var part207 = // "Pattern{Constant('Database maintenance finished successfully.'), Field(,false)}" -match("MESSAGE#90:Database:02", "nwparser.payload", "Database maintenance finished successfully.%{}", processor_chain([ +var part207 = match("MESSAGE#90:Database:02", "nwparser.payload", "Database maintenance finished successfully.%{}", processor_chain([ dup43, dup15, setc("event_description","Database maintenance finished successfully."), @@ -5616,8 +5219,7 @@ match("MESSAGE#90:Database:02", "nwparser.payload", "Database maintenance finish var msg166 = msg("Database:02", part207); -var part208 = // "Pattern{Constant('Database properties are changed'), Field(,false)}" -match("MESSAGE#91:Database:03", "nwparser.payload", "Database properties are changed%{}", processor_chain([ +var part208 = match("MESSAGE#91:Database:03", "nwparser.payload", "Database properties are changed%{}", processor_chain([ dup43, dup15, setc("event_description","Database properties are changed"), @@ -5632,8 +5234,7 @@ var select36 = linear_select([ msg167, ]); -var part209 = // "Pattern{Constant('Disconnected from Symantec Endpoint Protection Manager. --- server address : '), Field(hostid,false)}" -match("MESSAGE#92:Disconnected", "nwparser.payload", "Disconnected from Symantec Endpoint Protection Manager. --- server address : %{hostid}", processor_chain([ +var part209 = match("MESSAGE#92:Disconnected", "nwparser.payload", "Disconnected from Symantec Endpoint Protection Manager. --- server address : %{hostid}", processor_chain([ dup43, dup12, dup13, @@ -5644,8 +5245,7 @@ match("MESSAGE#92:Disconnected", "nwparser.payload", "Disconnected from Symantec var msg168 = msg("Disconnected", part209); -var part210 = // "Pattern{Constant('Disconnected from Symantec Endpoint Protection Manager ('), Field(hostip,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#93:Disconnected:01/0", "nwparser.payload", "Disconnected from Symantec Endpoint Protection Manager (%{hostip})%{p0}"); +var part210 = match("MESSAGE#93:Disconnected:01/0", "nwparser.payload", "Disconnected from Symantec Endpoint Protection Manager (%{hostip})%{p0}"); var all82 = all_match({ processors: [ @@ -5667,8 +5267,7 @@ var all82 = all_match({ var msg169 = msg("Disconnected:01", all82); -var part211 = // "Pattern{Constant('Disconnected to Management Server '), Field(hostip,false), Constant('.')}" -match("MESSAGE#687:Disconnected:02", "nwparser.payload", "Disconnected to Management Server %{hostip}.", processor_chain([ +var part211 = match("MESSAGE#687:Disconnected:02", "nwparser.payload", "Disconnected to Management Server %{hostip}.", processor_chain([ dup43, dup12, dup13, @@ -5685,8 +5284,7 @@ var select37 = linear_select([ msg170, ]); -var part212 = // "Pattern{Field(event_description,false)}" -match_copy("MESSAGE#94:Decomposer", "nwparser.payload", "event_description", processor_chain([ +var part212 = match_copy("MESSAGE#94:Decomposer", "nwparser.payload", "event_description", processor_chain([ dup92, dup12, dup13, @@ -5696,8 +5294,7 @@ match_copy("MESSAGE#94:Decomposer", "nwparser.payload", "event_description", pro var msg171 = msg("Decomposer", part212); -var part213 = // "Pattern{Constant('Domain "'), Field(domain,false), Constant('" was added')}" -match("MESSAGE#95:Domain:added", "nwparser.payload", "Domain \"%{domain}\" was added", processor_chain([ +var part213 = match("MESSAGE#95:Domain:added", "nwparser.payload", "Domain \"%{domain}\" was added", processor_chain([ dup95, dup12, dup13, @@ -5712,8 +5309,7 @@ match("MESSAGE#95:Domain:added", "nwparser.payload", "Domain \"%{domain}\" was a var msg172 = msg("Domain:added", part213); -var part214 = // "Pattern{Constant('Domain "'), Field(change_old,false), Constant('" was renamed to "'), Field(change_new,false), Constant('"')}" -match("MESSAGE#96:Domain:renamed", "nwparser.payload", "Domain \"%{change_old}\" was renamed to \"%{change_new}\"", processor_chain([ +var part214 = match("MESSAGE#96:Domain:renamed", "nwparser.payload", "Domain \"%{change_old}\" was renamed to \"%{change_new}\"", processor_chain([ dup136, dup12, dup13, @@ -5729,8 +5325,7 @@ match("MESSAGE#96:Domain:renamed", "nwparser.payload", "Domain \"%{change_old}\" var msg173 = msg("Domain:renamed", part214); -var part215 = // "Pattern{Constant('Domain "'), Field(domain,false), Constant('" was deleted!')}" -match("MESSAGE#97:Domain:deleted", "nwparser.payload", "Domain \"%{domain}\" was deleted!", processor_chain([ +var part215 = match("MESSAGE#97:Domain:deleted", "nwparser.payload", "Domain \"%{domain}\" was deleted!", processor_chain([ dup156, dup12, dup13, @@ -5745,8 +5340,7 @@ match("MESSAGE#97:Domain:deleted", "nwparser.payload", "Domain \"%{domain}\" was var msg174 = msg("Domain:deleted", part215); -var part216 = // "Pattern{Constant('Domain administrator "'), Field(username,false), Constant('" was added')}" -match("MESSAGE#98:Domain:administratoradded", "nwparser.payload", "Domain administrator \"%{username}\" was added", processor_chain([ +var part216 = match("MESSAGE#98:Domain:administratoradded", "nwparser.payload", "Domain administrator \"%{username}\" was added", processor_chain([ dup170, dup12, dup13, @@ -5762,8 +5356,7 @@ match("MESSAGE#98:Domain:administratoradded", "nwparser.payload", "Domain admini var msg175 = msg("Domain:administratoradded", part216); -var part217 = // "Pattern{Constant('Domain administrator "'), Field(username,false), Constant('" was deleted')}" -match("MESSAGE#99:Domain:administratordeleted", "nwparser.payload", "Domain administrator \"%{username}\" was deleted", processor_chain([ +var part217 = match("MESSAGE#99:Domain:administratordeleted", "nwparser.payload", "Domain administrator \"%{username}\" was deleted", processor_chain([ dup171, dup12, dup13, @@ -5779,8 +5372,7 @@ match("MESSAGE#99:Domain:administratordeleted", "nwparser.payload", "Domain admi var msg176 = msg("Domain:administratordeleted", part217); -var part218 = // "Pattern{Constant('Domain "'), Field(domain,false), Constant('" was disabled')}" -match("MESSAGE#100:Domain:disabled", "nwparser.payload", "Domain \"%{domain}\" was disabled", processor_chain([ +var part218 = match("MESSAGE#100:Domain:disabled", "nwparser.payload", "Domain \"%{domain}\" was disabled", processor_chain([ dup136, dup12, dup13, @@ -5795,8 +5387,7 @@ match("MESSAGE#100:Domain:disabled", "nwparser.payload", "Domain \"%{domain}\" w var msg177 = msg("Domain:disabled", part218); -var part219 = // "Pattern{Constant('Domain "'), Field(domain,false), Constant('" was enabled')}" -match("MESSAGE#101:Domain:enabled", "nwparser.payload", "Domain \"%{domain}\" was enabled", processor_chain([ +var part219 = match("MESSAGE#101:Domain:enabled", "nwparser.payload", "Domain \"%{domain}\" was enabled", processor_chain([ dup136, dup12, dup13, @@ -5821,8 +5412,7 @@ var select38 = linear_select([ msg178, ]); -var part220 = // "Pattern{Constant('Failed to connect to the server. '), Field(action,false), Constant('. ErrorCode: '), Field(resultcode,false)}" -match("MESSAGE#102:Failed", "nwparser.payload", "Failed to connect to the server. %{action}. ErrorCode: %{resultcode}", processor_chain([ +var part220 = match("MESSAGE#102:Failed", "nwparser.payload", "Failed to connect to the server. %{action}. ErrorCode: %{resultcode}", processor_chain([ dup168, dup12, dup13, @@ -5833,14 +5423,11 @@ match("MESSAGE#102:Failed", "nwparser.payload", "Failed to connect to the server var msg179 = msg("Failed", part220); -var part221 = // "Pattern{Constant('Failed to contact server for more than '), Field(p0,false)}" -match("MESSAGE#103:Failed:01/0", "nwparser.payload", "Failed to contact server for more than %{p0}"); +var part221 = match("MESSAGE#103:Failed:01/0", "nwparser.payload", "Failed to contact server for more than %{p0}"); -var part222 = // "Pattern{Constant(''), Field(fld1,true), Constant(' times.,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#103:Failed:01/1_0", "nwparser.p0", "%{fld1->} times.,Event time:%{fld17->} %{fld18}"); +var part222 = match("MESSAGE#103:Failed:01/1_0", "nwparser.p0", "%{fld1->} times.,Event time:%{fld17->} %{fld18}"); -var part223 = // "Pattern{Field(fld1,true), Constant(' times.')}" -match("MESSAGE#103:Failed:01/1_1", "nwparser.p0", "%{fld1->} times."); +var part223 = match("MESSAGE#103:Failed:01/1_1", "nwparser.p0", "%{fld1->} times."); var select39 = linear_select([ part222, @@ -5865,8 +5452,7 @@ var all83 = all_match({ var msg180 = msg("Failed:01", all83); -var part224 = // "Pattern{Constant('Failed to disable Windows firewall'), Field(,false)}" -match("MESSAGE#104:Failed:02", "nwparser.payload", "Failed to disable Windows firewall%{}", processor_chain([ +var part224 = match("MESSAGE#104:Failed:02", "nwparser.payload", "Failed to disable Windows firewall%{}", processor_chain([ dup168, dup12, dup13, @@ -5877,8 +5463,7 @@ match("MESSAGE#104:Failed:02", "nwparser.payload", "Failed to disable Windows fi var msg181 = msg("Failed:02", part224); -var part225 = // "Pattern{Constant('Failed to install teefer driver'), Field(,false)}" -match("MESSAGE#105:Failed:03", "nwparser.payload", "Failed to install teefer driver%{}", processor_chain([ +var part225 = match("MESSAGE#105:Failed:03", "nwparser.payload", "Failed to install teefer driver%{}", processor_chain([ dup168, dup12, dup13, @@ -5889,8 +5474,7 @@ match("MESSAGE#105:Failed:03", "nwparser.payload", "Failed to install teefer dri var msg182 = msg("Failed:03", part225); -var part226 = // "Pattern{Constant('Failed to connect to '), Field(fld22,false), Constant('. Make sure the server can ping or resolve this domain. ErrorCode: '), Field(resultcode,false)}" -match("MESSAGE#106:Failed:04", "nwparser.payload", "Failed to connect to %{fld22}. Make sure the server can ping or resolve this domain. ErrorCode: %{resultcode}", processor_chain([ +var part226 = match("MESSAGE#106:Failed:04", "nwparser.payload", "Failed to connect to %{fld22}. Make sure the server can ping or resolve this domain. ErrorCode: %{resultcode}", processor_chain([ dup168, dup14, dup15, @@ -5899,8 +5483,7 @@ match("MESSAGE#106:Failed:04", "nwparser.payload", "Failed to connect to %{fld22 var msg183 = msg("Failed:04", part226); -var part227 = // "Pattern{Constant('Failed to download new client upgrade package from the management server. New Version: '), Field(version,true), Constant(' Package size: '), Field(filename_size,true), Constant(' bytes. Package url: '), Field(url,false)}" -match("MESSAGE#107:Failed:05", "nwparser.payload", "Failed to download new client upgrade package from the management server. New Version: %{version->} Package size: %{filename_size->} bytes. Package url: %{url}", processor_chain([ +var part227 = match("MESSAGE#107:Failed:05", "nwparser.payload", "Failed to download new client upgrade package from the management server. New Version: %{version->} Package size: %{filename_size->} bytes. Package url: %{url}", processor_chain([ dup168, dup12, dup13, @@ -5914,8 +5497,7 @@ match("MESSAGE#107:Failed:05", "nwparser.payload", "Failed to download new clien var msg184 = msg("Failed:05", part227); -var part228 = // "Pattern{Constant('Failed to import server policy.'), Field(,false)}" -match("MESSAGE#108:Failed:06", "nwparser.payload", "Failed to import server policy.%{}", processor_chain([ +var part228 = match("MESSAGE#108:Failed:06", "nwparser.payload", "Failed to import server policy.%{}", processor_chain([ dup168, dup12, dup13, @@ -5928,8 +5510,7 @@ match("MESSAGE#108:Failed:06", "nwparser.payload", "Failed to import server poli var msg185 = msg("Failed:06", part228); -var part229 = // "Pattern{Constant('Failed to load plugin:'), Field(filename,false)}" -match("MESSAGE#109:Failed:07", "nwparser.payload", "Failed to load plugin:%{filename}", processor_chain([ +var part229 = match("MESSAGE#109:Failed:07", "nwparser.payload", "Failed to load plugin:%{filename}", processor_chain([ dup168, dup12, dup13, @@ -5942,8 +5523,7 @@ match("MESSAGE#109:Failed:07", "nwparser.payload", "Failed to load plugin:%{file var msg186 = msg("Failed:07", part229); -var part230 = // "Pattern{Constant('Failed to clean up LiveUpdate downloaded content'), Field(,false)}" -match("MESSAGE#110:Failed:08", "nwparser.payload", "Failed to clean up LiveUpdate downloaded content%{}", processor_chain([ +var part230 = match("MESSAGE#110:Failed:08", "nwparser.payload", "Failed to clean up LiveUpdate downloaded content%{}", processor_chain([ dup168, dup12, dup13, @@ -5956,8 +5536,7 @@ match("MESSAGE#110:Failed:08", "nwparser.payload", "Failed to clean up LiveUpdat var msg187 = msg("Failed:08", part230); -var part231 = // "Pattern{Constant('Failed to Login to Remote Site ['), Field(node,false), Constant('] Failed to connect to the server. Make sure that the server is running and your session has not timed out. If you can reach the server but cannot log on, make sure that you provided the correct parameters. If you are experiencing network issues, contact your system administrator.')}" -match("MESSAGE#111:Failed:09", "nwparser.payload", "Failed to Login to Remote Site [%{node}] Failed to connect to the server. Make sure that the server is running and your session has not timed out. If you can reach the server but cannot log on, make sure that you provided the correct parameters. If you are experiencing network issues, contact your system administrator.", processor_chain([ +var part231 = match("MESSAGE#111:Failed:09", "nwparser.payload", "Failed to Login to Remote Site [%{node}] Failed to connect to the server. Make sure that the server is running and your session has not timed out. If you can reach the server but cannot log on, make sure that you provided the correct parameters. If you are experiencing network issues, contact your system administrator.", processor_chain([ dup174, dup12, dup13, @@ -5970,8 +5549,7 @@ match("MESSAGE#111:Failed:09", "nwparser.payload", "Failed to Login to Remote Si var msg188 = msg("Failed:09", part231); -var part232 = // "Pattern{Constant('Failed to Login to Remote Site ['), Field(node,false), Constant('] Replication partnership has been deleted from remote site.')}" -match("MESSAGE#112:Failed:10", "nwparser.payload", "Failed to Login to Remote Site [%{node}] Replication partnership has been deleted from remote site.", processor_chain([ +var part232 = match("MESSAGE#112:Failed:10", "nwparser.payload", "Failed to Login to Remote Site [%{node}] Replication partnership has been deleted from remote site.", processor_chain([ dup174, dup12, dup13, @@ -5984,8 +5562,7 @@ match("MESSAGE#112:Failed:10", "nwparser.payload", "Failed to Login to Remote Si var msg189 = msg("Failed:10", part232); -var part233 = // "Pattern{Constant('Failed to import new policy.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#113:Failed:11", "nwparser.payload", "Failed to import new policy.,Event time: %{event_time_string}", processor_chain([ +var part233 = match("MESSAGE#113:Failed:11", "nwparser.payload", "Failed to import new policy.,Event time: %{event_time_string}", processor_chain([ setc("eventcategory","1601000000"), dup12, dup13, @@ -5995,8 +5572,7 @@ match("MESSAGE#113:Failed:11", "nwparser.payload", "Failed to import new policy. var msg190 = msg("Failed:11", part233); -var part234 = // "Pattern{Constant('Failed to set a custom action for IPS signature '), Field(sigid,true), Constant(' (errcode=0x'), Field(resultcode,false), Constant('). Most probably, this IPS signature was removed from the IPS content.'), Field(p0,false)}" -match("MESSAGE#250:Network:24/0", "nwparser.payload", "Failed to set a custom action for IPS signature %{sigid->} (errcode=0x%{resultcode}). Most probably, this IPS signature was removed from the IPS content.%{p0}"); +var part234 = match("MESSAGE#250:Network:24/0", "nwparser.payload", "Failed to set a custom action for IPS signature %{sigid->} (errcode=0x%{resultcode}). Most probably, this IPS signature was removed from the IPS content.%{p0}"); var select40 = linear_select([ dup176, @@ -6020,8 +5596,7 @@ var all84 = all_match({ var msg191 = msg("Network:24", all84); -var part235 = // "Pattern{Constant('Failed to connect to all GUPs, now trying to connect SEPM"'), Field(,false)}" -match("MESSAGE#696:SYLINK:03", "nwparser.payload", "Failed to connect to all GUPs, now trying to connect SEPM\"%{}", processor_chain([ +var part235 = match("MESSAGE#696:SYLINK:03", "nwparser.payload", "Failed to connect to all GUPs, now trying to connect SEPM\"%{}", processor_chain([ dup74, dup12, dup13, @@ -6049,8 +5624,7 @@ var select41 = linear_select([ msg192, ]); -var part236 = // "Pattern{Constant('Firewall driver failed to '), Field(info,false)}" -match("MESSAGE#114:Firewall", "nwparser.payload", "Firewall driver failed to %{info}", processor_chain([ +var part236 = match("MESSAGE#114:Firewall", "nwparser.payload", "Firewall driver failed to %{info}", processor_chain([ dup168, dup12, dup13, @@ -6061,8 +5635,7 @@ match("MESSAGE#114:Firewall", "nwparser.payload", "Firewall driver failed to %{i var msg193 = msg("Firewall", part236); -var part237 = // "Pattern{Constant('Firewall is enabled,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#115:Firewall:01", "nwparser.payload", "Firewall is enabled,Event time: %{event_time_string}", processor_chain([ +var part237 = match("MESSAGE#115:Firewall:01", "nwparser.payload", "Firewall is enabled,Event time: %{event_time_string}", processor_chain([ dup168, dup12, dup13, @@ -6073,8 +5646,7 @@ match("MESSAGE#115:Firewall:01", "nwparser.payload", "Firewall is enabled,Event var msg194 = msg("Firewall:01", part237); -var part238 = // "Pattern{Constant('Firewall is disabled by policy,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#116:Firewall:02", "nwparser.payload", "Firewall is disabled by policy,Event time: %{event_time_string}", processor_chain([ +var part238 = match("MESSAGE#116:Firewall:02", "nwparser.payload", "Firewall is disabled by policy,Event time: %{event_time_string}", processor_chain([ dup53, dup12, dup13, @@ -6085,8 +5657,7 @@ match("MESSAGE#116:Firewall:02", "nwparser.payload", "Firewall is disabled by po var msg195 = msg("Firewall:02", part238); -var part239 = // "Pattern{Constant('Firewall is disabled,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#117:Firewall:03", "nwparser.payload", "Firewall is disabled,Event time: %{event_time_string}", processor_chain([ +var part239 = match("MESSAGE#117:Firewall:03", "nwparser.payload", "Firewall is disabled,Event time: %{event_time_string}", processor_chain([ dup53, dup12, dup13, @@ -6104,8 +5675,7 @@ var select42 = linear_select([ msg196, ]); -var part240 = // "Pattern{Constant('Group has been created'), Field(,false)}" -match("MESSAGE#118:Group:created", "nwparser.payload", "Group has been created%{}", processor_chain([ +var part240 = match("MESSAGE#118:Group:created", "nwparser.payload", "Group has been created%{}", processor_chain([ dup95, dup12, dup13, @@ -6121,8 +5691,7 @@ match("MESSAGE#118:Group:created", "nwparser.payload", "Group has been created%{ var msg197 = msg("Group:created", part240); -var part241 = // "Pattern{Constant('Group has been deleted'), Field(,false)}" -match("MESSAGE#119:Group:deleted", "nwparser.payload", "Group has been deleted%{}", processor_chain([ +var part241 = match("MESSAGE#119:Group:deleted", "nwparser.payload", "Group has been deleted%{}", processor_chain([ dup156, dup12, dup13, @@ -6138,8 +5707,7 @@ match("MESSAGE#119:Group:deleted", "nwparser.payload", "Group has been deleted%{ var msg198 = msg("Group:deleted", part241); -var part242 = // "Pattern{Constant('Group ''), Field(group,false), Constant('' was deleted')}" -match("MESSAGE#120:Group:deleted_01", "nwparser.payload", "Group '%{group}' was deleted", processor_chain([ +var part242 = match("MESSAGE#120:Group:deleted_01", "nwparser.payload", "Group '%{group}' was deleted", processor_chain([ dup156, dup12, dup13, @@ -6155,8 +5723,7 @@ match("MESSAGE#120:Group:deleted_01", "nwparser.payload", "Group '%{group}' was var msg199 = msg("Group:deleted_01", part242); -var part243 = // "Pattern{Constant('Group has been moved'), Field(,false)}" -match("MESSAGE#121:Group:moved", "nwparser.payload", "Group has been moved%{}", processor_chain([ +var part243 = match("MESSAGE#121:Group:moved", "nwparser.payload", "Group has been moved%{}", processor_chain([ dup136, dup12, dup13, @@ -6172,8 +5739,7 @@ match("MESSAGE#121:Group:moved", "nwparser.payload", "Group has been moved%{}", var msg200 = msg("Group:moved", part243); -var part244 = // "Pattern{Constant('Group has been renamed'), Field(,false)}" -match("MESSAGE#122:Group:renamed", "nwparser.payload", "Group has been renamed%{}", processor_chain([ +var part244 = match("MESSAGE#122:Group:renamed", "nwparser.payload", "Group has been renamed%{}", processor_chain([ dup136, dup12, dup13, @@ -6189,8 +5755,7 @@ match("MESSAGE#122:Group:renamed", "nwparser.payload", "Group has been renamed%{ var msg201 = msg("Group:renamed", part244); -var part245 = // "Pattern{Constant('Group ''), Field(group,false), Constant('' was added')}" -match("MESSAGE#123:Group:added", "nwparser.payload", "Group '%{group}' was added", processor_chain([ +var part245 = match("MESSAGE#123:Group:added", "nwparser.payload", "Group '%{group}' was added", processor_chain([ dup95, dup12, dup13, @@ -6215,8 +5780,7 @@ var select43 = linear_select([ msg202, ]); -var part246 = // "Pattern{Constant('Host Integrity check is disabled. '), Field(info,true), Constant(' by the '), Field(username,false)}" -match("MESSAGE#124:Host", "nwparser.payload", "Host Integrity check is disabled. %{info->} by the %{username}", processor_chain([ +var part246 = match("MESSAGE#124:Host", "nwparser.payload", "Host Integrity check is disabled. %{info->} by the %{username}", processor_chain([ dup179, dup12, dup13, @@ -6230,8 +5794,7 @@ match("MESSAGE#124:Host", "nwparser.payload", "Host Integrity check is disabled. var msg203 = msg("Host", part246); -var part247 = // "Pattern{Field(info,true), Constant(' up-to-date')}" -match("MESSAGE#125:Host:01", "nwparser.payload", "%{info->} up-to-date", processor_chain([ +var part247 = match("MESSAGE#125:Host:01", "nwparser.payload", "%{info->} up-to-date", processor_chain([ dup92, dup12, dup13, @@ -6242,8 +5805,7 @@ match("MESSAGE#125:Host:01", "nwparser.payload", "%{info->} up-to-date", process var msg204 = msg("Host:01", part247); -var part248 = // "Pattern{Constant('Host Integrity check failed Requirement: "'), Field(fld11,false), Constant('" passed Requirement: "'), Field(fld12,false), Constant('" failed Requirement: "'), Field(fld13,false), Constant('" passed Requirement: "'), Field(fld14,false), Constant('" passed '), Field(fld44,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#126:Host:02", "nwparser.payload", "Host Integrity check failed Requirement: \"%{fld11}\" passed Requirement: \"%{fld12}\" failed Requirement: \"%{fld13}\" passed Requirement: \"%{fld14}\" passed %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain}", processor_chain([ +var part248 = match("MESSAGE#126:Host:02", "nwparser.payload", "Host Integrity check failed Requirement: \"%{fld11}\" passed Requirement: \"%{fld12}\" failed Requirement: \"%{fld13}\" passed Requirement: \"%{fld14}\" passed %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain}", processor_chain([ dup179, dup12, dup13, @@ -6255,8 +5817,7 @@ match("MESSAGE#126:Host:02", "nwparser.payload", "Host Integrity check failed Re var msg205 = msg("Host:02", part248); -var part249 = // "Pattern{Constant('Host Integrity failed but reported as pass Requirement: "'), Field(fld11,false), Constant('" passed Requirement: "'), Field(fld12,false), Constant('" passed Requirement: "'), Field(fld13,false), Constant('" passed Requirement: "'), Field(fld14,false), Constant('" failed '), Field(fld44,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#127:Host:05", "nwparser.payload", "Host Integrity failed but reported as pass Requirement: \"%{fld11}\" passed Requirement: \"%{fld12}\" passed Requirement: \"%{fld13}\" passed Requirement: \"%{fld14}\" failed %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part249 = match("MESSAGE#127:Host:05", "nwparser.payload", "Host Integrity failed but reported as pass Requirement: \"%{fld11}\" passed Requirement: \"%{fld12}\" passed Requirement: \"%{fld13}\" passed Requirement: \"%{fld14}\" failed %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup179, dup12, dup13, @@ -6268,8 +5829,7 @@ match("MESSAGE#127:Host:05", "nwparser.payload", "Host Integrity failed but repo var msg206 = msg("Host:05", part249); -var part250 = // "Pattern{Constant('Host Integrity failed but reported as pass Requirement: "'), Field(fld11,false), Constant('" '), Field(fld18,true), Constant(' Requirement: "'), Field(fld12,false), Constant('" '), Field(fld17,true), Constant(' Requirement: "'), Field(fld13,false), Constant('" '), Field(fld16,true), Constant(' Requirement: "'), Field(fld14,false), Constant('" '), Field(fld15,true), Constant(' '), Field(fld44,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#128:Host:06", "nwparser.payload", "Host Integrity failed but reported as pass Requirement: \"%{fld11}\" %{fld18->} Requirement: \"%{fld12}\" %{fld17->} Requirement: \"%{fld13}\" %{fld16->} Requirement: \"%{fld14}\" %{fld15->} %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part250 = match("MESSAGE#128:Host:06", "nwparser.payload", "Host Integrity failed but reported as pass Requirement: \"%{fld11}\" %{fld18->} Requirement: \"%{fld12}\" %{fld17->} Requirement: \"%{fld13}\" %{fld16->} Requirement: \"%{fld14}\" %{fld15->} %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup179, dup12, dup13, @@ -6281,8 +5841,7 @@ match("MESSAGE#128:Host:06", "nwparser.payload", "Host Integrity failed but repo var msg207 = msg("Host:06", part250); -var part251 = // "Pattern{Constant('Host Integrity check failed '), Field(result,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#129:Host:04", "nwparser.payload", "Host Integrity check failed %{result},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part251 = match("MESSAGE#129:Host:04", "nwparser.payload", "Host Integrity check failed %{result},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup179, dup12, dup13, @@ -6294,8 +5853,7 @@ match("MESSAGE#129:Host:04", "nwparser.payload", "Host Integrity check failed %{ var msg208 = msg("Host:04", part251); -var part252 = // "Pattern{Constant('Host Integrity check passed Requirement: "'), Field(fld11,false), Constant('" passed Requirement: "'), Field(fld12,false), Constant('" passed Requirement: "'), Field(fld13,false), Constant('" passed Requirement: "'), Field(fld14,false), Constant('" passed '), Field(fld44,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#130:Host:03", "nwparser.payload", "Host Integrity check passed Requirement: \"%{fld11}\" passed Requirement: \"%{fld12}\" passed Requirement: \"%{fld13}\" passed Requirement: \"%{fld14}\" passed %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part252 = match("MESSAGE#130:Host:03", "nwparser.payload", "Host Integrity check passed Requirement: \"%{fld11}\" passed Requirement: \"%{fld12}\" passed Requirement: \"%{fld13}\" passed Requirement: \"%{fld14}\" passed %{fld44},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup179, dup12, dup13, @@ -6307,8 +5865,7 @@ match("MESSAGE#130:Host:03", "nwparser.payload", "Host Integrity check passed Re var msg209 = msg("Host:03", part252); -var part253 = // "Pattern{Constant('Host Integrity check passed'), Field(space,false), Constant('Requirement: ''), Field(fld11,false), Constant('' passed '), Field(fld12,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#132:Host:07", "nwparser.payload", "Host Integrity check passed%{space}Requirement: '%{fld11}' passed %{fld12},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part253 = match("MESSAGE#132:Host:07", "nwparser.payload", "Host Integrity check passed%{space}Requirement: '%{fld11}' passed %{fld12},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup179, dup87, dup12, @@ -6321,19 +5878,16 @@ match("MESSAGE#132:Host:07", "nwparser.payload", "Host Integrity check passed%{s var msg210 = msg("Host:07", part253); -var part254 = // "Pattern{Field(shost,false), Constant(', Host Integrity check passed '), Field(p0,false)}" -match("MESSAGE#133:Host:08/0_0", "nwparser.payload", "%{shost}, Host Integrity check passed %{p0}"); +var part254 = match("MESSAGE#133:Host:08/0_0", "nwparser.payload", "%{shost}, Host Integrity check passed %{p0}"); -var part255 = // "Pattern{Constant('Host Integrity check passed'), Field(p0,false)}" -match("MESSAGE#133:Host:08/0_1", "nwparser.payload", "Host Integrity check passed%{p0}"); +var part255 = match("MESSAGE#133:Host:08/0_1", "nwparser.payload", "Host Integrity check passed%{p0}"); var select44 = linear_select([ part254, part255, ]); -var part256 = // "Pattern{Field(,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#133:Host:08/1", "nwparser.p0", "%{},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:%{fld25}"); +var part256 = match("MESSAGE#133:Host:08/1", "nwparser.p0", "%{},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:%{fld25}"); var all85 = all_match({ processors: [ @@ -6355,16 +5909,14 @@ var all85 = all_match({ var msg211 = msg("Host:08", all85); -var part257 = // "Pattern{Field(shost,false), Constant(', Host Integrity check pass.'), Field(info,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(','), Field(p0,false)}" -match("MESSAGE#134:Host:09/0", "nwparser.payload", "%{shost}, Host Integrity check pass.%{info},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},%{p0}"); +var part257 = match("MESSAGE#134:Host:09/0", "nwparser.payload", "%{shost}, Host Integrity check pass.%{info},Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},%{p0}"); var select45 = linear_select([ dup67, dup182, ]); -var part258 = // "Pattern{Field(,true), Constant(' '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#134:Host:09/2", "nwparser.p0", "%{} %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:%{fld25}"); +var part258 = match("MESSAGE#134:Host:09/2", "nwparser.p0", "%{} %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:%{fld25}"); var all86 = all_match({ processors: [ @@ -6385,8 +5937,7 @@ var all86 = all_match({ var msg212 = msg("Host:09", all86); -var part259 = // "Pattern{Constant('Host Integrity check is disabled. Only do Host Integrity checking when connected to the Symantec Endpoint Protection Manager is checked.,Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#702:Smc:06", "nwparser.payload", "Host Integrity check is disabled. Only do Host Integrity checking when connected to the Symantec Endpoint Protection Manager is checked.,Event time: %{fld17->} %{fld18}", processor_chain([ +var part259 = match("MESSAGE#702:Smc:06", "nwparser.payload", "Host Integrity check is disabled. Only do Host Integrity checking when connected to the Symantec Endpoint Protection Manager is checked.,Event time: %{fld17->} %{fld18}", processor_chain([ dup53, dup12, dup13, @@ -6412,8 +5963,7 @@ var select46 = linear_select([ msg213, ]); -var part260 = // "Pattern{Field(fld31,true), Constant(' ??????????????? ??: "'), Field(fld11,false), Constant('"?? ??: "'), Field(fld12,false), Constant('"?? ??: "'), Field(fld13,false), Constant('"?? ??: "'), Field(fld14,false), Constant('"??,??????????? ,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#131:??:", "nwparser.payload", "%{fld31->} ??????????????? ??: \"%{fld11}\"?? ??: \"%{fld12}\"?? ??: \"%{fld13}\"?? ??: \"%{fld14}\"??,??????????? ,Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ +var part260 = match("MESSAGE#131:??:", "nwparser.payload", "%{fld31->} ??????????????? ??: \"%{fld11}\"?? ??: \"%{fld12}\"?? ??: \"%{fld13}\"?? ??: \"%{fld14}\"??,??????????? ,Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld25}", processor_chain([ dup179, dup12, dup13, @@ -6423,19 +5973,16 @@ match("MESSAGE#131:??:", "nwparser.payload", "%{fld31->} ??????????????? ??: \"% var msg214 = msg("??:", part260); -var part261 = // "Pattern{Field(info,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#135:Intrusion/0", "nwparser.payload", "%{info->} %{p0}"); +var part261 = match("MESSAGE#135:Intrusion/0", "nwparser.payload", "%{info->} %{p0}"); -var part262 = // "Pattern{Constant('was '), Field(p0,false)}" -match("MESSAGE#135:Intrusion/1_1", "nwparser.p0", "was %{p0}"); +var part262 = match("MESSAGE#135:Intrusion/1_1", "nwparser.p0", "was %{p0}"); var select47 = linear_select([ dup183, part262, ]); -var part263 = // "Pattern{Constant(''), Field(action,false)}" -match("MESSAGE#135:Intrusion/2", "nwparser.p0", "%{action}"); +var part263 = match("MESSAGE#135:Intrusion/2", "nwparser.p0", "%{action}"); var all87 = all_match({ processors: [ @@ -6455,8 +6002,7 @@ var all87 = all_match({ var msg215 = msg("Intrusion", all87); -var part264 = // "Pattern{Field(info,true), Constant(' failed to update')}" -match("MESSAGE#136:Intrusion:01", "nwparser.payload", "%{info->} failed to update", processor_chain([ +var part264 = match("MESSAGE#136:Intrusion:01", "nwparser.payload", "%{info->} failed to update", processor_chain([ dup92, dup12, dup13, @@ -6472,8 +6018,7 @@ var select48 = linear_select([ msg216, ]); -var part265 = // "Pattern{Constant('Invalid log record:'), Field(info,false)}" -match("MESSAGE#137:Invalid", "nwparser.payload", "Invalid log record:%{info}", processor_chain([ +var part265 = match("MESSAGE#137:Invalid", "nwparser.payload", "Invalid log record:%{info}", processor_chain([ dup168, dup12, dup13, @@ -6484,8 +6029,7 @@ match("MESSAGE#137:Invalid", "nwparser.payload", "Invalid log record:%{info}", p var msg217 = msg("Invalid", part265); -var part266 = // "Pattern{Constant('Limited Administrator administrator "'), Field(change_old,false), Constant('" was renamed to "'), Field(change_new,false), Constant('"')}" -match("MESSAGE#138:Limited", "nwparser.payload", "Limited Administrator administrator \"%{change_old}\" was renamed to \"%{change_new}\"", processor_chain([ +var part266 = match("MESSAGE#138:Limited", "nwparser.payload", "Limited Administrator administrator \"%{change_old}\" was renamed to \"%{change_new}\"", processor_chain([ setc("eventcategory","1402020300"), dup12, dup13, @@ -6500,8 +6044,7 @@ match("MESSAGE#138:Limited", "nwparser.payload", "Limited Administrator administ var msg218 = msg("Limited", part266); -var part267 = // "Pattern{Constant('LiveUpdate will start next on '), Field(info,true), Constant(' on '), Field(product,false)}" -match("MESSAGE#139:LiveUpdate:08", "nwparser.payload", "LiveUpdate will start next on %{info->} on %{product}", processor_chain([ +var part267 = match("MESSAGE#139:LiveUpdate:08", "nwparser.payload", "LiveUpdate will start next on %{info->} on %{product}", processor_chain([ dup43, dup15, dup184, @@ -6509,8 +6052,7 @@ match("MESSAGE#139:LiveUpdate:08", "nwparser.payload", "LiveUpdate will start ne var msg219 = msg("LiveUpdate:08", part267); -var part268 = // "Pattern{Constant('LiveUpdate '), Field(info,true), Constant(' on '), Field(product,false), Constant('"')}" -match("MESSAGE#140:LiveUpdate:01", "nwparser.payload", "LiveUpdate %{info->} on %{product}\"", processor_chain([ +var part268 = match("MESSAGE#140:LiveUpdate:01", "nwparser.payload", "LiveUpdate %{info->} on %{product}\"", processor_chain([ dup43, dup12, dup13, @@ -6521,8 +6063,7 @@ match("MESSAGE#140:LiveUpdate:01", "nwparser.payload", "LiveUpdate %{info->} on var msg220 = msg("LiveUpdate:01", part268); -var part269 = // "Pattern{Constant('LiveUpdate failed.'), Field(,false)}" -match("MESSAGE#141:LiveUpdate", "nwparser.payload", "LiveUpdate failed.%{}", processor_chain([ +var part269 = match("MESSAGE#141:LiveUpdate", "nwparser.payload", "LiveUpdate failed.%{}", processor_chain([ dup168, dup12, dup13, @@ -6533,8 +6074,7 @@ match("MESSAGE#141:LiveUpdate", "nwparser.payload", "LiveUpdate failed.%{}", pro var msg221 = msg("LiveUpdate", part269); -var part270 = // "Pattern{Constant('LiveUpdate encountered one or more errors. Return code = '), Field(resultcode,false)}" -match("MESSAGE#142:LiveUpdate:04", "nwparser.payload", "LiveUpdate encountered one or more errors. Return code = %{resultcode}", processor_chain([ +var part270 = match("MESSAGE#142:LiveUpdate:04", "nwparser.payload", "LiveUpdate encountered one or more errors. Return code = %{resultcode}", processor_chain([ dup168, dup15, setc("event_description","LiveUpdate encountered one or more errors"), @@ -6542,8 +6082,7 @@ match("MESSAGE#142:LiveUpdate:04", "nwparser.payload", "LiveUpdate encountered o var msg222 = msg("LiveUpdate:04", part270); -var part271 = // "Pattern{Constant('LiveUpdate succeeded'), Field(,false)}" -match("MESSAGE#143:LiveUpdate:02", "nwparser.payload", "LiveUpdate succeeded%{}", processor_chain([ +var part271 = match("MESSAGE#143:LiveUpdate:02", "nwparser.payload", "LiveUpdate succeeded%{}", processor_chain([ dup43, dup12, dup13, @@ -6554,8 +6093,7 @@ match("MESSAGE#143:LiveUpdate:02", "nwparser.payload", "LiveUpdate succeeded%{}" var msg223 = msg("LiveUpdate:02", part271); -var part272 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,[LiveUpdate error submission] Submitting information to Symantec failed.')}" -match("MESSAGE#144:LiveUpdate:09", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,[LiveUpdate error submission] Submitting information to Symantec failed.", processor_chain([ +var part272 = match("MESSAGE#144:LiveUpdate:09", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,[LiveUpdate error submission] Submitting information to Symantec failed.", processor_chain([ dup43, dup12, dup13, @@ -6566,8 +6104,7 @@ match("MESSAGE#144:LiveUpdate:09", "nwparser.payload", "Category: %{fld22},LiveU var msg224 = msg("LiveUpdate:09", part272); -var part273 = // "Pattern{Constant('LiveUpdate encountered an error: Failed to connect to the LiveUpdate server ('), Field(resultcode,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#145:LiveUpdate:10/0", "nwparser.payload", "LiveUpdate encountered an error: Failed to connect to the LiveUpdate server (%{resultcode})%{p0}"); +var part273 = match("MESSAGE#145:LiveUpdate:10/0", "nwparser.payload", "LiveUpdate encountered an error: Failed to connect to the LiveUpdate server (%{resultcode})%{p0}"); var select49 = linear_select([ dup186, @@ -6592,8 +6129,7 @@ var all88 = all_match({ var msg225 = msg("LiveUpdate:10", all88); -var part274 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,"An update for '), Field(application,true), Constant(' failed to install. Error: '), Field(resultcode,false), Constant(', DuResult:'), Field(fld23,false), Constant('."'), Field(p0,false)}" -match("MESSAGE#146:LiveUpdate:11/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,\"An update for %{application->} failed to install. Error: %{resultcode}, DuResult:%{fld23}.\"%{p0}"); +var part274 = match("MESSAGE#146:LiveUpdate:11/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,\"An update for %{application->} failed to install. Error: %{resultcode}, DuResult:%{fld23}.\"%{p0}"); var all89 = all_match({ processors: [ @@ -6613,8 +6149,7 @@ var all89 = all_match({ var msg226 = msg("LiveUpdate:11", all89); -var part275 = // "Pattern{Constant('LiveUpdate re-run triggered by the download of content catalog.'), Field(,false)}" -match("MESSAGE#147:LiveUpdate:12", "nwparser.payload", "LiveUpdate re-run triggered by the download of content catalog.%{}", processor_chain([ +var part275 = match("MESSAGE#147:LiveUpdate:12", "nwparser.payload", "LiveUpdate re-run triggered by the download of content catalog.%{}", processor_chain([ dup43, dup12, dup13, @@ -6625,8 +6160,7 @@ match("MESSAGE#147:LiveUpdate:12", "nwparser.payload", "LiveUpdate re-run trigge var msg227 = msg("LiveUpdate:12", part275); -var part276 = // "Pattern{Constant('LiveUpdate cannot be run because all licenses have expired.'), Field(,false)}" -match("MESSAGE#148:LiveUpdate:13", "nwparser.payload", "LiveUpdate cannot be run because all licenses have expired.%{}", processor_chain([ +var part276 = match("MESSAGE#148:LiveUpdate:13", "nwparser.payload", "LiveUpdate cannot be run because all licenses have expired.%{}", processor_chain([ dup43, dup14, dup15, @@ -6635,8 +6169,7 @@ match("MESSAGE#148:LiveUpdate:13", "nwparser.payload", "LiveUpdate cannot be run var msg228 = msg("LiveUpdate:13", part276); -var part277 = // "Pattern{Constant('LiveUpdate started.'), Field(,false)}" -match("MESSAGE#149:LiveUpdate::05", "nwparser.payload", "LiveUpdate started.%{}", processor_chain([ +var part277 = match("MESSAGE#149:LiveUpdate::05", "nwparser.payload", "LiveUpdate started.%{}", processor_chain([ dup43, dup15, setc("action","LiveUpdate started."), @@ -6644,8 +6177,7 @@ match("MESSAGE#149:LiveUpdate::05", "nwparser.payload", "LiveUpdate started.%{}" var msg229 = msg("LiveUpdate::05", part277); -var part278 = // "Pattern{Constant('LiveUpdate retry started.'), Field(,false)}" -match("MESSAGE#150:LiveUpdate::06", "nwparser.payload", "LiveUpdate retry started.%{}", processor_chain([ +var part278 = match("MESSAGE#150:LiveUpdate::06", "nwparser.payload", "LiveUpdate retry started.%{}", processor_chain([ dup43, dup15, setc("action","LiveUpdate retry started."), @@ -6653,8 +6185,7 @@ match("MESSAGE#150:LiveUpdate::06", "nwparser.payload", "LiveUpdate retry starte var msg230 = msg("LiveUpdate::06", part278); -var part279 = // "Pattern{Constant('LiveUpdate retry succeeded.'), Field(,false)}" -match("MESSAGE#151:LiveUpdate::07", "nwparser.payload", "LiveUpdate retry succeeded.%{}", processor_chain([ +var part279 = match("MESSAGE#151:LiveUpdate::07", "nwparser.payload", "LiveUpdate retry succeeded.%{}", processor_chain([ dup43, dup15, setc("action","LiveUpdate retry succeeded."), @@ -6662,8 +6193,7 @@ match("MESSAGE#151:LiveUpdate::07", "nwparser.payload", "LiveUpdate retry succee var msg231 = msg("LiveUpdate::07", part279); -var part280 = // "Pattern{Constant('LiveUpdate retry failed. Will try again.'), Field(,false)}" -match("MESSAGE#152:LiveUpdate::08", "nwparser.payload", "LiveUpdate retry failed. Will try again.%{}", processor_chain([ +var part280 = match("MESSAGE#152:LiveUpdate::08", "nwparser.payload", "LiveUpdate retry failed. Will try again.%{}", processor_chain([ dup43, dup12, dup13, @@ -6673,8 +6203,7 @@ match("MESSAGE#152:LiveUpdate::08", "nwparser.payload", "LiveUpdate retry failed var msg232 = msg("LiveUpdate::08", part280); -var part281 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Centralized Reputation Settings from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#153:LiveUpdate:14", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Centralized Reputation Settings from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part281 = match("MESSAGE#153:LiveUpdate:14", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Centralized Reputation Settings from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup12, dup13, @@ -6685,8 +6214,7 @@ match("MESSAGE#153:LiveUpdate:14", "nwparser.payload", "Category: %{fld11},LiveU var msg233 = msg("LiveUpdate:14", part281); -var part282 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Intrusion Prevention Signatures (hub) from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#154:LiveUpdate:15", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Intrusion Prevention Signatures (hub) from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part282 = match("MESSAGE#154:LiveUpdate:15", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Intrusion Prevention Signatures (hub) from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup12, dup13, @@ -6700,8 +6228,7 @@ match("MESSAGE#154:LiveUpdate:15", "nwparser.payload", "Category: %{fld11},LiveU var msg234 = msg("LiveUpdate:15", part282); -var part283 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Intrusion Prevention Signatures from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#155:LiveUpdate:16", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Intrusion Prevention Signatures from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part283 = match("MESSAGE#155:LiveUpdate:16", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Intrusion Prevention Signatures from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup12, dup13, @@ -6715,8 +6242,7 @@ match("MESSAGE#155:LiveUpdate:16", "nwparser.payload", "Category: %{fld11},LiveU var msg235 = msg("LiveUpdate:16", part283); -var part284 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Revocation Data from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#156:LiveUpdate:17", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Revocation Data from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part284 = match("MESSAGE#156:LiveUpdate:17", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Revocation Data from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup12, dup13, @@ -6727,8 +6253,7 @@ match("MESSAGE#156:LiveUpdate:17", "nwparser.payload", "Category: %{fld11},LiveU var msg236 = msg("LiveUpdate:17", part284); -var part285 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for SONAR Definitions from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#157:LiveUpdate:18/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for SONAR Definitions from LiveUpdate failed to install. Error:%{result}(%{resultcode})%{p0}"); +var part285 = match("MESSAGE#157:LiveUpdate:18/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for SONAR Definitions from LiveUpdate failed to install. Error:%{result}(%{resultcode})%{p0}"); var all90 = all_match({ processors: [ @@ -6748,8 +6273,7 @@ var all90 = all_match({ var msg237 = msg("LiveUpdate:18", all90); -var part286 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Symantec Whitelist from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#158:LiveUpdate:19/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Symantec Whitelist from LiveUpdate failed to install. Error:%{result}(%{resultcode})%{p0}"); +var part286 = match("MESSAGE#158:LiveUpdate:19/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Symantec Whitelist from LiveUpdate failed to install. Error:%{result}(%{resultcode})%{p0}"); var all91 = all_match({ processors: [ @@ -6769,8 +6293,7 @@ var all91 = all_match({ var msg238 = msg("LiveUpdate:19", all91); -var part287 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Virus and Spyware Definitions Win32 (hub) from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#159:LiveUpdate:20", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win32 (hub) from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part287 = match("MESSAGE#159:LiveUpdate:20", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win32 (hub) from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup12, dup13, @@ -6784,8 +6307,7 @@ match("MESSAGE#159:LiveUpdate:20", "nwparser.payload", "Category: %{fld11},LiveU var msg239 = msg("LiveUpdate:20", part287); -var part288 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Virus and Spyware Definitions Win32 from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#160:LiveUpdate:21", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win32 from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part288 = match("MESSAGE#160:LiveUpdate:21", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win32 from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup12, dup13, @@ -6799,8 +6321,7 @@ match("MESSAGE#160:LiveUpdate:21", "nwparser.payload", "Category: %{fld11},LiveU var msg240 = msg("LiveUpdate:21", part288); -var part289 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Virus and Spyware Definitions Win64 (hub) from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#161:LiveUpdate:22", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win64 (hub) from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part289 = match("MESSAGE#161:LiveUpdate:22", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win64 (hub) from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup12, dup13, @@ -6814,8 +6335,7 @@ match("MESSAGE#161:LiveUpdate:22", "nwparser.payload", "Category: %{fld11},LiveU var msg241 = msg("LiveUpdate:22", part289); -var part290 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,An update for Virus and Spyware Definitions Win64 from LiveUpdate failed to install. Error:'), Field(result,false), Constant('('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#162:LiveUpdate:23", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win64 from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ +var part290 = match("MESSAGE#162:LiveUpdate:23", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,An update for Virus and Spyware Definitions Win64 from LiveUpdate failed to install. Error:%{result}(%{resultcode})", processor_chain([ dup43, dup94, dup13, @@ -6829,8 +6349,7 @@ match("MESSAGE#162:LiveUpdate:23", "nwparser.payload", "Category: %{fld11},LiveU var msg242 = msg("LiveUpdate:23", part290); -var part291 = // "Pattern{Constant('LiveUpdate encountered an error: '), Field(result,true), Constant(' ('), Field(resultcode,false), Constant(').'), Field(p0,false)}" -match("MESSAGE#163:LiveUpdate:24/0", "nwparser.payload", "LiveUpdate encountered an error: %{result->} (%{resultcode}).%{p0}"); +var part291 = match("MESSAGE#163:LiveUpdate:24/0", "nwparser.payload", "LiveUpdate encountered an error: %{result->} (%{resultcode}).%{p0}"); var all92 = all_match({ processors: [ @@ -6852,8 +6371,7 @@ var all92 = all_match({ var msg243 = msg("LiveUpdate:24", all92); -var part292 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,The latest Revocation Data update failed to load. The component has no valid content and will not function correctly until it is updated.')}" -match("MESSAGE#164:LiveUpdate:25", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Revocation Data update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ +var part292 = match("MESSAGE#164:LiveUpdate:25", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Revocation Data update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ dup43, dup12, dup13, @@ -6864,8 +6382,7 @@ match("MESSAGE#164:LiveUpdate:25", "nwparser.payload", "Category: %{fld11},LiveU var msg244 = msg("LiveUpdate:25", part292); -var part293 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,The latest Symantec Whitelist update failed to load. The component has no valid content and will not function correctly until it is updated.')}" -match("MESSAGE#165:LiveUpdate:26", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Symantec Whitelist update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ +var part293 = match("MESSAGE#165:LiveUpdate:26", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Symantec Whitelist update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ dup43, dup12, dup13, @@ -6876,8 +6393,7 @@ match("MESSAGE#165:LiveUpdate:26", "nwparser.payload", "Category: %{fld11},LiveU var msg245 = msg("LiveUpdate:26", part293); -var part294 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,A LiveUpdate session encountered errors. '), Field(fld1,true), Constant(' update(s) were available. '), Field(fld2,true), Constant(' update(s) installed successfully. '), Field(fld3,true), Constant(' update(s) failed to install.'), Field(p0,false)}" -match("MESSAGE#166:LiveUpdate:27/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,A LiveUpdate session encountered errors. %{fld1->} update(s) were available. %{fld2->} update(s) installed successfully. %{fld3->} update(s) failed to install.%{p0}"); +var part294 = match("MESSAGE#166:LiveUpdate:27/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,A LiveUpdate session encountered errors. %{fld1->} update(s) were available. %{fld2->} update(s) installed successfully. %{fld3->} update(s) failed to install.%{p0}"); var all93 = all_match({ processors: [ @@ -6897,8 +6413,7 @@ var all93 = all_match({ var msg246 = msg("LiveUpdate:27", all93); -var part295 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,The latest Revocation Data update failed to load. The component will continue to use its previous content.'), Field(p0,false)}" -match("MESSAGE#167:LiveUpdate:28/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Revocation Data update failed to load. The component will continue to use its previous content.%{p0}"); +var part295 = match("MESSAGE#167:LiveUpdate:28/0", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Revocation Data update failed to load. The component will continue to use its previous content.%{p0}"); var all94 = all_match({ processors: [ @@ -6918,8 +6433,7 @@ var all94 = all_match({ var msg247 = msg("LiveUpdate:28", all94); -var part296 = // "Pattern{Field(fld11,false), Constant(': Impossible de se connecter au serveur LiveUpdate '), Field(fld12,false), Constant('.')}" -match("MESSAGE#168:LiveUpdate:29", "nwparser.payload", "%{fld11}: Impossible de se connecter au serveur LiveUpdate %{fld12}.", processor_chain([ +var part296 = match("MESSAGE#168:LiveUpdate:29", "nwparser.payload", "%{fld11}: Impossible de se connecter au serveur LiveUpdate %{fld12}.", processor_chain([ dup43, dup12, dup13, @@ -6930,14 +6444,11 @@ match("MESSAGE#168:LiveUpdate:29", "nwparser.payload", "%{fld11}: Impossible de var msg248 = msg("LiveUpdate:29", part296); -var part297 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,An update for '), Field(application,true), Constant(' was successfully installed.'), Field(space,false), Constant('The new sequence number is '), Field(fld23,false), Constant('.'), Field(p0,false)}" -match("MESSAGE#169:LiveUpdate:30/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,An update for %{application->} was successfully installed.%{space}The new sequence number is %{fld23}.%{p0}"); +var part297 = match("MESSAGE#169:LiveUpdate:30/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,An update for %{application->} was successfully installed.%{space}The new sequence number is %{fld23}.%{p0}"); -var part298 = // "Pattern{Field(space,false), Constant('Content was downloaded from '), Field(url,true), Constant(' ('), Field(sport,false), Constant(').,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#169:LiveUpdate:30/1_0", "nwparser.p0", "%{space}Content was downloaded from %{url->} (%{sport}).,Event time:%{fld17->} %{fld18}"); +var part298 = match("MESSAGE#169:LiveUpdate:30/1_0", "nwparser.p0", "%{space}Content was downloaded from %{url->} (%{sport}).,Event time:%{fld17->} %{fld18}"); -var part299 = // "Pattern{Field(space,false), Constant('Content was downloaded from '), Field(url,true), Constant(' ('), Field(sport,false), Constant(').')}" -match("MESSAGE#169:LiveUpdate:30/1_1", "nwparser.p0", "%{space}Content was downloaded from %{url->} (%{sport})."); +var part299 = match("MESSAGE#169:LiveUpdate:30/1_1", "nwparser.p0", "%{space}Content was downloaded from %{url->} (%{sport})."); var select50 = linear_select([ part298, @@ -6964,8 +6475,7 @@ var all95 = all_match({ var msg249 = msg("LiveUpdate:30", all95); -var part300 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,The latest '), Field(application,true), Constant(' update failed to load. The component will continue to use its previous content.'), Field(p0,false)}" -match("MESSAGE#170:LiveUpdate:31/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest %{application->} update failed to load. The component will continue to use its previous content.%{p0}"); +var part300 = match("MESSAGE#170:LiveUpdate:31/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest %{application->} update failed to load. The component will continue to use its previous content.%{p0}"); var all96 = all_match({ processors: [ @@ -6985,8 +6495,7 @@ var all96 = all_match({ var msg250 = msg("LiveUpdate:31", all96); -var part301 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,Scheduled LiveUpdate switched to '), Field(change_new,false), Constant('.')}" -match("MESSAGE#171:LiveUpdate:32", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,Scheduled LiveUpdate switched to %{change_new}.", processor_chain([ +var part301 = match("MESSAGE#171:LiveUpdate:32", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,Scheduled LiveUpdate switched to %{change_new}.", processor_chain([ dup136, dup12, dup13, @@ -7000,8 +6509,7 @@ match("MESSAGE#171:LiveUpdate:32", "nwparser.payload", "Category: %{fld22},LiveU var msg251 = msg("LiveUpdate:32", part301); -var part302 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,An update for '), Field(application,true), Constant(' from LiveUpdate failed to install. Error: '), Field(result,false), Constant('('), Field(resultcode,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#172:LiveUpdate:33/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,An update for %{application->} from LiveUpdate failed to install. Error: %{result}(%{resultcode})%{p0}"); +var part302 = match("MESSAGE#172:LiveUpdate:33/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,An update for %{application->} from LiveUpdate failed to install. Error: %{result}(%{resultcode})%{p0}"); var all97 = all_match({ processors: [ @@ -7021,8 +6529,7 @@ var all97 = all_match({ var msg252 = msg("LiveUpdate:33", all97); -var part303 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,An update for '), Field(application,true), Constant(' from Intelligent Updater was already installed.')}" -match("MESSAGE#173:LiveUpdate:34", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,An update for %{application->} from Intelligent Updater was already installed.", processor_chain([ +var part303 = match("MESSAGE#173:LiveUpdate:34", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,An update for %{application->} from Intelligent Updater was already installed.", processor_chain([ dup43, dup12, dup13, @@ -7033,33 +6540,27 @@ match("MESSAGE#173:LiveUpdate:34", "nwparser.payload", "Category: %{fld22},LiveU var msg253 = msg("LiveUpdate:34", part303); -var part304 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,'), Field(p0,false)}" -match("MESSAGE#174:LiveUpdate:35/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,%{p0}"); +var part304 = match("MESSAGE#174:LiveUpdate:35/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,%{p0}"); -var part305 = // "Pattern{Constant('A '), Field(p0,false)}" -match("MESSAGE#174:LiveUpdate:35/1_0", "nwparser.p0", "A %{p0}"); +var part305 = match("MESSAGE#174:LiveUpdate:35/1_0", "nwparser.p0", "A %{p0}"); -var part306 = // "Pattern{Constant(' The'), Field(p0,false)}" -match("MESSAGE#174:LiveUpdate:35/1_1", "nwparser.p0", " The%{p0}"); +var part306 = match("MESSAGE#174:LiveUpdate:35/1_1", "nwparser.p0", " The%{p0}"); var select51 = linear_select([ part305, part306, ]); -var part307 = // "Pattern{Field(,false), Constant('LiveUpdate session '), Field(p0,false)}" -match("MESSAGE#174:LiveUpdate:35/2", "nwparser.p0", "%{}LiveUpdate session %{p0}"); +var part307 = match("MESSAGE#174:LiveUpdate:35/2", "nwparser.p0", "%{}LiveUpdate session %{p0}"); -var part308 = // "Pattern{Constant('was'), Field(p0,false)}" -match("MESSAGE#174:LiveUpdate:35/3_1", "nwparser.p0", "was%{p0}"); +var part308 = match("MESSAGE#174:LiveUpdate:35/3_1", "nwparser.p0", "was%{p0}"); var select52 = linear_select([ dup183, part308, ]); -var part309 = // "Pattern{Field(,false), Constant('cancelled.')}" -match("MESSAGE#174:LiveUpdate:35/4", "nwparser.p0", "%{}cancelled."); +var part309 = match("MESSAGE#174:LiveUpdate:35/4", "nwparser.p0", "%{}cancelled."); var all98 = all_match({ processors: [ @@ -7081,8 +6582,7 @@ var all98 = all_match({ var msg254 = msg("LiveUpdate:35", all98); -var part310 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,"A LiveUpdate session is already running, so the scheduled LiveUpdate was skipped."'), Field(p0,false)}" -match("MESSAGE#175:LiveUpdate:36/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,\"A LiveUpdate session is already running, so the scheduled LiveUpdate was skipped.\"%{p0}"); +var part310 = match("MESSAGE#175:LiveUpdate:36/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,\"A LiveUpdate session is already running, so the scheduled LiveUpdate was skipped.\"%{p0}"); var all99 = all_match({ processors: [ @@ -7102,8 +6602,7 @@ var all99 = all_match({ var msg255 = msg("LiveUpdate:36", all99); -var part311 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,Scheduled LiveUpdate keep trying to connect to Server for '), Field(fld23,true), Constant(' times.')}" -match("MESSAGE#176:LiveUpdate:37", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,Scheduled LiveUpdate keep trying to connect to Server for %{fld23->} times.", processor_chain([ +var part311 = match("MESSAGE#176:LiveUpdate:37", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,Scheduled LiveUpdate keep trying to connect to Server for %{fld23->} times.", processor_chain([ dup43, dup94, dup13, @@ -7114,14 +6613,11 @@ match("MESSAGE#176:LiveUpdate:37", "nwparser.payload", "Category: %{fld22},LiveU var msg256 = msg("LiveUpdate:37", part311); -var part312 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,A LiveUpdate session ran successfully. '), Field(p0,false)}" -match("MESSAGE#177:LiveUpdate:38/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,A LiveUpdate session ran successfully. %{p0}"); +var part312 = match("MESSAGE#177:LiveUpdate:38/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,A LiveUpdate session ran successfully. %{p0}"); -var part313 = // "Pattern{Constant(''), Field(fld23,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#177:LiveUpdate:38/1_0", "nwparser.p0", "%{fld23},Event time:%{fld17->} %{fld18}"); +var part313 = match("MESSAGE#177:LiveUpdate:38/1_0", "nwparser.p0", "%{fld23},Event time:%{fld17->} %{fld18}"); -var part314 = // "Pattern{Field(fld23,false)}" -match_copy("MESSAGE#177:LiveUpdate:38/1_1", "nwparser.p0", "fld23"); +var part314 = match_copy("MESSAGE#177:LiveUpdate:38/1_1", "nwparser.p0", "fld23"); var select53 = linear_select([ part313, @@ -7146,8 +6642,7 @@ var all100 = all_match({ var msg257 = msg("LiveUpdate:38", all100); -var part315 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,[LiveUpdate error submission] Information submitted to Symantec.'), Field(p0,false)}" -match("MESSAGE#178:LiveUpdate:39/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,[LiveUpdate error submission] Information submitted to Symantec.%{p0}"); +var part315 = match("MESSAGE#178:LiveUpdate:39/0", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,[LiveUpdate error submission] Information submitted to Symantec.%{p0}"); var all101 = all_match({ processors: [ @@ -7167,8 +6662,7 @@ var all101 = all_match({ var msg258 = msg("LiveUpdate:39", all101); -var part316 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,The latest Submission Control Thresholds update failed to load. The component has no valid content and will not function correctly until it is updated.')}" -match("MESSAGE#180:LiveUpdate:41", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Submission Control Thresholds update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ +var part316 = match("MESSAGE#180:LiveUpdate:41", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Submission Control Thresholds update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ dup43, dup12, dup13, @@ -7179,8 +6673,7 @@ match("MESSAGE#180:LiveUpdate:41", "nwparser.payload", "Category: %{fld11},LiveU var msg259 = msg("LiveUpdate:41", part316); -var part317 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,The latest SONAR Definitions update failed to load. The component has no valid content and will not function correctly until it is updated.')}" -match("MESSAGE#181:LiveUpdate:42", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest SONAR Definitions update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ +var part317 = match("MESSAGE#181:LiveUpdate:42", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest SONAR Definitions update failed to load. The component has no valid content and will not function correctly until it is updated.", processor_chain([ dup43, dup12, dup13, @@ -7191,8 +6684,7 @@ match("MESSAGE#181:LiveUpdate:42", "nwparser.payload", "Category: %{fld11},LiveU var msg260 = msg("LiveUpdate:42", part317); -var part318 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',LiveUpdate Manager,The latest Endpoint Detection and Response update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#182:LiveUpdate:43", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Endpoint Detection and Response update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ +var part318 = match("MESSAGE#182:LiveUpdate:43", "nwparser.payload", "Category: %{fld11},LiveUpdate Manager,The latest Endpoint Detection and Response update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ dup43, dup12, dup13, @@ -7203,8 +6695,7 @@ match("MESSAGE#182:LiveUpdate:43", "nwparser.payload", "Category: %{fld11},LiveU var msg261 = msg("LiveUpdate:43", part318); -var part319 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,"[LiveUpdate error submission] Submitting information to Symantec failed. Network error : ''), Field(result,false), Constant('''), Field(fld23,false), Constant('",Event time: '), Field(event_time_string,false)}" -match("MESSAGE#183:LiveUpdate:44", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,\"[LiveUpdate error submission] Submitting information to Symantec failed. Network error : '%{result}'%{fld23}\",Event time: %{event_time_string}", processor_chain([ +var part319 = match("MESSAGE#183:LiveUpdate:44", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,\"[LiveUpdate error submission] Submitting information to Symantec failed. Network error : '%{result}'%{fld23}\",Event time: %{event_time_string}", processor_chain([ dup86, dup12, dup13, @@ -7214,8 +6705,7 @@ match("MESSAGE#183:LiveUpdate:44", "nwparser.payload", "Category: %{fld22},LiveU var msg262 = msg("LiveUpdate:44", part319); -var part320 = // "Pattern{Constant('LiveUpdate encountered an error.,Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#184:LiveUpdate:45", "nwparser.payload", "LiveUpdate encountered an error.,Event time: %{fld17->} %{fld18}", processor_chain([ +var part320 = match("MESSAGE#184:LiveUpdate:45", "nwparser.payload", "LiveUpdate encountered an error.,Event time: %{fld17->} %{fld18}", processor_chain([ dup86, dup12, dup13, @@ -7226,8 +6716,7 @@ match("MESSAGE#184:LiveUpdate:45", "nwparser.payload", "LiveUpdate encountered a var msg263 = msg("LiveUpdate:45", part320); -var part321 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,The latest AP Portal List update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#185:LiveUpdate:46", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest AP Portal List update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ +var part321 = match("MESSAGE#185:LiveUpdate:46", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest AP Portal List update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ dup86, dup12, dup13, @@ -7237,8 +6726,7 @@ match("MESSAGE#185:LiveUpdate:46", "nwparser.payload", "Category: %{fld22},LiveU var msg264 = msg("LiveUpdate:46", part321); -var part322 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,The latest Centralized Reputation Settings update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#186:LiveUpdate:47", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Centralized Reputation Settings update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ +var part322 = match("MESSAGE#186:LiveUpdate:47", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Centralized Reputation Settings update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ dup86, dup12, dup13, @@ -7248,8 +6736,7 @@ match("MESSAGE#186:LiveUpdate:47", "nwparser.payload", "Category: %{fld22},LiveU var msg265 = msg("LiveUpdate:47", part322); -var part323 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,The latest Power Eraser Definitions update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#187:LiveUpdate:48", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Power Eraser Definitions update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ +var part323 = match("MESSAGE#187:LiveUpdate:48", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Power Eraser Definitions update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ dup86, dup12, dup13, @@ -7259,8 +6746,7 @@ match("MESSAGE#187:LiveUpdate:48", "nwparser.payload", "Category: %{fld22},LiveU var msg266 = msg("LiveUpdate:48", part323); -var part324 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,The latest Common Network Transport Library and Configuration update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#188:LiveUpdate:49", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Common Network Transport Library and Configuration update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ +var part324 = match("MESSAGE#188:LiveUpdate:49", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Common Network Transport Library and Configuration update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ dup86, dup12, dup13, @@ -7270,8 +6756,7 @@ match("MESSAGE#188:LiveUpdate:49", "nwparser.payload", "Category: %{fld22},LiveU var msg267 = msg("LiveUpdate:49", part324); -var part325 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',LiveUpdate Manager,The latest Extended File Attributes and Signatures update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#189:LiveUpdate:50", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Extended File Attributes and Signatures update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ +var part325 = match("MESSAGE#189:LiveUpdate:50", "nwparser.payload", "Category: %{fld22},LiveUpdate Manager,The latest Extended File Attributes and Signatures update failed to load. The component has no valid content and will not function correctly until it is updated.,Event time: %{event_time_string}", processor_chain([ dup86, dup12, dup13, @@ -7334,8 +6819,7 @@ var select54 = linear_select([ msg268, ]); -var part326 = // "Pattern{Constant('Virus and Spyware Definitions were updated recently, so the scheduled LiveUpdate was skipped.'), Field(p0,false)}" -match("MESSAGE#179:LiveUpdate:40/0", "nwparser.payload", "Virus and Spyware Definitions were updated recently, so the scheduled LiveUpdate was skipped.%{p0}"); +var part326 = match("MESSAGE#179:LiveUpdate:40/0", "nwparser.payload", "Virus and Spyware Definitions were updated recently, so the scheduled LiveUpdate was skipped.%{p0}"); var select55 = linear_select([ dup191, @@ -7360,8 +6844,7 @@ var all102 = all_match({ var msg269 = msg("LiveUpdate:40", all102); -var part327 = // "Pattern{Constant('Virus Found..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Time: '), Field(fld6,false), Constant('..Virus Name: '), Field(virusname,false), Constant('..Path: '), Field(filename,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#430:Virus", "nwparser.payload", "Virus Found..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Virus Name: %{virusname}..Path: %{filename}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part327 = match("MESSAGE#430:Virus", "nwparser.payload", "Virus Found..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Virus Name: %{virusname}..Path: %{filename}..Severity: %{severity}..Source: %{product}", processor_chain([ dup110, dup115, dup116, @@ -7374,8 +6857,7 @@ match("MESSAGE#430:Virus", "nwparser.payload", "Virus Found..Computer: %{shost}. var msg270 = msg("Virus", part327); -var part328 = // "Pattern{Constant('Virus Found..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Time: '), Field(fld6,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#431:Virus:01", "nwparser.payload", "Virus Found..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part328 = match("MESSAGE#431:Virus:01", "nwparser.payload", "Virus Found..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Severity: %{severity}..Source: %{product}", processor_chain([ dup110, dup192, dup15, @@ -7384,19 +6866,16 @@ match("MESSAGE#431:Virus:01", "nwparser.payload", "Virus Found..Computer: %{shos var msg271 = msg("Virus:01", part328); -var part329 = // "Pattern{Constant('Virus Definition File Update..'), Field(fld4,false), Constant('..'), Field(fld5,false), Constant('..Update to computer '), Field(shost,true), Constant(' of virus definition file '), Field(fld6,true), Constant(' failed. Status '), Field(fld7,true), Constant(' ..'), Field(p0,false)}" -match("MESSAGE#432:Virus:02/0", "nwparser.payload", "Virus Definition File Update..%{fld4}..%{fld5}..Update to computer %{shost->} of virus definition file %{fld6->} failed. Status %{fld7->} ..%{p0}"); +var part329 = match("MESSAGE#432:Virus:02/0", "nwparser.payload", "Virus Definition File Update..%{fld4}..%{fld5}..Update to computer %{shost->} of virus definition file %{fld6->} failed. Status %{fld7->} ..%{p0}"); -var part330 = // "Pattern{Constant('. '), Field(p0,false)}" -match("MESSAGE#432:Virus:02/1_0", "nwparser.p0", ". %{p0}"); +var part330 = match("MESSAGE#432:Virus:02/1_0", "nwparser.p0", ". %{p0}"); var select56 = linear_select([ part330, dup194, ]); -var part331 = // "Pattern{Constant(''), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld8,false)}" -match("MESSAGE#432:Virus:02/2", "nwparser.p0", "%{severity}..%{product}..%{fld8}"); +var part331 = match("MESSAGE#432:Virus:02/2", "nwparser.p0", "%{severity}..%{product}..%{fld8}"); var all103 = all_match({ processors: [ @@ -7424,8 +6903,7 @@ var all103 = all_match({ var msg272 = msg("Virus:02", all103); -var part332 = // "Pattern{Constant('Virus Definition File Update..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('..'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,false)}" -match("MESSAGE#433:Virus:03", "nwparser.payload", "Virus Definition File Update..%{shost}..%{fld5}..%{severity}..%{product}..%{fld6}", processor_chain([ +var part332 = match("MESSAGE#433:Virus:03", "nwparser.payload", "Virus Definition File Update..%{shost}..%{fld5}..%{severity}..%{product}..%{fld6}", processor_chain([ dup43, dup44, dup45, @@ -7438,8 +6916,7 @@ match("MESSAGE#433:Virus:03", "nwparser.payload", "Virus Definition File Update. var msg273 = msg("Virus:03", part332); -var part333 = // "Pattern{Constant('Virus Found..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('..'), Field(filename,false), Constant('.....'), Field(info,false), Constant('..'), Field(action,false), Constant('....'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,false), Constant('..'), Field(username,false), Constant('..'), Field(virusname,false)}" -match("MESSAGE#434:Virus:09", "nwparser.payload", "Virus Found..%{shost}..%{fld5}..%{filename}.....%{info}..%{action}....%{severity}..%{product}..%{fld6}..%{username}..%{virusname}", processor_chain([ +var part333 = match("MESSAGE#434:Virus:09", "nwparser.payload", "Virus Found..%{shost}..%{fld5}..%{filename}.....%{info}..%{action}....%{severity}..%{product}..%{fld6}..%{username}..%{virusname}", processor_chain([ dup110, dup115, dup116, @@ -7452,8 +6929,7 @@ match("MESSAGE#434:Virus:09", "nwparser.payload", "Virus Found..%{shost}..%{fld5 var msg274 = msg("Virus:09", part333); -var part334 = // "Pattern{Constant('Virus Found..'), Field(fld12,false), Constant('..'), Field(fld5,false), Constant('..'), Field(filename,false), Constant('..'), Field(info,false), Constant('..'), Field(action,false), Constant('..'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,false), Constant('..'), Field(username,false), Constant('..'), Field(virusname,false)}" -match("MESSAGE#435:Virus:04", "nwparser.payload", "Virus Found..%{fld12}..%{fld5}..%{filename}..%{info}..%{action}..%{severity}..%{product}..%{fld6}..%{username}..%{virusname}", processor_chain([ +var part334 = match("MESSAGE#435:Virus:04", "nwparser.payload", "Virus Found..%{fld12}..%{fld5}..%{filename}..%{info}..%{action}..%{severity}..%{product}..%{fld6}..%{username}..%{virusname}", processor_chain([ dup110, dup115, dup116, @@ -7466,8 +6942,7 @@ match("MESSAGE#435:Virus:04", "nwparser.payload", "Virus Found..%{fld12}..%{fld5 var msg275 = msg("Virus:04", part334); -var part335 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(',0,Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false)}" -match("MESSAGE#436:Virus:12/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},0,Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}"); +var part335 = match("MESSAGE#436:Virus:12/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},0,Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}"); var all104 = all_match({ processors: [ @@ -7493,14 +6968,11 @@ var all104 = all_match({ var msg276 = msg("Virus:12", all104); -var part336 = // "Pattern{Constant('Virus found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(','), Field(p0,false)}" -match("MESSAGE#437:Virus:15/0", "nwparser.payload", "Virus found,IP Address: %{saddr},Computer name: %{shost},%{p0}"); +var part336 = match("MESSAGE#437:Virus:15/0", "nwparser.payload", "Virus found,IP Address: %{saddr},Computer name: %{shost},%{p0}"); -var part337 = // "Pattern{Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(p0,false)}" -match("MESSAGE#437:Virus:15/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); +var part337 = match("MESSAGE#437:Virus:15/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); -var part338 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(url,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(filename,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(event_type,false)}" -match("MESSAGE#437:Virus:15/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{url},Web domain: %{fld45},Downloaded by: %{filename},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{event_type}"); +var part338 = match("MESSAGE#437:Virus:15/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{url},Web domain: %{fld45},Downloaded by: %{filename},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{event_type}"); var all105 = all_match({ processors: [ @@ -7528,8 +7000,7 @@ var all105 = all_match({ var msg277 = msg("Virus:15", all105); -var part339 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(','), Field(p0,false)}" -match("MESSAGE#438:Virus:13/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},%{p0}"); +var part339 = match("MESSAGE#438:Virus:13/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},%{p0}"); var all106 = all_match({ processors: [ @@ -7558,8 +7029,7 @@ var all106 = all_match({ var msg278 = msg("Virus:13", all106); -var part340 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false)}" -match("MESSAGE#439:Virus:10/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}"); +var part340 = match("MESSAGE#439:Virus:10/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}"); var all107 = all_match({ processors: [ @@ -7585,19 +7055,16 @@ var all107 = all_match({ var msg279 = msg("Virus:10", all107); -var part341 = // "Pattern{Constant('"'), Field(fld22,false), Constant('",Actual action: '), Field(p0,false)}" -match("MESSAGE#440:Virus:14/1_0", "nwparser.p0", "\"%{fld22}\",Actual action: %{p0}"); +var part341 = match("MESSAGE#440:Virus:14/1_0", "nwparser.p0", "\"%{fld22}\",Actual action: %{p0}"); -var part342 = // "Pattern{Field(fld22,false), Constant(',Actual action: '), Field(p0,false)}" -match("MESSAGE#440:Virus:14/1_1", "nwparser.p0", "%{fld22},Actual action: %{p0}"); +var part342 = match("MESSAGE#440:Virus:14/1_1", "nwparser.p0", "%{fld22},Actual action: %{p0}"); var select57 = linear_select([ part341, part342, ]); -var part343 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld58,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false)}" -match("MESSAGE#440:Virus:14/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}"); +var part343 = match("MESSAGE#440:Virus:14/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},First Seen: %{fld50},Sensitivity: %{fld58},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}"); var all108 = all_match({ processors: [ @@ -7649,8 +7116,7 @@ var all109 = all_match({ var msg281 = msg("Virus:05", all109); -var part344 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',"Group: '), Field(group,false), Constant('",Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#442:Virus:11/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},\"Group: %{group}\",Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part344 = match("MESSAGE#442:Virus:11/2", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},\"Group: %{group}\",Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var all110 = all_match({ processors: [ @@ -7677,22 +7143,18 @@ var all110 = all_match({ var msg282 = msg("Virus:11", all110); -var part345 = // "Pattern{Constant('Virus Found..Computer: '), Field(shost,false), Constant('..'), Field(p0,false)}" -match("MESSAGE#443:Virus:06/0", "nwparser.payload", "Virus Found..Computer: %{shost}..%{p0}"); +var part345 = match("MESSAGE#443:Virus:06/0", "nwparser.payload", "Virus Found..Computer: %{shost}..%{p0}"); -var part346 = // "Pattern{Constant('Date: '), Field(fld5,false), Constant('..File Path:'), Field(p0,false)}" -match("MESSAGE#443:Virus:06/1_0", "nwparser.p0", "Date: %{fld5}..File Path:%{p0}"); +var part346 = match("MESSAGE#443:Virus:06/1_0", "nwparser.p0", "Date: %{fld5}..File Path:%{p0}"); -var part347 = // "Pattern{Field(fld5,false), Constant('..File Path:'), Field(p0,false)}" -match("MESSAGE#443:Virus:06/1_1", "nwparser.p0", "%{fld5}..File Path:%{p0}"); +var part347 = match("MESSAGE#443:Virus:06/1_1", "nwparser.p0", "%{fld5}..File Path:%{p0}"); var select58 = linear_select([ part346, part347, ]); -var part348 = // "Pattern{Field(filename,false), Constant('..'), Field(info,false), Constant('..Requested Action:'), Field(action,false), Constant('..Severity:'), Field(severity,false), Constant('..Source:'), Field(product,false), Constant('..Time:'), Field(fld6,false), Constant('..User:'), Field(username,false)}" -match("MESSAGE#443:Virus:06/2", "nwparser.p0", "%{filename}..%{info}..Requested Action:%{action}..Severity:%{severity}..Source:%{product}..Time:%{fld6}..User:%{username}"); +var part348 = match("MESSAGE#443:Virus:06/2", "nwparser.p0", "%{filename}..%{info}..Requested Action:%{action}..Severity:%{severity}..Source:%{product}..Time:%{fld6}..User:%{username}"); var all111 = all_match({ processors: [ @@ -7713,8 +7175,7 @@ var all111 = all_match({ var msg283 = msg("Virus:06", all111); -var part349 = // "Pattern{Field(fld1,true), Constant(' Virus Found '), Field(shost,true), Constant(' '), Field(fld5,true), Constant(' '), Field(filename,true), Constant(' Forward from '), Field(info,true), Constant(' '), Field(action,true), Constant(' '), Field(severity,true), Constant(' '), Field(product,true), Constant(' Edition '), Field(version,true), Constant(' '), Field(virusname,false)}" -match("MESSAGE#444:Virus:07", "nwparser.payload", "%{fld1->} Virus Found %{shost->} %{fld5->} %{filename->} Forward from %{info->} %{action->} %{severity->} %{product->} Edition %{version->} %{virusname}", processor_chain([ +var part349 = match("MESSAGE#444:Virus:07", "nwparser.payload", "%{fld1->} Virus Found %{shost->} %{fld5->} %{filename->} Forward from %{info->} %{action->} %{severity->} %{product->} Edition %{version->} %{virusname}", processor_chain([ dup110, dup115, dup116, @@ -7727,8 +7188,7 @@ match("MESSAGE#444:Virus:07", "nwparser.payload", "%{fld1->} Virus Found %{shost var msg284 = msg("Virus:07", part349); -var part350 = // "Pattern{Field(product,true), Constant(' definitions '), Field(info,false)}" -match("MESSAGE#445:Virus:08", "nwparser.payload", "%{product->} definitions %{info}", processor_chain([ +var part350 = match("MESSAGE#445:Virus:08", "nwparser.payload", "%{product->} definitions %{info}", processor_chain([ dup43, dup12, dup13, @@ -7759,8 +7219,7 @@ var select59 = linear_select([ msg285, ]); -var part351 = // "Pattern{Field(shost,false), Constant(', Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#216:Local:01", "nwparser.payload", "%{shost}, Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part351 = match("MESSAGE#216:Local:01", "nwparser.payload", "%{shost}, Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup53, dup12, dup15, @@ -7769,8 +7228,7 @@ match("MESSAGE#216:Local:01", "nwparser.payload", "%{shost}, Local Port %{sport} var msg286 = msg("Local:01", part351); -var part352 = // "Pattern{Constant('Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#217:Local:02", "nwparser.payload", "Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part352 = match("MESSAGE#217:Local:02", "nwparser.payload", "Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup53, dup12, dup13, @@ -7785,22 +7243,18 @@ var select60 = linear_select([ msg287, ]); -var part353 = // "Pattern{Constant('Location has been '), Field(p0,false)}" -match("MESSAGE#218:Location/0", "nwparser.payload", "Location has been %{p0}"); +var part353 = match("MESSAGE#218:Location/0", "nwparser.payload", "Location has been %{p0}"); -var part354 = // "Pattern{Constant('changed '), Field(p0,false)}" -match("MESSAGE#218:Location/1_0", "nwparser.p0", "changed %{p0}"); +var part354 = match("MESSAGE#218:Location/1_0", "nwparser.p0", "changed %{p0}"); -var part355 = // "Pattern{Constant('switched'), Field(p0,false)}" -match("MESSAGE#218:Location/1_1", "nwparser.p0", "switched%{p0}"); +var part355 = match("MESSAGE#218:Location/1_1", "nwparser.p0", "switched%{p0}"); var select61 = linear_select([ part354, part355, ]); -var part356 = // "Pattern{Field(,false), Constant('to '), Field(p0,false)}" -match("MESSAGE#218:Location/2", "nwparser.p0", "%{}to %{p0}"); +var part356 = match("MESSAGE#218:Location/2", "nwparser.p0", "%{}to %{p0}"); var all112 = all_match({ processors: [ @@ -7825,8 +7279,7 @@ var all112 = all_match({ var msg288 = msg("Location", all112); -var part357 = // "Pattern{Field(event_description,false)}" -match_copy("MESSAGE#219:LUALL", "nwparser.payload", "event_description", processor_chain([ +var part357 = match_copy("MESSAGE#219:LUALL", "nwparser.payload", "event_description", processor_chain([ dup43, dup12, dup13, @@ -7835,8 +7288,7 @@ match_copy("MESSAGE#219:LUALL", "nwparser.payload", "event_description", process var msg289 = msg("LUALL", part357); -var part358 = // "Pattern{Constant('Management server started up successfully'), Field(,false)}" -match("MESSAGE#220:Management", "nwparser.payload", "Management server started up successfully%{}", processor_chain([ +var part358 = match("MESSAGE#220:Management", "nwparser.payload", "Management server started up successfully%{}", processor_chain([ dup43, dup12, dup13, @@ -7847,8 +7299,7 @@ match("MESSAGE#220:Management", "nwparser.payload", "Management server started u var msg290 = msg("Management", part358); -var part359 = // "Pattern{Constant('Management server shut down gracefully'), Field(,false)}" -match("MESSAGE#221:Management:01", "nwparser.payload", "Management server shut down gracefully%{}", processor_chain([ +var part359 = match("MESSAGE#221:Management:01", "nwparser.payload", "Management server shut down gracefully%{}", processor_chain([ dup43, dup12, dup13, @@ -7859,8 +7310,7 @@ match("MESSAGE#221:Management:01", "nwparser.payload", "Management server shut d var msg291 = msg("Management:01", part359); -var part360 = // "Pattern{Constant('Management Server has detected and ignored one or more duplicate entries.Please check the following entries in your directory server:'), Field(fld12,false)}" -match("MESSAGE#222:Management:02", "nwparser.payload", "Management Server has detected and ignored one or more duplicate entries.Please check the following entries in your directory server:%{fld12}", processor_chain([ +var part360 = match("MESSAGE#222:Management:02", "nwparser.payload", "Management Server has detected and ignored one or more duplicate entries.Please check the following entries in your directory server:%{fld12}", processor_chain([ dup43, dup12, dup13, @@ -7877,8 +7327,7 @@ var select62 = linear_select([ msg292, ]); -var part361 = // "Pattern{Constant('management server received the client log successfully,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#223:management", "nwparser.payload", "management server received the client log successfully,%{shost},%{username},%{group}", processor_chain([ +var part361 = match("MESSAGE#223:management", "nwparser.payload", "management server received the client log successfully,%{shost},%{username},%{group}", processor_chain([ dup53, dup12, dup13, @@ -7889,8 +7338,7 @@ match("MESSAGE#223:management", "nwparser.payload", "management server received var msg293 = msg("management", part361); -var part362 = // "Pattern{Constant('management server received a report that the client computer changed its hardware identity,'), Field(shost,false), Constant(','), Field(username,false), Constant(','), Field(group,false)}" -match("MESSAGE#224:management:01", "nwparser.payload", "management server received a report that the client computer changed its hardware identity,%{shost},%{username},%{group}", processor_chain([ +var part362 = match("MESSAGE#224:management:01", "nwparser.payload", "management server received a report that the client computer changed its hardware identity,%{shost},%{username},%{group}", processor_chain([ dup53, dup12, dup13, @@ -7906,22 +7354,18 @@ var select63 = linear_select([ msg294, ]); -var part363 = // "Pattern{Constant('Network Threat Protection --'), Field(p0,false)}" -match("MESSAGE#225:Network/0", "nwparser.payload", "Network Threat Protection --%{p0}"); +var part363 = match("MESSAGE#225:Network/0", "nwparser.payload", "Network Threat Protection --%{p0}"); -var part364 = // "Pattern{Constant('-- Engine version'), Field(p0,false)}" -match("MESSAGE#225:Network/1_0", "nwparser.p0", "-- Engine version%{p0}"); +var part364 = match("MESSAGE#225:Network/1_0", "nwparser.p0", "-- Engine version%{p0}"); -var part365 = // "Pattern{Constant(' Engine version'), Field(p0,false)}" -match("MESSAGE#225:Network/1_1", "nwparser.p0", " Engine version%{p0}"); +var part365 = match("MESSAGE#225:Network/1_1", "nwparser.p0", " Engine version%{p0}"); var select64 = linear_select([ part364, part365, ]); -var part366 = // "Pattern{Field(,false), Constant(': '), Field(version,true), Constant(' Windows Version info: Operating System: '), Field(os,true), Constant(' Network info:'), Field(info,false)}" -match("MESSAGE#225:Network/2", "nwparser.p0", "%{}: %{version->} Windows Version info: Operating System: %{os->} Network info:%{info}"); +var part366 = match("MESSAGE#225:Network/2", "nwparser.p0", "%{}: %{version->} Windows Version info: Operating System: %{os->} Network info:%{info}"); var all113 = all_match({ processors: [ @@ -7941,8 +7385,7 @@ var all113 = all_match({ var msg295 = msg("Network", all113); -var part367 = // "Pattern{Constant('Network Threat Protection has been activated'), Field(,false)}" -match("MESSAGE#226:Network:01", "nwparser.payload", "Network Threat Protection has been activated%{}", processor_chain([ +var part367 = match("MESSAGE#226:Network:01", "nwparser.payload", "Network Threat Protection has been activated%{}", processor_chain([ dup213, dup12, dup13, @@ -7956,22 +7399,18 @@ match("MESSAGE#226:Network:01", "nwparser.payload", "Network Threat Protection h var msg296 = msg("Network:01", part367); -var part368 = // "Pattern{Constant('Network Threat Protection applied a new IPS '), Field(p0,false)}" -match("MESSAGE#227:Network:02/0", "nwparser.payload", "Network Threat Protection applied a new IPS %{p0}"); +var part368 = match("MESSAGE#227:Network:02/0", "nwparser.payload", "Network Threat Protection applied a new IPS %{p0}"); -var part369 = // "Pattern{Constant('Library'), Field(p0,false)}" -match("MESSAGE#227:Network:02/1_0", "nwparser.p0", "Library%{p0}"); +var part369 = match("MESSAGE#227:Network:02/1_0", "nwparser.p0", "Library%{p0}"); -var part370 = // "Pattern{Constant('library'), Field(p0,false)}" -match("MESSAGE#227:Network:02/1_1", "nwparser.p0", "library%{p0}"); +var part370 = match("MESSAGE#227:Network:02/1_1", "nwparser.p0", "library%{p0}"); var select65 = linear_select([ part369, part370, ]); -var part371 = // "Pattern{Field(,false), Constant('.')}" -match("MESSAGE#227:Network:02/2", "nwparser.p0", "%{}."); +var part371 = match("MESSAGE#227:Network:02/2", "nwparser.p0", "%{}."); var all114 = all_match({ processors: [ @@ -7991,8 +7430,7 @@ var all114 = all_match({ var msg297 = msg("Network:02", all114); -var part372 = // "Pattern{Constant('The Network Threat Protection already has the newest policy.'), Field(,false)}" -match("MESSAGE#228:Network:03", "nwparser.payload", "The Network Threat Protection already has the newest policy.%{}", processor_chain([ +var part372 = match("MESSAGE#228:Network:03", "nwparser.payload", "The Network Threat Protection already has the newest policy.%{}", processor_chain([ dup92, dup12, dup13, @@ -8003,8 +7441,7 @@ match("MESSAGE#228:Network:03", "nwparser.payload", "The Network Threat Protecti var msg298 = msg("Network:03", part372); -var part373 = // "Pattern{Constant('The Network Threat Protection is unable to download the newest policy from the Symantec Endpoint Protection Manager.'), Field(,false)}" -match("MESSAGE#229:Network:04", "nwparser.payload", "The Network Threat Protection is unable to download the newest policy from the Symantec Endpoint Protection Manager.%{}", processor_chain([ +var part373 = match("MESSAGE#229:Network:04", "nwparser.payload", "The Network Threat Protection is unable to download the newest policy from the Symantec Endpoint Protection Manager.%{}", processor_chain([ dup43, dup12, dup13, @@ -8015,8 +7452,7 @@ match("MESSAGE#229:Network:04", "nwparser.payload", "The Network Threat Protecti var msg299 = msg("Network:04", part373); -var part374 = // "Pattern{Constant('Network Threat Protection's firewall and Intrusion Prevention features are disabled'), Field(,false)}" -match("MESSAGE#230:Network:05", "nwparser.payload", "Network Threat Protection's firewall and Intrusion Prevention features are disabled%{}", processor_chain([ +var part374 = match("MESSAGE#230:Network:05", "nwparser.payload", "Network Threat Protection's firewall and Intrusion Prevention features are disabled%{}", processor_chain([ dup92, dup12, dup13, @@ -8027,8 +7463,7 @@ match("MESSAGE#230:Network:05", "nwparser.payload", "Network Threat Protection's var msg300 = msg("Network:05", part374); -var part375 = // "Pattern{Constant('The Network Threat Protection is unable to communicate with the Symantec Endpoint Protection Manager.'), Field(,false)}" -match("MESSAGE#231:Network:06", "nwparser.payload", "The Network Threat Protection is unable to communicate with the Symantec Endpoint Protection Manager.%{}", processor_chain([ +var part375 = match("MESSAGE#231:Network:06", "nwparser.payload", "The Network Threat Protection is unable to communicate with the Symantec Endpoint Protection Manager.%{}", processor_chain([ dup92, dup12, dup13, @@ -8039,8 +7474,7 @@ match("MESSAGE#231:Network:06", "nwparser.payload", "The Network Threat Protecti var msg301 = msg("Network:06", part375); -var part376 = // "Pattern{Constant('Network Audit Search Unagented Hosts Started'), Field(,false)}" -match("MESSAGE#232:Network:07", "nwparser.payload", "Network Audit Search Unagented Hosts Started%{}", processor_chain([ +var part376 = match("MESSAGE#232:Network:07", "nwparser.payload", "Network Audit Search Unagented Hosts Started%{}", processor_chain([ dup92, dup12, dup13, @@ -8051,8 +7485,7 @@ match("MESSAGE#232:Network:07", "nwparser.payload", "Network Audit Search Unagen var msg302 = msg("Network:07", part376); -var part377 = // "Pattern{Constant('Network Audit Search Unagented Hosts From NST Finished Abnormally'), Field(,false)}" -match("MESSAGE#233:Network:08", "nwparser.payload", "Network Audit Search Unagented Hosts From NST Finished Abnormally%{}", processor_chain([ +var part377 = match("MESSAGE#233:Network:08", "nwparser.payload", "Network Audit Search Unagented Hosts From NST Finished Abnormally%{}", processor_chain([ dup92, dup12, dup13, @@ -8063,8 +7496,7 @@ match("MESSAGE#233:Network:08", "nwparser.payload", "Network Audit Search Unagen var msg303 = msg("Network:08", part377); -var part378 = // "Pattern{Constant('Network Audit Search Unagented Hosts From NST Finished Normally'), Field(,false)}" -match("MESSAGE#234:Network:09", "nwparser.payload", "Network Audit Search Unagented Hosts From NST Finished Normally%{}", processor_chain([ +var part378 = match("MESSAGE#234:Network:09", "nwparser.payload", "Network Audit Search Unagented Hosts From NST Finished Normally%{}", processor_chain([ dup92, dup12, dup13, @@ -8075,8 +7507,7 @@ match("MESSAGE#234:Network:09", "nwparser.payload", "Network Audit Search Unagen var msg304 = msg("Network:09", part378); -var part379 = // "Pattern{Constant('Network Audit Client Remote Pushing Install Started'), Field(,false)}" -match("MESSAGE#235:Network:10", "nwparser.payload", "Network Audit Client Remote Pushing Install Started%{}", processor_chain([ +var part379 = match("MESSAGE#235:Network:10", "nwparser.payload", "Network Audit Client Remote Pushing Install Started%{}", processor_chain([ dup92, dup12, dup13, @@ -8087,8 +7518,7 @@ match("MESSAGE#235:Network:10", "nwparser.payload", "Network Audit Client Remote var msg305 = msg("Network:10", part379); -var part380 = // "Pattern{Constant('Network Audit Client Remote Pushing Install Finished Normally'), Field(,false)}" -match("MESSAGE#236:Network:11", "nwparser.payload", "Network Audit Client Remote Pushing Install Finished Normally%{}", processor_chain([ +var part380 = match("MESSAGE#236:Network:11", "nwparser.payload", "Network Audit Client Remote Pushing Install Finished Normally%{}", processor_chain([ dup92, dup12, dup13, @@ -8099,8 +7529,7 @@ match("MESSAGE#236:Network:11", "nwparser.payload", "Network Audit Client Remote var msg306 = msg("Network:11", part380); -var part381 = // "Pattern{Constant('Network Intrusion Prevention is malfunctioning, '), Field(result,false), Constant('"')}" -match("MESSAGE#237:Network:12", "nwparser.payload", "Network Intrusion Prevention is malfunctioning, %{result}\"", processor_chain([ +var part381 = match("MESSAGE#237:Network:12", "nwparser.payload", "Network Intrusion Prevention is malfunctioning, %{result}\"", processor_chain([ dup92, dup12, dup13, @@ -8112,8 +7541,7 @@ match("MESSAGE#237:Network:12", "nwparser.payload", "Network Intrusion Preventio var msg307 = msg("Network:12", part381); -var part382 = // "Pattern{Constant('Category: '), Field(fld11,false), Constant(',Network Intrusion Protection Sys,Browser Intrusion Prevention is malfunctioning. Browser type: '), Field(obj_name,false), Constant('.Try to update the signatures Browser path: '), Field(filename,false)}" -match("MESSAGE#238:Network:13", "nwparser.payload", "Category: %{fld11},Network Intrusion Protection Sys,Browser Intrusion Prevention is malfunctioning. Browser type: %{obj_name}.Try to update the signatures Browser path: %{filename}", processor_chain([ +var part382 = match("MESSAGE#238:Network:13", "nwparser.payload", "Category: %{fld11},Network Intrusion Protection Sys,Browser Intrusion Prevention is malfunctioning. Browser type: %{obj_name}.Try to update the signatures Browser path: %{filename}", processor_chain([ dup92, dup12, dup13, @@ -8125,8 +7553,7 @@ match("MESSAGE#238:Network:13", "nwparser.payload", "Category: %{fld11},Network var msg308 = msg("Network:13", part382); -var part383 = // "Pattern{Constant('Network Intrusion Prevention and Browser Intrusion Prevention are malfunctioning because their content is not installed. The IPS content is going to be installed automatically'), Field(,false)}" -match("MESSAGE#241:Network:16", "nwparser.payload", "Network Intrusion Prevention and Browser Intrusion Prevention are malfunctioning because their content is not installed. The IPS content is going to be installed automatically%{}", processor_chain([ +var part383 = match("MESSAGE#241:Network:16", "nwparser.payload", "Network Intrusion Prevention and Browser Intrusion Prevention are malfunctioning because their content is not installed. The IPS content is going to be installed automatically%{}", processor_chain([ dup92, dup12, dup13, @@ -8138,8 +7565,7 @@ match("MESSAGE#241:Network:16", "nwparser.payload", "Network Intrusion Preventio var msg309 = msg("Network:16", part383); -var part384 = // "Pattern{Constant('Network Intrusion Prevention is malfunctioning'), Field(,false)}" -match("MESSAGE#242:Network:17", "nwparser.payload", "Network Intrusion Prevention is malfunctioning%{}", processor_chain([ +var part384 = match("MESSAGE#242:Network:17", "nwparser.payload", "Network Intrusion Prevention is malfunctioning%{}", processor_chain([ dup92, dup12, dup13, @@ -8151,8 +7577,7 @@ match("MESSAGE#242:Network:17", "nwparser.payload", "Network Intrusion Preventio var msg310 = msg("Network:17", part384); -var part385 = // "Pattern{Constant('Network Intrusion Prevention is not protecting machine because its driver was unloaded'), Field(,false)}" -match("MESSAGE#243:Network:18", "nwparser.payload", "Network Intrusion Prevention is not protecting machine because its driver was unloaded%{}", processor_chain([ +var part385 = match("MESSAGE#243:Network:18", "nwparser.payload", "Network Intrusion Prevention is not protecting machine because its driver was unloaded%{}", processor_chain([ dup92, dup12, dup13, @@ -8163,8 +7588,7 @@ match("MESSAGE#243:Network:18", "nwparser.payload", "Network Intrusion Preventio var msg311 = msg("Network:18", part385); -var part386 = // "Pattern{Constant('Network Threat Protection's firewall is disabled by policy'), Field(,false)}" -match("MESSAGE#244:Network:19", "nwparser.payload", "Network Threat Protection's firewall is disabled by policy%{}", processor_chain([ +var part386 = match("MESSAGE#244:Network:19", "nwparser.payload", "Network Threat Protection's firewall is disabled by policy%{}", processor_chain([ dup92, dup12, dup13, @@ -8175,8 +7599,7 @@ match("MESSAGE#244:Network:19", "nwparser.payload", "Network Threat Protection's var msg312 = msg("Network:19", part386); -var part387 = // "Pattern{Field(service,true), Constant(' has been restored and '), Field(result,false)}" -match("MESSAGE#246:Network:21", "nwparser.payload", "%{service->} has been restored and %{result}", processor_chain([ +var part387 = match("MESSAGE#246:Network:21", "nwparser.payload", "%{service->} has been restored and %{result}", processor_chain([ dup92, dup12, dup13, @@ -8187,8 +7610,7 @@ match("MESSAGE#246:Network:21", "nwparser.payload", "%{service->} has been resto var msg313 = msg("Network:21", part387); -var part388 = // "Pattern{Field(service,true), Constant(' is not protecting machine because its driver was disabled,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#247:Network:33", "nwparser.payload", "%{service->} is not protecting machine because its driver was disabled,Event time: %{event_time_string}", processor_chain([ +var part388 = match("MESSAGE#247:Network:33", "nwparser.payload", "%{service->} is not protecting machine because its driver was disabled,Event time: %{event_time_string}", processor_chain([ dup86, dup12, dup13, @@ -8198,8 +7620,7 @@ match("MESSAGE#247:Network:33", "nwparser.payload", "%{service->} is not protect var msg314 = msg("Network:33", part388); -var part389 = // "Pattern{Constant('Network Threat Protection's firewall is enabled'), Field(p0,false)}" -match("MESSAGE#251:Network:25/0", "nwparser.payload", "Network Threat Protection's firewall is enabled%{p0}"); +var part389 = match("MESSAGE#251:Network:25/0", "nwparser.payload", "Network Threat Protection's firewall is enabled%{p0}"); var all115 = all_match({ processors: [ @@ -8219,8 +7640,7 @@ var all115 = all_match({ var msg315 = msg("Network:25", all115); -var part390 = // "Pattern{Constant('Network Intrusion Prevention disabled'), Field(p0,false)}" -match("MESSAGE#253:Network:27/0", "nwparser.payload", "Network Intrusion Prevention disabled%{p0}"); +var part390 = match("MESSAGE#253:Network:27/0", "nwparser.payload", "Network Intrusion Prevention disabled%{p0}"); var all116 = all_match({ processors: [ @@ -8239,8 +7659,7 @@ var all116 = all_match({ var msg316 = msg("Network:27", all116); -var part391 = // "Pattern{Constant('Network Intrusion Prevention enabled'), Field(p0,false)}" -match("MESSAGE#254:Network:28/0", "nwparser.payload", "Network Intrusion Prevention enabled%{p0}"); +var part391 = match("MESSAGE#254:Network:28/0", "nwparser.payload", "Network Intrusion Prevention enabled%{p0}"); var all117 = all_match({ processors: [ @@ -8260,8 +7679,7 @@ var all117 = all_match({ var msg317 = msg("Network:28", all117); -var part392 = // "Pattern{Constant('Network Audit Client Remote Pushing Install Finished Abnormally in Pusing Stage'), Field(,false)}" -match("MESSAGE#257:Network:30", "nwparser.payload", "Network Audit Client Remote Pushing Install Finished Abnormally in Pusing Stage%{}", processor_chain([ +var part392 = match("MESSAGE#257:Network:30", "nwparser.payload", "Network Audit Client Remote Pushing Install Finished Abnormally in Pusing Stage%{}", processor_chain([ dup92, dup12, dup13, @@ -8299,8 +7717,7 @@ var select66 = linear_select([ msg318, ]); -var part393 = // "Pattern{Constant('Firefox Browser Intrusion Prevention is malfunctioning'), Field(,false)}" -match("MESSAGE#239:Network:14", "nwparser.payload", "Firefox Browser Intrusion Prevention is malfunctioning%{}", processor_chain([ +var part393 = match("MESSAGE#239:Network:14", "nwparser.payload", "Firefox Browser Intrusion Prevention is malfunctioning%{}", processor_chain([ dup92, dup12, dup13, @@ -8312,8 +7729,7 @@ match("MESSAGE#239:Network:14", "nwparser.payload", "Firefox Browser Intrusion P var msg319 = msg("Network:14", part393); -var part394 = // "Pattern{Constant('Firefox Browser Intrusion Prevention disabled'), Field(p0,false)}" -match("MESSAGE#245:Network:20/0", "nwparser.payload", "Firefox Browser Intrusion Prevention disabled%{p0}"); +var part394 = match("MESSAGE#245:Network:20/0", "nwparser.payload", "Firefox Browser Intrusion Prevention disabled%{p0}"); var all118 = all_match({ processors: [ @@ -8332,8 +7748,7 @@ var all118 = all_match({ var msg320 = msg("Network:20", all118); -var part395 = // "Pattern{Constant('Firefox Browser Intrusion Prevention enabled'), Field(p0,false)}" -match("MESSAGE#252:Network:26/0", "nwparser.payload", "Firefox Browser Intrusion Prevention enabled%{p0}"); +var part395 = match("MESSAGE#252:Network:26/0", "nwparser.payload", "Firefox Browser Intrusion Prevention enabled%{p0}"); var all119 = all_match({ processors: [ @@ -8359,8 +7774,7 @@ var select67 = linear_select([ msg321, ]); -var part396 = // "Pattern{Constant('Internet Explorer Browser Intrusion Prevention is malfunctioning'), Field(,false)}" -match("MESSAGE#240:Network:15", "nwparser.payload", "Internet Explorer Browser Intrusion Prevention is malfunctioning%{}", processor_chain([ +var part396 = match("MESSAGE#240:Network:15", "nwparser.payload", "Internet Explorer Browser Intrusion Prevention is malfunctioning%{}", processor_chain([ dup92, dup12, dup13, @@ -8372,8 +7786,7 @@ match("MESSAGE#240:Network:15", "nwparser.payload", "Internet Explorer Browser I var msg322 = msg("Network:15", part396); -var part397 = // "Pattern{Constant('Internet Explorer Browser Intrusion Prevention enabled'), Field(p0,false)}" -match("MESSAGE#248:Network:22/0", "nwparser.payload", "Internet Explorer Browser Intrusion Prevention enabled%{p0}"); +var part397 = match("MESSAGE#248:Network:22/0", "nwparser.payload", "Internet Explorer Browser Intrusion Prevention enabled%{p0}"); var all120 = all_match({ processors: [ @@ -8393,8 +7806,7 @@ var all120 = all_match({ var msg323 = msg("Network:22", all120); -var part398 = // "Pattern{Constant('Internet Explorer Browser Intrusion Prevention disabled'), Field(p0,false)}" -match("MESSAGE#249:Network:23/0", "nwparser.payload", "Internet Explorer Browser Intrusion Prevention disabled%{p0}"); +var part398 = match("MESSAGE#249:Network:23/0", "nwparser.payload", "Internet Explorer Browser Intrusion Prevention disabled%{p0}"); var all121 = all_match({ processors: [ @@ -8419,17 +7831,13 @@ var select68 = linear_select([ msg324, ]); -var part399 = // "Pattern{Constant('Generic Exploit Mitigation '), Field(p0,false)}" -match("MESSAGE#255:Network:29/0", "nwparser.payload", "Generic Exploit Mitigation %{p0}"); +var part399 = match("MESSAGE#255:Network:29/0", "nwparser.payload", "Generic Exploit Mitigation %{p0}"); -var part400 = // "Pattern{Constant('enabled'), Field(p0,false)}" -match("MESSAGE#255:Network:29/1_0", "nwparser.p0", "enabled%{p0}"); +var part400 = match("MESSAGE#255:Network:29/1_0", "nwparser.p0", "enabled%{p0}"); -var part401 = // "Pattern{Constant('disabled'), Field(p0,false)}" -match("MESSAGE#255:Network:29/1_1", "nwparser.p0", "disabled%{p0}"); +var part401 = match("MESSAGE#255:Network:29/1_1", "nwparser.p0", "disabled%{p0}"); -var part402 = // "Pattern{Constant('is malfunctioning'), Field(p0,false)}" -match("MESSAGE#255:Network:29/1_2", "nwparser.p0", "is malfunctioning%{p0}"); +var part402 = match("MESSAGE#255:Network:29/1_2", "nwparser.p0", "is malfunctioning%{p0}"); var select69 = linear_select([ part400, @@ -8437,8 +7845,7 @@ var select69 = linear_select([ part402, ]); -var part403 = // "Pattern{Constant(',Event time: '), Field(event_time_string,false)}" -match("MESSAGE#255:Network:29/2", "nwparser.p0", ",Event time: %{event_time_string}"); +var part403 = match("MESSAGE#255:Network:29/2", "nwparser.p0", ",Event time: %{event_time_string}"); var all122 = all_match({ processors: [ @@ -8458,8 +7865,7 @@ var all122 = all_match({ var msg325 = msg("Network:29", all122); -var part404 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',Generic Exploit Mitigation Syste,Already running process (PID:'), Field(process_id,false), Constant(') ''), Field(process,false), Constant('' is affected by a change to the application rules.,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#256:Network:31", "nwparser.payload", "Category: %{fld22},Generic Exploit Mitigation Syste,Already running process (PID:%{process_id}) '%{process}' is affected by a change to the application rules.,Event time: %{event_time_string}", processor_chain([ +var part404 = match("MESSAGE#256:Network:31", "nwparser.payload", "Category: %{fld22},Generic Exploit Mitigation Syste,Already running process (PID:%{process_id}) '%{process}' is affected by a change to the application rules.,Event time: %{event_time_string}", processor_chain([ dup92, dup12, dup13, @@ -8475,8 +7881,7 @@ var select70 = linear_select([ msg326, ]); -var part405 = // "Pattern{Field(event_description,false), Constant(',Event time: '), Field(event_time_string,false)}" -match("MESSAGE#258:Network:32", "nwparser.payload", "%{event_description},Event time: %{event_time_string}", processor_chain([ +var part405 = match("MESSAGE#258:Network:32", "nwparser.payload", "%{event_description},Event time: %{event_time_string}", processor_chain([ dup43, dup12, dup13, @@ -8486,14 +7891,11 @@ match("MESSAGE#258:Network:32", "nwparser.payload", "%{event_description},Event var msg327 = msg("Network:32", part405); -var part406 = // "Pattern{Constant('New virus definition file loaded. Version: '), Field(p0,false)}" -match("MESSAGE#259:New/0", "nwparser.payload", "New virus definition file loaded. Version: %{p0}"); +var part406 = match("MESSAGE#259:New/0", "nwparser.payload", "New virus definition file loaded. Version: %{p0}"); -var part407 = // "Pattern{Field(version,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#259:New/1_0", "nwparser.p0", "%{version},Event time:%{fld17->} %{fld18}"); +var part407 = match("MESSAGE#259:New/1_0", "nwparser.p0", "%{version},Event time:%{fld17->} %{fld18}"); -var part408 = // "Pattern{Field(version,false)}" -match_copy("MESSAGE#259:New/1_1", "nwparser.p0", "version"); +var part408 = match_copy("MESSAGE#259:New/1_1", "nwparser.p0", "version"); var select71 = linear_select([ part407, @@ -8522,8 +7924,7 @@ var all123 = all_match({ var msg328 = msg("New", all123); -var part409 = // "Pattern{Constant('New Value ''), Field(change_attribute,false), Constant('' = ''), Field(change_new,false), Constant('''), Field(p0,false)}" -match("MESSAGE#260:New:01/0", "nwparser.payload", "New Value '%{change_attribute}' = '%{change_new}'%{p0}"); +var part409 = match("MESSAGE#260:New:01/0", "nwparser.payload", "New Value '%{change_attribute}' = '%{change_new}'%{p0}"); var all124 = all_match({ processors: [ @@ -8547,8 +7948,7 @@ var all124 = all_match({ var msg329 = msg("New:01", all124); -var part410 = // "Pattern{Constant('New AgentGUID = '), Field(fld22,false)}" -match("MESSAGE#261:New:02", "nwparser.payload", "New AgentGUID = %{fld22}", processor_chain([ +var part410 = match("MESSAGE#261:New:02", "nwparser.payload", "New AgentGUID = %{fld22}", processor_chain([ dup43, dup12, dup13, @@ -8560,8 +7960,7 @@ match("MESSAGE#261:New:02", "nwparser.payload", "New AgentGUID = %{fld22}", proc var msg330 = msg("New:02", part410); -var part411 = // "Pattern{Constant('New policy has been imported.'), Field(,false)}" -match("MESSAGE#262:New:03", "nwparser.payload", "New policy has been imported.%{}", processor_chain([ +var part411 = match("MESSAGE#262:New:03", "nwparser.payload", "New policy has been imported.%{}", processor_chain([ dup43, dup12, dup13, @@ -8573,11 +7972,9 @@ match("MESSAGE#262:New:03", "nwparser.payload", "New policy has been imported.%{ var msg331 = msg("New:03", part411); -var part412 = // "Pattern{Constant('New content update failed to download from the management server. Remote file path: '), Field(p0,false)}" -match("MESSAGE#263:New:04/0", "nwparser.payload", "New content update failed to download from the management server. Remote file path: %{p0}"); +var part412 = match("MESSAGE#263:New:04/0", "nwparser.payload", "New content update failed to download from the management server. Remote file path: %{p0}"); -var part413 = // "Pattern{Field(url,false), Constant(',Event time: '), Field(event_time_string,false)}" -match("MESSAGE#263:New:04/1_0", "nwparser.p0", "%{url},Event time: %{event_time_string}"); +var part413 = match("MESSAGE#263:New:04/1_0", "nwparser.p0", "%{url},Event time: %{event_time_string}"); var select72 = linear_select([ part413, @@ -8602,8 +7999,7 @@ var all125 = all_match({ var msg332 = msg("New:04", all125); -var part414 = // "Pattern{Constant('New content update failed to download from Group Update Provider. Remote file path: '), Field(url,false)}" -match("MESSAGE#264:New:05", "nwparser.payload", "New content update failed to download from Group Update Provider. Remote file path: %{url}", processor_chain([ +var part414 = match("MESSAGE#264:New:05", "nwparser.payload", "New content update failed to download from Group Update Provider. Remote file path: %{url}", processor_chain([ dup43, dup12, dup13, @@ -8624,8 +8020,7 @@ var select73 = linear_select([ msg333, ]); -var part415 = // "Pattern{Constant('No '), Field(virusname,true), Constant(' virus found events got swept.')}" -match("MESSAGE#265:No", "nwparser.payload", "No %{virusname->} virus found events got swept.", processor_chain([ +var part415 = match("MESSAGE#265:No", "nwparser.payload", "No %{virusname->} virus found events got swept.", processor_chain([ dup43, dup12, dup13, @@ -8637,8 +8032,7 @@ match("MESSAGE#265:No", "nwparser.payload", "No %{virusname->} virus found event var msg334 = msg("No", part415); -var part416 = // "Pattern{Constant('No clients got swept.'), Field(,false)}" -match("MESSAGE#266:No:01", "nwparser.payload", "No clients got swept.%{}", processor_chain([ +var part416 = match("MESSAGE#266:No:01", "nwparser.payload", "No clients got swept.%{}", processor_chain([ dup43, dup15, setc("event_description","No clients got swept."), @@ -8646,8 +8040,7 @@ match("MESSAGE#266:No:01", "nwparser.payload", "No clients got swept.%{}", proce var msg335 = msg("No:01", part416); -var part417 = // "Pattern{Constant('No objects got swept.'), Field(,false)}" -match("MESSAGE#267:No:02", "nwparser.payload", "No objects got swept.%{}", processor_chain([ +var part417 = match("MESSAGE#267:No:02", "nwparser.payload", "No objects got swept.%{}", processor_chain([ dup43, dup15, dup218, @@ -8655,8 +8048,7 @@ match("MESSAGE#267:No:02", "nwparser.payload", "No objects got swept.%{}", proce var msg336 = msg("No:02", part417); -var part418 = // "Pattern{Constant('No clients got swept [Domain: '), Field(sdomain,false), Constant('].')}" -match("MESSAGE#268:No:06", "nwparser.payload", "No clients got swept [Domain: %{sdomain}].", processor_chain([ +var part418 = match("MESSAGE#268:No:06", "nwparser.payload", "No clients got swept [Domain: %{sdomain}].", processor_chain([ dup43, dup12, dup13, @@ -8666,8 +8058,7 @@ match("MESSAGE#268:No:06", "nwparser.payload", "No clients got swept [Domain: %{ var msg337 = msg("No:06", part418); -var part419 = // "Pattern{Constant('No old risk events got swept.'), Field(,false)}" -match("MESSAGE#269:No:03", "nwparser.payload", "No old risk events got swept.%{}", processor_chain([ +var part419 = match("MESSAGE#269:No:03", "nwparser.payload", "No old risk events got swept.%{}", processor_chain([ dup43, dup15, setc("event_description","No old risk events got swept."), @@ -8675,8 +8066,7 @@ match("MESSAGE#269:No:03", "nwparser.payload", "No old risk events got swept.%{} var msg338 = msg("No:03", part419); -var part420 = // "Pattern{Constant('No physical files got swept.'), Field(,false)}" -match("MESSAGE#270:No:04", "nwparser.payload", "No physical files got swept.%{}", processor_chain([ +var part420 = match("MESSAGE#270:No:04", "nwparser.payload", "No physical files got swept.%{}", processor_chain([ dup43, dup15, setc("event_description","No physical files got swept."), @@ -8684,8 +8074,7 @@ match("MESSAGE#270:No:04", "nwparser.payload", "No physical files got swept.%{}" var msg339 = msg("No:04", part420); -var part421 = // "Pattern{Constant('No risk events from deleted clients got swept.'), Field(,false)}" -match("MESSAGE#271:No:05", "nwparser.payload", "No risk events from deleted clients got swept.%{}", processor_chain([ +var part421 = match("MESSAGE#271:No:05", "nwparser.payload", "No risk events from deleted clients got swept.%{}", processor_chain([ dup43, dup15, setc("event_description","No risk events from deleted clients got swept."), @@ -8693,8 +8082,7 @@ match("MESSAGE#271:No:05", "nwparser.payload", "No risk events from deleted clie var msg340 = msg("No:05", part421); -var part422 = // "Pattern{Constant('No updates found for '), Field(application,false), Constant('.')}" -match("MESSAGE#272:No:07", "nwparser.payload", "No updates found for %{application}.", processor_chain([ +var part422 = match("MESSAGE#272:No:07", "nwparser.payload", "No updates found for %{application}.", processor_chain([ dup43, dup12, dup13, @@ -8715,8 +8103,7 @@ var select74 = linear_select([ msg341, ]); -var part423 = // "Pattern{Constant('Organization Unit or Container importing finished successfully'), Field(,false)}" -match("MESSAGE#273:Organization:03", "nwparser.payload", "Organization Unit or Container importing finished successfully%{}", processor_chain([ +var part423 = match("MESSAGE#273:Organization:03", "nwparser.payload", "Organization Unit or Container importing finished successfully%{}", processor_chain([ dup53, dup12, dup13, @@ -8727,8 +8114,7 @@ match("MESSAGE#273:Organization:03", "nwparser.payload", "Organization Unit or C var msg342 = msg("Organization:03", part423); -var part424 = // "Pattern{Constant('Organization Unit or Container importing started'), Field(,false)}" -match("MESSAGE#274:Organization:02", "nwparser.payload", "Organization Unit or Container importing started%{}", processor_chain([ +var part424 = match("MESSAGE#274:Organization:02", "nwparser.payload", "Organization Unit or Container importing started%{}", processor_chain([ dup53, dup12, dup13, @@ -8739,8 +8125,7 @@ match("MESSAGE#274:Organization:02", "nwparser.payload", "Organization Unit or C var msg343 = msg("Organization:02", part424); -var part425 = // "Pattern{Constant('Organization importing finished successfully'), Field(,false)}" -match("MESSAGE#275:Organization:01", "nwparser.payload", "Organization importing finished successfully%{}", processor_chain([ +var part425 = match("MESSAGE#275:Organization:01", "nwparser.payload", "Organization importing finished successfully%{}", processor_chain([ dup53, dup12, dup13, @@ -8751,8 +8136,7 @@ match("MESSAGE#275:Organization:01", "nwparser.payload", "Organization importing var msg344 = msg("Organization:01", part425); -var part426 = // "Pattern{Constant('Organization importing started'), Field(,false)}" -match("MESSAGE#276:Organization", "nwparser.payload", "Organization importing started%{}", processor_chain([ +var part426 = match("MESSAGE#276:Organization", "nwparser.payload", "Organization importing started%{}", processor_chain([ dup53, dup12, dup13, @@ -8770,8 +8154,7 @@ var select75 = linear_select([ msg345, ]); -var part427 = // "Pattern{Constant('Number of '), Field(virusname,true), Constant(' virus found events swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#277:Number:01", "nwparser.payload", "Number of %{virusname->} virus found events swept: %{dclass_counter1}", processor_chain([ +var part427 = match("MESSAGE#277:Number:01", "nwparser.payload", "Number of %{virusname->} virus found events swept: %{dclass_counter1}", processor_chain([ dup43, dup152, dup15, @@ -8781,8 +8164,7 @@ match("MESSAGE#277:Number:01", "nwparser.payload", "Number of %{virusname->} vir var msg346 = msg("Number:01", part427); -var part428 = // "Pattern{Constant('Number of virus definition records swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#278:Number", "nwparser.payload", "Number of virus definition records swept: %{dclass_counter1}", processor_chain([ +var part428 = match("MESSAGE#278:Number", "nwparser.payload", "Number of virus definition records swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8794,8 +8176,7 @@ match("MESSAGE#278:Number", "nwparser.payload", "Number of virus definition reco var msg347 = msg("Number", part428); -var part429 = // "Pattern{Constant('Number of scan events swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#279:Number:02", "nwparser.payload", "Number of scan events swept: %{dclass_counter1}", processor_chain([ +var part429 = match("MESSAGE#279:Number:02", "nwparser.payload", "Number of scan events swept: %{dclass_counter1}", processor_chain([ dup43, dup15, setc("event_description","Number of scan events swept."), @@ -8804,8 +8185,7 @@ match("MESSAGE#279:Number:02", "nwparser.payload", "Number of scan events swept: var msg348 = msg("Number:02", part429); -var part430 = // "Pattern{Constant('Number of clients swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#280:Number:04", "nwparser.payload", "Number of clients swept: %{dclass_counter1}", processor_chain([ +var part430 = match("MESSAGE#280:Number:04", "nwparser.payload", "Number of clients swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8816,8 +8196,7 @@ match("MESSAGE#280:Number:04", "nwparser.payload", "Number of clients swept: %{d var msg349 = msg("Number:04", part430); -var part431 = // "Pattern{Constant('Number of old risk events swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#281:Number:05", "nwparser.payload", "Number of old risk events swept: %{dclass_counter1}", processor_chain([ +var part431 = match("MESSAGE#281:Number:05", "nwparser.payload", "Number of old risk events swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8828,8 +8207,7 @@ match("MESSAGE#281:Number:05", "nwparser.payload", "Number of old risk events sw var msg350 = msg("Number:05", part431); -var part432 = // "Pattern{Constant('Number of unacknowledged notifications swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#282:Number:06", "nwparser.payload", "Number of unacknowledged notifications swept: %{dclass_counter1}", processor_chain([ +var part432 = match("MESSAGE#282:Number:06", "nwparser.payload", "Number of unacknowledged notifications swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8840,8 +8218,7 @@ match("MESSAGE#282:Number:06", "nwparser.payload", "Number of unacknowledged not var msg351 = msg("Number:06", part432); -var part433 = // "Pattern{Constant('Number of objects swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#283:Number:07", "nwparser.payload", "Number of objects swept: %{dclass_counter1}", processor_chain([ +var part433 = match("MESSAGE#283:Number:07", "nwparser.payload", "Number of objects swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8852,8 +8229,7 @@ match("MESSAGE#283:Number:07", "nwparser.payload", "Number of objects swept: %{d var msg352 = msg("Number:07", part433); -var part434 = // "Pattern{Constant('Number of risk events from deleted clients swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#284:Number:08", "nwparser.payload", "Number of risk events from deleted clients swept: %{dclass_counter1}", processor_chain([ +var part434 = match("MESSAGE#284:Number:08", "nwparser.payload", "Number of risk events from deleted clients swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8864,8 +8240,7 @@ match("MESSAGE#284:Number:08", "nwparser.payload", "Number of risk events from d var msg353 = msg("Number:08", part434); -var part435 = // "Pattern{Constant('Number of old risk events compressed: '), Field(dclass_counter1,false)}" -match("MESSAGE#285:Number:09", "nwparser.payload", "Number of old risk events compressed: %{dclass_counter1}", processor_chain([ +var part435 = match("MESSAGE#285:Number:09", "nwparser.payload", "Number of old risk events compressed: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8876,8 +8251,7 @@ match("MESSAGE#285:Number:09", "nwparser.payload", "Number of old risk events co var msg354 = msg("Number:09", part435); -var part436 = // "Pattern{Constant('Number of compressed risk events swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#286:Number:10", "nwparser.payload", "Number of compressed risk events swept: %{dclass_counter1}", processor_chain([ +var part436 = match("MESSAGE#286:Number:10", "nwparser.payload", "Number of compressed risk events swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8888,14 +8262,11 @@ match("MESSAGE#286:Number:10", "nwparser.payload", "Number of compressed risk ev var msg355 = msg("Number:10", part436); -var part437 = // "Pattern{Constant('Number of '), Field(info,true), Constant(' in the policy: '), Field(p0,false)}" -match("MESSAGE#287:Number:11/0", "nwparser.payload", "Number of %{info->} in the policy: %{p0}"); +var part437 = match("MESSAGE#287:Number:11/0", "nwparser.payload", "Number of %{info->} in the policy: %{p0}"); -var part438 = // "Pattern{Field(dclass_counter1,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#287:Number:11/1_0", "nwparser.p0", "%{dclass_counter1},Event time:%{fld17->} %{fld18}"); +var part438 = match("MESSAGE#287:Number:11/1_0", "nwparser.p0", "%{dclass_counter1},Event time:%{fld17->} %{fld18}"); -var part439 = // "Pattern{Field(dclass_counter1,false)}" -match_copy("MESSAGE#287:Number:11/1_1", "nwparser.p0", "dclass_counter1"); +var part439 = match_copy("MESSAGE#287:Number:11/1_1", "nwparser.p0", "dclass_counter1"); var select76 = linear_select([ part438, @@ -8920,8 +8291,7 @@ var all126 = all_match({ var msg356 = msg("Number:11", all126); -var part440 = // "Pattern{Constant('Number of physical files swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#288:Number:12", "nwparser.payload", "Number of physical files swept: %{dclass_counter1}", processor_chain([ +var part440 = match("MESSAGE#288:Number:12", "nwparser.payload", "Number of physical files swept: %{dclass_counter1}", processor_chain([ dup43, dup12, dup13, @@ -8932,8 +8302,7 @@ match("MESSAGE#288:Number:12", "nwparser.payload", "Number of physical files swe var msg357 = msg("Number:12", part440); -var part441 = // "Pattern{Constant('Number of '), Field(fld1,true), Constant(' swept: '), Field(dclass_counter1,false)}" -match("MESSAGE#289:Number:13", "nwparser.payload", "Number of %{fld1->} swept: %{dclass_counter1}", processor_chain([ +var part441 = match("MESSAGE#289:Number:13", "nwparser.payload", "Number of %{fld1->} swept: %{dclass_counter1}", processor_chain([ dup43, dup15, dup12, @@ -8978,8 +8347,7 @@ var select77 = linear_select([ msg358, ]); -var part442 = // "Pattern{Constant('Policy has been added,'), Field(info,false)}" -match("MESSAGE#292:Policy:added", "nwparser.payload", "Policy has been added,%{info}", processor_chain([ +var part442 = match("MESSAGE#292:Policy:added", "nwparser.payload", "Policy has been added,%{info}", processor_chain([ dup95, dup12, dup13, @@ -8994,8 +8362,7 @@ match("MESSAGE#292:Policy:added", "nwparser.payload", "Policy has been added,%{i var msg359 = msg("Policy:added", part442); -var part443 = // "Pattern{Constant('Policy has been added:'), Field(info,false)}" -match("MESSAGE#293:Policy:added_01", "nwparser.payload", "Policy has been added:%{info}", processor_chain([ +var part443 = match("MESSAGE#293:Policy:added_01", "nwparser.payload", "Policy has been added:%{info}", processor_chain([ dup95, dup12, dup13, @@ -9010,8 +8377,7 @@ match("MESSAGE#293:Policy:added_01", "nwparser.payload", "Policy has been added: var msg360 = msg("Policy:added_01", part443); -var part444 = // "Pattern{Constant('Policy has been edited,'), Field(info,false)}" -match("MESSAGE#294:Policy:edited", "nwparser.payload", "Policy has been edited,%{info}", processor_chain([ +var part444 = match("MESSAGE#294:Policy:edited", "nwparser.payload", "Policy has been edited,%{info}", processor_chain([ dup136, dup12, dup13, @@ -9026,8 +8392,7 @@ match("MESSAGE#294:Policy:edited", "nwparser.payload", "Policy has been edited,% var msg361 = msg("Policy:edited", part444); -var part445 = // "Pattern{Constant('Policy has been edited:'), Field(info,false), Constant(','), Field(fld1,false)}" -match("MESSAGE#295:Policy:edited_01", "nwparser.payload", "Policy has been edited:%{info},%{fld1}", processor_chain([ +var part445 = match("MESSAGE#295:Policy:edited_01", "nwparser.payload", "Policy has been edited:%{info},%{fld1}", processor_chain([ dup136, dup12, dup13, @@ -9042,8 +8407,7 @@ match("MESSAGE#295:Policy:edited_01", "nwparser.payload", "Policy has been edite var msg362 = msg("Policy:edited_01", part445); -var part446 = // "Pattern{Constant('Policy has been deleted'), Field(p0,false)}" -match("MESSAGE#296:Policy:deleted/0", "nwparser.payload", "Policy has been deleted%{p0}"); +var part446 = match("MESSAGE#296:Policy:deleted/0", "nwparser.payload", "Policy has been deleted%{p0}"); var select78 = linear_select([ dup226, @@ -9080,8 +8444,7 @@ var select79 = linear_select([ msg363, ]); -var part447 = // "Pattern{Constant('Potential risk found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(',Intensive Protection Level: '), Field(fld61,false), Constant(',Certificate issuer: '), Field(fld60,false), Constant(',Certificate signer: '), Field(fld62,false), Constant(',Certificate thumbprint: '), Field(fld63,false), Constant(',Signing timestamp: '), Field(fld64,false), Constant(',Certificate serial number: '), Field(fld65,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(fld1,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Last update time: '), Field(fld53,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld100,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(vendor_event_cat,false), Constant(',Location:'), Field(fld55,false)}" -match("MESSAGE#297:Potential:03", "nwparser.payload", "Potential risk found,IP Address: %{saddr},Computer name: %{shost},Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld1},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld53},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld100},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{vendor_event_cat},Location:%{fld55}", processor_chain([ +var part447 = match("MESSAGE#297:Potential:03", "nwparser.payload", "Potential risk found,IP Address: %{saddr},Computer name: %{shost},Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld1},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Last update time: %{fld53},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld100},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size},Category set: %{category},Category type: %{vendor_event_cat},Location:%{fld55}", processor_chain([ dup110, dup12, dup152, @@ -9096,11 +8459,9 @@ match("MESSAGE#297:Potential:03", "nwparser.payload", "Potential risk found,IP A var msg364 = msg("Potential:03", part447); -var part448 = // "Pattern{Field(severity,false), Constant(',First Seen:'), Field(fld55,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld6,false), Constant(',Detection score:'), Field(fld7,false), Constant(',COH Engine Version: '), Field(fld41,false), Constant(',Detection Submissions No,Permitted application reason: '), Field(fld42,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',Risk Level: '), Field(fld50,false), Constant(',Detection Source: '), Field(fld52,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#298:Potential:02/2", "nwparser.p0", "%{severity},First Seen:%{fld55},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},COH Engine Version: %{fld41},Detection Submissions No,Permitted application reason: %{fld42},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); +var part448 = match("MESSAGE#298:Potential:02/2", "nwparser.p0", "%{severity},First Seen:%{fld55},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},COH Engine Version: %{fld41},Detection Submissions No,Permitted application reason: %{fld42},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); -var part449 = // "Pattern{Field(fld1,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#298:Potential:02/4", "nwparser.p0", "%{fld1},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part449 = match("MESSAGE#298:Potential:02/4", "nwparser.p0", "%{fld1},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var all128 = all_match({ processors: [ @@ -9126,8 +8487,7 @@ var all128 = all_match({ var msg365 = msg("Potential:02", all128); -var part450 = // "Pattern{Field(fld23,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld6,false), Constant(',Detection score:'), Field(fld7,false), Constant(',Submission recommendation: '), Field(fld8,false), Constant(',Permitted application reason: '), Field(fld9,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(fld1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#299:Potential/2", "nwparser.p0", "%{fld23},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); +var part450 = match("MESSAGE#299:Potential/2", "nwparser.p0", "%{fld23},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); var all129 = all_match({ processors: [ @@ -9156,8 +8516,7 @@ var all129 = all_match({ var msg366 = msg("Potential", all129); -var part451 = // "Pattern{Constant('Potential risk found,Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(fld1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#300:Potential:01/0", "nwparser.payload", "Potential risk found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); +var part451 = match("MESSAGE#300:Potential:01/0", "nwparser.payload", "Potential risk found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); var all130 = all_match({ processors: [ @@ -9191,8 +8550,7 @@ var select80 = linear_select([ msg367, ]); -var part452 = // "Pattern{Constant('Previous virus definition file loaded. Version: '), Field(version,false)}" -match("MESSAGE#301:Previous", "nwparser.payload", "Previous virus definition file loaded. Version: %{version}", processor_chain([ +var part452 = match("MESSAGE#301:Previous", "nwparser.payload", "Previous virus definition file loaded. Version: %{version}", processor_chain([ dup92, dup12, dup13, @@ -9203,8 +8561,7 @@ match("MESSAGE#301:Previous", "nwparser.payload", "Previous virus definition fil var msg368 = msg("Previous", part452); -var part453 = // "Pattern{Constant('Proactive Threat Scan '), Field(info,true), Constant(' failed to update.')}" -match("MESSAGE#302:Proactive", "nwparser.payload", "Proactive Threat Scan %{info->} failed to update.", processor_chain([ +var part453 = match("MESSAGE#302:Proactive", "nwparser.payload", "Proactive Threat Scan %{info->} failed to update.", processor_chain([ setc("eventcategory","1703020000"), dup12, dup13, @@ -9215,8 +8572,7 @@ match("MESSAGE#302:Proactive", "nwparser.payload", "Proactive Threat Scan %{info var msg369 = msg("Proactive", part453); -var part454 = // "Pattern{Constant('Proactive Threat Scan whitelist '), Field(info,true), Constant(' is up-to-date.')}" -match("MESSAGE#303:Proactive:01", "nwparser.payload", "Proactive Threat Scan whitelist %{info->} is up-to-date.", processor_chain([ +var part454 = match("MESSAGE#303:Proactive:01", "nwparser.payload", "Proactive Threat Scan whitelist %{info->} is up-to-date.", processor_chain([ dup92, dup12, dup13, @@ -9227,8 +8583,7 @@ match("MESSAGE#303:Proactive:01", "nwparser.payload", "Proactive Threat Scan whi var msg370 = msg("Proactive:01", part454); -var part455 = // "Pattern{Constant('Proactive Threat Protection has been enabled'), Field(p0,false)}" -match("MESSAGE#399:Symantec:38/0", "nwparser.payload", "Proactive Threat Protection has been enabled%{p0}"); +var part455 = match("MESSAGE#399:Symantec:38/0", "nwparser.payload", "Proactive Threat Protection has been enabled%{p0}"); var all131 = all_match({ processors: [ @@ -9247,8 +8602,7 @@ var all131 = all_match({ var msg371 = msg("Symantec:38", all131); -var part456 = // "Pattern{Constant('Proactive Threat Protection has been disabled'), Field(,false)}" -match("MESSAGE#400:Symantec:42", "nwparser.payload", "Proactive Threat Protection has been disabled%{}", processor_chain([ +var part456 = match("MESSAGE#400:Symantec:42", "nwparser.payload", "Proactive Threat Protection has been disabled%{}", processor_chain([ dup43, dup56, dup12, @@ -9266,8 +8620,7 @@ var select81 = linear_select([ msg372, ]); -var part457 = // "Pattern{Constant('process '), Field(process,true), Constant(' can not lock the process status table. The process status has been locked by the server '), Field(info,true), Constant(' since '), Field(fld50,false), Constant('.')}" -match("MESSAGE#304:process", "nwparser.payload", "process %{process->} can not lock the process status table. The process status has been locked by the server %{info->} since %{fld50}.", processor_chain([ +var part457 = match("MESSAGE#304:process", "nwparser.payload", "process %{process->} can not lock the process status table. The process status has been locked by the server %{info->} since %{fld50}.", processor_chain([ dup168, dup12, dup13, @@ -9278,8 +8631,7 @@ match("MESSAGE#304:process", "nwparser.payload", "process %{process->} can not l var msg373 = msg("process", part457); -var part458 = // "Pattern{Constant('"Application has changed since the last time you opened it, process id: '), Field(process_id,true), Constant(' Filename: '), Field(filename,true), Constant(' The change was allowed by profile.",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld25,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Outbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld12,false)}" -match("MESSAGE#305:process:01", "nwparser.payload", "\"Application has changed since the last time you opened it, process id: %{process_id->} Filename: %{filename->} The change was allowed by profile.\",Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},Outbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}", processor_chain([ +var part458 = match("MESSAGE#305:process:01", "nwparser.payload", "\"Application has changed since the last time you opened it, process id: %{process_id->} Filename: %{filename->} The change was allowed by profile.\",Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},Outbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}", processor_chain([ dup168, dup12, dup13, @@ -9294,8 +8646,7 @@ match("MESSAGE#305:process:01", "nwparser.payload", "\"Application has changed s var msg374 = msg("process:01", part458); -var part459 = // "Pattern{Constant('"Application has changed since the last time you opened it, process id: '), Field(process_id,true), Constant(' Filename: '), Field(filename,true), Constant(' The change was allowed by profile.",Local: '), Field(daddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld25,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Inbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld12,false)}" -match("MESSAGE#306:process:11", "nwparser.payload", "\"Application has changed since the last time you opened it, process id: %{process_id->} Filename: %{filename->} The change was allowed by profile.\",Local: %{daddr},Local: %{fld1},Remote: %{fld25},Remote: %{saddr},Remote: %{fld3},Inbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}", processor_chain([ +var part459 = match("MESSAGE#306:process:11", "nwparser.payload", "\"Application has changed since the last time you opened it, process id: %{process_id->} Filename: %{filename->} The change was allowed by profile.\",Local: %{daddr},Local: %{fld1},Remote: %{fld25},Remote: %{saddr},Remote: %{fld3},Inbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}", processor_chain([ dup168, dup12, dup13, @@ -9310,11 +8661,9 @@ match("MESSAGE#306:process:11", "nwparser.payload", "\"Application has changed s var msg375 = msg("process:11", part459); -var part460 = // "Pattern{Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(protocol,false), Constant(','), Field(p0,false)}" -match("MESSAGE#308:process:03/2", "nwparser.p0", ",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},%{p0}"); +var part460 = match("MESSAGE#308:process:03/2", "nwparser.p0", ",Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{protocol},%{p0}"); -var part461 = // "Pattern{Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#308:process:03/4", "nwparser.p0", "%{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part461 = match("MESSAGE#308:process:03/4", "nwparser.p0", "%{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); var all132 = all_match({ processors: [ @@ -9372,22 +8721,18 @@ var select82 = linear_select([ msg377, ]); -var part462 = // "Pattern{Constant('properties of domain '), Field(p0,false)}" -match("MESSAGE#310:properties/0", "nwparser.payload", "properties of domain %{p0}"); +var part462 = match("MESSAGE#310:properties/0", "nwparser.payload", "properties of domain %{p0}"); -var part463 = // "Pattern{Constant('"'), Field(domain,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#310:properties/1_0", "nwparser.p0", "\"%{domain}\"%{p0}"); +var part463 = match("MESSAGE#310:properties/1_0", "nwparser.p0", "\"%{domain}\"%{p0}"); -var part464 = // "Pattern{Constant('''), Field(domain,false), Constant('''), Field(p0,false)}" -match("MESSAGE#310:properties/1_1", "nwparser.p0", "'%{domain}'%{p0}"); +var part464 = match("MESSAGE#310:properties/1_1", "nwparser.p0", "'%{domain}'%{p0}"); var select83 = linear_select([ part463, part464, ]); -var part465 = // "Pattern{Field(,false), Constant('were changed')}" -match("MESSAGE#310:properties/2", "nwparser.p0", "%{}were changed"); +var part465 = match("MESSAGE#310:properties/2", "nwparser.p0", "%{}were changed"); var all134 = all_match({ processors: [ @@ -9410,22 +8755,18 @@ var all134 = all_match({ var msg378 = msg("properties", all134); -var part466 = // "Pattern{Constant('properties for system administrator '), Field(p0,false)}" -match("MESSAGE#311:properties:01/0", "nwparser.payload", "properties for system administrator %{p0}"); +var part466 = match("MESSAGE#311:properties:01/0", "nwparser.payload", "properties for system administrator %{p0}"); -var part467 = // "Pattern{Constant('"'), Field(c_username,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#311:properties:01/1_0", "nwparser.p0", "\"%{c_username}\"%{p0}"); +var part467 = match("MESSAGE#311:properties:01/1_0", "nwparser.p0", "\"%{c_username}\"%{p0}"); -var part468 = // "Pattern{Constant('''), Field(c_username,false), Constant('''), Field(p0,false)}" -match("MESSAGE#311:properties:01/1_1", "nwparser.p0", "'%{c_username}'%{p0}"); +var part468 = match("MESSAGE#311:properties:01/1_1", "nwparser.p0", "'%{c_username}'%{p0}"); var select84 = linear_select([ part467, part468, ]); -var part469 = // "Pattern{Field(,false), Constant('have been changed')}" -match("MESSAGE#311:properties:01/2", "nwparser.p0", "%{}have been changed"); +var part469 = match("MESSAGE#311:properties:01/2", "nwparser.p0", "%{}have been changed"); var all135 = all_match({ processors: [ @@ -9453,8 +8794,7 @@ var select85 = linear_select([ msg379, ]); -var part470 = // "Pattern{Constant('PTS has generated an error: code '), Field(resultcode,false), Constant(': description: '), Field(info,false)}" -match("MESSAGE#312:PTS", "nwparser.payload", "PTS has generated an error: code %{resultcode}: description: %{info}", processor_chain([ +var part470 = match("MESSAGE#312:PTS", "nwparser.payload", "PTS has generated an error: code %{resultcode}: description: %{info}", processor_chain([ dup168, dup12, dup13, @@ -9465,11 +8805,9 @@ match("MESSAGE#312:PTS", "nwparser.payload", "PTS has generated an error: code % var msg380 = msg("PTS", part470); -var part471 = // "Pattern{Constant('Received a new policy with '), Field(p0,false)}" -match("MESSAGE#313:Received/0", "nwparser.payload", "Received a new policy with %{p0}"); +var part471 = match("MESSAGE#313:Received/0", "nwparser.payload", "Received a new policy with %{p0}"); -var part472 = // "Pattern{Field(info,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#313:Received/1_0", "nwparser.p0", "%{info},Event time: %{fld17->} %{fld18}"); +var part472 = match("MESSAGE#313:Received/1_0", "nwparser.p0", "%{info},Event time: %{fld17->} %{fld18}"); var select86 = linear_select([ part472, @@ -9494,8 +8832,7 @@ var all136 = all_match({ var msg381 = msg("Received", all136); -var part473 = // "Pattern{Constant('Received a new profile with serial number '), Field(fld23,true), Constant(' from Symantec Endpoint Protection Manager.')}" -match("MESSAGE#699:Smc:03", "nwparser.payload", "Received a new profile with serial number %{fld23->} from Symantec Endpoint Protection Manager.", processor_chain([ +var part473 = match("MESSAGE#699:Smc:03", "nwparser.payload", "Received a new profile with serial number %{fld23->} from Symantec Endpoint Protection Manager.", processor_chain([ dup53, dup94, dup13, @@ -9511,8 +8848,7 @@ var select87 = linear_select([ msg382, ]); -var part474 = // "Pattern{Constant('Reconfiguring Symantec Management Client....'), Field(,false)}" -match("MESSAGE#314:Reconfiguring", "nwparser.payload", "Reconfiguring Symantec Management Client....%{}", processor_chain([ +var part474 = match("MESSAGE#314:Reconfiguring", "nwparser.payload", "Reconfiguring Symantec Management Client....%{}", processor_chain([ dup136, dup12, dup13, @@ -9526,8 +8862,7 @@ match("MESSAGE#314:Reconfiguring", "nwparser.payload", "Reconfiguring Symantec M var msg383 = msg("Reconfiguring", part474); -var part475 = // "Pattern{Constant('Reconnected to server after server was unreacheable.'), Field(p0,false)}" -match("MESSAGE#315:Reconnected/0", "nwparser.payload", "Reconnected to server after server was unreacheable.%{p0}"); +var part475 = match("MESSAGE#315:Reconnected/0", "nwparser.payload", "Reconnected to server after server was unreacheable.%{p0}"); var all137 = all_match({ processors: [ @@ -9547,8 +8882,7 @@ var all137 = all_match({ var msg384 = msg("Reconnected", all137); -var part476 = // "Pattern{Constant('Please restart your computer to enable '), Field(info,true), Constant(' changes.'), Field(p0,false)}" -match("MESSAGE#316:restart/0", "nwparser.payload", "Please restart your computer to enable %{info->} changes.%{p0}"); +var part476 = match("MESSAGE#316:restart/0", "nwparser.payload", "Please restart your computer to enable %{info->} changes.%{p0}"); var all138 = all_match({ processors: [ @@ -9568,8 +8902,7 @@ var all138 = all_match({ var msg385 = msg("restart", all138); -var part477 = // "Pattern{Constant('Retry '), Field(info,false), Constant('"')}" -match("MESSAGE#317:Retry", "nwparser.payload", "Retry %{info}\"", processor_chain([ +var part477 = match("MESSAGE#317:Retry", "nwparser.payload", "Retry %{info}\"", processor_chain([ dup43, dup12, dup13, @@ -9580,8 +8913,7 @@ match("MESSAGE#317:Retry", "nwparser.payload", "Retry %{info}\"", processor_chai var msg386 = msg("Retry", part477); -var part478 = // "Pattern{Constant('Retry timestamp is equal or over the next schedule time, switching to regular schedule run.'), Field(,false)}" -match("MESSAGE#318:Retry:01", "nwparser.payload", "Retry timestamp is equal or over the next schedule time, switching to regular schedule run.%{}", processor_chain([ +var part478 = match("MESSAGE#318:Retry:01", "nwparser.payload", "Retry timestamp is equal or over the next schedule time, switching to regular schedule run.%{}", processor_chain([ dup43, dup15, setc("action","Retry timestamp is equal or over the next schedule time, switching to regular schedule run."), @@ -9589,8 +8921,7 @@ match("MESSAGE#318:Retry:01", "nwparser.payload", "Retry timestamp is equal or o var msg387 = msg("Retry:01", part478); -var part479 = // "Pattern{Constant('Retry timestamp is over the maximum retry window, switching to regular schedule run.'), Field(,false)}" -match("MESSAGE#319:Retry:02", "nwparser.payload", "Retry timestamp is over the maximum retry window, switching to regular schedule run.%{}", processor_chain([ +var part479 = match("MESSAGE#319:Retry:02", "nwparser.payload", "Retry timestamp is over the maximum retry window, switching to regular schedule run.%{}", processor_chain([ dup43, dup233, dup15, @@ -9604,8 +8935,7 @@ var select88 = linear_select([ msg388, ]); -var part480 = // "Pattern{Constant('Successfully downloaded the '), Field(application,true), Constant(' security definitions from LiveUpdate. The security definitions are now available for deployment.')}" -match("MESSAGE#320:Successfully", "nwparser.payload", "Successfully downloaded the %{application->} security definitions from LiveUpdate. The security definitions are now available for deployment.", processor_chain([ +var part480 = match("MESSAGE#320:Successfully", "nwparser.payload", "Successfully downloaded the %{application->} security definitions from LiveUpdate. The security definitions are now available for deployment.", processor_chain([ dup43, setc("event_description","Successfully Downloaded."), dup15, @@ -9613,8 +8943,7 @@ match("MESSAGE#320:Successfully", "nwparser.payload", "Successfully downloaded t var msg389 = msg("Successfully", part480); -var part481 = // "Pattern{Constant('Successfully deleted the client install package ''), Field(info,false), Constant(''.')}" -match("MESSAGE#321:Successfully:01", "nwparser.payload", "Successfully deleted the client install package '%{info}'.", processor_chain([ +var part481 = match("MESSAGE#321:Successfully:01", "nwparser.payload", "Successfully deleted the client install package '%{info}'.", processor_chain([ dup43, dup234, dup15, @@ -9622,8 +8951,7 @@ match("MESSAGE#321:Successfully:01", "nwparser.payload", "Successfully deleted t var msg390 = msg("Successfully:01", part481); -var part482 = // "Pattern{Constant('Successfully imported the Symantec Endpoint Protection version '), Field(version,true), Constant(' for '), Field(fld3,true), Constant(' package during the server upgrade. This package is now available for deployment.')}" -match("MESSAGE#322:Successfully:02", "nwparser.payload", "Successfully imported the Symantec Endpoint Protection version %{version->} for %{fld3->} package during the server upgrade. This package is now available for deployment.", processor_chain([ +var part482 = match("MESSAGE#322:Successfully:02", "nwparser.payload", "Successfully imported the Symantec Endpoint Protection version %{version->} for %{fld3->} package during the server upgrade. This package is now available for deployment.", processor_chain([ dup43, dup234, dup15, @@ -9637,8 +8965,7 @@ var select89 = linear_select([ msg391, ]); -var part483 = // "Pattern{Constant('Risk Repair Failed..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Time: '), Field(fld6,true), Constant(' '), Field(fld7,true), Constant(' ..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#323:Risk:01", "nwparser.payload", "Risk Repair Failed..Computer: %{shost}..Date: %{fld5}..Time: %{fld6->} %{fld7->} ..Severity: %{severity}..Source: %{product}", processor_chain([ +var part483 = match("MESSAGE#323:Risk:01", "nwparser.payload", "Risk Repair Failed..Computer: %{shost}..Date: %{fld5}..Time: %{fld6->} %{fld7->} ..Severity: %{severity}..Source: %{product}", processor_chain([ dup110, dup166, dup15, @@ -9647,8 +8974,7 @@ match("MESSAGE#323:Risk:01", "nwparser.payload", "Risk Repair Failed..Computer: var msg392 = msg("Risk:01", part483); -var part484 = // "Pattern{Constant('Risk Repair Failed..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('..'), Field(filename,false), Constant('..'), Field(info,false), Constant('..'), Field(action,false), Constant('..'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,true), Constant(' '), Field(fld7,false), Constant('..'), Field(username,false), Constant('..'), Field(virusname,false)}" -match("MESSAGE#324:Risk:02", "nwparser.payload", "Risk Repair Failed..%{shost}..%{fld5}..%{filename}..%{info}..%{action}..%{severity}..%{product}..%{fld6->} %{fld7}..%{username}..%{virusname}", processor_chain([ +var part484 = match("MESSAGE#324:Risk:02", "nwparser.payload", "Risk Repair Failed..%{shost}..%{fld5}..%{filename}..%{info}..%{action}..%{severity}..%{product}..%{fld6->} %{fld7}..%{username}..%{virusname}", processor_chain([ dup110, dup152, dup166, @@ -9658,8 +8984,7 @@ match("MESSAGE#324:Risk:02", "nwparser.payload", "Risk Repair Failed..%{shost}.. var msg393 = msg("Risk:02", part484); -var part485 = // "Pattern{Constant('Risk Repaired..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Time: '), Field(fld6,true), Constant(' '), Field(fld7,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#325:Risk:03", "nwparser.payload", "Risk Repaired..Computer: %{shost}..Date: %{fld5}..Time: %{fld6->} %{fld7}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part485 = match("MESSAGE#325:Risk:03", "nwparser.payload", "Risk Repaired..Computer: %{shost}..Date: %{fld5}..Time: %{fld6->} %{fld7}..Severity: %{severity}..Source: %{product}", processor_chain([ dup110, dup166, dup15, @@ -9668,8 +8993,7 @@ match("MESSAGE#325:Risk:03", "nwparser.payload", "Risk Repaired..Computer: %{sho var msg394 = msg("Risk:03", part485); -var part486 = // "Pattern{Constant('Risk Repaired..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('..'), Field(filename,false), Constant('..'), Field(info,false), Constant('..'), Field(action,false), Constant('..'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,true), Constant(' '), Field(fld7,false), Constant('..'), Field(username,false), Constant('..'), Field(virusname,false)}" -match("MESSAGE#326:Risk:04", "nwparser.payload", "Risk Repaired..%{shost}..%{fld5}..%{filename}..%{info}..%{action}..%{severity}..%{product}..%{fld6->} %{fld7}..%{username}..%{virusname}", processor_chain([ +var part486 = match("MESSAGE#326:Risk:04", "nwparser.payload", "Risk Repaired..%{shost}..%{fld5}..%{filename}..%{info}..%{action}..%{severity}..%{product}..%{fld6->} %{fld7}..%{username}..%{virusname}", processor_chain([ dup110, dup152, dup166, @@ -9679,14 +9003,11 @@ match("MESSAGE#326:Risk:04", "nwparser.payload", "Risk Repaired..%{shost}..%{fld var msg395 = msg("Risk:04", part486); -var part487 = // "Pattern{Constant('Risk sample submitted to Symantec,Computer name: '), Field(p0,false)}" -match("MESSAGE#327:Risk:05/0", "nwparser.payload", "Risk sample submitted to Symantec,Computer name: %{p0}"); +var part487 = match("MESSAGE#327:Risk:05/0", "nwparser.payload", "Risk sample submitted to Symantec,Computer name: %{p0}"); -var part488 = // "Pattern{Field(event_type,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld6,false), Constant(',Detection score:'), Field(fld7,false), Constant(',Submission recommendation: '), Field(fld8,false), Constant(',Permitted application reason: '), Field(fld9,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(fld1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#327:Risk:05/2", "nwparser.p0", "%{event_type},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); +var part488 = match("MESSAGE#327:Risk:05/2", "nwparser.p0", "%{event_type},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); -var part489 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld16,true), Constant(' '), Field(fld17,false), Constant(',Inserted: '), Field(fld20,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#327:Risk:05/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld16->} %{fld17},Inserted: %{fld20},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part489 = match("MESSAGE#327:Risk:05/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld16->} %{fld17},Inserted: %{fld20},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var all139 = all_match({ processors: [ @@ -9726,8 +9047,7 @@ var select90 = linear_select([ msg396, ]); -var part490 = // "Pattern{Constant('Scan Start/Stop..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('..'), Field(filename,false), Constant('..'), Field(info,false), Constant('..'), Field(fld22,false), Constant('..'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,false), Constant('..'), Field(username,false), Constant('..'), Field(virusname,false)}" -match("MESSAGE#328:Scan", "nwparser.payload", "Scan Start/Stop..%{shost}..%{fld5}..%{filename}..%{info}..%{fld22}..%{severity}..%{product}..%{fld6}..%{username}..%{virusname}", processor_chain([ +var part490 = match("MESSAGE#328:Scan", "nwparser.payload", "Scan Start/Stop..%{shost}..%{fld5}..%{filename}..%{info}..%{fld22}..%{severity}..%{product}..%{fld6}..%{username}..%{virusname}", processor_chain([ dup43, dup152, dup166, @@ -9737,8 +9057,7 @@ match("MESSAGE#328:Scan", "nwparser.payload", "Scan Start/Stop..%{shost}..%{fld5 var msg397 = msg("Scan", part490); -var part491 = // "Pattern{Constant('Scan Start/Stop..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('..'), Field(info,false), Constant('..'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,false), Constant('..'), Field(username,false)}" -match("MESSAGE#329:Scan:01", "nwparser.payload", "Scan Start/Stop..%{shost}..%{fld5}..%{info}..%{severity}..%{product}..%{fld6}..%{username}", processor_chain([ +var part491 = match("MESSAGE#329:Scan:01", "nwparser.payload", "Scan Start/Stop..%{shost}..%{fld5}..%{info}..%{severity}..%{product}..%{fld6}..%{username}", processor_chain([ dup43, dup166, dup15, @@ -9747,8 +9066,7 @@ match("MESSAGE#329:Scan:01", "nwparser.payload", "Scan Start/Stop..%{shost}..%{f var msg398 = msg("Scan:01", part491); -var part492 = // "Pattern{Constant('Scan ID: '), Field(fld11,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,false), Constant(','), Field(disposition,false), Constant(',Duration (seconds): '), Field(duration_string,false), Constant(',User1: '), Field(username,false), Constant(',User2: '), Field(fld3,false), Constant(',"'), Field(info,false), Constant('","'), Field(context,false), Constant('",Command: Not a command scan (),Threats: '), Field(dclass_counter3,false), Constant(',Infected: '), Field(dclass_counter1,false), Constant(',Total files: '), Field(dclass_counter2,false), Constant(',Omitted: '), Field(fld4,false), Constant('Computer: '), Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant('Domain: '), Field(domain,false), Constant('Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false)}" -match("MESSAGE#330:Scan:02", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},\"%{info}\",\"%{context}\",Command: Not a command scan (),Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4}Computer: %{shost},IP Address: %{saddr}Domain: %{domain}Group: %{group},Server: %{hostid}", processor_chain([ +var part492 = match("MESSAGE#330:Scan:02", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},\"%{info}\",\"%{context}\",Command: Not a command scan (),Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4}Computer: %{shost},IP Address: %{saddr}Domain: %{domain}Group: %{group},Server: %{hostid}", processor_chain([ dup43, dup12, dup14, @@ -9762,8 +9080,7 @@ match("MESSAGE#330:Scan:02", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld var msg399 = msg("Scan:02", part492); -var part493 = // "Pattern{Constant('Scan ID: '), Field(fld11,false), Constant(',Begin: '), Field(fld1,false), Constant(',End: '), Field(fld2,false), Constant(','), Field(disposition,false), Constant(',Duration (seconds): '), Field(duration_string,false), Constant(',User1: '), Field(username,false), Constant(',User2: '), Field(fld3,false), Constant(','), Field(fld22,false), Constant(',,Command: '), Field(fld4,false), Constant(',Threats: '), Field(dclass_counter3,false), Constant(',Infected: '), Field(dclass_counter1,false), Constant(',Total files: '), Field(fld5,false), Constant(',Omitted: '), Field(fld21,false), Constant(',Computer: '), Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',"Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false)}" -match("MESSAGE#331:Scan:09", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld1},End: %{fld2},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},%{fld22},,Command: %{fld4},Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{fld5},Omitted: %{fld21},Computer: %{shost},IP Address: %{saddr},\"Group: %{group},Server: %{hostid}", processor_chain([ +var part493 = match("MESSAGE#331:Scan:09", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld1},End: %{fld2},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},%{fld22},,Command: %{fld4},Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{fld5},Omitted: %{fld21},Computer: %{shost},IP Address: %{saddr},\"Group: %{group},Server: %{hostid}", processor_chain([ dup43, dup12, dup14, @@ -9777,11 +9094,9 @@ match("MESSAGE#331:Scan:09", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld var msg400 = msg("Scan:09", part493); -var part494 = // "Pattern{Constant('Scan ID: '), Field(fld11,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,false), Constant(','), Field(disposition,false), Constant(',Duration (seconds): '), Field(duration_string,false), Constant(',User1: '), Field(username,false), Constant(',User2: '), Field(fld22,false), Constant(','), Field(info,false), Constant(',Command: Not a command scan (),Threats: '), Field(dclass_counter3,false), Constant(',Infected: '), Field(dclass_counter1,false), Constant(',Total files: '), Field(dclass_counter2,false), Constant(',Omitted: '), Field(fld21,false), Constant('Computer: '), Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',Domain: '), Field(domain,false), Constant(','), Field(p0,false)}" -match("MESSAGE#332:Scan:03/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld22},%{info},Command: Not a command scan (),Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld21}Computer: %{shost},IP Address: %{saddr},Domain: %{domain},%{p0}"); +var part494 = match("MESSAGE#332:Scan:03/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld22},%{info},Command: Not a command scan (),Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld21}Computer: %{shost},IP Address: %{saddr},Domain: %{domain},%{p0}"); -var part495 = // "Pattern{Field(hostid,false)}" -match_copy("MESSAGE#332:Scan:03/2", "nwparser.p0", "hostid"); +var part495 = match_copy("MESSAGE#332:Scan:03/2", "nwparser.p0", "hostid"); var all140 = all_match({ processors: [ @@ -9804,8 +9119,7 @@ var all140 = all_match({ var msg401 = msg("Scan:03", all140); -var part496 = // "Pattern{Constant('Scan ID: '), Field(fld11,false), Constant(',Begin: '), Field(fld1,false), Constant(',End: '), Field(fld2,false), Constant(','), Field(disposition,false), Constant(',Duration (seconds): '), Field(duration_string,false), Constant(',User1: '), Field(username,false), Constant(',User2: '), Field(fld3,false), Constant(',Files scanned: '), Field(dclass_counter2,false), Constant(',,Command: '), Field(fld4,false), Constant(',Threats: '), Field(dclass_counter3,false), Constant(',Infected: '), Field(dclass_counter1,false), Constant(',Total files: '), Field(fld5,false), Constant(',Omitted: '), Field(fld21,false), Constant(',Computer: '), Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false)}" -match("MESSAGE#333:Scan:08", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld1},End: %{fld2},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},Files scanned: %{dclass_counter2},,Command: %{fld4},Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{fld5},Omitted: %{fld21},Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}", processor_chain([ +var part496 = match("MESSAGE#333:Scan:08", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld1},End: %{fld2},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},Files scanned: %{dclass_counter2},,Command: %{fld4},Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{fld5},Omitted: %{fld21},Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}", processor_chain([ dup43, dup12, dup14, @@ -9819,14 +9133,11 @@ match("MESSAGE#333:Scan:08", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld var msg402 = msg("Scan:08", part496); -var part497 = // "Pattern{Constant('Scan Delayed: Risks: '), Field(dclass_counter1,true), Constant(' Scanned: '), Field(dclass_counter2,true), Constant(' Files/Folders/Drives Omitted: '), Field(p0,false)}" -match("MESSAGE#334:Scan:04/0", "nwparser.payload", "Scan Delayed: Risks: %{dclass_counter1->} Scanned: %{dclass_counter2->} Files/Folders/Drives Omitted: %{p0}"); +var part497 = match("MESSAGE#334:Scan:04/0", "nwparser.payload", "Scan Delayed: Risks: %{dclass_counter1->} Scanned: %{dclass_counter2->} Files/Folders/Drives Omitted: %{p0}"); -var part498 = // "Pattern{Field(dclass_counter3,true), Constant(' Trusted Files Skipped: '), Field(fld1,false)}" -match("MESSAGE#334:Scan:04/1_0", "nwparser.p0", "%{dclass_counter3->} Trusted Files Skipped: %{fld1}"); +var part498 = match("MESSAGE#334:Scan:04/1_0", "nwparser.p0", "%{dclass_counter3->} Trusted Files Skipped: %{fld1}"); -var part499 = // "Pattern{Field(dclass_counter3,false)}" -match_copy("MESSAGE#334:Scan:04/1_1", "nwparser.p0", "dclass_counter3"); +var part499 = match_copy("MESSAGE#334:Scan:04/1_1", "nwparser.p0", "dclass_counter3"); var select91 = linear_select([ part498, @@ -9855,8 +9166,7 @@ var all141 = all_match({ var msg403 = msg("Scan:04", all141); -var part500 = // "Pattern{Field(action,false), Constant('..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Description: '), Field(event_description,false), Constant(': Risks: '), Field(dclass_counter1,true), Constant(' Scanned: '), Field(dclass_counter2,true), Constant(' Files/Folders/Drives Omitted: '), Field(dclass_counter3,false), Constant('..Time: '), Field(fld6,true), Constant(' '), Field(fld4,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#335:Scan:05", "nwparser.payload", "%{action}..Computer: %{shost}..Date: %{fld5}..Description: %{event_description}: Risks: %{dclass_counter1->} Scanned: %{dclass_counter2->} Files/Folders/Drives Omitted: %{dclass_counter3}..Time: %{fld6->} %{fld4}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part500 = match("MESSAGE#335:Scan:05", "nwparser.payload", "%{action}..Computer: %{shost}..Date: %{fld5}..Description: %{event_description}: Risks: %{dclass_counter1->} Scanned: %{dclass_counter2->} Files/Folders/Drives Omitted: %{dclass_counter3}..Time: %{fld6->} %{fld4}..Severity: %{severity}..Source: %{product}", processor_chain([ dup43, dup166, dup15, @@ -9867,8 +9177,7 @@ match("MESSAGE#335:Scan:05", "nwparser.payload", "%{action}..Computer: %{shost}. var msg404 = msg("Scan:05", part500); -var part501 = // "Pattern{Field(action,false), Constant('..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Description: '), Field(event_description,false), Constant('...Time: '), Field(fld6,true), Constant(' '), Field(fld4,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#336:Scan:06", "nwparser.payload", "%{action}..Computer: %{shost}..Date: %{fld5}..Description: %{event_description}...Time: %{fld6->} %{fld4}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part501 = match("MESSAGE#336:Scan:06", "nwparser.payload", "%{action}..Computer: %{shost}..Date: %{fld5}..Description: %{event_description}...Time: %{fld6->} %{fld4}..Severity: %{severity}..Source: %{product}", processor_chain([ dup43, dup166, dup15, @@ -9876,8 +9185,7 @@ match("MESSAGE#336:Scan:06", "nwparser.payload", "%{action}..Computer: %{shost}. var msg405 = msg("Scan:06", part501); -var part502 = // "Pattern{Constant('Scan started on all drives and all extensions.'), Field(,false)}" -match("MESSAGE#337:Scan:07", "nwparser.payload", "Scan started on all drives and all extensions.%{}", processor_chain([ +var part502 = match("MESSAGE#337:Scan:07", "nwparser.payload", "Scan started on all drives and all extensions.%{}", processor_chain([ dup43, dup12, dup13, @@ -9888,8 +9196,7 @@ match("MESSAGE#337:Scan:07", "nwparser.payload", "Scan started on all drives and var msg406 = msg("Scan:07", part502); -var part503 = // "Pattern{Constant('Scan Suspended: '), Field(info,false)}" -match("MESSAGE#338:Scan:11", "nwparser.payload", "Scan Suspended: %{info}", processor_chain([ +var part503 = match("MESSAGE#338:Scan:11", "nwparser.payload", "Scan Suspended: %{info}", processor_chain([ dup43, dup12, dup13, @@ -9900,8 +9207,7 @@ match("MESSAGE#338:Scan:11", "nwparser.payload", "Scan Suspended: %{info}", proc var msg407 = msg("Scan:11", part503); -var part504 = // "Pattern{Constant('Scan resumed on all drives and all extensions.'), Field(,false)}" -match("MESSAGE#339:Scan:10", "nwparser.payload", "Scan resumed on all drives and all extensions.%{}", processor_chain([ +var part504 = match("MESSAGE#339:Scan:10", "nwparser.payload", "Scan resumed on all drives and all extensions.%{}", processor_chain([ dup43, dup12, dup13, @@ -9912,11 +9218,9 @@ match("MESSAGE#339:Scan:10", "nwparser.payload", "Scan resumed on all drives and var msg408 = msg("Scan:10", part504); -var part505 = // "Pattern{Constant('Scan ID: '), Field(fld11,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,false), Constant(','), Field(disposition,false), Constant(',Duration (seconds): '), Field(duration_string,false), Constant(',User1: '), Field(uid,false), Constant(',User2: '), Field(fld3,false), Constant(',''), Field(info,false), Constant('','), Field(p0,false)}" -match("MESSAGE#340:Scan:12/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{uid},User2: %{fld3},'%{info}',%{p0}"); +var part505 = match("MESSAGE#340:Scan:12/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{uid},User2: %{fld3},'%{info}',%{p0}"); -var part506 = // "Pattern{Constant('Command: Update Content and Scan Active,Threats: '), Field(dclass_counter3,false), Constant(',Infected: '), Field(dclass_counter1,false), Constant(',Total files: '), Field(dclass_counter2,false), Constant(',Omitted: '), Field(fld4,false), Constant('Computer: '), Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false)}" -match("MESSAGE#340:Scan:12/2", "nwparser.p0", "Command: Update Content and Scan Active,Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4}Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}"); +var part506 = match("MESSAGE#340:Scan:12/2", "nwparser.p0", "Command: Update Content and Scan Active,Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4}Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}"); var all142 = all_match({ processors: [ @@ -9939,11 +9243,9 @@ var all142 = all_match({ var msg409 = msg("Scan:12", all142); -var part507 = // "Pattern{Constant('Scan ID: '), Field(fld11,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End:'), Field(fld51,false), Constant(','), Field(disposition,false), Constant(',Duration (seconds): '), Field(duration_string,false), Constant(',User1: '), Field(uid,false), Constant(',User2:'), Field(fld3,false), Constant(',''), Field(info,false), Constant('','), Field(p0,false)}" -match("MESSAGE#341:Scan:13/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End:%{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{uid},User2:%{fld3},'%{info}',%{p0}"); +var part507 = match("MESSAGE#341:Scan:13/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End:%{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{uid},User2:%{fld3},'%{info}',%{p0}"); -var part508 = // "Pattern{Constant('Command: Full Scan,Threats: '), Field(dclass_counter3,false), Constant(',Infected: '), Field(dclass_counter1,false), Constant(',Total files: '), Field(dclass_counter2,false), Constant(',Omitted: '), Field(fld4,false), Constant('Computer: '), Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false)}" -match("MESSAGE#341:Scan:13/2", "nwparser.p0", "Command: Full Scan,Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4}Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}"); +var part508 = match("MESSAGE#341:Scan:13/2", "nwparser.p0", "Command: Full Scan,Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4}Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}"); var all143 = all_match({ processors: [ @@ -9966,33 +9268,27 @@ var all143 = all_match({ var msg410 = msg("Scan:13", all143); -var part509 = // "Pattern{Constant('Scan ID: '), Field(fld11,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,false), Constant(','), Field(disposition,false), Constant(',Duration (seconds): '), Field(duration_string,false), Constant(',User1: '), Field(username,false), Constant(',User2: '), Field(fld3,false), Constant(','), Field(p0,false)}" -match("MESSAGE#342:Scan:14/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},%{p0}"); +var part509 = match("MESSAGE#342:Scan:14/0", "nwparser.payload", "Scan ID: %{fld11},Begin: %{fld50->} %{fld52},End: %{fld51},%{disposition},Duration (seconds): %{duration_string},User1: %{username},User2: %{fld3},%{p0}"); -var part510 = // "Pattern{Field(info,false), Constant('","'), Field(p0,false)}" -match("MESSAGE#342:Scan:14/2_0", "nwparser.p0", "%{info}\",\"%{p0}"); +var part510 = match("MESSAGE#342:Scan:14/2_0", "nwparser.p0", "%{info}\",\"%{p0}"); -var part511 = // "Pattern{Field(info,false), Constant(','), Field(p0,false)}" -match("MESSAGE#342:Scan:14/2_1", "nwparser.p0", "%{info},%{p0}"); +var part511 = match("MESSAGE#342:Scan:14/2_1", "nwparser.p0", "%{info},%{p0}"); var select92 = linear_select([ part510, part511, ]); -var part512 = // "Pattern{Field(context,false), Constant('",'), Field(p0,false)}" -match("MESSAGE#342:Scan:14/3_0", "nwparser.p0", "%{context}\",%{p0}"); +var part512 = match("MESSAGE#342:Scan:14/3_0", "nwparser.p0", "%{context}\",%{p0}"); -var part513 = // "Pattern{Field(context,false), Constant(','), Field(p0,false)}" -match("MESSAGE#342:Scan:14/3_1", "nwparser.p0", "%{context},%{p0}"); +var part513 = match("MESSAGE#342:Scan:14/3_1", "nwparser.p0", "%{context},%{p0}"); var select93 = linear_select([ part512, part513, ]); -var part514 = // "Pattern{Constant('Command: '), Field(fld10,false), Constant(',Threats: '), Field(dclass_counter3,false), Constant(',Infected: '), Field(dclass_counter1,false), Constant(',Total files: '), Field(dclass_counter2,false), Constant(',Omitted: '), Field(fld4,false), Constant(',Computer: '), Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false)}" -match("MESSAGE#342:Scan:14/4", "nwparser.p0", "Command: %{fld10},Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4},Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}"); +var part514 = match("MESSAGE#342:Scan:14/4", "nwparser.p0", "Command: %{fld10},Threats: %{dclass_counter3},Infected: %{dclass_counter1},Total files: %{dclass_counter2},Omitted: %{fld4},Computer: %{shost},IP Address: %{saddr},Domain: %{domain},Group: %{group},Server: %{hostid}"); var all144 = all_match({ processors: [ @@ -10035,8 +9331,7 @@ var select94 = linear_select([ msg411, ]); -var part515 = // "Pattern{Field(severity,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld13,false), Constant(',Detection score:'), Field(fld7,false), Constant(',Submission recommendation: '), Field(fld8,false), Constant(',Permitted application reason: '), Field(fld9,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(info,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#343:Security:03/2", "nwparser.p0", "%{severity},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld13},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part515 = match("MESSAGE#343:Security:03/2", "nwparser.p0", "%{severity},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld13},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var all145 = all_match({ processors: [ @@ -10088,33 +9383,27 @@ var all146 = all_match({ var msg413 = msg("Security:06", all146); -var part516 = // "Pattern{Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Cookie:'), Field(filename,false), Constant(','), Field(fld22,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Last update time: '), Field(fld57,false), Constant(',Domain: '), Field(domain,true), Constant(' ,'), Field(p0,false)}" -match("MESSAGE#345:Security:05/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},Cookie:%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Last update time: %{fld57},Domain: %{domain->} ,%{p0}"); +var part516 = match("MESSAGE#345:Security:05/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},Cookie:%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Last update time: %{fld57},Domain: %{domain->} ,%{p0}"); -var part517 = // "Pattern{Constant('" '), Field(p0,false)}" -match("MESSAGE#345:Security:05/3_0", "nwparser.p0", "\" %{p0}"); +var part517 = match("MESSAGE#345:Security:05/3_0", "nwparser.p0", "\" %{p0}"); var select95 = linear_select([ part517, dup194, ]); -var part518 = // "Pattern{Constant('Group: '), Field(group,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#345:Security:05/4", "nwparser.p0", "Group: %{group->} %{p0}"); +var part518 = match("MESSAGE#345:Security:05/4", "nwparser.p0", "Group: %{group->} %{p0}"); -var part519 = // "Pattern{Constant('", '), Field(p0,false)}" -match("MESSAGE#345:Security:05/5_0", "nwparser.p0", "\", %{p0}"); +var part519 = match("MESSAGE#345:Security:05/5_0", "nwparser.p0", "\", %{p0}"); -var part520 = // "Pattern{Constant(', '), Field(p0,false)}" -match("MESSAGE#345:Security:05/5_1", "nwparser.p0", ", %{p0}"); +var part520 = match("MESSAGE#345:Security:05/5_1", "nwparser.p0", ", %{p0}"); var select96 = linear_select([ part519, part520, ]); -var part521 = // "Pattern{Constant('Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(', File size (bytes): '), Field(p0,false)}" -match("MESSAGE#345:Security:05/6", "nwparser.p0", "Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type}, File size (bytes): %{p0}"); +var part521 = match("MESSAGE#345:Security:05/6", "nwparser.p0", "Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type}, File size (bytes): %{p0}"); var all147 = all_match({ processors: [ @@ -10146,8 +9435,7 @@ var all147 = all_match({ var msg414 = msg("Security:05", all147); -var part522 = // "Pattern{Constant('Security risk found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(fld22,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(',0,Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(filename_size,false)}" -match("MESSAGE#346:Security:04", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},0,Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}", processor_chain([ +var part522 = match("MESSAGE#346:Security:04", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},0,Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{filename_size}", processor_chain([ dup110, dup12, dup115, @@ -10165,8 +9453,7 @@ match("MESSAGE#346:Security:04", "nwparser.payload", "Security risk found,IP Add var msg415 = msg("Security:04", part522); -var part523 = // "Pattern{Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(fld22,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Last update time: '), Field(fld57,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(', File size (bytes): '), Field(p0,false)}" -match("MESSAGE#347:Security:07/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Last update time: %{fld57},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type}, File size (bytes): %{p0}"); +var part523 = match("MESSAGE#347:Security:07/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Last update time: %{fld57},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type}, File size (bytes): %{p0}"); var all148 = all_match({ processors: [ @@ -10194,19 +9481,16 @@ var all148 = all_match({ var msg416 = msg("Security:07", all148); -var part524 = // "Pattern{Constant('Security risk found,Computer name: '), Field(shost,false), Constant(','), Field(p0,false)}" -match("MESSAGE#348:Security:13/0", "nwparser.payload", "Security risk found,Computer name: %{shost},%{p0}"); +var part524 = match("MESSAGE#348:Security:13/0", "nwparser.payload", "Security risk found,Computer name: %{shost},%{p0}"); -var part525 = // "Pattern{Constant('Intensive Protection Level: '), Field(fld61,false), Constant(',Certificate issuer: '), Field(fld60,false), Constant(',Certificate signer: '), Field(fld62,false), Constant(',Certificate thumbprint: '), Field(fld63,false), Constant(',Signing timestamp: '), Field(fld64,false), Constant(',Certificate serial number: '), Field(fld65,false), Constant(','), Field(p0,false)}" -match("MESSAGE#348:Security:13/1_0", "nwparser.p0", "Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},%{p0}"); +var part525 = match("MESSAGE#348:Security:13/1_0", "nwparser.p0", "Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},%{p0}"); var select97 = linear_select([ part525, dup77, ]); -var part526 = // "Pattern{Constant('IP Address: '), Field(saddr,false), Constant(',Detection type: '), Field(severity,false), Constant(',First Seen: '), Field(fld1,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,true), Constant(' ,Hash type: '), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld3,true), Constant(' ,File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld4,false), Constant(',Detection score: '), Field(fld5,false), Constant(',COH Engine Version: '), Field(fld6,false), Constant(','), Field(fld7,false), Constant(',Permitted application reason: '), Field(fld8,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld10,false), Constant(',Web domain:'), Field(fld11,true), Constant(' ,Downloaded by: '), Field(fld12,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld15,false), Constant(',Risk Level: '), Field(fld16,false), Constant(',Risk type: '), Field(fld17,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name:'), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(fld18,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld19,true), Constant(' '), Field(fld20,false), Constant(',Inserted: '), Field(fld21,false), Constant(',End: '), Field(fld22,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld23,false), Constant(',Source IP: '), Field(fld24,false)}" -match("MESSAGE#348:Security:13/2", "nwparser.p0", "IP Address: %{saddr},Detection type: %{severity},First Seen: %{fld1},Application name: %{application},Application type: %{obj_type},Application version:%{version->} ,Hash type: %{encryption_type},Application hash: %{checksum},Company name: %{fld3->} ,File size (bytes): %{filename_size},Sensitivity: %{fld4},Detection score: %{fld5},COH Engine Version: %{fld6},%{fld7},Permitted application reason: %{fld8},Disposition: %{result},Download site: %{fld10},Web domain:%{fld11->} ,Downloaded by: %{fld12},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld15},Risk Level: %{fld16},Risk type: %{fld17},Source: %{event_source},Risk name:%{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld18},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld19->} %{fld20},Inserted: %{fld21},End: %{fld22},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld23},Source IP: %{fld24}"); +var part526 = match("MESSAGE#348:Security:13/2", "nwparser.p0", "IP Address: %{saddr},Detection type: %{severity},First Seen: %{fld1},Application name: %{application},Application type: %{obj_type},Application version:%{version->} ,Hash type: %{encryption_type},Application hash: %{checksum},Company name: %{fld3->} ,File size (bytes): %{filename_size},Sensitivity: %{fld4},Detection score: %{fld5},COH Engine Version: %{fld6},%{fld7},Permitted application reason: %{fld8},Disposition: %{result},Download site: %{fld10},Web domain:%{fld11->} ,Downloaded by: %{fld12},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld15},Risk Level: %{fld16},Risk type: %{fld17},Source: %{event_source},Risk name:%{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld18},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld19->} %{fld20},Inserted: %{fld21},End: %{fld22},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld23},Source IP: %{fld24}"); var all149 = all_match({ processors: [ @@ -10249,8 +9533,7 @@ var all149 = all_match({ var msg417 = msg("Security:13", all149); -var part527 = // "Pattern{Constant('Security risk found,Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(info,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#349:Security", "nwparser.payload", "Security risk found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}", processor_chain([ +var part527 = match("MESSAGE#349:Security", "nwparser.payload", "Security risk found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}", processor_chain([ dup110, dup12, dup115, @@ -10268,8 +9551,7 @@ match("MESSAGE#349:Security", "nwparser.payload", "Security risk found,Computer var msg418 = msg("Security", part527); -var part528 = // "Pattern{Constant('Security risk found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Cookie: '), Field(fld1,false), Constant(','), Field(info,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false)}" -match("MESSAGE#350:Security:01", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},Cookie: %{fld1},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}", processor_chain([ +var part528 = match("MESSAGE#350:Security:01", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},Cookie: %{fld1},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}", processor_chain([ dup110, dup12, dup115, @@ -10286,8 +9568,7 @@ match("MESSAGE#350:Security:01", "nwparser.payload", "Security risk found,IP Add var msg419 = msg("Security:01", part528); -var part529 = // "Pattern{Constant('Security risk found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(info,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false)}" -match("MESSAGE#351:Security:02", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}", processor_chain([ +var part529 = match("MESSAGE#351:Security:02", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}", processor_chain([ dup110, dup12, dup115, @@ -10317,8 +9598,7 @@ var select98 = linear_select([ msg420, ]); -var part530 = // "Pattern{Constant('Compressed File,Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(info,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#352:Compressed", "nwparser.payload", "Compressed File,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}", processor_chain([ +var part530 = match("MESSAGE#352:Compressed", "nwparser.payload", "Compressed File,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}", processor_chain([ dup110, dup12, dup152, @@ -10333,11 +9613,9 @@ match("MESSAGE#352:Compressed", "nwparser.payload", "Compressed File,Computer na var msg421 = msg("Compressed", part530); -var part531 = // "Pattern{Constant('Compressed File,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(','), Field(p0,false)}" -match("MESSAGE#353:Compressed:02/0", "nwparser.payload", "Compressed File,IP Address: %{saddr},Computer name: %{shost},%{p0}"); +var part531 = match("MESSAGE#353:Compressed:02/0", "nwparser.payload", "Compressed File,IP Address: %{saddr},Computer name: %{shost},%{p0}"); -var part532 = // "Pattern{Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(fld22,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(','), Field(p0,false)}" -match("MESSAGE#353:Compressed:02/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},%{p0}"); +var part532 = match("MESSAGE#353:Compressed:02/2", "nwparser.p0", "%{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},%{p0}"); var all150 = all_match({ processors: [ @@ -10364,8 +9642,7 @@ var all150 = all_match({ var msg422 = msg("Compressed:02", all150); -var part533 = // "Pattern{Constant('Compressed File,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(info,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false)}" -match("MESSAGE#354:Compressed:01", "nwparser.payload", "Compressed File,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}", processor_chain([ +var part533 = match("MESSAGE#354:Compressed:01", "nwparser.payload", "Compressed File,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{info},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31}", processor_chain([ dup110, dup12, dup152, @@ -10386,8 +9663,7 @@ var select99 = linear_select([ msg423, ]); -var part534 = // "Pattern{Constant('Stop serving as the Group Update Provider (proxy server)'), Field(,false)}" -match("MESSAGE#355:Stop", "nwparser.payload", "Stop serving as the Group Update Provider (proxy server)%{}", processor_chain([ +var part534 = match("MESSAGE#355:Stop", "nwparser.payload", "Stop serving as the Group Update Provider (proxy server)%{}", processor_chain([ dup43, dup12, dup13, @@ -10398,8 +9674,7 @@ match("MESSAGE#355:Stop", "nwparser.payload", "Stop serving as the Group Update var msg424 = msg("Stop", part534); -var part535 = // "Pattern{Constant('Stop Symantec Network Access Control client.'), Field(,false)}" -match("MESSAGE#356:Stop:01", "nwparser.payload", "Stop Symantec Network Access Control client.%{}", processor_chain([ +var part535 = match("MESSAGE#356:Stop:01", "nwparser.payload", "Stop Symantec Network Access Control client.%{}", processor_chain([ dup43, dup12, dup13, @@ -10410,8 +9685,7 @@ match("MESSAGE#356:Stop:01", "nwparser.payload", "Stop Symantec Network Access C var msg425 = msg("Stop:01", part535); -var part536 = // "Pattern{Constant('Stop using Group Update Provider (proxy server) @ '), Field(saddr,false), Constant(':'), Field(sport,false), Constant('.')}" -match("MESSAGE#357:Stop:02", "nwparser.payload", "Stop using Group Update Provider (proxy server) @ %{saddr}:%{sport}.", processor_chain([ +var part536 = match("MESSAGE#357:Stop:02", "nwparser.payload", "Stop using Group Update Provider (proxy server) @ %{saddr}:%{sport}.", processor_chain([ dup43, dup12, dup13, @@ -10428,8 +9702,7 @@ var select100 = linear_select([ msg426, ]); -var part537 = // "Pattern{Constant('Stopping Symantec Management Client....'), Field(p0,false)}" -match("MESSAGE#358:Stopping/0", "nwparser.payload", "Stopping Symantec Management Client....%{p0}"); +var part537 = match("MESSAGE#358:Stopping/0", "nwparser.payload", "Stopping Symantec Management Client....%{p0}"); var all151 = all_match({ processors: [ @@ -10452,8 +9725,7 @@ var all151 = all_match({ var msg427 = msg("Stopping", all151); -var part538 = // "Pattern{Constant('Submission Control signatures '), Field(version,true), Constant(' is up-to-date.')}" -match("MESSAGE#359:Submission", "nwparser.payload", "Submission Control signatures %{version->} is up-to-date.", processor_chain([ +var part538 = match("MESSAGE#359:Submission", "nwparser.payload", "Submission Control signatures %{version->} is up-to-date.", processor_chain([ dup92, dup12, dup13, @@ -10464,8 +9736,7 @@ match("MESSAGE#359:Submission", "nwparser.payload", "Submission Control signatur var msg428 = msg("Submission", part538); -var part539 = // "Pattern{Constant('Switched to server control.'), Field(,false)}" -match("MESSAGE#360:Switched", "nwparser.payload", "Switched to server control.%{}", processor_chain([ +var part539 = match("MESSAGE#360:Switched", "nwparser.payload", "Switched to server control.%{}", processor_chain([ dup136, dup12, dup13, @@ -10479,8 +9750,7 @@ match("MESSAGE#360:Switched", "nwparser.payload", "Switched to server control.%{ var msg429 = msg("Switched", part539); -var part540 = // "Pattern{Constant('Symantec Endpoint Protection Manager Content Catalog '), Field(version,true), Constant(' is up-to-date.')}" -match("MESSAGE#361:Symantec:18", "nwparser.payload", "Symantec Endpoint Protection Manager Content Catalog %{version->} is up-to-date.", processor_chain([ +var part540 = match("MESSAGE#361:Symantec:18", "nwparser.payload", "Symantec Endpoint Protection Manager Content Catalog %{version->} is up-to-date.", processor_chain([ dup86, dup15, setc("event_description","Symantec Endpoint Protection Manager Content Catalog is up to date."), @@ -10488,8 +9758,7 @@ match("MESSAGE#361:Symantec:18", "nwparser.payload", "Symantec Endpoint Protecti var msg430 = msg("Symantec:18", part540); -var part541 = // "Pattern{Constant('Symantec Endpoint Protection Manager could not update TruScan proactive threat scan commercial application list '), Field(application,false), Constant('.')}" -match("MESSAGE#362:Symantec:33", "nwparser.payload", "Symantec Endpoint Protection Manager could not update TruScan proactive threat scan commercial application list %{application}.", processor_chain([ +var part541 = match("MESSAGE#362:Symantec:33", "nwparser.payload", "Symantec Endpoint Protection Manager could not update TruScan proactive threat scan commercial application list %{application}.", processor_chain([ dup43, dup15, setc("event_description","Symantec Endpoint Protection Manager could not update TruScan proactive threat scan."), @@ -10497,8 +9766,7 @@ match("MESSAGE#362:Symantec:33", "nwparser.payload", "Symantec Endpoint Protecti var msg431 = msg("Symantec:33", part541); -var part542 = // "Pattern{Constant('Symantec Endpoint Protection '), Field(application,true), Constant(' '), Field(version,true), Constant(' ('), Field(info,false), Constant(') is up-to-date.')}" -match("MESSAGE#363:Symantec:17", "nwparser.payload", "Symantec Endpoint Protection %{application->} %{version->} (%{info}) is up-to-date.", processor_chain([ +var part542 = match("MESSAGE#363:Symantec:17", "nwparser.payload", "Symantec Endpoint Protection %{application->} %{version->} (%{info}) is up-to-date.", processor_chain([ dup86, dup15, setc("event_description","Symantec Endpoint Protection is up to date."), @@ -10506,8 +9774,7 @@ match("MESSAGE#363:Symantec:17", "nwparser.payload", "Symantec Endpoint Protecti var msg432 = msg("Symantec:17", part542); -var part543 = // "Pattern{Constant('Symantec Endpoint Protection '), Field(application,true), Constant(' '), Field(version,true), Constant(' ('), Field(info,false), Constant(') failed to update.')}" -match("MESSAGE#364:Symantec:20", "nwparser.payload", "Symantec Endpoint Protection %{application->} %{version->} (%{info}) failed to update.", processor_chain([ +var part543 = match("MESSAGE#364:Symantec:20", "nwparser.payload", "Symantec Endpoint Protection %{application->} %{version->} (%{info}) failed to update.", processor_chain([ dup86, dup12, dup13, @@ -10517,8 +9784,7 @@ match("MESSAGE#364:Symantec:20", "nwparser.payload", "Symantec Endpoint Protecti var msg433 = msg("Symantec:20", part543); -var part544 = // "Pattern{Constant('Symantec Endpoint Protection Microsoft Exchange E-mail Auto-Protect Disabled'), Field(p0,false)}" -match("MESSAGE#365:Symantec:16/0", "nwparser.payload", "Symantec Endpoint Protection Microsoft Exchange E-mail Auto-Protect Disabled%{p0}"); +var part544 = match("MESSAGE#365:Symantec:16/0", "nwparser.payload", "Symantec Endpoint Protection Microsoft Exchange E-mail Auto-Protect Disabled%{p0}"); var all152 = all_match({ processors: [ @@ -10537,8 +9803,7 @@ var all152 = all_match({ var msg434 = msg("Symantec:16", all152); -var part545 = // "Pattern{Constant('Symantec Network Access Control client started.'), Field(,false)}" -match("MESSAGE#366:Symantec:15", "nwparser.payload", "Symantec Network Access Control client started.%{}", processor_chain([ +var part545 = match("MESSAGE#366:Symantec:15", "nwparser.payload", "Symantec Network Access Control client started.%{}", processor_chain([ dup43, dup12, dup13, @@ -10548,8 +9813,7 @@ match("MESSAGE#366:Symantec:15", "nwparser.payload", "Symantec Network Access Co var msg435 = msg("Symantec:15", part545); -var part546 = // "Pattern{Constant('Symantec Endpoint Protection Tamper Protection Disabled'), Field(,false)}" -match("MESSAGE#367:Symantec:11", "nwparser.payload", "Symantec Endpoint Protection Tamper Protection Disabled%{}", processor_chain([ +var part546 = match("MESSAGE#367:Symantec:11", "nwparser.payload", "Symantec Endpoint Protection Tamper Protection Disabled%{}", processor_chain([ dup168, dup12, dup13, @@ -10560,8 +9824,7 @@ match("MESSAGE#367:Symantec:11", "nwparser.payload", "Symantec Endpoint Protecti var msg436 = msg("Symantec:11", part546); -var part547 = // "Pattern{Constant('Symantec AntiVirus Startup/Shutdown..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld5,false), Constant('..Time: '), Field(fld6,false), Constant('..Description: '), Field(info,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#368:Symantec", "nwparser.payload", "Symantec AntiVirus Startup/Shutdown..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Description: %{info}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part547 = match("MESSAGE#368:Symantec", "nwparser.payload", "Symantec AntiVirus Startup/Shutdown..Computer: %{shost}..Date: %{fld5}..Time: %{fld6}..Description: %{info}..Severity: %{severity}..Source: %{product}", processor_chain([ dup43, dup166, dup15, @@ -10570,8 +9833,7 @@ match("MESSAGE#368:Symantec", "nwparser.payload", "Symantec AntiVirus Startup/Sh var msg437 = msg("Symantec", part547); -var part548 = // "Pattern{Constant('Symantec AntiVirus Startup/Shutdown..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('........'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,false)}" -match("MESSAGE#369:Symantec:01", "nwparser.payload", "Symantec AntiVirus Startup/Shutdown..%{shost}..%{fld5}........%{severity}..%{product}..%{fld6}", processor_chain([ +var part548 = match("MESSAGE#369:Symantec:01", "nwparser.payload", "Symantec AntiVirus Startup/Shutdown..%{shost}..%{fld5}........%{severity}..%{product}..%{fld6}", processor_chain([ dup43, dup166, dup15, @@ -10580,8 +9842,7 @@ match("MESSAGE#369:Symantec:01", "nwparser.payload", "Symantec AntiVirus Startup var msg438 = msg("Symantec:01", part548); -var part549 = // "Pattern{Constant('Symantec AntiVirus Startup/Shutdown..'), Field(shost,false), Constant('..'), Field(fld5,false), Constant('..'), Field(severity,false), Constant('..'), Field(product,false), Constant('..'), Field(fld6,false)}" -match("MESSAGE#370:Symantec:02", "nwparser.payload", "Symantec AntiVirus Startup/Shutdown..%{shost}..%{fld5}..%{severity}..%{product}..%{fld6}", processor_chain([ +var part549 = match("MESSAGE#370:Symantec:02", "nwparser.payload", "Symantec AntiVirus Startup/Shutdown..%{shost}..%{fld5}..%{severity}..%{product}..%{fld6}", processor_chain([ dup43, dup166, dup15, @@ -10590,22 +9851,18 @@ match("MESSAGE#370:Symantec:02", "nwparser.payload", "Symantec AntiVirus Startup var msg439 = msg("Symantec:02", part549); -var part550 = // "Pattern{Constant('Symantec Endpoint Protection Manager Content Catalog '), Field(version,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#371:Symantec:03/0", "nwparser.payload", "Symantec Endpoint Protection Manager Content Catalog %{version->} %{p0}"); +var part550 = match("MESSAGE#371:Symantec:03/0", "nwparser.payload", "Symantec Endpoint Protection Manager Content Catalog %{version->} %{p0}"); -var part551 = // "Pattern{Constant('is up-to-date '), Field(p0,false)}" -match("MESSAGE#371:Symantec:03/1_0", "nwparser.p0", "is up-to-date %{p0}"); +var part551 = match("MESSAGE#371:Symantec:03/1_0", "nwparser.p0", "is up-to-date %{p0}"); -var part552 = // "Pattern{Constant('was successfully updated '), Field(p0,false)}" -match("MESSAGE#371:Symantec:03/1_1", "nwparser.p0", "was successfully updated %{p0}"); +var part552 = match("MESSAGE#371:Symantec:03/1_1", "nwparser.p0", "was successfully updated %{p0}"); var select101 = linear_select([ part551, part552, ]); -var part553 = // "Pattern{Constant('.'), Field(,false)}" -match("MESSAGE#371:Symantec:03/2", "nwparser.p0", ".%{}"); +var part553 = match("MESSAGE#371:Symantec:03/2", "nwparser.p0", ".%{}"); var all153 = all_match({ processors: [ @@ -10625,8 +9882,7 @@ var all153 = all_match({ var msg440 = msg("Symantec:03", all153); -var part554 = // "Pattern{Constant('Symantec Endpoint Protection services shutdown was successful.'), Field(p0,false)}" -match("MESSAGE#372:Symantec:04/0", "nwparser.payload", "Symantec Endpoint Protection services shutdown was successful.%{p0}"); +var part554 = match("MESSAGE#372:Symantec:04/0", "nwparser.payload", "Symantec Endpoint Protection services shutdown was successful.%{p0}"); var all154 = all_match({ processors: [ @@ -10646,8 +9902,7 @@ var all154 = all_match({ var msg441 = msg("Symantec:04", all154); -var part555 = // "Pattern{Constant('Symantec Endpoint Protection services startup was successful.'), Field(p0,false)}" -match("MESSAGE#373:Symantec:05/0", "nwparser.payload", "Symantec Endpoint Protection services startup was successful.%{p0}"); +var part555 = match("MESSAGE#373:Symantec:05/0", "nwparser.payload", "Symantec Endpoint Protection services startup was successful.%{p0}"); var all155 = all_match({ processors: [ @@ -10667,8 +9922,7 @@ var all155 = all_match({ var msg442 = msg("Symantec:05", all155); -var part556 = // "Pattern{Constant('Symantec Management Client is stopped.'), Field(p0,false)}" -match("MESSAGE#374:Symantec:06/0", "nwparser.payload", "Symantec Management Client is stopped.%{p0}"); +var part556 = match("MESSAGE#374:Symantec:06/0", "nwparser.payload", "Symantec Management Client is stopped.%{p0}"); var all156 = all_match({ processors: [ @@ -10688,22 +9942,18 @@ var all156 = all_match({ var msg443 = msg("Symantec:06", all156); -var part557 = // "Pattern{Constant('Symantec Management Client has been '), Field(p0,false)}" -match("MESSAGE#375:Symantec:07/0", "nwparser.payload", "Symantec Management Client has been %{p0}"); +var part557 = match("MESSAGE#375:Symantec:07/0", "nwparser.payload", "Symantec Management Client has been %{p0}"); -var part558 = // "Pattern{Constant('started'), Field(p0,false)}" -match("MESSAGE#375:Symantec:07/1_0", "nwparser.p0", "started%{p0}"); +var part558 = match("MESSAGE#375:Symantec:07/1_0", "nwparser.p0", "started%{p0}"); -var part559 = // "Pattern{Constant('activated'), Field(p0,false)}" -match("MESSAGE#375:Symantec:07/1_1", "nwparser.p0", "activated%{p0}"); +var part559 = match("MESSAGE#375:Symantec:07/1_1", "nwparser.p0", "activated%{p0}"); var select102 = linear_select([ part558, part559, ]); -var part560 = // "Pattern{Constant(' .'), Field(,false)}" -match("MESSAGE#375:Symantec:07/2_1", "nwparser.p0", " .%{}"); +var part560 = match("MESSAGE#375:Symantec:07/2_1", "nwparser.p0", " .%{}"); var select103 = linear_select([ dup186, @@ -10729,8 +9979,7 @@ var all157 = all_match({ var msg444 = msg("Symantec:07", all157); -var part561 = // "Pattern{Constant('Symantec Management Client has been '), Field(info,false)}" -match("MESSAGE#376:Symantec:08", "nwparser.payload", "Symantec Management Client has been %{info}", processor_chain([ +var part561 = match("MESSAGE#376:Symantec:08", "nwparser.payload", "Symantec Management Client has been %{info}", processor_chain([ dup257, dup12, dup13, @@ -10741,8 +9990,7 @@ match("MESSAGE#376:Symantec:08", "nwparser.payload", "Symantec Management Client var msg445 = msg("Symantec:08", part561); -var part562 = // "Pattern{Constant('Symantec Endpoint Protection Auto-Protect failed to load.'), Field(,false)}" -match("MESSAGE#377:Symantec:09", "nwparser.payload", "Symantec Endpoint Protection Auto-Protect failed to load.%{}", processor_chain([ +var part562 = match("MESSAGE#377:Symantec:09", "nwparser.payload", "Symantec Endpoint Protection Auto-Protect failed to load.%{}", processor_chain([ dup43, dup12, dup13, @@ -10753,8 +10001,7 @@ match("MESSAGE#377:Symantec:09", "nwparser.payload", "Symantec Endpoint Protecti var msg446 = msg("Symantec:09", part562); -var part563 = // "Pattern{Constant('Symantec Endpoint Protection has determined that the virus definitions are missing on this computer. '), Field(p0,false)}" -match("MESSAGE#378:Symantec:10/0", "nwparser.payload", "Symantec Endpoint Protection has determined that the virus definitions are missing on this computer. %{p0}"); +var part563 = match("MESSAGE#378:Symantec:10/0", "nwparser.payload", "Symantec Endpoint Protection has determined that the virus definitions are missing on this computer. %{p0}"); var all158 = all_match({ processors: [ @@ -10774,8 +10021,7 @@ var all158 = all_match({ var msg447 = msg("Symantec:10", all158); -var part564 = // "Pattern{Constant('Symantec AntiVirus services startup was successful'), Field(,false)}" -match("MESSAGE#379:Symantec:12", "nwparser.payload", "Symantec AntiVirus services startup was successful%{}", processor_chain([ +var part564 = match("MESSAGE#379:Symantec:12", "nwparser.payload", "Symantec AntiVirus services startup was successful%{}", processor_chain([ dup53, dup12, dup13, @@ -10786,8 +10032,7 @@ match("MESSAGE#379:Symantec:12", "nwparser.payload", "Symantec AntiVirus service var msg448 = msg("Symantec:12", part564); -var part565 = // "Pattern{Constant('Symantec AntiVirus services shutdown was successful'), Field(,false)}" -match("MESSAGE#380:Symantec:13", "nwparser.payload", "Symantec AntiVirus services shutdown was successful%{}", processor_chain([ +var part565 = match("MESSAGE#380:Symantec:13", "nwparser.payload", "Symantec AntiVirus services shutdown was successful%{}", processor_chain([ dup53, dup12, dup13, @@ -10798,8 +10043,7 @@ match("MESSAGE#380:Symantec:13", "nwparser.payload", "Symantec AntiVirus service var msg449 = msg("Symantec:13", part565); -var part566 = // "Pattern{Constant('Symantec AntiVirus services failed to start. '), Field(space,true), Constant(' ('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#381:Symantec:14", "nwparser.payload", "Symantec AntiVirus services failed to start. %{space->} (%{resultcode})", processor_chain([ +var part566 = match("MESSAGE#381:Symantec:14", "nwparser.payload", "Symantec AntiVirus services failed to start. %{space->} (%{resultcode})", processor_chain([ dup86, dup12, dup13, @@ -10810,8 +10054,7 @@ match("MESSAGE#381:Symantec:14", "nwparser.payload", "Symantec AntiVirus service var msg450 = msg("Symantec:14", part566); -var part567 = // "Pattern{Constant('Symantec Endpoint Protection services failed to start. '), Field(space,true), Constant(' ('), Field(resultcode,false), Constant(')')}" -match("MESSAGE#382:Symantec:19", "nwparser.payload", "Symantec Endpoint Protection services failed to start. %{space->} (%{resultcode})", processor_chain([ +var part567 = match("MESSAGE#382:Symantec:19", "nwparser.payload", "Symantec Endpoint Protection services failed to start. %{space->} (%{resultcode})", processor_chain([ dup86, dup12, dup13, @@ -10822,8 +10065,7 @@ match("MESSAGE#382:Symantec:19", "nwparser.payload", "Symantec Endpoint Protecti var msg451 = msg("Symantec:19", part567); -var part568 = // "Pattern{Constant('Symantec Endpoint Protection Manager server started with trial license.'), Field(,false)}" -match("MESSAGE#383:Symantec:21", "nwparser.payload", "Symantec Endpoint Protection Manager server started with trial license.%{}", processor_chain([ +var part568 = match("MESSAGE#383:Symantec:21", "nwparser.payload", "Symantec Endpoint Protection Manager server started with trial license.%{}", processor_chain([ dup43, dup15, setc("event_description","Symantec Endpoint Protection Manager server started with trial license."), @@ -10831,8 +10073,7 @@ match("MESSAGE#383:Symantec:21", "nwparser.payload", "Symantec Endpoint Protecti var msg452 = msg("Symantec:21", part568); -var part569 = // "Pattern{Constant('Symantec trial license has expired.'), Field(,false)}" -match("MESSAGE#384:Symantec:22", "nwparser.payload", "Symantec trial license has expired.%{}", processor_chain([ +var part569 = match("MESSAGE#384:Symantec:22", "nwparser.payload", "Symantec trial license has expired.%{}", processor_chain([ dup259, dup15, setc("event_description","Symantec trial license has expired."), @@ -10840,8 +10081,7 @@ match("MESSAGE#384:Symantec:22", "nwparser.payload", "Symantec trial license has var msg453 = msg("Symantec:22", part569); -var part570 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',Symantec Endpoint Protection,"Reputation check timed out during unproven file evaluation, likely due to network delays."')}" -match("MESSAGE#385:Symantec:23", "nwparser.payload", "Category: %{fld22},Symantec Endpoint Protection,\"Reputation check timed out during unproven file evaluation, likely due to network delays.\"", processor_chain([ +var part570 = match("MESSAGE#385:Symantec:23", "nwparser.payload", "Category: %{fld22},Symantec Endpoint Protection,\"Reputation check timed out during unproven file evaluation, likely due to network delays.\"", processor_chain([ dup259, dup12, dup13, @@ -10851,8 +10091,7 @@ match("MESSAGE#385:Symantec:23", "nwparser.payload", "Category: %{fld22},Symante var msg454 = msg("Symantec:23", part570); -var part571 = // "Pattern{Constant('Symantec Endpoint Protection Lotus Notes E-mail Auto-Protect Disabled'), Field(,false)}" -match("MESSAGE#386:Symantec:24", "nwparser.payload", "Symantec Endpoint Protection Lotus Notes E-mail Auto-Protect Disabled%{}", processor_chain([ +var part571 = match("MESSAGE#386:Symantec:24", "nwparser.payload", "Symantec Endpoint Protection Lotus Notes E-mail Auto-Protect Disabled%{}", processor_chain([ dup43, dup12, dup13, @@ -10862,8 +10101,7 @@ match("MESSAGE#386:Symantec:24", "nwparser.payload", "Symantec Endpoint Protecti var msg455 = msg("Symantec:24", part571); -var part572 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',Symantec AntiVirus,[Antivirus advanced heuristic detection submission] Submitting file to Symantec failed. File : ''), Field(filename,false), Constant(''.')}" -match("MESSAGE#387:Symantec:25", "nwparser.payload", "Category: %{fld22},Symantec AntiVirus,[Antivirus advanced heuristic detection submission] Submitting file to Symantec failed. File : '%{filename}'.", processor_chain([ +var part572 = match("MESSAGE#387:Symantec:25", "nwparser.payload", "Category: %{fld22},Symantec AntiVirus,[Antivirus advanced heuristic detection submission] Submitting file to Symantec failed. File : '%{filename}'.", processor_chain([ dup43, dup12, dup13, @@ -10878,11 +10116,9 @@ var select104 = linear_select([ dup262, ]); -var part573 = // "Pattern{Field(,false), Constant('advanced heuristic detection submission] Submitting information to Symantec about file failed. File : ''), Field(filename,false), Constant(''.'), Field(p0,false)}" -match("MESSAGE#388:Symantec:26/2", "nwparser.p0", "%{}advanced heuristic detection submission] Submitting information to Symantec about file failed. File : '%{filename}'.%{p0}"); +var part573 = match("MESSAGE#388:Symantec:26/2", "nwparser.p0", "%{}advanced heuristic detection submission] Submitting information to Symantec about file failed. File : '%{filename}'.%{p0}"); -var part574 = // "Pattern{Constant(' Network error : ''), Field(fld56,false), Constant(''.,Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#388:Symantec:26/3_0", "nwparser.p0", " Network error : '%{fld56}'.,Event time: %{fld17->} %{fld18}"); +var part574 = match("MESSAGE#388:Symantec:26/3_0", "nwparser.p0", " Network error : '%{fld56}'.,Event time: %{fld17->} %{fld18}"); var select105 = linear_select([ part574, @@ -10909,8 +10145,7 @@ var all159 = all_match({ var msg457 = msg("Symantec:26", all159); -var part575 = // "Pattern{Field(,false), Constant('submission] Information submitted to Symantec about file. File : ''), Field(filename,false), Constant('','), Field(p0,false)}" -match("MESSAGE#389:Symantec:39/4", "nwparser.p0", "%{}submission] Information submitted to Symantec about file. File : '%{filename}',%{p0}"); +var part575 = match("MESSAGE#389:Symantec:39/4", "nwparser.p0", "%{}submission] Information submitted to Symantec about file. File : '%{filename}',%{p0}"); var all160 = all_match({ processors: [ @@ -10933,8 +10168,7 @@ var all160 = all_match({ var msg458 = msg("Symantec:39", all160); -var part576 = // "Pattern{Field(,false), Constant('submission] File submitted to Symantec for analysis. File : ''), Field(filename,false), Constant('','), Field(p0,false)}" -match("MESSAGE#390:Symantec:40/4", "nwparser.p0", "%{}submission] File submitted to Symantec for analysis. File : '%{filename}',%{p0}"); +var part576 = match("MESSAGE#390:Symantec:40/4", "nwparser.p0", "%{}submission] File submitted to Symantec for analysis. File : '%{filename}',%{p0}"); var all161 = all_match({ processors: [ @@ -10957,8 +10191,7 @@ var all161 = all_match({ var msg459 = msg("Symantec:40", all161); -var part577 = // "Pattern{Constant('Symantec Endpoint Protection Manager server started with paid license.'), Field(,false)}" -match("MESSAGE#391:Symantec:27", "nwparser.payload", "Symantec Endpoint Protection Manager server started with paid license.%{}", processor_chain([ +var part577 = match("MESSAGE#391:Symantec:27", "nwparser.payload", "Symantec Endpoint Protection Manager server started with paid license.%{}", processor_chain([ dup43, dup12, dup13, @@ -10968,8 +10201,7 @@ match("MESSAGE#391:Symantec:27", "nwparser.payload", "Symantec Endpoint Protecti var msg460 = msg("Symantec:27", part577); -var part578 = // "Pattern{Constant('Uninstalling Symantec Management Client....'), Field(,false)}" -match("MESSAGE#392:Symantec:28", "nwparser.payload", "Uninstalling Symantec Management Client....%{}", processor_chain([ +var part578 = match("MESSAGE#392:Symantec:28", "nwparser.payload", "Uninstalling Symantec Management Client....%{}", processor_chain([ dup43, dup12, dup13, @@ -10979,8 +10211,7 @@ match("MESSAGE#392:Symantec:28", "nwparser.payload", "Uninstalling Symantec Mana var msg461 = msg("Symantec:28", part578); -var part579 = // "Pattern{Constant('Category: 2,Symantec Endpoint Protection,SONAR has generated an error: code '), Field(resultcode,false), Constant(': description: '), Field(result,false)}" -match("MESSAGE#393:Symantec:29", "nwparser.payload", "Category: 2,Symantec Endpoint Protection,SONAR has generated an error: code %{resultcode}: description: %{result}", processor_chain([ +var part579 = match("MESSAGE#393:Symantec:29", "nwparser.payload", "Category: 2,Symantec Endpoint Protection,SONAR has generated an error: code %{resultcode}: description: %{result}", processor_chain([ dup43, dup12, dup13, @@ -10991,8 +10222,7 @@ match("MESSAGE#393:Symantec:29", "nwparser.payload", "Category: 2,Symantec Endpo var msg462 = msg("Symantec:29", part579); -var part580 = // "Pattern{Constant('Symantec Endpoint Protection cannot connect to Symantec Endpoint Protection Manager. '), Field(result,false), Constant('.')}" -match("MESSAGE#394:Symantec:30", "nwparser.payload", "Symantec Endpoint Protection cannot connect to Symantec Endpoint Protection Manager. %{result}.", processor_chain([ +var part580 = match("MESSAGE#394:Symantec:30", "nwparser.payload", "Symantec Endpoint Protection cannot connect to Symantec Endpoint Protection Manager. %{result}.", processor_chain([ dup43, dup12, dup13, @@ -11004,8 +10234,7 @@ match("MESSAGE#394:Symantec:30", "nwparser.payload", "Symantec Endpoint Protecti var msg463 = msg("Symantec:30", part580); -var part581 = // "Pattern{Constant('The Symantec Endpoint Protection is unable to communicate with the Symantec Endpoint Protection Manager.'), Field(,false)}" -match("MESSAGE#395:Symantec:31", "nwparser.payload", "The Symantec Endpoint Protection is unable to communicate with the Symantec Endpoint Protection Manager.%{}", processor_chain([ +var part581 = match("MESSAGE#395:Symantec:31", "nwparser.payload", "The Symantec Endpoint Protection is unable to communicate with the Symantec Endpoint Protection Manager.%{}", processor_chain([ dup43, dup12, dup13, @@ -11017,8 +10246,7 @@ match("MESSAGE#395:Symantec:31", "nwparser.payload", "The Symantec Endpoint Prot var msg464 = msg("Symantec:31", part581); -var part582 = // "Pattern{Constant('The Symantec Endpoint Protection is unable to download the newest policy from the Symantec Endpoint Protection Manager.'), Field(,false)}" -match("MESSAGE#396:Symantec:32", "nwparser.payload", "The Symantec Endpoint Protection is unable to download the newest policy from the Symantec Endpoint Protection Manager.%{}", processor_chain([ +var part582 = match("MESSAGE#396:Symantec:32", "nwparser.payload", "The Symantec Endpoint Protection is unable to download the newest policy from the Symantec Endpoint Protection Manager.%{}", processor_chain([ dup43, dup12, dup13, @@ -11028,8 +10256,7 @@ match("MESSAGE#396:Symantec:32", "nwparser.payload", "The Symantec Endpoint Prot var msg465 = msg("Symantec:32", part582); -var part583 = // "Pattern{Constant('Category: 2,Symantec Endpoint Protection,SymELAM Protection has been enabled'), Field(p0,false)}" -match("MESSAGE#397:Symantec:36/0", "nwparser.payload", "Category: 2,Symantec Endpoint Protection,SymELAM Protection has been enabled%{p0}"); +var part583 = match("MESSAGE#397:Symantec:36/0", "nwparser.payload", "Category: 2,Symantec Endpoint Protection,SymELAM Protection has been enabled%{p0}"); var all162 = all_match({ processors: [ @@ -11048,8 +10275,7 @@ var all162 = all_match({ var msg466 = msg("Symantec:36", all162); -var part584 = // "Pattern{Constant('Category: 2,Symantec Endpoint Protection,SONAR has been enabled'), Field(p0,false)}" -match("MESSAGE#398:Symantec:37/0", "nwparser.payload", "Category: 2,Symantec Endpoint Protection,SONAR has been enabled%{p0}"); +var part584 = match("MESSAGE#398:Symantec:37/0", "nwparser.payload", "Category: 2,Symantec Endpoint Protection,SONAR has been enabled%{p0}"); var all163 = all_match({ processors: [ @@ -11068,8 +10294,7 @@ var all163 = all_match({ var msg467 = msg("Symantec:37", all163); -var part585 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',Symantec Endpoint Protection,SONAR has been disabled')}" -match("MESSAGE#401:Symantec:41", "nwparser.payload", "Category: %{fld22},Symantec Endpoint Protection,SONAR has been disabled", processor_chain([ +var part585 = match("MESSAGE#401:Symantec:41", "nwparser.payload", "Category: %{fld22},Symantec Endpoint Protection,SONAR has been disabled", processor_chain([ dup43, dup56, dup12, @@ -11080,8 +10305,7 @@ match("MESSAGE#401:Symantec:41", "nwparser.payload", "Category: %{fld22},Symante var msg468 = msg("Symantec:41", part585); -var part586 = // "Pattern{Constant('Symantec Endpoint Protection Internet E-mail Auto-Protect Disabled,Event time: '), Field(event_time_string,false)}" -match("MESSAGE#403:Symantec:44", "nwparser.payload", "Symantec Endpoint Protection Internet E-mail Auto-Protect Disabled,Event time: %{event_time_string}", processor_chain([ +var part586 = match("MESSAGE#403:Symantec:44", "nwparser.payload", "Symantec Endpoint Protection Internet E-mail Auto-Protect Disabled,Event time: %{event_time_string}", processor_chain([ dup43, dup12, dup13, @@ -11091,8 +10315,7 @@ match("MESSAGE#403:Symantec:44", "nwparser.payload", "Symantec Endpoint Protecti var msg469 = msg("Symantec:44", part586); -var part587 = // "Pattern{Constant('Symantec Network Access Control is overdeployed'), Field(,false)}" -match("MESSAGE#511:Server:02", "nwparser.payload", "Symantec Network Access Control is overdeployed%{}", processor_chain([ +var part587 = match("MESSAGE#511:Server:02", "nwparser.payload", "Symantec Network Access Control is overdeployed%{}", processor_chain([ dup86, dup12, dup222, @@ -11102,8 +10325,7 @@ match("MESSAGE#511:Server:02", "nwparser.payload", "Symantec Network Access Cont var msg470 = msg("Server:02", part587); -var part588 = // "Pattern{Constant('Symantec Endpoint Protection is overdeployed'), Field(,false)}" -match("MESSAGE#513:Server:04", "nwparser.payload", "Symantec Endpoint Protection is overdeployed%{}", processor_chain([ +var part588 = match("MESSAGE#513:Server:04", "nwparser.payload", "Symantec Endpoint Protection is overdeployed%{}", processor_chain([ dup86, dup12, dup222, @@ -11114,8 +10336,7 @@ match("MESSAGE#513:Server:04", "nwparser.payload", "Symantec Endpoint Protection var msg471 = msg("Server:04", part588); -var part589 = // "Pattern{Constant('Symantec Endpoint Protection Manager could not update '), Field(application,false), Constant('.')}" -match("MESSAGE#688:Symantec:34", "nwparser.payload", "Symantec Endpoint Protection Manager could not update %{application}.", processor_chain([ +var part589 = match("MESSAGE#688:Symantec:34", "nwparser.payload", "Symantec Endpoint Protection Manager could not update %{application}.", processor_chain([ dup43, dup14, dup15, @@ -11124,20 +10345,15 @@ match("MESSAGE#688:Symantec:34", "nwparser.payload", "Symantec Endpoint Protecti var msg472 = msg("Symantec:34", part589); -var part590 = // "Pattern{Field(event_description,false), Constant('. File : '), Field(filename,false), Constant(', Size (bytes): '), Field(filename_size,false), Constant('.",Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#689:Symantec:35/0_0", "nwparser.payload", "%{event_description}. File : %{filename}, Size (bytes): %{filename_size}.\",Event time:%{fld17->} %{fld18}"); +var part590 = match("MESSAGE#689:Symantec:35/0_0", "nwparser.payload", "%{event_description}. File : %{filename}, Size (bytes): %{filename_size}.\",Event time:%{fld17->} %{fld18}"); -var part591 = // "Pattern{Field(event_description,false), Constant('. File : '), Field(filename,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#689:Symantec:35/0_1", "nwparser.payload", "%{event_description}. File : %{filename},Event time:%{fld17->} %{fld18}"); +var part591 = match("MESSAGE#689:Symantec:35/0_1", "nwparser.payload", "%{event_description}. File : %{filename},Event time:%{fld17->} %{fld18}"); -var part592 = // "Pattern{Field(event_description,false), Constant('.,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#689:Symantec:35/0_2", "nwparser.payload", "%{event_description}.,Event time:%{fld17->} %{fld18}"); +var part592 = match("MESSAGE#689:Symantec:35/0_2", "nwparser.payload", "%{event_description}.,Event time:%{fld17->} %{fld18}"); -var part593 = // "Pattern{Field(event_description,false), Constant('Operating System: '), Field(os,false), Constant('Network info:'), Field(info,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#689:Symantec:35/0_3", "nwparser.payload", "%{event_description}Operating System: %{os}Network info:%{info},Event time:%{fld17->} %{fld18}"); +var part593 = match("MESSAGE#689:Symantec:35/0_3", "nwparser.payload", "%{event_description}Operating System: %{os}Network info:%{info},Event time:%{fld17->} %{fld18}"); -var part594 = // "Pattern{Field(event_description,false), Constant('.')}" -match("MESSAGE#689:Symantec:35/0_4", "nwparser.payload", "%{event_description}."); +var part594 = match("MESSAGE#689:Symantec:35/0_4", "nwparser.payload", "%{event_description}."); var select106 = linear_select([ part590, @@ -11163,8 +10379,7 @@ var all164 = all_match({ var msg473 = msg("Symantec:35", all164); -var part595 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',Symantec Endpoint Protection,'), Field(event_description,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#690:Symantec:45", "nwparser.payload", "Category: %{fld22},Symantec Endpoint Protection,%{event_description},Event time:%{fld17->} %{fld18}", processor_chain([ +var part595 = match("MESSAGE#690:Symantec:45", "nwparser.payload", "Category: %{fld22},Symantec Endpoint Protection,%{event_description},Event time:%{fld17->} %{fld18}", processor_chain([ dup43, dup12, dup13, @@ -11174,8 +10389,7 @@ match("MESSAGE#690:Symantec:45", "nwparser.payload", "Category: %{fld22},Symante var msg474 = msg("Symantec:45", part595); -var part596 = // "Pattern{Field(event_description,false)}" -match_copy("MESSAGE#691:Server:05", "nwparser.payload", "event_description", processor_chain([ +var part596 = match_copy("MESSAGE#691:Server:05", "nwparser.payload", "event_description", processor_chain([ dup53, dup12, dup222, @@ -11234,8 +10448,7 @@ var select107 = linear_select([ msg475, ]); -var part597 = // "Pattern{Constant('Suspicious Behavior Detection has been '), Field(fld2,false), Constant(',Event time: '), Field(event_time_string,false)}" -match("MESSAGE#402:Symantec:43", "nwparser.payload", "Suspicious Behavior Detection has been %{fld2},Event time: %{event_time_string}", processor_chain([ +var part597 = match("MESSAGE#402:Symantec:43", "nwparser.payload", "Suspicious Behavior Detection has been %{fld2},Event time: %{event_time_string}", processor_chain([ dup43, dup12, dup13, @@ -11253,8 +10466,7 @@ match("MESSAGE#402:Symantec:43", "nwparser.payload", "Suspicious Behavior Detect var msg476 = msg("Symantec:43", part597); -var part598 = // "Pattern{Constant('System has been restarted '), Field(info,false), Constant('.')}" -match("MESSAGE#404:System", "nwparser.payload", "System has been restarted %{info}.", processor_chain([ +var part598 = match("MESSAGE#404:System", "nwparser.payload", "System has been restarted %{info}.", processor_chain([ dup53, dup12, dup13, @@ -11265,8 +10477,7 @@ match("MESSAGE#404:System", "nwparser.payload", "System has been restarted %{inf var msg477 = msg("System", part598); -var part599 = // "Pattern{Constant('System client-server activity logs have been swept.'), Field(,false)}" -match("MESSAGE#405:System:01", "nwparser.payload", "System client-server activity logs have been swept.%{}", processor_chain([ +var part599 = match("MESSAGE#405:System:01", "nwparser.payload", "System client-server activity logs have been swept.%{}", processor_chain([ dup53, dup12, dup13, @@ -11277,8 +10488,7 @@ match("MESSAGE#405:System:01", "nwparser.payload", "System client-server activit var msg478 = msg("System:01", part599); -var part600 = // "Pattern{Constant('System server activity logs have been swept.'), Field(,false)}" -match("MESSAGE#406:System:02", "nwparser.payload", "System server activity logs have been swept.%{}", processor_chain([ +var part600 = match("MESSAGE#406:System:02", "nwparser.payload", "System server activity logs have been swept.%{}", processor_chain([ dup53, dup12, dup13, @@ -11289,8 +10499,7 @@ match("MESSAGE#406:System:02", "nwparser.payload", "System server activity logs var msg479 = msg("System:02", part600); -var part601 = // "Pattern{Constant('System administrative logs have been swept.'), Field(,false)}" -match("MESSAGE#407:System:03", "nwparser.payload", "System administrative logs have been swept.%{}", processor_chain([ +var part601 = match("MESSAGE#407:System:03", "nwparser.payload", "System administrative logs have been swept.%{}", processor_chain([ dup53, dup12, dup13, @@ -11301,8 +10510,7 @@ match("MESSAGE#407:System:03", "nwparser.payload", "System administrative logs h var msg480 = msg("System:03", part601); -var part602 = // "Pattern{Constant('System enforcer activity logs have been swept.'), Field(,false)}" -match("MESSAGE#408:System:04", "nwparser.payload", "System enforcer activity logs have been swept.%{}", processor_chain([ +var part602 = match("MESSAGE#408:System:04", "nwparser.payload", "System enforcer activity logs have been swept.%{}", processor_chain([ dup53, dup14, dup15, @@ -11311,8 +10519,7 @@ match("MESSAGE#408:System:04", "nwparser.payload", "System enforcer activity log var msg481 = msg("System:04", part602); -var part603 = // "Pattern{Constant('System administrator "'), Field(username,false), Constant('" was added')}" -match("MESSAGE#409:System:05", "nwparser.payload", "System administrator \"%{username}\" was added", processor_chain([ +var part603 = match("MESSAGE#409:System:05", "nwparser.payload", "System administrator \"%{username}\" was added", processor_chain([ dup53, dup12, dup13, @@ -11331,16 +10538,14 @@ var select108 = linear_select([ msg482, ]); -var part604 = // "Pattern{Constant('- Caller MD5='), Field(fld6,false), Constant(','), Field(p0,false)}" -match("MESSAGE#410:Terminated/0_0", "nwparser.payload", "- Caller MD5=%{fld6},%{p0}"); +var part604 = match("MESSAGE#410:Terminated/0_0", "nwparser.payload", "- Caller MD5=%{fld6},%{p0}"); var select109 = linear_select([ part604, dup269, ]); -var part605 = // "Pattern{Field(action,false), Constant(',Begin:'), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End:'), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule:'), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User:'), Field(username,false), Constant(',Domain:'), Field(domain,false), Constant(',Action Type:'), Field(fld45,false), Constant(',File size (bytes):'), Field(filename_size,false), Constant(',Device ID:'), Field(device,false)}" -match("MESSAGE#410:Terminated/1", "nwparser.p0", "%{action},Begin:%{fld50->} %{fld52},End:%{fld51->} %{fld53},Rule:%{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User:%{username},Domain:%{domain},Action Type:%{fld45},File size (bytes):%{filename_size},Device ID:%{device}"); +var part605 = match("MESSAGE#410:Terminated/1", "nwparser.p0", "%{action},Begin:%{fld50->} %{fld52},End:%{fld51->} %{fld53},Rule:%{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User:%{username},Domain:%{domain},Action Type:%{fld45},File size (bytes):%{filename_size},Device ID:%{device}"); var all165 = all_match({ processors: [ @@ -11363,20 +10568,15 @@ var all165 = all_match({ var msg483 = msg("Terminated", all165); -var part606 = // "Pattern{Constant('Compliance '), Field(p0,false)}" -match("MESSAGE#411:Compliance/0", "nwparser.payload", "Compliance %{p0}"); +var part606 = match("MESSAGE#411:Compliance/0", "nwparser.payload", "Compliance %{p0}"); -var part607 = // "Pattern{Constant('server '), Field(p0,false)}" -match("MESSAGE#411:Compliance/1_0", "nwparser.p0", "server %{p0}"); +var part607 = match("MESSAGE#411:Compliance/1_0", "nwparser.p0", "server %{p0}"); -var part608 = // "Pattern{Constant('client '), Field(p0,false)}" -match("MESSAGE#411:Compliance/1_1", "nwparser.p0", "client %{p0}"); +var part608 = match("MESSAGE#411:Compliance/1_1", "nwparser.p0", "client %{p0}"); -var part609 = // "Pattern{Constant('traffic '), Field(p0,false)}" -match("MESSAGE#411:Compliance/1_2", "nwparser.p0", "traffic %{p0}"); +var part609 = match("MESSAGE#411:Compliance/1_2", "nwparser.p0", "traffic %{p0}"); -var part610 = // "Pattern{Constant('criteria '), Field(p0,false)}" -match("MESSAGE#411:Compliance/1_3", "nwparser.p0", "criteria %{p0}"); +var part610 = match("MESSAGE#411:Compliance/1_3", "nwparser.p0", "criteria %{p0}"); var select110 = linear_select([ part607, @@ -11385,8 +10585,7 @@ var select110 = linear_select([ part610, ]); -var part611 = // "Pattern{Constant('logs have been swept.'), Field(,false)}" -match("MESSAGE#411:Compliance/2", "nwparser.p0", "logs have been swept.%{}"); +var part611 = match("MESSAGE#411:Compliance/2", "nwparser.p0", "logs have been swept.%{}"); var all166 = all_match({ processors: [ @@ -11404,8 +10603,7 @@ var all166 = all_match({ var msg484 = msg("Compliance", all166); -var part612 = // "Pattern{Constant('Download started.'), Field(,false)}" -match("MESSAGE#412:Download", "nwparser.payload", "Download started.%{}", processor_chain([ +var part612 = match("MESSAGE#412:Download", "nwparser.payload", "Download started.%{}", processor_chain([ dup43, dup14, dup15, @@ -11414,8 +10612,7 @@ match("MESSAGE#412:Download", "nwparser.payload", "Download started.%{}", proces var msg485 = msg("Download", part612); -var part613 = // "Pattern{Constant('Traffic from IP address '), Field(hostip,true), Constant(' is blocked from '), Field(fld14,true), Constant(' to '), Field(fld15,false), Constant('.,Local: '), Field(daddr,false), Constant(',Local: '), Field(fld16,false), Constant(',Remote: '), Field(fld17,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld18,false), Constant(',Inbound,'), Field(fld19,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld10,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#413:Traffic", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld14->} to %{fld15}.,Local: %{daddr},Local: %{fld16},Remote: %{fld17},Remote: %{saddr},Remote: %{fld18},Inbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld10},User: %{username},Domain: %{domain}", processor_chain([ +var part613 = match("MESSAGE#413:Traffic", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld14->} to %{fld15}.,Local: %{daddr},Local: %{fld16},Remote: %{fld17},Remote: %{saddr},Remote: %{fld18},Inbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld10},User: %{username},Domain: %{domain}", processor_chain([ dup11, dup12, dup13, @@ -11430,8 +10627,7 @@ match("MESSAGE#413:Traffic", "nwparser.payload", "Traffic from IP address %{host var msg486 = msg("Traffic", part613); -var part614 = // "Pattern{Constant('Traffic from IP address '), Field(hostip,true), Constant(' is blocked from '), Field(fld14,true), Constant(' to '), Field(fld15,false), Constant('.,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld16,false), Constant(',Remote: '), Field(fld17,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld18,false), Constant(',Outbound,'), Field(fld19,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld10,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#414:Traffic:11", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld14->} to %{fld15}.,Local: %{saddr},Local: %{fld16},Remote: %{fld17},Remote: %{daddr},Remote: %{fld18},Outbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld10},User: %{username},Domain: %{domain}", processor_chain([ +var part614 = match("MESSAGE#414:Traffic:11", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld14->} to %{fld15}.,Local: %{saddr},Local: %{fld16},Remote: %{fld17},Remote: %{daddr},Remote: %{fld18},Outbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld10},User: %{username},Domain: %{domain}", processor_chain([ dup11, dup12, dup13, @@ -11446,8 +10642,7 @@ match("MESSAGE#414:Traffic:11", "nwparser.payload", "Traffic from IP address %{h var msg487 = msg("Traffic:11", part614); -var part615 = // "Pattern{Constant('Traffic from IP address '), Field(hostip,true), Constant(' is blocked from '), Field(fld1,true), Constant(' to '), Field(fld2,false), Constant('. ,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',1,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#415:Traffic:01", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld1->} to %{fld2}. ,Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},1,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain}", processor_chain([ +var part615 = match("MESSAGE#415:Traffic:01", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld1->} to %{fld2}. ,Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},1,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain}", processor_chain([ dup11, dup12, dup13, @@ -11461,8 +10656,7 @@ match("MESSAGE#415:Traffic:01", "nwparser.payload", "Traffic from IP address %{h var msg488 = msg("Traffic:01", part615); -var part616 = // "Pattern{Constant('Traffic from IP address '), Field(hostip,true), Constant(' is blocked from '), Field(fld1,true), Constant(' to '), Field(fld2,false), Constant('. ,Local: '), Field(daddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Inbound,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#416:Traffic:02/0", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld1->} to %{fld2}. ,Local: %{daddr},Local: %{fld3},Remote: %{fld4},Remote: %{saddr},Remote: %{fld5},Inbound,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part616 = match("MESSAGE#416:Traffic:02/0", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld1->} to %{fld2}. ,Local: %{daddr},Local: %{fld3},Remote: %{fld4},Remote: %{saddr},Remote: %{fld5},Inbound,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); var all167 = all_match({ processors: [ @@ -11486,8 +10680,7 @@ var all167 = all_match({ var msg489 = msg("Traffic:02", all167); -var part617 = // "Pattern{Constant('Traffic from IP address '), Field(hostip,true), Constant(' is blocked from '), Field(fld1,true), Constant(' to '), Field(fld2,false), Constant('. ,Local: '), Field(saddr,false), Constant(',Local: '), Field(fld3,false), Constant(',Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Outbound,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#417:Traffic:12/0", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld1->} to %{fld2}. ,Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Outbound,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part617 = match("MESSAGE#417:Traffic:12/0", "nwparser.payload", "Traffic from IP address %{hostip->} is blocked from %{fld1->} to %{fld2}. ,Local: %{saddr},Local: %{fld3},Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Outbound,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); var all168 = all_match({ processors: [ @@ -11511,8 +10704,7 @@ var all168 = all_match({ var msg490 = msg("Traffic:12", all168); -var part618 = // "Pattern{Field(fld1,true), Constant(' Traffic Redirection disabled.,Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#717:Traffic:13", "nwparser.payload", "%{fld1->} Traffic Redirection disabled.,Event time: %{fld17->} %{fld18}", processor_chain([ +var part618 = match("MESSAGE#717:Traffic:13", "nwparser.payload", "%{fld1->} Traffic Redirection disabled.,Event time: %{fld17->} %{fld18}", processor_chain([ dup86, dup12, dup13, @@ -11523,8 +10715,7 @@ match("MESSAGE#717:Traffic:13", "nwparser.payload", "%{fld1->} Traffic Redirecti var msg491 = msg("Traffic:13", part618); -var part619 = // "Pattern{Field(fld1,true), Constant(' Traffic Redirection is malfunctioning.,Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#718:Traffic:14", "nwparser.payload", "%{fld1->} Traffic Redirection is malfunctioning.,Event time: %{fld17->} %{fld18}", processor_chain([ +var part619 = match("MESSAGE#718:Traffic:14", "nwparser.payload", "%{fld1->} Traffic Redirection is malfunctioning.,Event time: %{fld17->} %{fld18}", processor_chain([ dup86, dup12, dup13, @@ -11545,8 +10736,7 @@ var select111 = linear_select([ msg492, ]); -var part620 = // "Pattern{Constant('TruScan has generated an error: code '), Field(resultcode,false), Constant(': description: '), Field(info,false)}" -match("MESSAGE#418:TruScan", "nwparser.payload", "TruScan has generated an error: code %{resultcode}: description: %{info}", processor_chain([ +var part620 = match("MESSAGE#418:TruScan", "nwparser.payload", "TruScan has generated an error: code %{resultcode}: description: %{info}", processor_chain([ dup168, dup12, dup13, @@ -11557,11 +10747,9 @@ match("MESSAGE#418:TruScan", "nwparser.payload", "TruScan has generated an error var msg493 = msg("TruScan", part620); -var part621 = // "Pattern{Constant('Forced TruScan proactive threat detected,Computer name: '), Field(p0,false)}" -match("MESSAGE#419:TruScan:01/0", "nwparser.payload", "Forced TruScan proactive threat detected,Computer name: %{p0}"); +var part621 = match("MESSAGE#419:TruScan:01/0", "nwparser.payload", "Forced TruScan proactive threat detected,Computer name: %{p0}"); -var part622 = // "Pattern{Field(fld1,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version: '), Field(version,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld13,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld6,false), Constant(',Detection score: '), Field(fld7,false), Constant(',Submission recommendation: '), Field(fld8,false), Constant(',Permitted application reason: '), Field(fld9,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(',"'), Field(fld12,false), Constant('",Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld15,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#419:TruScan:01/2", "nwparser.p0", "%{fld1},Application name: %{application},Application type: %{obj_type},Application version: %{version},Hash type: %{encryption_type},Application hash: %{checksum},Company name: %{fld13},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score: %{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},\"%{fld12}\",Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld15},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part622 = match("MESSAGE#419:TruScan:01/2", "nwparser.p0", "%{fld1},Application name: %{application},Application type: %{obj_type},Application version: %{version},Hash type: %{encryption_type},Application hash: %{checksum},Company name: %{fld13},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score: %{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},\"%{fld12}\",Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld15},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); var all169 = all_match({ processors: [ @@ -11591,14 +10779,11 @@ var all169 = all_match({ var msg494 = msg("TruScan:01", all169); -var part623 = // "Pattern{Constant('TruScan '), Field(info,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#420:TruScan:update/0", "nwparser.payload", "TruScan %{info->} %{p0}"); +var part623 = match("MESSAGE#420:TruScan:update/0", "nwparser.payload", "TruScan %{info->} %{p0}"); -var part624 = // "Pattern{Constant('was successfully updated'), Field(,false)}" -match("MESSAGE#420:TruScan:update/1_0", "nwparser.p0", "was successfully updated%{}"); +var part624 = match("MESSAGE#420:TruScan:update/1_0", "nwparser.p0", "was successfully updated%{}"); -var part625 = // "Pattern{Constant('is up-to-date'), Field(,false)}" -match("MESSAGE#420:TruScan:update/1_1", "nwparser.p0", "is up-to-date%{}"); +var part625 = match("MESSAGE#420:TruScan:update/1_1", "nwparser.p0", "is up-to-date%{}"); var select112 = linear_select([ part624, @@ -11622,8 +10807,7 @@ var all170 = all_match({ var msg495 = msg("TruScan:update", all170); -var part626 = // "Pattern{Constant('TruScan '), Field(info,true), Constant(' failed to update.')}" -match("MESSAGE#421:TruScan:updatefailed", "nwparser.payload", "TruScan %{info->} failed to update.", processor_chain([ +var part626 = match("MESSAGE#421:TruScan:updatefailed", "nwparser.payload", "TruScan %{info->} failed to update.", processor_chain([ dup168, dup12, dup13, @@ -11641,8 +10825,7 @@ var select113 = linear_select([ msg496, ]); -var part627 = // "Pattern{Constant('Unexpected server error. ErrorCode: '), Field(resultcode,false)}" -match("MESSAGE#422:Unexpected", "nwparser.payload", "Unexpected server error. ErrorCode: %{resultcode}", processor_chain([ +var part627 = match("MESSAGE#422:Unexpected", "nwparser.payload", "Unexpected server error. ErrorCode: %{resultcode}", processor_chain([ dup43, dup12, dup13, @@ -11653,8 +10836,7 @@ match("MESSAGE#422:Unexpected", "nwparser.payload", "Unexpected server error. Er var msg497 = msg("Unexpected", part627); -var part628 = // "Pattern{Constant('Unexpected server error.'), Field(,false)}" -match("MESSAGE#423:Unexpected:01", "nwparser.payload", "Unexpected server error.%{}", processor_chain([ +var part628 = match("MESSAGE#423:Unexpected:01", "nwparser.payload", "Unexpected server error.%{}", processor_chain([ dup43, dup12, dup13, @@ -11670,8 +10852,7 @@ var select114 = linear_select([ msg498, ]); -var part629 = // "Pattern{Constant('Unsolicited incoming ARP reply detected,'), Field(info,false), Constant('",Local: '), Field(daddr,false), Constant(',Local: '), Field(fld16,false), Constant(',Remote: '), Field(fld17,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld18,false), Constant(',Inbound,'), Field(fld19,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld20,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#424:Unsolicited", "nwparser.payload", "Unsolicited incoming ARP reply detected,%{info}\",Local: %{daddr},Local: %{fld16},Remote: %{fld17},Remote: %{saddr},Remote: %{fld18},Inbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld20},User: %{username},Domain: %{domain}", processor_chain([ +var part629 = match("MESSAGE#424:Unsolicited", "nwparser.payload", "Unsolicited incoming ARP reply detected,%{info}\",Local: %{daddr},Local: %{fld16},Remote: %{fld17},Remote: %{saddr},Remote: %{fld18},Inbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld20},User: %{username},Domain: %{domain}", processor_chain([ dup11, dup12, dup13, @@ -11686,8 +10867,7 @@ match("MESSAGE#424:Unsolicited", "nwparser.payload", "Unsolicited incoming ARP r var msg499 = msg("Unsolicited", part629); -var part630 = // "Pattern{Constant('Unsolicited incoming ARP reply detected,'), Field(info,false), Constant('",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld16,false), Constant(',Remote: '), Field(fld17,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld18,false), Constant(',Outbound,'), Field(fld19,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld20,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#425:Unsolicited:01", "nwparser.payload", "Unsolicited incoming ARP reply detected,%{info}\",Local: %{saddr},Local: %{fld16},Remote: %{fld17},Remote: %{daddr},Remote: %{fld18},Outbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld20},User: %{username},Domain: %{domain}", processor_chain([ +var part630 = match("MESSAGE#425:Unsolicited:01", "nwparser.payload", "Unsolicited incoming ARP reply detected,%{info}\",Local: %{saddr},Local: %{fld16},Remote: %{fld17},Remote: %{daddr},Remote: %{fld18},Outbound,%{fld19},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld20},User: %{username},Domain: %{domain}", processor_chain([ dup11, dup12, dup13, @@ -11707,11 +10887,9 @@ var select115 = linear_select([ msg500, ]); -var part631 = // "Pattern{Constant('User is attempting to terminate Symantec Management Client'), Field(p0,false)}" -match("MESSAGE#426:User/0", "nwparser.payload", "User is attempting to terminate Symantec Management Client%{p0}"); +var part631 = match("MESSAGE#426:User/0", "nwparser.payload", "User is attempting to terminate Symantec Management Client%{p0}"); -var part632 = // "Pattern{Constant('....,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#426:User/1_0", "nwparser.p0", "....,Event time:%{fld17->} %{fld18}"); +var part632 = match("MESSAGE#426:User/1_0", "nwparser.p0", "....,Event time:%{fld17->} %{fld18}"); var select116 = linear_select([ part632, @@ -11736,8 +10914,7 @@ var all171 = all_match({ var msg501 = msg("User", all171); -var part633 = // "Pattern{Field(fld44,false), Constant(',User - Kernel Hook Error,'), Field(fld1,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(fld7,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#427:User:01", "nwparser.payload", "%{fld44},User - Kernel Hook Error,%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{fld4},%{fld5},%{fld6},%{fld7},User: %{username},Domain: %{domain}", processor_chain([ +var part633 = match("MESSAGE#427:User:01", "nwparser.payload", "%{fld44},User - Kernel Hook Error,%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{fld4},%{fld5},%{fld6},%{fld7},User: %{username},Domain: %{domain}", processor_chain([ dup171, dup12, dup13, @@ -11753,8 +10930,7 @@ match("MESSAGE#427:User:01", "nwparser.payload", "%{fld44},User - Kernel Hook Er var msg502 = msg("User:01", part633); -var part634 = // "Pattern{Constant('User has been created'), Field(,false)}" -match("MESSAGE#428:User:created", "nwparser.payload", "User has been created%{}", processor_chain([ +var part634 = match("MESSAGE#428:User:created", "nwparser.payload", "User has been created%{}", processor_chain([ dup170, dup12, dup13, @@ -11770,8 +10946,7 @@ match("MESSAGE#428:User:created", "nwparser.payload", "User has been created%{}" var msg503 = msg("User:created", part634); -var part635 = // "Pattern{Constant('User has been deleted'), Field(,false)}" -match("MESSAGE#429:User:deleted", "nwparser.payload", "User has been deleted%{}", processor_chain([ +var part635 = match("MESSAGE#429:User:deleted", "nwparser.payload", "User has been deleted%{}", processor_chain([ dup171, dup12, dup13, @@ -11794,11 +10969,9 @@ var select117 = linear_select([ msg504, ]); -var part636 = // "Pattern{Constant('Windows Version info: Operating System: '), Field(os,true), Constant(' Network info:'), Field(p0,false)}" -match("MESSAGE#446:Windows/0", "nwparser.payload", "Windows Version info: Operating System: %{os->} Network info:%{p0}"); +var part636 = match("MESSAGE#446:Windows/0", "nwparser.payload", "Windows Version info: Operating System: %{os->} Network info:%{p0}"); -var part637 = // "Pattern{Field(info,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#446:Windows/1_0", "nwparser.p0", "%{info},Event time:%{fld17->} %{fld18}"); +var part637 = match("MESSAGE#446:Windows/1_0", "nwparser.p0", "%{info},Event time:%{fld17->} %{fld18}"); var select118 = linear_select([ part637, @@ -11823,8 +10996,7 @@ var all172 = all_match({ var msg505 = msg("Windows", all172); -var part638 = // "Pattern{Constant('Windows Host Integrity Content '), Field(version,true), Constant(' was successfully updated.')}" -match("MESSAGE#447:Windows:01", "nwparser.payload", "Windows Host Integrity Content %{version->} was successfully updated.", processor_chain([ +var part638 = match("MESSAGE#447:Windows:01", "nwparser.payload", "Windows Host Integrity Content %{version->} was successfully updated.", processor_chain([ dup92, dup12, dup13, @@ -11840,8 +11012,7 @@ var select119 = linear_select([ msg506, ]); -var part639 = // "Pattern{Constant('"=======EXCEPTION:'), Field(event_description,false), Constant('"')}" -match("MESSAGE#448:\"=======EXCEPTION:", "nwparser.payload", "\"=======EXCEPTION:%{event_description}\"", processor_chain([ +var part639 = match("MESSAGE#448:\"=======EXCEPTION:", "nwparser.payload", "\"=======EXCEPTION:%{event_description}\"", processor_chain([ dup168, dup12, dup13, @@ -11851,8 +11022,7 @@ match("MESSAGE#448:\"=======EXCEPTION:", "nwparser.payload", "\"=======EXCEPTION var msg507 = msg("\"=======EXCEPTION:", part639); -var part640 = // "Pattern{Constant('Sysfer exception: '), Field(info,false), Constant(',Sysfer exception,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(filename,false), Constant(','), Field(fld4,false), Constant(','), Field(event_description,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld6,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#449:Allowed:08", "nwparser.payload", "Sysfer exception: %{info},Sysfer exception,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},%{event_description},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ +var part640 = match("MESSAGE#449:Allowed:08", "nwparser.payload", "Sysfer exception: %{info},Sysfer exception,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},%{event_description},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -11865,8 +11035,7 @@ match("MESSAGE#449:Allowed:08", "nwparser.payload", "Sysfer exception: %{info},S var msg508 = msg("Allowed:08", part640); -var part641 = // "Pattern{Constant('Sysfer exception: '), Field(info,false), Constant(',Sysfer exception,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(filename,false), Constant(','), Field(fld4,false), Constant(','), Field(event_description,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#450:Allowed", "nwparser.payload", "Sysfer exception: %{info},Sysfer exception,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},%{event_description},User: %{username},Domain: %{domain}", processor_chain([ +var part641 = match("MESSAGE#450:Allowed", "nwparser.payload", "Sysfer exception: %{info},Sysfer exception,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},%{event_description},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -11879,8 +11048,7 @@ match("MESSAGE#450:Allowed", "nwparser.payload", "Sysfer exception: %{info},Sysf var msg509 = msg("Allowed", part641); -var part642 = // "Pattern{Constant('"'), Field(filename,false), Constant('",'), Field(fld1,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld4,false), Constant(','), Field(process,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(info,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld8,false)}" -match("MESSAGE#451:Allowed:05", "nwparser.payload", "\"%{filename}\",%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ +var part642 = match("MESSAGE#451:Allowed:05", "nwparser.payload", "\"%{filename}\",%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ dup121, dup12, dup13, @@ -11893,8 +11061,7 @@ match("MESSAGE#451:Allowed:05", "nwparser.payload", "\"%{filename}\",%{fld1},Beg var msg510 = msg("Allowed:05", part642); -var part643 = // "Pattern{Constant('"'), Field(filename,false), Constant(','), Field(fld1,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld4,false), Constant(','), Field(process,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(info,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld8,false)}" -match("MESSAGE#452:Allowed:06", "nwparser.payload", "\"%{filename},%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ +var part643 = match("MESSAGE#452:Allowed:06", "nwparser.payload", "\"%{filename},%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ dup121, dup12, dup13, @@ -11907,8 +11074,7 @@ match("MESSAGE#452:Allowed:06", "nwparser.payload", "\"%{filename},%{fld1},Begin var msg511 = msg("Allowed:06", part643); -var part644 = // "Pattern{Constant('"'), Field(filename,false), Constant('",'), Field(fld1,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld4,false), Constant(','), Field(process,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(info,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#453:Allowed:01", "nwparser.payload", "\"%{filename}\",%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain}", processor_chain([ +var part644 = match("MESSAGE#453:Allowed:01", "nwparser.payload", "\"%{filename}\",%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -11921,11 +11087,9 @@ match("MESSAGE#453:Allowed:01", "nwparser.payload", "\"%{filename}\",%{fld1},Beg var msg512 = msg("Allowed:01", part644); -var part645 = // "Pattern{Field(fld1,false), Constant(',File Read,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(filename,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(directory,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(p0,false)}" -match("MESSAGE#454:Allowed:02/0", "nwparser.payload", "%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},No Module Name,%{directory},User: %{username},Domain: %{p0}"); +var part645 = match("MESSAGE#454:Allowed:02/0", "nwparser.payload", "%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},No Module Name,%{directory},User: %{username},Domain: %{p0}"); -var part646 = // "Pattern{Field(domain,false), Constant(',Action Type:'), Field(fld45,false), Constant(',File size (bytes):'), Field(filename_size,false), Constant(',Device ID:'), Field(device,false)}" -match("MESSAGE#454:Allowed:02/1_0", "nwparser.p0", "%{domain},Action Type:%{fld45},File size (bytes):%{filename_size},Device ID:%{device}"); +var part646 = match("MESSAGE#454:Allowed:02/1_0", "nwparser.p0", "%{domain},Action Type:%{fld45},File size (bytes):%{filename_size},Device ID:%{device}"); var select120 = linear_select([ part646, @@ -11954,22 +11118,18 @@ var all173 = all_match({ var msg513 = msg("Allowed:02", all173); -var part647 = // "Pattern{Constant('- Caller MD5='), Field(checksum,false), Constant(',File Write,Begin: '), Field(p0,false)}" -match("MESSAGE#455:Allowed:09/0_0", "nwparser.payload", "- Caller MD5=%{checksum},File Write,Begin: %{p0}"); +var part647 = match("MESSAGE#455:Allowed:09/0_0", "nwparser.payload", "- Caller MD5=%{checksum},File Write,Begin: %{p0}"); -var part648 = // "Pattern{Field(fld1,false), Constant(',File Write,Begin: '), Field(p0,false)}" -match("MESSAGE#455:Allowed:09/0_1", "nwparser.payload", "%{fld1},File Write,Begin: %{p0}"); +var part648 = match("MESSAGE#455:Allowed:09/0_1", "nwparser.payload", "%{fld1},File Write,Begin: %{p0}"); var select121 = linear_select([ part647, part648, ]); -var part649 = // "Pattern{Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(p0,false)}" -match("MESSAGE#455:Allowed:09/1", "nwparser.p0", "%{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); +var part649 = match("MESSAGE#455:Allowed:09/1", "nwparser.p0", "%{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); -var part650 = // "Pattern{Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld46,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#455:Allowed:09/3", "nwparser.p0", "%{username},Domain: %{domain},Action Type:%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); +var part650 = match("MESSAGE#455:Allowed:09/3", "nwparser.p0", "%{username},Domain: %{domain},Action Type:%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); var all174 = all_match({ processors: [ @@ -11994,8 +11154,7 @@ var all174 = all_match({ var msg514 = msg("Allowed:09", all174); -var part651 = // "Pattern{Field(fld1,false), Constant(',File Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(filename,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(directory,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld46,false)}" -match("MESSAGE#456:Allowed:03", "nwparser.payload", "%{fld1},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},No Module Name,%{directory},User: %{username},Domain: %{domain},Action Type:%{fld46}", processor_chain([ +var part651 = match("MESSAGE#456:Allowed:03", "nwparser.payload", "%{fld1},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},No Module Name,%{directory},User: %{username},Domain: %{domain},Action Type:%{fld46}", processor_chain([ dup121, dup12, dup13, @@ -12011,14 +11170,11 @@ match("MESSAGE#456:Allowed:03", "nwparser.payload", "%{fld1},File Write,Begin: % var msg515 = msg("Allowed:03", part651); -var part652 = // "Pattern{Constant('- Caller MD5='), Field(checksum,false), Constant(',File Delete,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(p0,false)}" -match("MESSAGE#457:Allowed:10/0", "nwparser.payload", "- Caller MD5=%{checksum},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); +var part652 = match("MESSAGE#457:Allowed:10/0", "nwparser.payload", "- Caller MD5=%{checksum},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); -var part653 = // "Pattern{Constant('User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(p0,false)}" -match("MESSAGE#457:Allowed:10/2", "nwparser.p0", "User: %{username},Domain: %{domain},Action Type:%{p0}"); +var part653 = match("MESSAGE#457:Allowed:10/2", "nwparser.p0", "User: %{username},Domain: %{domain},Action Type:%{p0}"); -var part654 = // "Pattern{Field(fld46,false)}" -match_copy("MESSAGE#457:Allowed:10/3_1", "nwparser.p0", "fld46"); +var part654 = match_copy("MESSAGE#457:Allowed:10/3_1", "nwparser.p0", "fld46"); var select122 = linear_select([ dup278, @@ -12049,8 +11205,7 @@ var all175 = all_match({ var msg516 = msg("Allowed:10", all175); -var part655 = // "Pattern{Field(fld1,false), Constant(',File Delete,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(filename,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(directory,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld46,false)}" -match("MESSAGE#458:Allowed:04", "nwparser.payload", "%{fld1},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},No Module Name,%{directory},User: %{username},Domain: %{domain},Action Type:%{fld46}", processor_chain([ +var part655 = match("MESSAGE#458:Allowed:04", "nwparser.payload", "%{fld1},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{filename},%{fld4},No Module Name,%{directory},User: %{username},Domain: %{domain},Action Type:%{fld46}", processor_chain([ dup121, dup12, dup13, @@ -12067,8 +11222,7 @@ match("MESSAGE#458:Allowed:04", "nwparser.payload", "%{fld1},File Delete,Begin: var msg517 = msg("Allowed:04", part655); -var part656 = // "Pattern{Field(filename,false), Constant(','), Field(fld1,false), Constant(',Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld4,false), Constant(','), Field(process,false), Constant(','), Field(fld5,false), Constant(','), Field(fld6,false), Constant(','), Field(info,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld8,false)}" -match("MESSAGE#459:Allowed:07", "nwparser.payload", "%{filename},%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ +var part656 = match("MESSAGE#459:Allowed:07", "nwparser.payload", "%{filename},%{fld1},Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld4},%{process},%{fld5},%{fld6},%{info},User: %{username},Domain: %{domain},Action Type: %{fld8}", processor_chain([ dup121, dup12, dup13, @@ -12095,8 +11249,7 @@ var select123 = linear_select([ msg518, ]); -var part657 = // "Pattern{Constant('Audit logs have been swept.'), Field(,false)}" -match("MESSAGE#460:Audit", "nwparser.payload", "Audit logs have been swept.%{}", processor_chain([ +var part657 = match("MESSAGE#460:Audit", "nwparser.payload", "Audit logs have been swept.%{}", processor_chain([ dup43, dup12, dup13, @@ -12107,8 +11260,7 @@ match("MESSAGE#460:Audit", "nwparser.payload", "Audit logs have been swept.%{}", var msg519 = msg("Audit", part657); -var part658 = // "Pattern{Field(fld24,false), Constant(','), Field(fld1,false), Constant(',FATAL: '), Field(event_description,false)}" -match("MESSAGE#465:Category", "nwparser.payload", "%{fld24},%{fld1},FATAL: %{event_description}", processor_chain([ +var part658 = match("MESSAGE#465:Category", "nwparser.payload", "%{fld24},%{fld1},FATAL: %{event_description}", processor_chain([ dup53, dup12, dup13, @@ -12118,11 +11270,9 @@ match("MESSAGE#465:Category", "nwparser.payload", "%{fld24},%{fld1},FATAL: %{eve var msg520 = msg("Category", part658); -var part659 = // "Pattern{Field(fld1,false), Constant(','), Field(fld2,false), Constant(','), Field(event_description,true), Constant(' Remote file path:'), Field(p0,false)}" -match("MESSAGE#466:Category:03/0", "nwparser.payload", "%{fld1},%{fld2},%{event_description->} Remote file path:%{p0}"); +var part659 = match("MESSAGE#466:Category:03/0", "nwparser.payload", "%{fld1},%{fld2},%{event_description->} Remote file path:%{p0}"); -var part660 = // "Pattern{Field(url,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#466:Category:03/1_0", "nwparser.p0", "%{url},Event time:%{fld17->} %{fld18}"); +var part660 = match("MESSAGE#466:Category:03/1_0", "nwparser.p0", "%{url},Event time:%{fld17->} %{fld18}"); var select124 = linear_select([ part660, @@ -12148,14 +11298,11 @@ var all176 = all_match({ var msg521 = msg("Category:03", all176); -var part661 = // "Pattern{Field(fld1,false), Constant(','), Field(fld2,false), Constant(',Downloaded content from GUP '), Field(daddr,false), Constant(': '), Field(p0,false)}" -match("MESSAGE#467:Category:02/0", "nwparser.payload", "%{fld1},%{fld2},Downloaded content from GUP %{daddr}: %{p0}"); +var part661 = match("MESSAGE#467:Category:02/0", "nwparser.payload", "%{fld1},%{fld2},Downloaded content from GUP %{daddr}: %{p0}"); -var part662 = // "Pattern{Field(dport,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#467:Category:02/1_0", "nwparser.p0", "%{dport},Event time:%{fld17->} %{fld18}"); +var part662 = match("MESSAGE#467:Category:02/1_0", "nwparser.p0", "%{dport},Event time:%{fld17->} %{fld18}"); -var part663 = // "Pattern{Field(dport,false)}" -match_copy("MESSAGE#467:Category:02/1_1", "nwparser.p0", "dport"); +var part663 = match_copy("MESSAGE#467:Category:02/1_1", "nwparser.p0", "dport"); var select125 = linear_select([ part662, @@ -12180,29 +11327,21 @@ var all177 = all_match({ var msg522 = msg("Category:02", all177); -var part664 = // "Pattern{Field(fld1,false), Constant(','), Field(fld2,false), Constant(','), Field(p0,false)}" -match("MESSAGE#468:Category:01/0", "nwparser.payload", "%{fld1},%{fld2},%{p0}"); +var part664 = match("MESSAGE#468:Category:01/0", "nwparser.payload", "%{fld1},%{fld2},%{p0}"); -var part665 = // "Pattern{Field(event_description,false), Constant('. File : ''), Field(filename,false), Constant('',",Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#468:Category:01/1_0", "nwparser.p0", "%{event_description}. File : '%{filename}',\",Event time: %{fld17->} %{fld18}"); +var part665 = match("MESSAGE#468:Category:01/1_0", "nwparser.p0", "%{event_description}. File : '%{filename}',\",Event time: %{fld17->} %{fld18}"); -var part666 = // "Pattern{Field(event_description,false), Constant('Size (bytes): '), Field(filename_size,false), Constant('.,Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#468:Category:01/1_1", "nwparser.p0", "%{event_description}Size (bytes): %{filename_size}.,Event time: %{fld17->} %{fld18}"); +var part666 = match("MESSAGE#468:Category:01/1_1", "nwparser.p0", "%{event_description}Size (bytes): %{filename_size}.,Event time: %{fld17->} %{fld18}"); -var part667 = // "Pattern{Field(event_description,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#468:Category:01/1_2", "nwparser.p0", "%{event_description},Event time: %{fld17->} %{fld18}"); +var part667 = match("MESSAGE#468:Category:01/1_2", "nwparser.p0", "%{event_description},Event time: %{fld17->} %{fld18}"); -var part668 = // "Pattern{Field(event_description,false), Constant('. Size (bytes):'), Field(filename_size,false), Constant('.')}" -match("MESSAGE#468:Category:01/1_3", "nwparser.p0", "%{event_description}. Size (bytes):%{filename_size}."); +var part668 = match("MESSAGE#468:Category:01/1_3", "nwparser.p0", "%{event_description}. Size (bytes):%{filename_size}."); -var part669 = // "Pattern{Field(event_description,false), Constant('. '), Field(space,true), Constant(' File : ''), Field(filename,false), Constant('',"')}" -match("MESSAGE#468:Category:01/1_4", "nwparser.p0", "%{event_description}. %{space->} File : '%{filename}',\""); +var part669 = match("MESSAGE#468:Category:01/1_4", "nwparser.p0", "%{event_description}. %{space->} File : '%{filename}',\""); -var part670 = // "Pattern{Field(event_description,false), Constant('. '), Field(space,true), Constant(' File : ''), Field(filename,false), Constant(''')}" -match("MESSAGE#468:Category:01/1_5", "nwparser.p0", "%{event_description}. %{space->} File : '%{filename}'"); +var part670 = match("MESSAGE#468:Category:01/1_5", "nwparser.p0", "%{event_description}. %{space->} File : '%{filename}'"); -var part671 = // "Pattern{Field(event_description,false)}" -match_copy("MESSAGE#468:Category:01/1_6", "nwparser.p0", "event_description"); +var part671 = match_copy("MESSAGE#468:Category:01/1_6", "nwparser.p0", "event_description"); var select126 = linear_select([ part665, @@ -12238,8 +11377,7 @@ var select127 = linear_select([ msg523, ]); -var part672 = // "Pattern{Constant('Default '), Field(info,false), Constant('..Computer: '), Field(shost,false), Constant('..Date: '), Field(fld2,false), Constant('..Failed Alert Name: '), Field(action,false), Constant('..Time: '), Field(fld3,true), Constant(' '), Field(fld1,false), Constant('..Severity: '), Field(severity,false), Constant('..Source: '), Field(product,false)}" -match("MESSAGE#469:Default", "nwparser.payload", "Default %{info}..Computer: %{shost}..Date: %{fld2}..Failed Alert Name: %{action}..Time: %{fld3->} %{fld1}..Severity: %{severity}..Source: %{product}", processor_chain([ +var part672 = match("MESSAGE#469:Default", "nwparser.payload", "Default %{info}..Computer: %{shost}..Date: %{fld2}..Failed Alert Name: %{action}..Time: %{fld3->} %{fld1}..Severity: %{severity}..Source: %{product}", processor_chain([ dup43, date_time({ dest: "event_time", @@ -12254,8 +11392,7 @@ match("MESSAGE#469:Default", "nwparser.payload", "Default %{info}..Computer: %{s var msg524 = msg("Default", part672); -var part673 = // "Pattern{Constant('Default Group blocks new clients. The client cannot register with the Default Group.'), Field(,false)}" -match("MESSAGE#470:Default:01", "nwparser.payload", "Default Group blocks new clients. The client cannot register with the Default Group.%{}", processor_chain([ +var part673 = match("MESSAGE#470:Default:01", "nwparser.payload", "Default Group blocks new clients. The client cannot register with the Default Group.%{}", processor_chain([ dup43, dup12, dup13, @@ -12270,8 +11407,7 @@ var select128 = linear_select([ msg525, ]); -var part674 = // "Pattern{Field(action,false), Constant('. '), Field(info,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld25,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld3,false), Constant(','), Field(direction,false), Constant(','), Field(fld5,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(fld24,false), Constant(',Intrusion Payload URL:'), Field(fld12,false)}" -match("MESSAGE#471:Device:01", "nwparser.payload", "%{action}. %{info},Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},%{direction},%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}", processor_chain([ +var part674 = match("MESSAGE#471:Device:01", "nwparser.payload", "%{action}. %{info},Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},%{direction},%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{fld24},Intrusion Payload URL:%{fld12}", processor_chain([ dup43, dup12, dup13, @@ -12285,14 +11421,11 @@ match("MESSAGE#471:Device:01", "nwparser.payload", "%{action}. %{info},Local: %{ var msg526 = msg("Device:01", part674); -var part675 = // "Pattern{Field(action,false), Constant('. '), Field(info,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld25,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld3,false), Constant(','), Field(direction,false), Constant(','), Field(fld5,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld8,false), Constant(','), Field(p0,false)}" -match("MESSAGE#472:Device/0", "nwparser.payload", "%{action}. %{info},Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},%{direction},%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},%{p0}"); +var part675 = match("MESSAGE#472:Device/0", "nwparser.payload", "%{action}. %{info},Local: %{saddr},Local: %{fld1},Remote: %{fld25},Remote: %{daddr},Remote: %{fld3},%{direction},%{fld5},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld8},%{p0}"); -var part676 = // "Pattern{Constant('"User:'), Field(username,false), Constant('",Domain:'), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld26,false)}" -match("MESSAGE#472:Device/1_0", "nwparser.p0", "\"User:%{username}\",Domain:%{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld26}"); +var part676 = match("MESSAGE#472:Device/1_0", "nwparser.p0", "\"User:%{username}\",Domain:%{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld26}"); -var part677 = // "Pattern{Constant(' User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#472:Device/1_1", "nwparser.p0", " User: %{username},Domain: %{domain}"); +var part677 = match("MESSAGE#472:Device/1_1", "nwparser.p0", " User: %{username},Domain: %{domain}"); var select129 = linear_select([ part676, @@ -12324,8 +11457,7 @@ var select130 = linear_select([ msg527, ]); -var part678 = // "Pattern{Constant('Email sending failed'), Field(,false)}" -match("MESSAGE#473:Email", "nwparser.payload", "Email sending failed%{}", processor_chain([ +var part678 = match("MESSAGE#473:Email", "nwparser.payload", "Email sending failed%{}", processor_chain([ dup53, dup12, dup13, @@ -12336,14 +11468,11 @@ match("MESSAGE#473:Email", "nwparser.payload", "Email sending failed%{}", proces var msg528 = msg("Email", part678); -var part679 = // "Pattern{Field(fld5,true), Constant(' - Caller MD5='), Field(checksum,false), Constant(',File Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(p0,false)}" -match("MESSAGE#474:FileWrite:02/0", "nwparser.payload", "%{fld5->} - Caller MD5=%{checksum},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); +var part679 = match("MESSAGE#474:FileWrite:02/0", "nwparser.payload", "%{fld5->} - Caller MD5=%{checksum},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); -var part680 = // "Pattern{Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(p0,false)}" -match("MESSAGE#474:FileWrite:02/2", "nwparser.p0", "%{username},Domain: %{domain},Action Type:%{p0}"); +var part680 = match("MESSAGE#474:FileWrite:02/2", "nwparser.p0", "%{username},Domain: %{domain},Action Type:%{p0}"); -var part681 = // "Pattern{Field(fld44,false)}" -match_copy("MESSAGE#474:FileWrite:02/3_1", "nwparser.p0", "fld44"); +var part681 = match_copy("MESSAGE#474:FileWrite:02/3_1", "nwparser.p0", "fld44"); var select131 = linear_select([ dup278, @@ -12373,8 +11502,7 @@ var all180 = all_match({ var msg529 = msg("FileWrite:02", all180); -var part682 = // "Pattern{Constant('[AC5-1.1] Log files written to Removable Media,File Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false)}" -match("MESSAGE#475:FileWrite:01", "nwparser.payload", "[AC5-1.1] Log files written to Removable Media,File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ +var part682 = match("MESSAGE#475:FileWrite:01", "nwparser.payload", "[AC5-1.1] Log files written to Removable Media,File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ dup121, dup12, dup13, @@ -12389,8 +11517,7 @@ match("MESSAGE#475:FileWrite:01", "nwparser.payload", "[AC5-1.1] Log files writt var msg530 = msg("FileWrite:01", part682); -var part683 = // "Pattern{Field(fld5,false), Constant(',File Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false)}" -match("MESSAGE#476:FileWrite:03", "nwparser.payload", "%{fld5},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ +var part683 = match("MESSAGE#476:FileWrite:03", "nwparser.payload", "%{fld5},File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ dup121, dup12, dup13, @@ -12405,8 +11532,7 @@ match("MESSAGE#476:FileWrite:03", "nwparser.payload", "%{fld5},File Write,Begin: var msg531 = msg("FileWrite:03", part683); -var part684 = // "Pattern{Constant(',File Write,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#477:FileWrite", "nwparser.payload", ",File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain}", processor_chain([ +var part684 = match("MESSAGE#477:FileWrite", "nwparser.payload", ",File Write,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain}", processor_chain([ dup121, dup12, dup13, @@ -12421,8 +11547,7 @@ match("MESSAGE#477:FileWrite", "nwparser.payload", ",File Write,Begin: %{fld50-> var msg532 = msg("FileWrite", part684); -var part685 = // "Pattern{Constant('[AC5-1.1] Log files written to Removable Media,File Delete,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false)}" -match("MESSAGE#478:FileDelete", "nwparser.payload", "[AC5-1.1] Log files written to Removable Media,File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ +var part685 = match("MESSAGE#478:FileDelete", "nwparser.payload", "[AC5-1.1] Log files written to Removable Media,File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ dup121, dup12, dup13, @@ -12437,11 +11562,9 @@ match("MESSAGE#478:FileDelete", "nwparser.payload", "[AC5-1.1] Log files written var msg533 = msg("FileDelete", part685); -var part686 = // "Pattern{Field(info,true), Constant(' - Caller MD5='), Field(checksum,false), Constant(',File Delete,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(p0,false)}" -match("MESSAGE#479:Continue/0", "nwparser.payload", "%{info->} - Caller MD5=%{checksum},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); +var part686 = match("MESSAGE#479:Continue/0", "nwparser.payload", "%{info->} - Caller MD5=%{checksum},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{p0}"); -var part687 = // "Pattern{Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#479:Continue/2", "nwparser.p0", "%{username},Domain: %{domain},Action Type:%{fld44},File size (bytes): %{filename_size},Device ID: %{device}"); +var part687 = match("MESSAGE#479:Continue/2", "nwparser.p0", "%{username},Domain: %{domain},Action Type:%{fld44},File size (bytes): %{filename_size},Device ID: %{device}"); var all181 = all_match({ processors: [ @@ -12466,8 +11589,7 @@ var all181 = all_match({ var msg534 = msg("Continue", all181); -var part688 = // "Pattern{Field(fld5,true), Constant(' - Caller MD5='), Field(fld6,false), Constant(',File Delete,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false)}" -match("MESSAGE#480:FileDelete:01", "nwparser.payload", "%{fld5->} - Caller MD5=%{fld6},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ +var part688 = match("MESSAGE#480:FileDelete:01", "nwparser.payload", "%{fld5->} - Caller MD5=%{fld6},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ dup121, dup12, dup13, @@ -12482,8 +11604,7 @@ match("MESSAGE#480:FileDelete:01", "nwparser.payload", "%{fld5->} - Caller MD5=% var msg535 = msg("FileDelete:01", part688); -var part689 = // "Pattern{Field(fld5,false), Constant(',File Delete,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(',No Module Name,'), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false)}" -match("MESSAGE#481:FileDelete:02", "nwparser.payload", "%{fld5},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ +var part689 = match("MESSAGE#481:FileDelete:02", "nwparser.payload", "%{fld5},File Delete,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},No Module Name,%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ dup121, dup12, dup13, @@ -12498,8 +11619,7 @@ match("MESSAGE#481:FileDelete:02", "nwparser.payload", "%{fld5},File Delete,Begi var msg536 = msg("FileDelete:02", part689); -var part690 = // "Pattern{Field(fld5,false), Constant(',System,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld6,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld44,false)}" -match("MESSAGE#482:System:06", "nwparser.payload", "%{fld5},System,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld6},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ +var part690 = match("MESSAGE#482:System:06", "nwparser.payload", "%{fld5},System,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld6},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld44}", processor_chain([ dup121, dup12, dup13, @@ -12511,8 +11631,7 @@ match("MESSAGE#482:System:06", "nwparser.payload", "%{fld5},System,Begin: %{fld5 var msg537 = msg("System:06", part690); -var part691 = // "Pattern{Field(fld1,false), Constant(',File Read,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(fld3,false), Constant(','), Field(process,false), Constant(','), Field(fld4,false), Constant(','), Field(fld5,false), Constant(','), Field(filename,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type:'), Field(fld6,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#495:File:10", "nwparser.payload", "%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ +var part691 = match("MESSAGE#495:File:10", "nwparser.payload", "%{fld1},File Read,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Rule: %{rulename},%{fld3},%{process},%{fld4},%{fld5},%{filename},User: %{username},Domain: %{domain},Action Type:%{fld6},File size (bytes): %{filename_size},Device ID: %{device}", processor_chain([ dup121, dup12, dup13, @@ -12527,16 +11646,14 @@ match("MESSAGE#495:File:10", "nwparser.payload", "%{fld1},File Read,Begin: %{fld var msg538 = msg("File:10", part691); -var part692 = // "Pattern{Field(fld11,true), Constant(' - Caller MD5='), Field(fld6,false), Constant(','), Field(p0,false)}" -match("MESSAGE#503:Blocked:08/0_0", "nwparser.payload", "%{fld11->} - Caller MD5=%{fld6},%{p0}"); +var part692 = match("MESSAGE#503:Blocked:08/0_0", "nwparser.payload", "%{fld11->} - Caller MD5=%{fld6},%{p0}"); var select132 = linear_select([ part692, dup269, ]); -var part693 = // "Pattern{Field(action,false), Constant(',Begin: '), Field(fld2,true), Constant(' '), Field(fld3,false), Constant(',End: '), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(',Rule: '), Field(rulename,false), Constant(','), Field(process_id,false), Constant(','), Field(process,false), Constant(','), Field(fld6,false), Constant(','), Field(fld7,false), Constant(','), Field(fld8,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Action Type: '), Field(fld9,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#503:Blocked:08/1", "nwparser.p0", "%{action},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{domain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID: %{device}"); +var part693 = match("MESSAGE#503:Blocked:08/1", "nwparser.p0", "%{action},Begin: %{fld2->} %{fld3},End: %{fld4->} %{fld5},Rule: %{rulename},%{process_id},%{process},%{fld6},%{fld7},%{fld8},User: %{username},Domain: %{domain},Action Type: %{fld9},File size (%{fld10}): %{filename_size},Device ID: %{device}"); var all182 = all_match({ processors: [ @@ -12570,8 +11687,7 @@ var select133 = linear_select([ msg539, ]); -var part694 = // "Pattern{Field(event_description,false), Constant('",Local: '), Field(daddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld9,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Inbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(fld7,false)}" -match("MESSAGE#505:Ping/1", "nwparser.p0", "%{event_description}\",Local: %{daddr},Local: %{fld1},Remote: %{fld9},Remote: %{saddr},Remote: %{fld3},Inbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{fld7}"); +var part694 = match("MESSAGE#505:Ping/1", "nwparser.p0", "%{event_description}\",Local: %{daddr},Local: %{fld1},Remote: %{fld9},Remote: %{saddr},Remote: %{fld3},Inbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{fld7}"); var all183 = all_match({ processors: [ @@ -12594,8 +11710,7 @@ var all183 = all_match({ var msg540 = msg("Ping", all183); -var part695 = // "Pattern{Field(event_description,false), Constant('",Local: '), Field(saddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld9,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Outbound,'), Field(protocol,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(fld7,false)}" -match("MESSAGE#506:Ping:01/1", "nwparser.p0", "%{event_description}\",Local: %{saddr},Local: %{fld1},Remote: %{fld9},Remote: %{daddr},Remote: %{fld3},Outbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{fld7}"); +var part695 = match("MESSAGE#506:Ping:01/1", "nwparser.p0", "%{event_description}\",Local: %{saddr},Local: %{fld1},Remote: %{fld9},Remote: %{daddr},Remote: %{fld3},Outbound,%{protocol},,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{fld7}"); var all184 = all_match({ processors: [ @@ -12623,8 +11738,7 @@ var select134 = linear_select([ msg541, ]); -var part696 = // "Pattern{Field(fld1,false), Constant(': Site: '), Field(fld2,false), Constant(',Server: '), Field(hostid,false), Constant(','), Field(directory,true), Constant(' '), Field(event_description,false)}" -match("MESSAGE#509:Server", "nwparser.payload", "%{fld1}: Site: %{fld2},Server: %{hostid},%{directory->} %{event_description}", processor_chain([ +var part696 = match("MESSAGE#509:Server", "nwparser.payload", "%{fld1}: Site: %{fld2},Server: %{hostid},%{directory->} %{event_description}", processor_chain([ dup53, dup12, dup13, @@ -12634,8 +11748,7 @@ match("MESSAGE#509:Server", "nwparser.payload", "%{fld1}: Site: %{fld2},Server: var msg542 = msg("Server", part696); -var part697 = // "Pattern{Constant('Server returned HTTP response code: '), Field(resultcode,true), Constant(' for URL: '), Field(url,false)}" -match("MESSAGE#510:Server:01", "nwparser.payload", "Server returned HTTP response code: %{resultcode->} for URL: %{url}", processor_chain([ +var part697 = match("MESSAGE#510:Server:01", "nwparser.payload", "Server returned HTTP response code: %{resultcode->} for URL: %{url}", processor_chain([ dup53, dup12, dup13, @@ -12645,8 +11758,7 @@ match("MESSAGE#510:Server:01", "nwparser.payload", "Server returned HTTP respons var msg543 = msg("Server:01", part697); -var part698 = // "Pattern{Constant('Server security validation failed.'), Field(,false)}" -match("MESSAGE#512:Server:03", "nwparser.payload", "Server security validation failed.%{}", processor_chain([ +var part698 = match("MESSAGE#512:Server:03", "nwparser.payload", "Server security validation failed.%{}", processor_chain([ dup174, dup94, setf("saddr","hhostid"), @@ -12662,8 +11774,7 @@ var select135 = linear_select([ msg544, ]); -var part699 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#514:1", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part699 = match("MESSAGE#514:1", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12676,8 +11787,7 @@ match("MESSAGE#514:1", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg545 = msg("1", part699); -var part700 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#515:2", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part700 = match("MESSAGE#515:2", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12690,8 +11800,7 @@ match("MESSAGE#515:2", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg546 = msg("2", part700); -var part701 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#516:3", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part701 = match("MESSAGE#516:3", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12704,8 +11813,7 @@ match("MESSAGE#516:3", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg547 = msg("3", part701); -var part702 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#517:4", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part702 = match("MESSAGE#517:4", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12718,8 +11826,7 @@ match("MESSAGE#517:4", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg548 = msg("4", part702); -var part703 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#518:5", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part703 = match("MESSAGE#518:5", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12732,8 +11839,7 @@ match("MESSAGE#518:5", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg549 = msg("5", part703); -var part704 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#519:6", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part704 = match("MESSAGE#519:6", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12746,8 +11852,7 @@ match("MESSAGE#519:6", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg550 = msg("6", part704); -var part705 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#520:7", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part705 = match("MESSAGE#520:7", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12760,8 +11865,7 @@ match("MESSAGE#520:7", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg551 = msg("7", part705); -var part706 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#521:8", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part706 = match("MESSAGE#521:8", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12774,8 +11878,7 @@ match("MESSAGE#521:8", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg552 = msg("8", part706); -var part707 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#522:9", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part707 = match("MESSAGE#522:9", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12788,8 +11891,7 @@ match("MESSAGE#522:9", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^% var msg553 = msg("9", part707); -var part708 = // "Pattern{Field(hostip,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(username,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(virusname,false), Constant('^^'), Field(info,false), Constant('^^'), Field(disposition,false), Constant('^^'), Field(action,false), Constant('^^'), Field(recorded_time,false), Constant('^^'), Field(fld33,false), Constant('^^'), Field(fld1,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(filename,false), Constant('^^'), Field(fld2,false)}" -match("MESSAGE#523:10", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ +var part708 = match("MESSAGE#523:10", "nwparser.payload", "%{hostip}^^%{hostname}^^%{domain}^^%{username}^^%{shost}^^%{saddr}^^%{event_source}^^%{virusname}^^%{info}^^%{disposition}^^%{action}^^%{recorded_time}^^%{fld33}^^%{fld1}^^%{dclass_counter1}^^%{filename}^^%{fld2}", processor_chain([ dup110, dup115, dup116, @@ -12808,8 +11910,7 @@ var msg556 = msg("257", dup342); var msg557 = msg("259", dup342); -var part709 = // "Pattern{Field(id,false), Constant('^^'), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' Organization importing started')}" -match("MESSAGE#527:264", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Organization importing started", processor_chain([ +var part709 = match("MESSAGE#527:264", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Organization importing started", processor_chain([ dup53, dup284, dup15, @@ -12818,8 +11919,7 @@ match("MESSAGE#527:264", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3- var msg558 = msg("264", part709); -var part710 = // "Pattern{Field(id,false), Constant('^^'), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' Organization importing finished successfully')}" -match("MESSAGE#528:265", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Organization importing finished successfully", processor_chain([ +var part710 = match("MESSAGE#528:265", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Organization importing finished successfully", processor_chain([ dup53, dup284, dup15, @@ -12830,8 +11930,7 @@ var msg559 = msg("265", part710); var msg560 = msg("273", dup342); -var part711 = // "Pattern{Field(id,false), Constant('^^The process '), Field(process,true), Constant(' can not lock the process status table. The process status has been locked by the server '), Field(shost,true), Constant(' ('), Field(fld22,false), Constant(') since '), Field(recorded_time,false), Constant('.')}" -match("MESSAGE#530:275", "nwparser.payload", "%{id}^^The process %{process->} can not lock the process status table. The process status has been locked by the server %{shost->} (%{fld22}) since %{recorded_time}.", processor_chain([ +var part711 = match("MESSAGE#530:275", "nwparser.payload", "%{id}^^The process %{process->} can not lock the process status table. The process status has been locked by the server %{shost->} (%{fld22}) since %{recorded_time}.", processor_chain([ dup53, dup15, setc("event_description","The process can not lock the process status table"), @@ -12851,8 +11950,7 @@ var msg566 = msg("779", dup342); var msg567 = msg("782", dup342); -var part712 = // "Pattern{Field(id,false), Constant('^^'), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' Backup succeeded and finished at '), Field(fld4,true), Constant(' '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant('. The backup file resides at the following location on the server '), Field(shost,false), Constant(': '), Field(directory,false)}" -match("MESSAGE#537:1029", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Backup succeeded and finished at %{fld4->} %{fld5->} %{fld6}. The backup file resides at the following location on the server %{shost}: %{directory}", processor_chain([ +var part712 = match("MESSAGE#537:1029", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Backup succeeded and finished at %{fld4->} %{fld5->} %{fld6}. The backup file resides at the following location on the server %{shost}: %{directory}", processor_chain([ dup53, dup284, date_time({ @@ -12868,8 +11966,7 @@ match("MESSAGE#537:1029", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3 var msg568 = msg("1029", part712); -var part713 = // "Pattern{Field(id,false), Constant('^^Backup succeeded and finished. The backup file resides at the following location on the server '), Field(shost,false), Constant(': '), Field(directory,false)}" -match("MESSAGE#538:1029:01", "nwparser.payload", "%{id}^^Backup succeeded and finished. The backup file resides at the following location on the server %{shost}: %{directory}", processor_chain([ +var part713 = match("MESSAGE#538:1029:01", "nwparser.payload", "%{id}^^Backup succeeded and finished. The backup file resides at the following location on the server %{shost}: %{directory}", processor_chain([ dup53, dup15, dup285, @@ -12882,8 +11979,7 @@ var select136 = linear_select([ msg569, ]); -var part714 = // "Pattern{Field(id,false), Constant('^^'), Field(fld1,true), Constant(' '), Field(fld2,true), Constant(' '), Field(fld3,true), Constant(' Backup started')}" -match("MESSAGE#539:1030", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Backup started", processor_chain([ +var part714 = match("MESSAGE#539:1030", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3->} Backup started", processor_chain([ dup53, dup284, dup15, @@ -12892,8 +11988,7 @@ match("MESSAGE#539:1030", "nwparser.payload", "%{id}^^%{fld1->} %{fld2->} %{fld3 var msg570 = msg("1030", part714); -var part715 = // "Pattern{Field(id,false), Constant('^^Backup started')}" -match("MESSAGE#540:1030:01", "nwparser.payload", "%{id}^^Backup started", processor_chain([ +var part715 = match("MESSAGE#540:1030:01", "nwparser.payload", "%{id}^^Backup started", processor_chain([ dup53, dup15, dup286, @@ -12914,8 +12009,7 @@ var msg574 = msg("5121", dup342); var msg575 = msg("5122", dup342); -var part716 = // "Pattern{Field(id,false), Constant('^^Sending Email Failed for following email address ['), Field(user_address,false), Constant('].')}" -match("MESSAGE#545:4609", "nwparser.payload", "%{id}^^Sending Email Failed for following email address [%{user_address}].", processor_chain([ +var part716 = match("MESSAGE#545:4609", "nwparser.payload", "%{id}^^Sending Email Failed for following email address [%{user_address}].", processor_chain([ setc("eventcategory","1207010200"), setc("event_description","Sending Email Failed"), dup15, @@ -12974,8 +12068,7 @@ var select142 = linear_select([ msg589, ]); -var part717 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#559:302449166", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part717 = match("MESSAGE#559:302449166", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup165, dup15, dup287, @@ -12983,8 +12076,7 @@ match("MESSAGE#559:302449166", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^ var msg590 = msg("302449166", part717); -var part718 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#560:302449166:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part718 = match("MESSAGE#560:302449166:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup165, dup15, dup287, @@ -12997,8 +12089,7 @@ var select143 = linear_select([ msg591, ]); -var part719 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#561:302449168", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part719 = match("MESSAGE#561:302449168", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup136, dup288, dup56, @@ -13009,8 +12100,7 @@ match("MESSAGE#561:302449168", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^ var msg592 = msg("302449168", part719); -var part720 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#562:302449168:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part720 = match("MESSAGE#562:302449168:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup136, dup288, dup56, @@ -13035,8 +12125,7 @@ var select145 = linear_select([ msg595, ]); -var part721 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#565:302449176", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part721 = match("MESSAGE#565:302449176", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup213, dup288, dup172, @@ -13047,8 +12136,7 @@ match("MESSAGE#565:302449176", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^ var msg596 = msg("302449176", part721); -var part722 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#566:302449176:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part722 = match("MESSAGE#566:302449176:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup213, dup288, dup172, @@ -13064,8 +12152,7 @@ var select146 = linear_select([ msg597, ]); -var part723 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#567:302449178", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part723 = match("MESSAGE#567:302449178", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup256, dup15, dup287, @@ -13073,8 +12160,7 @@ match("MESSAGE#567:302449178", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^ var msg598 = msg("302449178", part723); -var part724 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#568:302449178:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part724 = match("MESSAGE#568:302449178:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup256, dup15, dup287, @@ -13105,8 +12191,7 @@ var select149 = linear_select([ msg603, ]); -var part725 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#573:302449412", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part725 = match("MESSAGE#573:302449412", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup289, dup15, dup287, @@ -13114,8 +12199,7 @@ match("MESSAGE#573:302449412", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^ var msg604 = msg("302449412", part725); -var part726 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#574:302449412:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part726 = match("MESSAGE#574:302449412:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup289, dup15, dup287, @@ -13128,8 +12212,7 @@ var select150 = linear_select([ msg605, ]); -var part727 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#575:302449413", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part727 = match("MESSAGE#575:302449413", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup232, dup15, dup287, @@ -13137,8 +12220,7 @@ match("MESSAGE#575:302449413", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^ var msg606 = msg("302449413", part727); -var part728 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#576:302449413:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part728 = match("MESSAGE#576:302449413:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup232, dup15, dup287, @@ -13430,8 +12512,7 @@ var select182 = linear_select([ msg669, ]); -var part729 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#639:303235080/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{p0}"); +var part729 = match("MESSAGE#639:303235080/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{p0}"); var all185 = all_match({ processors: [ @@ -13448,8 +12529,7 @@ var all185 = all_match({ var msg670 = msg("303235080", all185); -var part730 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#640:303235080:01/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{p0}"); +var part730 = match("MESSAGE#640:303235080:01/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{p0}"); var all186 = all_match({ processors: [ @@ -13511,8 +12591,7 @@ var select187 = linear_select([ var msg681 = msg("302448900", dup345); -var part731 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^Block all other IP traffic and log^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#651:301", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part731 = match("MESSAGE#651:301", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup351, @@ -13530,8 +12609,7 @@ match("MESSAGE#651:301", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos var msg682 = msg("301", part731); -var part732 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^Block all other IP traffic and log^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#652:301:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part732 = match("MESSAGE#652:301:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup351, @@ -13549,8 +12627,7 @@ match("MESSAGE#652:301:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{ var msg683 = msg("301:01", part732); -var part733 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#653:301:02", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part733 = match("MESSAGE#653:301:02", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup120, dup295, dup268, @@ -13572,8 +12649,7 @@ var select188 = linear_select([ msg684, ]); -var part734 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#654:302", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part734 = match("MESSAGE#654:302", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13590,8 +12666,7 @@ match("MESSAGE#654:302", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos var msg685 = msg("302", part734); -var part735 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#655:302:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part735 = match("MESSAGE#655:302:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13613,8 +12688,7 @@ var select189 = linear_select([ msg686, ]); -var part736 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#656:306", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part736 = match("MESSAGE#656:306", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13631,8 +12705,7 @@ match("MESSAGE#656:306", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos var msg687 = msg("306", part736); -var part737 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#657:306:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part737 = match("MESSAGE#657:306:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13654,8 +12727,7 @@ var select190 = linear_select([ msg688, ]); -var part738 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#658:307", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part738 = match("MESSAGE#658:307", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13672,8 +12744,7 @@ match("MESSAGE#658:307", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos var msg689 = msg("307", part738); -var part739 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#659:307:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part739 = match("MESSAGE#659:307:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13695,8 +12766,7 @@ var select191 = linear_select([ msg690, ]); -var part740 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^Block all other IP traffic and log^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#660:308", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part740 = match("MESSAGE#660:308", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13714,8 +12784,7 @@ match("MESSAGE#660:308", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos var msg691 = msg("308", part740); -var part741 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^Block all other IP traffic and log^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#661:308:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part741 = match("MESSAGE#661:308:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^Block all other IP traffic and log^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -13733,8 +12802,7 @@ match("MESSAGE#661:308:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{ var msg692 = msg("308:01", part741); -var part742 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#662:308:02", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part742 = match("MESSAGE#662:308:02", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{id}^^%{saddr_v6}^^%{daddr_v6}^^%{saddr}^^%{daddr}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{sport}^^%{dport}^^%{fld14}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{fld17}^^%{rule}^^%{rulename}^^%{fld18}^^%{fld19}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup120, dup295, dup351, @@ -13756,8 +12824,7 @@ var select192 = linear_select([ msg693, ]); -var part743 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#663:202", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var part743 = match("MESSAGE#663:202", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup36, dup295, setc("ec_activity","Scan"), @@ -13791,8 +12858,7 @@ var select194 = linear_select([ msg698, ]); -var part744 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#668:208", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var part744 = match("MESSAGE#668:208", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup36, dup295, dup268, @@ -13809,8 +12875,7 @@ var msg699 = msg("208", part744); var msg700 = msg("210", dup359); -var part745 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#670:210:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part745 = match("MESSAGE#670:210:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup43, dup15, dup353, @@ -13839,8 +12904,7 @@ var select196 = linear_select([ var msg704 = msg("221", dup359); -var part746 = // "Pattern{Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#674:238/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}"); +var part746 = match("MESSAGE#674:238/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}"); var all187 = all_match({ processors: [ @@ -13862,11 +12926,9 @@ var all187 = all_match({ var msg705 = msg("238", all187); -var part747 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#675:238:01/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{p0}"); +var part747 = match("MESSAGE#675:238:01/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{p0}"); -var part748 = // "Pattern{Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#675:238:01/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}"); +var part748 = match("MESSAGE#675:238:01/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}"); var all188 = all_match({ processors: [ @@ -13902,8 +12964,7 @@ var select198 = linear_select([ msg708, ]); -var part749 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(parent_pid,false), Constant('^^'), Field(parent_process,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(param,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(fld31,false), Constant('^^'), Field(filename_size,false), Constant('^^'), Field(fld32,false), Constant('^^'), Field(fld33,false)}" -match("MESSAGE#678:502", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{username}^^%{sdomain}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}^^%{fld31}^^%{filename_size}^^%{fld32}^^%{fld33}", processor_chain([ +var part749 = match("MESSAGE#678:502", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{username}^^%{sdomain}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}^^%{fld31}^^%{filename_size}^^%{fld32}^^%{fld33}", processor_chain([ dup43, dup15, dup356, @@ -13917,8 +12978,7 @@ match("MESSAGE#678:502", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id} var msg709 = msg("502", part749); -var part750 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(parent_pid,false), Constant('^^'), Field(parent_process,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(param,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(fld30,false)}" -match("MESSAGE#679:502:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{username}^^%{sdomain}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}", processor_chain([ +var part750 = match("MESSAGE#679:502:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{username}^^%{sdomain}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}", processor_chain([ dup43, dup15, dup356, @@ -13946,8 +13006,7 @@ var select200 = linear_select([ msg712, ]); -var part751 = // "Pattern{Constant('Application,rn='), Field(fld1,true), Constant(' cid='), Field(fld2,true), Constant(' eid='), Field(fld3,false), Constant(','), Field(fld4,true), Constant(' '), Field(fld5,false), Constant(','), Field(fld6,false), Constant(',Symantec AntiVirus,SYSTEM,Information,'), Field(shost,false), Constant(','), Field(event_description,false), Constant('. string-data=[ Scan type: '), Field(event_type,true), Constant(' Event: '), Field(result,true), Constant(' Security risk detected: '), Field(directory,true), Constant(' File: '), Field(filename,true), Constant(' Location: '), Field(fld7,true), Constant(' Computer: '), Field(fld8,true), Constant(' User: '), Field(username,true), Constant(' Action taken:'), Field(action,true), Constant(' Date found: '), Field(fld9,false), Constant(']')}" -match("MESSAGE#682:Application_45", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,SYSTEM,Information,%{shost},%{event_description}. string-data=[ Scan type: %{event_type->} Event: %{result->} Security risk detected: %{directory->} File: %{filename->} Location: %{fld7->} Computer: %{fld8->} User: %{username->} Action taken:%{action->} Date found: %{fld9}]", processor_chain([ +var part751 = match("MESSAGE#682:Application_45", "nwparser.payload", "Application,rn=%{fld1->} cid=%{fld2->} eid=%{fld3},%{fld4->} %{fld5},%{fld6},Symantec AntiVirus,SYSTEM,Information,%{shost},%{event_description}. string-data=[ Scan type: %{event_type->} Event: %{result->} Security risk detected: %{directory->} File: %{filename->} Location: %{fld7->} Computer: %{fld8->} User: %{username->} Action taken:%{action->} Date found: %{fld9}]", processor_chain([ dup43, dup15, dup55, @@ -13955,26 +13014,19 @@ match("MESSAGE#682:Application_45", "nwparser.payload", "Application,rn=%{fld1-> var msg713 = msg("Application_45", part751); -var part752 = // "Pattern{Constant('Using Group Update Provider type: '), Field(p0,false)}" -match("MESSAGE#692:SYLINK/0", "nwparser.payload", "Using Group Update Provider type: %{p0}"); +var part752 = match("MESSAGE#692:SYLINK/0", "nwparser.payload", "Using Group Update Provider type: %{p0}"); -var part753 = // "Pattern{Constant('Single Group Update Provider,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#692:SYLINK/1_0", "nwparser.p0", "Single Group Update Provider,Event time:%{fld17->} %{fld18}"); +var part753 = match("MESSAGE#692:SYLINK/1_0", "nwparser.p0", "Single Group Update Provider,Event time:%{fld17->} %{fld18}"); -var part754 = // "Pattern{Constant('Multiple Group Update Providers,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#692:SYLINK/1_1", "nwparser.p0", "Multiple Group Update Providers,Event time:%{fld17->} %{fld18}"); +var part754 = match("MESSAGE#692:SYLINK/1_1", "nwparser.p0", "Multiple Group Update Providers,Event time:%{fld17->} %{fld18}"); -var part755 = // "Pattern{Constant('Mapped Group Update Providers,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#692:SYLINK/1_2", "nwparser.p0", "Mapped Group Update Providers,Event time:%{fld17->} %{fld18}"); +var part755 = match("MESSAGE#692:SYLINK/1_2", "nwparser.p0", "Mapped Group Update Providers,Event time:%{fld17->} %{fld18}"); -var part756 = // "Pattern{Constant('Single Group Update Provider'), Field(,false)}" -match("MESSAGE#692:SYLINK/1_3", "nwparser.p0", "Single Group Update Provider%{}"); +var part756 = match("MESSAGE#692:SYLINK/1_3", "nwparser.p0", "Single Group Update Provider%{}"); -var part757 = // "Pattern{Constant('Multiple Group Update Providers'), Field(,false)}" -match("MESSAGE#692:SYLINK/1_4", "nwparser.p0", "Multiple Group Update Providers%{}"); +var part757 = match("MESSAGE#692:SYLINK/1_4", "nwparser.p0", "Multiple Group Update Providers%{}"); -var part758 = // "Pattern{Constant('Mapped Group Update Providers'), Field(,false)}" -match("MESSAGE#692:SYLINK/1_5", "nwparser.p0", "Mapped Group Update Providers%{}"); +var part758 = match("MESSAGE#692:SYLINK/1_5", "nwparser.p0", "Mapped Group Update Providers%{}"); var select201 = linear_select([ part753, @@ -14003,8 +13055,7 @@ var all189 = all_match({ var msg714 = msg("SYLINK", all189); -var part759 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,true), Constant(' [name]:'), Field(obj_name,true), Constant(' [class]:'), Field(obj_type,true), Constant(' [guid]:'), Field(hardware_id,true), Constant(' [deviceID]:'), Field(info,false), Constant('^^'), Field(fld79,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#703:242", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description->} [name]:%{obj_name->} [class]:%{obj_type->} [guid]:%{hardware_id->} [deviceID]:%{info}^^%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var part759 = match("MESSAGE#703:242", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description->} [name]:%{obj_name->} [class]:%{obj_type->} [guid]:%{hardware_id->} [deviceID]:%{info}^^%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup53, dup15, dup353, @@ -14017,22 +13068,18 @@ match("MESSAGE#703:242", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos var msg715 = msg("242", part759); -var part760 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,true), Constant(' ['), Field(p0,false)}" -match("MESSAGE#704:242:01/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description->} [%{p0}"); +var part760 = match("MESSAGE#704:242:01/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description->} [%{p0}"); -var part761 = // "Pattern{Constant('Device]: '), Field(device,true), Constant(' [guid]: '), Field(hardware_id,true), Constant(' [Volume]:'), Field(p0,false)}" -match("MESSAGE#704:242:01/1_0", "nwparser.p0", "Device]: %{device->} [guid]: %{hardware_id->} [Volume]:%{p0}"); +var part761 = match("MESSAGE#704:242:01/1_0", "nwparser.p0", "Device]: %{device->} [guid]: %{hardware_id->} [Volume]:%{p0}"); -var part762 = // "Pattern{Constant('Volume]:'), Field(p0,false)}" -match("MESSAGE#704:242:01/1_1", "nwparser.p0", "Volume]:%{p0}"); +var part762 = match("MESSAGE#704:242:01/1_1", "nwparser.p0", "Volume]:%{p0}"); var select202 = linear_select([ part761, part762, ]); -var part763 = // "Pattern{Field(,true), Constant(' '), Field(disk_volume,true), Constant(' [Vendor]:'), Field(devvendor,true), Constant(' [Model]: '), Field(product,true), Constant(' [Access]: '), Field(accesses,false), Constant('^^'), Field(fld79,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#704:242:01/2", "nwparser.p0", "%{} %{disk_volume->} [Vendor]:%{devvendor->} [Model]: %{product->} [Access]: %{accesses}^^%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}"); +var part763 = match("MESSAGE#704:242:01/2", "nwparser.p0", "%{} %{disk_volume->} [Vendor]:%{devvendor->} [Model]: %{product->} [Access]: %{accesses}^^%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}"); var all190 = all_match({ processors: [ @@ -14054,8 +13101,7 @@ var all190 = all_match({ var msg716 = msg("242:01", all190); -var part764 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,true), Constant(' [Volume]: '), Field(disk_volume,true), Constant(' [Model]: '), Field(product,true), Constant(' [Access]: '), Field(accesses,false), Constant('^^'), Field(fld79,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#705:242:02", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description->} [Volume]: %{disk_volume->} [Model]: %{product->} [Access]: %{accesses}^^%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var part764 = match("MESSAGE#705:242:02", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description->} [Volume]: %{disk_volume->} [Model]: %{product->} [Access]: %{accesses}^^%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup53, dup15, dup353, @@ -14068,14 +13114,11 @@ match("MESSAGE#705:242:02", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{ var msg717 = msg("242:02", part764); -var part765 = // "Pattern{Field(event_description,false), Constant('. '), Field(info,true), Constant(' [Access]: '), Field(accesses,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#706:242:03/1_0", "nwparser.p0", "%{event_description}. %{info->} [Access]: %{accesses}^^%{p0}"); +var part765 = match("MESSAGE#706:242:03/1_0", "nwparser.p0", "%{event_description}. %{info->} [Access]: %{accesses}^^%{p0}"); -var part766 = // "Pattern{Constant(' '), Field(event_description,false), Constant('. '), Field(info,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#706:242:03/1_1", "nwparser.p0", " %{event_description}. %{info}^^%{p0}"); +var part766 = match("MESSAGE#706:242:03/1_1", "nwparser.p0", " %{event_description}. %{info}^^%{p0}"); -var part767 = // "Pattern{Constant(' '), Field(event_description,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#706:242:03/1_2", "nwparser.p0", " %{event_description}^^%{p0}"); +var part767 = match("MESSAGE#706:242:03/1_2", "nwparser.p0", " %{event_description}^^%{p0}"); var select203 = linear_select([ part765, @@ -14083,8 +13126,7 @@ var select203 = linear_select([ part767, ]); -var part768 = // "Pattern{Field(fld79,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#706:242:03/2", "nwparser.p0", "%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}"); +var part768 = match("MESSAGE#706:242:03/2", "nwparser.p0", "%{fld79}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}"); var all191 = all_match({ processors: [ @@ -14113,8 +13155,7 @@ var select204 = linear_select([ msg718, ]); -var part769 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#707:303169540", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part769 = match("MESSAGE#707:303169540", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ setc("eventcategory","1801010000"), dup15, dup287, @@ -14122,8 +13163,7 @@ match("MESSAGE#707:303169540", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^ var msg719 = msg("303169540", part769); -var part770 = // "Pattern{Field(shost,false), Constant(', Remote: '), Field(fld4,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld5,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL:'), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#708:Remote::01", "nwparser.payload", "%{shost}, Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:%{fld25}", processor_chain([ +var part770 = match("MESSAGE#708:Remote::01", "nwparser.payload", "%{shost}, Remote: %{fld4},Remote: %{daddr},Remote: %{fld5},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},Domain: %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL:%{url},Intrusion Payload URL:%{fld25}", processor_chain([ dup53, dup12, dup15, @@ -14135,27 +13175,23 @@ match("MESSAGE#708:Remote::01", "nwparser.payload", "%{shost}, Remote: %{fld4},R var msg720 = msg("Remote::01", part770); -var part771 = // "Pattern{Constant('"'), Field(info,false), Constant('",Local: '), Field(p0,false)}" -match("MESSAGE#709:Notification::01/0_0", "nwparser.payload", "\"%{info}\",Local: %{p0}"); +var part771 = match("MESSAGE#709:Notification::01/0_0", "nwparser.payload", "\"%{info}\",Local: %{p0}"); -var part772 = // "Pattern{Field(info,false), Constant(',Local: '), Field(p0,false)}" -match("MESSAGE#709:Notification::01/0_1", "nwparser.payload", "%{info},Local: %{p0}"); +var part772 = match("MESSAGE#709:Notification::01/0_1", "nwparser.payload", "%{info},Local: %{p0}"); var select205 = linear_select([ part771, part772, ]); -var part773 = // "Pattern{Field(saddr,false), Constant(',Local: '), Field(fld1,false), Constant(',Remote: '), Field(fld9,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld3,false), Constant(',Unknown,OTHERS,,Begin: '), Field(fld50,true), Constant(' '), Field(fld52,false), Constant(',End: '), Field(fld51,true), Constant(' '), Field(fld53,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(','), Field(p0,false)}" -match("MESSAGE#709:Notification::01/1", "nwparser.p0", "%{saddr},Local: %{fld1},Remote: %{fld9},Remote: %{daddr},Remote: %{fld3},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},%{p0}"); +var part773 = match("MESSAGE#709:Notification::01/1", "nwparser.p0", "%{saddr},Local: %{fld1},Remote: %{fld9},Remote: %{daddr},Remote: %{fld3},Unknown,OTHERS,,Begin: %{fld50->} %{fld52},End: %{fld51->} %{fld53},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld6},User: %{username},%{p0}"); var select206 = linear_select([ dup182, dup67, ]); -var part774 = // "Pattern{Field(,true), Constant(' '), Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#709:Notification::01/3", "nwparser.p0", "%{} %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part774 = match("MESSAGE#709:Notification::01/3", "nwparser.p0", "%{} %{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); var all192 = all_match({ processors: [ @@ -14388,299 +13424,201 @@ var chain1 = processor_chain([ }), ]); -var part775 = // "Pattern{Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#0:Active/1_0", "nwparser.p0", "%{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part775 = match("MESSAGE#0:Active/1_0", "nwparser.p0", "%{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); -var part776 = // "Pattern{Field(domain,false)}" -match_copy("MESSAGE#0:Active/1_1", "nwparser.p0", "domain"); +var part776 = match_copy("MESSAGE#0:Active/1_1", "nwparser.p0", "domain"); -var part777 = // "Pattern{Field(domain,false), Constant(',Local Port '), Field(sport,false), Constant(',Remote Port '), Field(dport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#15:Somebody:01/1_0", "nwparser.p0", "%{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part777 = match("MESSAGE#15:Somebody:01/1_0", "nwparser.p0", "%{domain},Local Port %{sport},Remote Port %{dport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); -var part778 = // "Pattern{Constant('"Intrusion URL: '), Field(url,false), Constant('",Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#27:Application:06/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}"); +var part778 = match("MESSAGE#27:Application:06/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{fld25}"); -var part779 = // "Pattern{Constant('Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#27:Application:06/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); +var part779 = match("MESSAGE#27:Application:06/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{fld25}"); -var part780 = // "Pattern{Constant('Intrusion URL: '), Field(url,false)}" -match("MESSAGE#27:Application:06/1_2", "nwparser.p0", "Intrusion URL: %{url}"); +var part780 = match("MESSAGE#27:Application:06/1_2", "nwparser.p0", "Intrusion URL: %{url}"); -var part781 = // "Pattern{Field(url,false), Constant(',Intrusion Payload URL:'), Field(fld25,false)}" -match("MESSAGE#31:scanning:01/1_0", "nwparser.p0", "%{url},Intrusion Payload URL:%{fld25}"); +var part781 = match("MESSAGE#31:scanning:01/1_0", "nwparser.p0", "%{url},Intrusion Payload URL:%{fld25}"); -var part782 = // "Pattern{Field(url,false)}" -match_copy("MESSAGE#31:scanning:01/1_1", "nwparser.p0", "url"); +var part782 = match_copy("MESSAGE#31:scanning:01/1_1", "nwparser.p0", "url"); -var part783 = // "Pattern{Constant('Domain:'), Field(p0,false)}" -match("MESSAGE#33:Informational/1_1", "nwparser.p0", "Domain:%{p0}"); +var part783 = match("MESSAGE#33:Informational/1_1", "nwparser.p0", "Domain:%{p0}"); -var part784 = // "Pattern{Constant(':'), Field(p0,false)}" -match("MESSAGE#38:Web_Attack:16/1_1", "nwparser.p0", ":%{p0}"); +var part784 = match("MESSAGE#38:Web_Attack:16/1_1", "nwparser.p0", ":%{p0}"); -var part785 = // "Pattern{Constant('"'), Field(p0,false)}" -match("MESSAGE#307:process:12/1_0", "nwparser.p0", "\"%{p0}"); +var part785 = match("MESSAGE#307:process:12/1_0", "nwparser.p0", "\"%{p0}"); -var part786 = // "Pattern{Field(p0,false)}" -match_copy("MESSAGE#307:process:12/1_1", "nwparser.p0", "p0"); +var part786 = match_copy("MESSAGE#307:process:12/1_1", "nwparser.p0", "p0"); -var part787 = // "Pattern{Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(protocol,false), Constant(','), Field(p0,false)}" -match("MESSAGE#307:process:12/4", "nwparser.p0", ",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},%{p0}"); +var part787 = match("MESSAGE#307:process:12/4", "nwparser.p0", ",Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{protocol},%{p0}"); -var part788 = // "Pattern{Constant('Intrusion ID: '), Field(fld33,false), Constant(',Begin: '), Field(p0,false)}" -match("MESSAGE#307:process:12/5_0", "nwparser.p0", "Intrusion ID: %{fld33},Begin: %{p0}"); +var part788 = match("MESSAGE#307:process:12/5_0", "nwparser.p0", "Intrusion ID: %{fld33},Begin: %{p0}"); -var part789 = // "Pattern{Field(fld33,false), Constant(',Begin: '), Field(p0,false)}" -match("MESSAGE#307:process:12/5_1", "nwparser.p0", "%{fld33},Begin: %{p0}"); +var part789 = match("MESSAGE#307:process:12/5_1", "nwparser.p0", "%{fld33},Begin: %{p0}"); -var part790 = // "Pattern{Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(',Location: '), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false), Constant(',Local Port '), Field(dport,false), Constant(',Remote Port '), Field(sport,false), Constant(',CIDS Signature ID: '), Field(sigid,false), Constant(',CIDS Signature string: '), Field(sigid_string,false), Constant(',CIDS Signature SubID: '), Field(fld23,false), Constant(',Intrusion URL: '), Field(p0,false)}" -match("MESSAGE#307:process:12/6", "nwparser.p0", "%{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); +var part790 = match("MESSAGE#307:process:12/6", "nwparser.p0", "%{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application},Location: %{fld11},User: %{username},Domain: %{domain},Local Port %{dport},Remote Port %{sport},CIDS Signature ID: %{sigid},CIDS Signature string: %{sigid_string},CIDS Signature SubID: %{fld23},Intrusion URL: %{p0}"); -var part791 = // "Pattern{Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#21:Applied/1_0", "nwparser.p0", ",Event time:%{fld17->} %{fld18}"); +var part791 = match("MESSAGE#21:Applied/1_0", "nwparser.p0", ",Event time:%{fld17->} %{fld18}"); -var part792 = // "Pattern{}" -match_copy("MESSAGE#21:Applied/1_1", "nwparser.p0", ""); +var part792 = match_copy("MESSAGE#21:Applied/1_1", "nwparser.p0", ""); -var part793 = // "Pattern{Constant('"Location: '), Field(p0,false)}" -match("MESSAGE#23:blocked:01/1_0", "nwparser.p0", "\"Location: %{p0}"); +var part793 = match("MESSAGE#23:blocked:01/1_0", "nwparser.p0", "\"Location: %{p0}"); -var part794 = // "Pattern{Constant('Location: '), Field(p0,false)}" -match("MESSAGE#23:blocked:01/1_1", "nwparser.p0", "Location: %{p0}"); +var part794 = match("MESSAGE#23:blocked:01/1_1", "nwparser.p0", "Location: %{p0}"); -var part795 = // "Pattern{Constant(''), Field(fld2,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#52:blocked/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain}"); +var part795 = match("MESSAGE#52:blocked/2", "nwparser.p0", "%{fld2},User: %{username},Domain: %{domain}"); -var part796 = // "Pattern{Field(fld4,false), Constant(',MD-5:'), Field(fld5,false), Constant(',Local:'), Field(p0,false)}" -match("MESSAGE#190:Local::01/0_0", "nwparser.payload", "%{fld4},MD-5:%{fld5},Local:%{p0}"); +var part796 = match("MESSAGE#190:Local::01/0_0", "nwparser.payload", "%{fld4},MD-5:%{fld5},Local:%{p0}"); -var part797 = // "Pattern{Constant('Local:'), Field(p0,false)}" -match("MESSAGE#190:Local::01/0_1", "nwparser.payload", "Local:%{p0}"); +var part797 = match("MESSAGE#190:Local::01/0_1", "nwparser.payload", "Local:%{p0}"); -var part798 = // "Pattern{Constant('Rule: '), Field(rulename,false), Constant(',Location: '), Field(p0,false)}" -match("MESSAGE#192:Local:/1_0", "nwparser.p0", "Rule: %{rulename},Location: %{p0}"); +var part798 = match("MESSAGE#192:Local:/1_0", "nwparser.p0", "Rule: %{rulename},Location: %{p0}"); -var part799 = // "Pattern{Constant(' "Rule: '), Field(rulename,false), Constant('",Location: '), Field(p0,false)}" -match("MESSAGE#192:Local:/1_1", "nwparser.p0", " \"Rule: %{rulename}\",Location: %{p0}"); +var part799 = match("MESSAGE#192:Local:/1_1", "nwparser.p0", " \"Rule: %{rulename}\",Location: %{p0}"); -var part800 = // "Pattern{Field(fld11,false), Constant(',User: '), Field(username,false), Constant(','), Field(p0,false)}" -match("MESSAGE#192:Local:/2", "nwparser.p0", "%{fld11},User: %{username},%{p0}"); +var part800 = match("MESSAGE#192:Local:/2", "nwparser.p0", "%{fld11},User: %{username},%{p0}"); -var part801 = // "Pattern{Constant('Domain: '), Field(domain,false), Constant(',Action: '), Field(action,false)}" -match("MESSAGE#192:Local:/3_0", "nwparser.p0", "Domain: %{domain},Action: %{action}"); +var part801 = match("MESSAGE#192:Local:/3_0", "nwparser.p0", "Domain: %{domain},Action: %{action}"); -var part802 = // "Pattern{Constant(' Domain: '), Field(domain,false)}" -match("MESSAGE#192:Local:/3_1", "nwparser.p0", " Domain: %{domain}"); +var part802 = match("MESSAGE#192:Local:/3_1", "nwparser.p0", " Domain: %{domain}"); -var part803 = // "Pattern{Constant('"Intrusion URL: '), Field(url,false), Constant('",Intrusion Payload URL:'), Field(p0,false)}" -match("MESSAGE#198:Local::04/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{p0}"); +var part803 = match("MESSAGE#198:Local::04/1_0", "nwparser.p0", "\"Intrusion URL: %{url}\",Intrusion Payload URL:%{p0}"); -var part804 = // "Pattern{Constant('Intrusion URL: '), Field(url,false), Constant(',Intrusion Payload URL:'), Field(p0,false)}" -match("MESSAGE#198:Local::04/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{p0}"); +var part804 = match("MESSAGE#198:Local::04/1_1", "nwparser.p0", "Intrusion URL: %{url},Intrusion Payload URL:%{p0}"); -var part805 = // "Pattern{Field(fld25,false)}" -match_copy("MESSAGE#198:Local::04/2", "nwparser.p0", "fld25"); +var part805 = match_copy("MESSAGE#198:Local::04/2", "nwparser.p0", "fld25"); -var part806 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(daddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(saddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Inbound,'), Field(network_service,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#205:Local::07/0", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part806 = match("MESSAGE#205:Local::07/0", "nwparser.payload", "%{event_description},Local: %{daddr},Local: %{fld12},Remote: %{fld13},Remote: %{saddr},Remote: %{fld15},Inbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var part807 = // "Pattern{Field(event_description,false), Constant(',Local: '), Field(saddr,false), Constant(',Local: '), Field(fld12,false), Constant(',Remote: '), Field(fld13,false), Constant(',Remote: '), Field(daddr,false), Constant(',Remote: '), Field(fld15,false), Constant(',Outbound,'), Field(network_service,false), Constant(',,Begin: '), Field(fld50,true), Constant(' '), Field(fld54,false), Constant(',End: '), Field(fld16,true), Constant(' '), Field(fld19,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(',Application: '), Field(application,false), Constant(', '), Field(p0,false)}" -match("MESSAGE#206:Local::19/0", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); +var part807 = match("MESSAGE#206:Local::19/0", "nwparser.payload", "%{event_description},Local: %{saddr},Local: %{fld12},Remote: %{fld13},Remote: %{daddr},Remote: %{fld15},Outbound,%{network_service},,Begin: %{fld50->} %{fld54},End: %{fld16->} %{fld19},Occurrences: %{dclass_counter1},Application: %{application}, %{p0}"); -var part808 = // "Pattern{Constant(''), Field(fld11,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#209:Local::03/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain}"); +var part808 = match("MESSAGE#209:Local::03/2", "nwparser.p0", "%{fld11},User: %{username},Domain: %{domain}"); -var part809 = // "Pattern{Constant('The client will block traffic from IP address '), Field(fld14,true), Constant(' for the next '), Field(duration_string,true), Constant(' (from '), Field(fld13,false), Constant(')'), Field(p0,false)}" -match("MESSAGE#64:client:05/0", "nwparser.payload", "The client will block traffic from IP address %{fld14->} for the next %{duration_string->} (from %{fld13})%{p0}"); +var part809 = match("MESSAGE#64:client:05/0", "nwparser.payload", "The client will block traffic from IP address %{fld14->} for the next %{duration_string->} (from %{fld13})%{p0}"); -var part810 = // "Pattern{Constant('.,'), Field(p0,false)}" -match("MESSAGE#64:client:05/1_0", "nwparser.p0", ".,%{p0}"); +var part810 = match("MESSAGE#64:client:05/1_0", "nwparser.p0", ".,%{p0}"); -var part811 = // "Pattern{Constant(' . ,'), Field(p0,false)}" -match("MESSAGE#64:client:05/1_1", "nwparser.p0", " . ,%{p0}"); +var part811 = match("MESSAGE#64:client:05/1_1", "nwparser.p0", " . ,%{p0}"); -var part812 = // "Pattern{Constant('Commercial application detected,Computer name: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/0", "nwparser.payload", "Commercial application detected,Computer name: %{p0}"); +var part812 = match("MESSAGE#70:Commercial/0", "nwparser.payload", "Commercial application detected,Computer name: %{p0}"); -var part813 = // "Pattern{Field(shost,false), Constant(',IP Address: '), Field(saddr,false), Constant(',Detection type: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/1_0", "nwparser.p0", "%{shost},IP Address: %{saddr},Detection type: %{p0}"); +var part813 = match("MESSAGE#70:Commercial/1_0", "nwparser.p0", "%{shost},IP Address: %{saddr},Detection type: %{p0}"); -var part814 = // "Pattern{Field(shost,false), Constant(',Detection type: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/1_1", "nwparser.p0", "%{shost},Detection type: %{p0}"); +var part814 = match("MESSAGE#70:Commercial/1_1", "nwparser.p0", "%{shost},Detection type: %{p0}"); -var part815 = // "Pattern{Field(severity,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld6,false), Constant(',Detection score:'), Field(fld7,false), Constant(',Submission recommendation: '), Field(fld8,false), Constant(',Permitted application reason: '), Field(fld9,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(fld1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#70:Commercial/2", "nwparser.p0", "%{severity},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); +var part815 = match("MESSAGE#70:Commercial/2", "nwparser.p0", "%{severity},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld6},Detection score:%{fld7},Submission recommendation: %{fld8},Permitted application reason: %{fld9},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{fld1},%{p0}"); -var part816 = // "Pattern{Constant('"'), Field(filename,false), Constant('",Actual action: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/3_0", "nwparser.p0", "\"%{filename}\",Actual action: %{p0}"); +var part816 = match("MESSAGE#70:Commercial/3_0", "nwparser.p0", "\"%{filename}\",Actual action: %{p0}"); -var part817 = // "Pattern{Field(filename,false), Constant(',Actual action: '), Field(p0,false)}" -match("MESSAGE#70:Commercial/3_1", "nwparser.p0", "%{filename},Actual action: %{p0}"); +var part817 = match("MESSAGE#70:Commercial/3_1", "nwparser.p0", "%{filename},Actual action: %{p0}"); -var part818 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld19,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#70:Commercial/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part818 = match("MESSAGE#70:Commercial/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld19},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); -var part819 = // "Pattern{Constant('IP Address: '), Field(hostip,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(p0,false)}" -match("MESSAGE#76:Computer/0", "nwparser.payload", "IP Address: %{hostip},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); +var part819 = match("MESSAGE#76:Computer/0", "nwparser.payload", "IP Address: %{hostip},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{p0}"); -var part820 = // "Pattern{Constant('"'), Field(filename,false), Constant('",'), Field(p0,false)}" -match("MESSAGE#78:Computer:03/1_0", "nwparser.p0", "\"%{filename}\",%{p0}"); +var part820 = match("MESSAGE#78:Computer:03/1_0", "nwparser.p0", "\"%{filename}\",%{p0}"); -var part821 = // "Pattern{Field(filename,false), Constant(','), Field(p0,false)}" -match("MESSAGE#78:Computer:03/1_1", "nwparser.p0", "%{filename},%{p0}"); +var part821 = match("MESSAGE#78:Computer:03/1_1", "nwparser.p0", "%{filename},%{p0}"); -var part822 = // "Pattern{Field(severity,false), Constant(',First Seen: '), Field(fld55,false), Constant(',Application name: '), Field(application,false), Constant(',Application type: '), Field(obj_type,false), Constant(',Application version:'), Field(version,false), Constant(',Hash type:'), Field(encryption_type,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Company name: '), Field(fld11,false), Constant(',File size (bytes): '), Field(filename_size,false), Constant(',Sensitivity: '), Field(fld13,false), Constant(',Detection score:'), Field(fld7,false), Constant(',COH Engine Version: '), Field(fld41,false), Constant(','), Field(fld53,false), Constant(',Permitted application reason: '), Field(fld54,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',Risk Level: '), Field(fld50,false), Constant(',Detection Source: '), Field(fld52,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(fld22,false), Constant(',Actual action: '), Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld5,true), Constant(' '), Field(fld6,false), Constant(',Inserted:'), Field(fld12,false), Constant(',End:'), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#79:Computer:02/2", "nwparser.p0", "%{severity},First Seen: %{fld55},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld13},Detection score:%{fld7},COH Engine Version: %{fld41},%{fld53},Permitted application reason: %{fld54},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part822 = match("MESSAGE#79:Computer:02/2", "nwparser.p0", "%{severity},First Seen: %{fld55},Application name: %{application},Application type: %{obj_type},Application version:%{version},Hash type:%{encryption_type},Application hash: %{checksum},Company name: %{fld11},File size (bytes): %{filename_size},Sensitivity: %{fld13},Detection score:%{fld7},COH Engine Version: %{fld41},%{fld53},Permitted application reason: %{fld54},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},Risk Level: %{fld50},Detection Source: %{fld52},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{fld22},Actual action: %{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld5->} %{fld6},Inserted:%{fld12},End:%{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); -var part823 = // "Pattern{Constant('"'), Field(,false)}" -match("MESSAGE#250:Network:24/1_0", "nwparser.p0", "\"%{}"); +var part823 = match("MESSAGE#250:Network:24/1_0", "nwparser.p0", "\"%{}"); -var part824 = // "Pattern{Constant(' Domain:'), Field(p0,false)}" -match("MESSAGE#134:Host:09/1_1", "nwparser.p0", " Domain:%{p0}"); +var part824 = match("MESSAGE#134:Host:09/1_1", "nwparser.p0", " Domain:%{p0}"); -var part825 = // "Pattern{Constant('is '), Field(p0,false)}" -match("MESSAGE#135:Intrusion/1_0", "nwparser.p0", "is %{p0}"); +var part825 = match("MESSAGE#135:Intrusion/1_0", "nwparser.p0", "is %{p0}"); -var part826 = // "Pattern{Constant('.,Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#145:LiveUpdate:10/1_0", "nwparser.p0", ".,Event time:%{fld17->} %{fld18}"); +var part826 = match("MESSAGE#145:LiveUpdate:10/1_0", "nwparser.p0", ".,Event time:%{fld17->} %{fld18}"); -var part827 = // "Pattern{Constant('",Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#179:LiveUpdate:40/1_0", "nwparser.p0", "\",Event time:%{fld17->} %{fld18}"); +var part827 = match("MESSAGE#179:LiveUpdate:40/1_0", "nwparser.p0", "\",Event time:%{fld17->} %{fld18}"); -var part828 = // "Pattern{Constant(' '), Field(p0,false)}" -match("MESSAGE#432:Virus:02/1_1", "nwparser.p0", " %{p0}"); +var part828 = match("MESSAGE#432:Virus:02/1_1", "nwparser.p0", " %{p0}"); -var part829 = // "Pattern{Constant('Virus found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(p0,false)}" -match("MESSAGE#436:Virus:12/0", "nwparser.payload", "Virus found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); +var part829 = match("MESSAGE#436:Virus:12/0", "nwparser.payload", "Virus found,IP Address: %{saddr},Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); -var part830 = // "Pattern{Constant('"'), Field(fld1,false), Constant('",Actual action: '), Field(p0,false)}" -match("MESSAGE#436:Virus:12/1_0", "nwparser.p0", "\"%{fld1}\",Actual action: %{p0}"); +var part830 = match("MESSAGE#436:Virus:12/1_0", "nwparser.p0", "\"%{fld1}\",Actual action: %{p0}"); -var part831 = // "Pattern{Field(fld1,false), Constant(',Actual action: '), Field(p0,false)}" -match("MESSAGE#436:Virus:12/1_1", "nwparser.p0", "%{fld1},Actual action: %{p0}"); +var part831 = match("MESSAGE#436:Virus:12/1_1", "nwparser.p0", "%{fld1},Actual action: %{p0}"); -var part832 = // "Pattern{Constant('Intensive Protection Level: '), Field(fld61,false), Constant(',Certificate issuer: '), Field(fld60,false), Constant(',Certificate signer: '), Field(fld62,false), Constant(',Certificate thumbprint: '), Field(fld63,false), Constant(',Signing timestamp: '), Field(fld64,false), Constant(',Certificate serial number: '), Field(fld65,false), Constant(',Source: '), Field(p0,false)}" -match("MESSAGE#437:Virus:15/1_0", "nwparser.p0", "Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},Source: %{p0}"); +var part832 = match("MESSAGE#437:Virus:15/1_0", "nwparser.p0", "Intensive Protection Level: %{fld61},Certificate issuer: %{fld60},Certificate signer: %{fld62},Certificate thumbprint: %{fld63},Signing timestamp: %{fld64},Certificate serial number: %{fld65},Source: %{p0}"); -var part833 = // "Pattern{Constant('Source: '), Field(p0,false)}" -match("MESSAGE#437:Virus:15/1_1", "nwparser.p0", "Source: %{p0}"); +var part833 = match("MESSAGE#437:Virus:15/1_1", "nwparser.p0", "Source: %{p0}"); -var part834 = // "Pattern{Constant('"Group: '), Field(group,false), Constant('",Server: '), Field(p0,false)}" -match("MESSAGE#438:Virus:13/3_0", "nwparser.p0", "\"Group: %{group}\",Server: %{p0}"); +var part834 = match("MESSAGE#438:Virus:13/3_0", "nwparser.p0", "\"Group: %{group}\",Server: %{p0}"); -var part835 = // "Pattern{Constant('Group: '), Field(group,false), Constant(',Server: '), Field(p0,false)}" -match("MESSAGE#438:Virus:13/3_1", "nwparser.p0", "Group: %{group},Server: %{p0}"); +var part835 = match("MESSAGE#438:Virus:13/3_1", "nwparser.p0", "Group: %{group},Server: %{p0}"); -var part836 = // "Pattern{Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(fld31,false), Constant(',Disposition: '), Field(result,false), Constant(',Download site: '), Field(fld44,false), Constant(',Web domain: '), Field(fld45,false), Constant(',Downloaded by: '), Field(fld46,false), Constant(',Prevalence: '), Field(info,false), Constant(',Confidence: '), Field(context,false), Constant(',URL Tracking Status: '), Field(fld49,false), Constant(',,First Seen: '), Field(fld50,false), Constant(',Sensitivity: '), Field(fld52,false), Constant(','), Field(fld56,false), Constant(',Application hash: '), Field(checksum,false), Constant(',Hash type: '), Field(encryption_type,false), Constant(',Company name: '), Field(fld54,false), Constant(',Application name: '), Field(application,false), Constant(',Application version: '), Field(version,false), Constant(',Application type: '), Field(obj_type,false), Constant(',File size (bytes): '), Field(p0,false)}" -match("MESSAGE#438:Virus:13/4", "nwparser.p0", "%{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{p0}"); +var part836 = match("MESSAGE#438:Virus:13/4", "nwparser.p0", "%{hostid},User: %{username},Source computer: %{fld29},Source IP: %{fld31},Disposition: %{result},Download site: %{fld44},Web domain: %{fld45},Downloaded by: %{fld46},Prevalence: %{info},Confidence: %{context},URL Tracking Status: %{fld49},,First Seen: %{fld50},Sensitivity: %{fld52},%{fld56},Application hash: %{checksum},Hash type: %{encryption_type},Company name: %{fld54},Application name: %{application},Application version: %{version},Application type: %{obj_type},File size (bytes): %{p0}"); -var part837 = // "Pattern{Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(event_type,false)}" -match("MESSAGE#438:Virus:13/5_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{event_type}"); +var part837 = match("MESSAGE#438:Virus:13/5_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{event_type}"); -var part838 = // "Pattern{Field(filename_size,false)}" -match_copy("MESSAGE#438:Virus:13/5_1", "nwparser.p0", "filename_size"); +var part838 = match_copy("MESSAGE#438:Virus:13/5_1", "nwparser.p0", "filename_size"); -var part839 = // "Pattern{Constant('Virus found,Computer name: '), Field(shost,false), Constant(',Source: '), Field(event_source,false), Constant(',Risk name: '), Field(virusname,false), Constant(',Occurrences: '), Field(dclass_counter1,false), Constant(','), Field(filename,false), Constant(','), Field(p0,false)}" -match("MESSAGE#440:Virus:14/0", "nwparser.payload", "Virus found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); +var part839 = match("MESSAGE#440:Virus:14/0", "nwparser.payload", "Virus found,Computer name: %{shost},Source: %{event_source},Risk name: %{virusname},Occurrences: %{dclass_counter1},%{filename},%{p0}"); -var part840 = // "Pattern{Constant('"'), Field(info,false), Constant('",Actual action: '), Field(p0,false)}" -match("MESSAGE#441:Virus:05/1_0", "nwparser.p0", "\"%{info}\",Actual action: %{p0}"); +var part840 = match("MESSAGE#441:Virus:05/1_0", "nwparser.p0", "\"%{info}\",Actual action: %{p0}"); -var part841 = // "Pattern{Field(info,false), Constant(',Actual action: '), Field(p0,false)}" -match("MESSAGE#441:Virus:05/1_1", "nwparser.p0", "%{info},Actual action: %{p0}"); +var part841 = match("MESSAGE#441:Virus:05/1_1", "nwparser.p0", "%{info},Actual action: %{p0}"); -var part842 = // "Pattern{Constant(''), Field(info,false), Constant(',Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#218:Location/3_0", "nwparser.p0", "%{info},Event time:%{fld17->} %{fld18}"); +var part842 = match("MESSAGE#218:Location/3_0", "nwparser.p0", "%{info},Event time:%{fld17->} %{fld18}"); -var part843 = // "Pattern{Field(info,false)}" -match_copy("MESSAGE#218:Location/3_1", "nwparser.p0", "info"); +var part843 = match_copy("MESSAGE#218:Location/3_1", "nwparser.p0", "info"); -var part844 = // "Pattern{Constant(' by policy'), Field(,false)}" -match("MESSAGE#253:Network:27/1_0", "nwparser.p0", " by policy%{}"); +var part844 = match("MESSAGE#253:Network:27/1_0", "nwparser.p0", " by policy%{}"); -var part845 = // "Pattern{Constant(','), Field(p0,false)}" -match("MESSAGE#296:Policy:deleted/1_0", "nwparser.p0", ",%{p0}"); +var part845 = match("MESSAGE#296:Policy:deleted/1_0", "nwparser.p0", ",%{p0}"); -var part846 = // "Pattern{Constant('Potential risk found,Computer name: '), Field(p0,false)}" -match("MESSAGE#298:Potential:02/0", "nwparser.payload", "Potential risk found,Computer name: %{p0}"); +var part846 = match("MESSAGE#298:Potential:02/0", "nwparser.payload", "Potential risk found,Computer name: %{p0}"); -var part847 = // "Pattern{Field(action,false), Constant(',Requested action: '), Field(disposition,false), Constant(',Secondary action: '), Field(event_state,false), Constant(',Event time: '), Field(fld17,true), Constant(' '), Field(fld18,false), Constant(',Inserted: '), Field(fld20,false), Constant(',End: '), Field(fld51,false), Constant(',Domain: '), Field(domain,false), Constant(',Group: '), Field(group,false), Constant(',Server: '), Field(hostid,false), Constant(',User: '), Field(username,false), Constant(',Source computer: '), Field(fld29,false), Constant(',Source IP: '), Field(saddr,false)}" -match("MESSAGE#299:Potential/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld20},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); +var part847 = match("MESSAGE#299:Potential/4", "nwparser.p0", "%{action},Requested action: %{disposition},Secondary action: %{event_state},Event time: %{fld17->} %{fld18},Inserted: %{fld20},End: %{fld51},Domain: %{domain},Group: %{group},Server: %{hostid},User: %{username},Source computer: %{fld29},Source IP: %{saddr}"); -var part848 = // "Pattern{Field(event_description,false), Constant(', process id: '), Field(process_id,true), Constant(' Filename: '), Field(filename,true), Constant(' The change was denied by user'), Field(fld6,false), Constant('"'), Field(p0,false)}" -match("MESSAGE#308:process:03/0", "nwparser.payload", "%{event_description}, process id: %{process_id->} Filename: %{filename->} The change was denied by user%{fld6}\"%{p0}"); +var part848 = match("MESSAGE#308:process:03/0", "nwparser.payload", "%{event_description}, process id: %{process_id->} Filename: %{filename->} The change was denied by user%{fld6}\"%{p0}"); -var part849 = // "Pattern{Constant('''), Field(context,false), Constant('','), Field(p0,false)}" -match("MESSAGE#340:Scan:12/1_0", "nwparser.p0", "'%{context}',%{p0}"); +var part849 = match("MESSAGE#340:Scan:12/1_0", "nwparser.p0", "'%{context}',%{p0}"); -var part850 = // "Pattern{Constant('Security risk found,Computer name: '), Field(p0,false)}" -match("MESSAGE#343:Security:03/0", "nwparser.payload", "Security risk found,Computer name: %{p0}"); +var part850 = match("MESSAGE#343:Security:03/0", "nwparser.payload", "Security risk found,Computer name: %{p0}"); -var part851 = // "Pattern{Constant('Security risk found,IP Address: '), Field(saddr,false), Constant(',Computer name: '), Field(shost,false), Constant(','), Field(p0,false)}" -match("MESSAGE#345:Security:05/0", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},%{p0}"); +var part851 = match("MESSAGE#345:Security:05/0", "nwparser.payload", "Security risk found,IP Address: %{saddr},Computer name: %{shost},%{p0}"); -var part852 = // "Pattern{Field(filename_size,false), Constant(',Category set: '), Field(category,false), Constant(',Category type: '), Field(vendor_event_cat,false)}" -match("MESSAGE#345:Security:05/7_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{vendor_event_cat}"); +var part852 = match("MESSAGE#345:Security:05/7_0", "nwparser.p0", "%{filename_size},Category set: %{category},Category type: %{vendor_event_cat}"); -var part853 = // "Pattern{Constant('Category: '), Field(fld22,false), Constant(',Symantec AntiVirus,'), Field(p0,false)}" -match("MESSAGE#388:Symantec:26/0", "nwparser.payload", "Category: %{fld22},Symantec AntiVirus,%{p0}"); +var part853 = match("MESSAGE#388:Symantec:26/0", "nwparser.payload", "Category: %{fld22},Symantec AntiVirus,%{p0}"); -var part854 = // "Pattern{Constant('[Antivirus'), Field(p0,false)}" -match("MESSAGE#388:Symantec:26/1_0", "nwparser.p0", "[Antivirus%{p0}"); +var part854 = match("MESSAGE#388:Symantec:26/1_0", "nwparser.p0", "[Antivirus%{p0}"); -var part855 = // "Pattern{Constant('"[Antivirus'), Field(p0,false)}" -match("MESSAGE#388:Symantec:26/1_1", "nwparser.p0", "\"[Antivirus%{p0}"); +var part855 = match("MESSAGE#388:Symantec:26/1_1", "nwparser.p0", "\"[Antivirus%{p0}"); -var part856 = // "Pattern{Field(,true), Constant(' '), Field(p0,false)}" -match("MESSAGE#389:Symantec:39/2", "nwparser.p0", "%{} %{p0}"); +var part856 = match("MESSAGE#389:Symantec:39/2", "nwparser.p0", "%{} %{p0}"); -var part857 = // "Pattern{Constant('detection'), Field(p0,false)}" -match("MESSAGE#389:Symantec:39/3_0", "nwparser.p0", "detection%{p0}"); +var part857 = match("MESSAGE#389:Symantec:39/3_0", "nwparser.p0", "detection%{p0}"); -var part858 = // "Pattern{Constant('advanced heuristic detection'), Field(p0,false)}" -match("MESSAGE#389:Symantec:39/3_1", "nwparser.p0", "advanced heuristic detection%{p0}"); +var part858 = match("MESSAGE#389:Symantec:39/3_1", "nwparser.p0", "advanced heuristic detection%{p0}"); -var part859 = // "Pattern{Constant(' Size (bytes): '), Field(filename_size,false), Constant('.",Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#389:Symantec:39/5_0", "nwparser.p0", " Size (bytes): %{filename_size}.\",Event time:%{fld17->} %{fld18}"); +var part859 = match("MESSAGE#389:Symantec:39/5_0", "nwparser.p0", " Size (bytes): %{filename_size}.\",Event time:%{fld17->} %{fld18}"); -var part860 = // "Pattern{Constant('Event time:'), Field(fld17,true), Constant(' '), Field(fld18,false)}" -match("MESSAGE#389:Symantec:39/5_2", "nwparser.p0", "Event time:%{fld17->} %{fld18}"); +var part860 = match("MESSAGE#389:Symantec:39/5_2", "nwparser.p0", "Event time:%{fld17->} %{fld18}"); -var part861 = // "Pattern{Constant(','), Field(p0,false)}" -match("MESSAGE#410:Terminated/0_1", "nwparser.payload", ",%{p0}"); +var part861 = match("MESSAGE#410:Terminated/0_1", "nwparser.payload", ",%{p0}"); -var part862 = // "Pattern{Constant(''), Field(fld6,false), Constant(',User: '), Field(username,false), Constant(',Domain: '), Field(domain,false)}" -match("MESSAGE#416:Traffic:02/2", "nwparser.p0", "%{fld6},User: %{username},Domain: %{domain}"); +var part862 = match("MESSAGE#416:Traffic:02/2", "nwparser.p0", "%{fld6},User: %{username},Domain: %{domain}"); -var part863 = // "Pattern{Constant('"'), Field(filename,false), Constant('",User: '), Field(p0,false)}" -match("MESSAGE#455:Allowed:09/2_0", "nwparser.p0", "\"%{filename}\",User: %{p0}"); +var part863 = match("MESSAGE#455:Allowed:09/2_0", "nwparser.p0", "\"%{filename}\",User: %{p0}"); -var part864 = // "Pattern{Field(filename,false), Constant(',User: '), Field(p0,false)}" -match("MESSAGE#455:Allowed:09/2_1", "nwparser.p0", "%{filename},User: %{p0}"); +var part864 = match("MESSAGE#455:Allowed:09/2_1", "nwparser.p0", "%{filename},User: %{p0}"); -var part865 = // "Pattern{Field(fld46,false), Constant(',File size ('), Field(fld10,false), Constant('): '), Field(filename_size,false), Constant(',Device ID: '), Field(device,false)}" -match("MESSAGE#457:Allowed:10/3_0", "nwparser.p0", "%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); +var part865 = match("MESSAGE#457:Allowed:10/3_0", "nwparser.p0", "%{fld46},File size (%{fld10}): %{filename_size},Device ID: %{device}"); -var part866 = // "Pattern{Constant('""'), Field(action,true), Constant(' . Description: '), Field(p0,false)}" -match("MESSAGE#505:Ping/0_0", "nwparser.payload", "\"\"%{action->} . Description: %{p0}"); +var part866 = match("MESSAGE#505:Ping/0_0", "nwparser.payload", "\"\"%{action->} . Description: %{p0}"); -var part867 = // "Pattern{Field(action,true), Constant(' . Description: '), Field(p0,false)}" -match("MESSAGE#505:Ping/0_1", "nwparser.payload", "%{action->} . Description: %{p0}"); +var part867 = match("MESSAGE#505:Ping/0_1", "nwparser.payload", "%{action->} . Description: %{p0}"); -var part868 = // "Pattern{Field(event_description,true), Constant(' [name]:'), Field(obj_name,true), Constant(' [class]:'), Field(obj_type,true), Constant(' [guid]:'), Field(hardware_id,true), Constant(' [deviceID]:'), Field(info,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#639:303235080/1_0", "nwparser.p0", "%{event_description->} [name]:%{obj_name->} [class]:%{obj_type->} [guid]:%{hardware_id->} [deviceID]:%{info}^^%{p0}"); +var part868 = match("MESSAGE#639:303235080/1_0", "nwparser.p0", "%{event_description->} [name]:%{obj_name->} [class]:%{obj_type->} [guid]:%{hardware_id->} [deviceID]:%{info}^^%{p0}"); -var part869 = // "Pattern{Field(event_description,false), Constant('. '), Field(info,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#639:303235080/1_1", "nwparser.p0", "%{event_description}. %{info}^^%{p0}"); +var part869 = match("MESSAGE#639:303235080/1_1", "nwparser.p0", "%{event_description}. %{info}^^%{p0}"); -var part870 = // "Pattern{Field(event_description,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#639:303235080/1_2", "nwparser.p0", "%{event_description}^^%{p0}"); +var part870 = match("MESSAGE#639:303235080/1_2", "nwparser.p0", "%{event_description}^^%{p0}"); -var part871 = // "Pattern{Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#639:303235080/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}"); +var part871 = match("MESSAGE#639:303235080/2", "nwparser.p0", "%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}"); -var part872 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(p0,false)}" -match("MESSAGE#674:238/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{p0}"); +var part872 = match("MESSAGE#674:238/0", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{p0}"); var select207 = linear_select([ dup9, @@ -14836,55 +13774,47 @@ var select236 = linear_select([ dup282, ]); -var part873 = // "Pattern{Field(id,false), Constant('^^'), Field(event_description,false)}" -match("MESSAGE#524:1281", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ +var part873 = match("MESSAGE#524:1281", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ dup53, dup15, ])); -var part874 = // "Pattern{Field(id,false), Constant('^^'), Field(event_description,false)}" -match("MESSAGE#546:4868", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ +var part874 = match("MESSAGE#546:4868", "nwparser.payload", "%{id}^^%{event_description}", processor_chain([ dup43, dup15, ])); -var part875 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#549:302449153", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part875 = match("MESSAGE#549:302449153", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup43, dup15, dup287, ])); -var part876 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#550:302449153:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part876 = match("MESSAGE#550:302449153:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup43, dup15, dup287, ])); -var part877 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#553:302449155", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part877 = match("MESSAGE#553:302449155", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup74, dup15, dup287, ])); -var part878 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#554:302449155:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part878 = match("MESSAGE#554:302449155:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup74, dup15, dup287, ])); -var part879 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#585:302450432", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part879 = match("MESSAGE#585:302450432", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup168, dup15, dup287, ])); -var part880 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(id,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(event_source,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#586:302450432:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part880 = match("MESSAGE#586:302450432:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{id}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{event_source}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup168, dup15, dup287, @@ -14896,8 +13826,7 @@ var select237 = linear_select([ dup292, ]); -var part881 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#664:206", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var part881 = match("MESSAGE#664:206", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup294, dup295, dup37, @@ -14911,8 +13840,7 @@ match("MESSAGE#664:206", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos dup302, ])); -var part882 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false)}" -match("MESSAGE#665:206:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ +var part882 = match("MESSAGE#665:206:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}", processor_chain([ dup294, dup295, dup37, @@ -14926,8 +13854,7 @@ match("MESSAGE#665:206:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{ dup302, ])); -var part883 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(daddr,false), Constant('^^'), Field(smacaddr,false), Constant('^^'), Field(dmacaddr,false), Constant('^^'), Field(zone,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(dhost,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(application,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(fld19,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(saddr_v6,false), Constant('^^'), Field(daddr_v6,false), Constant('^^'), Field(sport,false), Constant('^^'), Field(dport,false), Constant('^^'), Field(sigid,false), Constant('^^'), Field(sigid_string,false), Constant('^^'), Field(sigid1,false), Constant('^^'), Field(url,false), Constant('^^'), Field(web_referer,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(version,false), Constant('^^'), Field(policy_id,false)}" -match("MESSAGE#669:210", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ +var part883 = match("MESSAGE#669:210", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{id}^^%{saddr}^^%{daddr}^^%{smacaddr}^^%{dmacaddr}^^%{zone}^^%{username}^^%{sdomain}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{dhost}^^%{fld13}^^%{fld14}^^%{fld29}^^%{fld15}^^%{fld16}^^%{dclass_counter1}^^%{application}^^%{event_description}^^%{fld17}^^%{fld18}^^%{fld19}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{saddr_v6}^^%{daddr_v6}^^%{sport}^^%{dport}^^%{sigid}^^%{sigid_string}^^%{sigid1}^^%{url}^^%{web_referer}^^%{fld30}^^%{version}^^%{policy_id}", processor_chain([ dup43, dup15, dup353, @@ -14938,8 +13865,7 @@ match("MESSAGE#669:210", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{hos dup302, ])); -var part884 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(saddr,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(hostname,false), Constant('^^'), Field(group,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(parent_pid,false), Constant('^^'), Field(parent_process,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(param,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(fld30,false), Constant('^^'), Field(fld31,false), Constant('^^'), Field(filename_size,false), Constant('^^'), Field(fld32,false), Constant('^^'), Field(fld33,false)}" -match("MESSAGE#676:501", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{username}^^%{sdomain}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}^^%{fld31}^^%{filename_size}^^%{fld32}^^%{fld33}", processor_chain([ +var part884 = match("MESSAGE#676:501", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{saddr}^^%{username}^^%{sdomain}^^%{hostname}^^%{group}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}^^%{fld31}^^%{filename_size}^^%{fld32}^^%{fld33}", processor_chain([ dup43, dup15, dup355, @@ -14950,8 +13876,7 @@ match("MESSAGE#676:501", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id} dup308, ])); -var part885 = // "Pattern{Field(fld1,false), Constant('^^'), Field(domain,false), Constant('^^'), Field(fld3,false), Constant('^^'), Field(id,false), Constant('^^'), Field(username,false), Constant('^^'), Field(sdomain,false), Constant('^^'), Field(fld6,false), Constant('^^'), Field(fld7,false), Constant('^^'), Field(fld8,false), Constant('^^'), Field(severity,false), Constant('^^'), Field(fld9,false), Constant('^^'), Field(fld10,false), Constant('^^'), Field(shost,false), Constant('^^'), Field(fld11,false), Constant('^^'), Field(fld12,false), Constant('^^'), Field(event_description,false), Constant('^^'), Field(fld13,false), Constant('^^'), Field(fld14,false), Constant('^^'), Field(fld15,false), Constant('^^'), Field(fld16,false), Constant('^^'), Field(rule,false), Constant('^^'), Field(rulename,false), Constant('^^'), Field(parent_pid,false), Constant('^^'), Field(parent_process,false), Constant('^^'), Field(fld17,false), Constant('^^'), Field(fld18,false), Constant('^^'), Field(param,false), Constant('^^'), Field(fld20,false), Constant('^^'), Field(fld21,false), Constant('^^'), Field(fld22,false), Constant('^^'), Field(fld23,false), Constant('^^'), Field(fld24,false), Constant('^^'), Field(fld25,false), Constant('^^'), Field(fld26,false), Constant('^^'), Field(fld27,false), Constant('^^'), Field(fld28,false), Constant('^^'), Field(fld29,false), Constant('^^'), Field(dclass_counter1,false), Constant('^^'), Field(fld30,false)}" -match("MESSAGE#677:501:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{username}^^%{sdomain}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}", processor_chain([ +var part885 = match("MESSAGE#677:501:01", "nwparser.payload", "%{fld1}^^%{domain}^^%{fld3}^^%{id}^^%{username}^^%{sdomain}^^%{fld6}^^%{fld7}^^%{fld8}^^%{severity}^^%{fld9}^^%{fld10}^^%{shost}^^%{fld11}^^%{fld12}^^%{event_description}^^%{fld13}^^%{fld14}^^%{fld15}^^%{fld16}^^%{rule}^^%{rulename}^^%{parent_pid}^^%{parent_process}^^%{fld17}^^%{fld18}^^%{param}^^%{fld20}^^%{fld21}^^%{fld22}^^%{fld23}^^%{fld24}^^%{fld25}^^%{fld26}^^%{fld27}^^%{fld28}^^%{fld29}^^%{dclass_counter1}^^%{fld30}", processor_chain([ dup43, dup15, dup355, From 8c992c508b1bb3c690034b675110e2d595afd19a Mon Sep 17 00:00:00 2001 From: Andrew Kroh Date: Tue, 29 Sep 2020 07:11:22 -0400 Subject: [PATCH 016/156] Add IP validation to Security module (#21325) For event 4778 (A session was reconnected to a Window Station) the `winlog.event_data.ClientAddress` could be "LOCAL" which is obviosuly not a valid IP so we don't want to copy it into `source.ip` in that case. Fixes #19627 --- CHANGELOG.next.asciidoc | 1 + .../winlogbeat/module/security/config/winlogbeat-security.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 58ca2acb35c..76a7f1edeb6 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -367,6 +367,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix invalid IP addresses in DNS query results from Sysmon data. {issue}18432[18432] {pull}18436[18436] - Fields from Winlogbeat modules were not being included in index templates and patterns. {pull}18983[18983] +- Add source.ip validation for event ID 4778 in the Security module. {issue}19627[19627] *Functionbeat* diff --git a/x-pack/winlogbeat/module/security/config/winlogbeat-security.js b/x-pack/winlogbeat/module/security/config/winlogbeat-security.js index 9a117a42f6f..9a0899165b9 100644 --- a/x-pack/winlogbeat/module/security/config/winlogbeat-security.js +++ b/x-pack/winlogbeat/module/security/config/winlogbeat-security.js @@ -1479,11 +1479,12 @@ var security = (function () { fields: [ {from: "winlog.event_data.AccountName", to: "user.name"}, {from: "winlog.event_data.AccountDomain", to: "user.domain"}, - {from: "winlog.event_data.ClientAddress", to: "source.ip"}, + {from: "winlog.event_data.ClientAddress", to: "source.ip", type: "ip"}, {from: "winlog.event_data.ClientName", to: "source.domain"}, {from: "winlog.event_data.LogonID", to: "winlog.logon.id"}, ], ignore_missing: true, + fail_on_error: false, }) .Add(function(evt) { var user = evt.Get("winlog.event_data.AccountName"); From 0cbf4e50a5e12f331529007dd88c77b6f65b9771 Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Tue, 29 Sep 2020 13:13:14 +0200 Subject: [PATCH 017/156] feat: prepare release pipelines (#21238) * feat: prepare release pipelines * Apply suggestions from code review --- .ci/jobs/beats-release-minor-major.yml | 20 ++++++++++++++++++++ .ci/jobs/beats-release-patch.yml | 20 ++++++++++++++++++++ .ci/jobs/folders.yml | 5 +++++ 3 files changed, 45 insertions(+) create mode 100644 .ci/jobs/beats-release-minor-major.yml create mode 100644 .ci/jobs/beats-release-patch.yml diff --git a/.ci/jobs/beats-release-minor-major.yml b/.ci/jobs/beats-release-minor-major.yml new file mode 100644 index 00000000000..91c7d105fb8 --- /dev/null +++ b/.ci/jobs/beats-release-minor-major.yml @@ -0,0 +1,20 @@ +--- +- job: + name: Beats/Release/beats-release-minor-major + display-name: 'Prepare Major/minor Release' + description: 'Automate the steps to prepare a new Release branch' + view: Beats + project-type: pipeline + pipeline-scm: + script-path: release_scripts/pipeline-release-minor-major.groovy + scm: + - git: + url: git@github.com:elastic/ingest-dev.git + refspec: +refs/heads/*:refs/remotes/origin/* +refs/pull/*/head:refs/remotes/origin/pr/* + wipe-workspace: 'True' + name: origin + shallow-clone: true + credentials-id: f6c7695a-671e-4f4f-a331-acdce44ff9ba + reference-repo: /var/lib/jenkins/.git-references/ingest-dev.git + branches: + - master diff --git a/.ci/jobs/beats-release-patch.yml b/.ci/jobs/beats-release-patch.yml new file mode 100644 index 00000000000..4d205f79647 --- /dev/null +++ b/.ci/jobs/beats-release-patch.yml @@ -0,0 +1,20 @@ +--- +- job: + name: Beats/Release/beats-release-patch + display-name: 'Prepare Patch Release' + description: 'Automate the steps to prepare a new Patch' + view: Beats + project-type: pipeline + pipeline-scm: + script-path: release_scripts/pipeline-release-patch.groovy + scm: + - git: + url: git@github.com:elastic/ingest-dev.git + refspec: +refs/heads/*:refs/remotes/origin/* +refs/pull/*/head:refs/remotes/origin/pr/* + wipe-workspace: 'True' + name: origin + shallow-clone: true + credentials-id: f6c7695a-671e-4f4f-a331-acdce44ff9ba + reference-repo: /var/lib/jenkins/.git-references/ingest-dev.git + branches: + - master diff --git a/.ci/jobs/folders.yml b/.ci/jobs/folders.yml index 60b6e3eff92..4b6cc5c4944 100644 --- a/.ci/jobs/folders.yml +++ b/.ci/jobs/folders.yml @@ -4,3 +4,8 @@ name: Beats description: Beats project-type: folder + +- job: + name: Beats/Release + description: Jobs for release preparation + project-type: folder From 8f9d54bef44f9745c958bb727aed4c0e180c93cd Mon Sep 17 00:00:00 2001 From: Marc Guasch Date: Tue, 29 Sep 2020 16:20:29 +0200 Subject: [PATCH 018/156] [Filebeat][httpjson] Make httpjson use cursor input when using date cursor (#20751) * Fix duplicate import * Move config to its own package * Minor improvements * Fix tests * Create input manager * Change requester to accept and store a cursor * Modify input to be embedded * Create stateless and cursor inputs * Initialize new input manager on publish * Add changelog entry and format files * Move test data folder * Change tests * Apply requested changes --- CHANGELOG.next.asciidoc | 1 + filebeat/input/v2/input-cursor/manager.go | 7 +- .../filebeat/input/default-inputs/inputs.go | 2 +- x-pack/filebeat/input/httpjson/config.go | 58 +++++------ .../filebeat/input/httpjson/config_oauth.go | 73 +++++++------- .../input/httpjson/config_oauth_test.go | 38 ++++---- x-pack/filebeat/input/httpjson/config_test.go | 18 ++-- x-pack/filebeat/input/httpjson/date_cursor.go | 41 ++++---- x-pack/filebeat/input/httpjson/input.go | 96 +++++++++---------- .../filebeat/input/httpjson/input_cursor.go | 67 +++++++++++++ .../filebeat/input/httpjson/input_manager.go | 49 ++++++++++ .../input/httpjson/input_stateless.go | 58 +++++++++++ .../{httpjson_test.go => input_test.go} | 17 ++-- x-pack/filebeat/input/httpjson/pagination.go | 4 +- .../input/httpjson/pagination_test.go | 2 +- .../filebeat/input/httpjson/rate_limiter.go | 2 +- x-pack/filebeat/input/httpjson/requester.go | 36 +++++-- 17 files changed, 385 insertions(+), 184 deletions(-) create mode 100644 x-pack/filebeat/input/httpjson/input_cursor.go create mode 100644 x-pack/filebeat/input/httpjson/input_manager.go create mode 100644 x-pack/filebeat/input/httpjson/input_stateless.go rename x-pack/filebeat/input/httpjson/{httpjson_test.go => input_test.go} (96%) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 76a7f1edeb6..1b5b1bd16bb 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -597,6 +597,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add type and sub_type to panw panos fileset {pull}20912[20912] - Always attempt community_id processor on zeek module {pull}21155[21155] - Add related.hosts ecs field to all modules {pull}21160[21160] +- Keep cursor state between httpjson input restarts {pull}20751[20751] *Heartbeat* diff --git a/filebeat/input/v2/input-cursor/manager.go b/filebeat/input/v2/input-cursor/manager.go index 2a4310dc778..766d6f17fa0 100644 --- a/filebeat/input/v2/input-cursor/manager.go +++ b/filebeat/input/v2/input-cursor/manager.go @@ -26,7 +26,6 @@ import ( "github.com/elastic/go-concert/unison" - input "github.com/elastic/beats/v7/filebeat/input/v2" v2 "github.com/elastic/beats/v7/filebeat/input/v2" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/logp" @@ -145,7 +144,7 @@ func (cim *InputManager) shutdown() { // Create builds a new v2.Input using the provided Configure function. // The Input will run a go-routine per source that has been configured. -func (cim *InputManager) Create(config *common.Config) (input.Input, error) { +func (cim *InputManager) Create(config *common.Config) (v2.Input, error) { if err := cim.init(); err != nil { return nil, err } @@ -180,7 +179,7 @@ func (cim *InputManager) Create(config *common.Config) (input.Input, error) { // Lock locks a key for exclusive access and returns an resource that can be used to modify // the cursor state and unlock the key. -func (cim *InputManager) lock(ctx input.Context, key string) (*resource, error) { +func (cim *InputManager) lock(ctx v2.Context, key string) (*resource, error) { resource := cim.store.Get(key) err := lockResource(ctx.Logger, resource, ctx.Cancelation) if err != nil { @@ -190,7 +189,7 @@ func (cim *InputManager) lock(ctx input.Context, key string) (*resource, error) return resource, nil } -func lockResource(log *logp.Logger, resource *resource, canceler input.Canceler) error { +func lockResource(log *logp.Logger, resource *resource, canceler v2.Canceler) error { if !resource.lock.TryLock() { log.Infof("Resource '%v' currently in use, waiting...", resource.key) err := resource.lock.LockContext(canceler) diff --git a/x-pack/filebeat/input/default-inputs/inputs.go b/x-pack/filebeat/input/default-inputs/inputs.go index 1fe245b80f7..cd8562560da 100644 --- a/x-pack/filebeat/input/default-inputs/inputs.go +++ b/x-pack/filebeat/input/default-inputs/inputs.go @@ -27,7 +27,7 @@ func xpackInputs(info beat.Info, log *logp.Logger, store beater.StateStore) []v2 return []v2.Plugin{ cloudfoundry.Plugin(), http_endpoint.Plugin(), - httpjson.Plugin(), + httpjson.Plugin(log, store), o365audit.Plugin(log, store), } } diff --git a/x-pack/filebeat/input/httpjson/config.go b/x-pack/filebeat/input/httpjson/config.go index 95ca205be0d..ee1445b8a3d 100644 --- a/x-pack/filebeat/input/httpjson/config.go +++ b/x-pack/filebeat/input/httpjson/config.go @@ -17,9 +17,9 @@ import ( "github.com/elastic/beats/v7/libbeat/common/transport/tlscommon" ) -// Config contains information about httpjson configuration +// config contains information about httpjson configuration type config struct { - OAuth2 *OAuth2 `config:"oauth2"` + OAuth2 *oauth2Config `config:"oauth2"` APIKey string `config:"api_key"` AuthenticationScheme string `config:"authentication_scheme"` HTTPClientTimeout time.Duration `config:"http_client_timeout"` @@ -30,21 +30,21 @@ type config struct { JSONObjects string `config:"json_objects_array"` SplitEventsBy string `config:"split_events_by"` NoHTTPBody bool `config:"no_http_body"` - Pagination *Pagination `config:"pagination"` - RateLimit *RateLimit `config:"rate_limit"` + Pagination *paginationConfig `config:"pagination"` + RateLimit *rateLimitConfig `config:"rate_limit"` RetryMax int `config:"retry.max_attempts"` RetryWaitMin time.Duration `config:"retry.wait_min"` RetryWaitMax time.Duration `config:"retry.wait_max"` TLS *tlscommon.Config `config:"ssl"` - URL *URL `config:"url" validate:"required"` - DateCursor *DateCursor `config:"date_cursor"` + URL *urlConfig `config:"url" validate:"required"` + DateCursor *dateCursorConfig `config:"date_cursor"` } // Pagination contains information about httpjson pagination settings -type Pagination struct { +type paginationConfig struct { Enabled *bool `config:"enabled"` ExtraBodyContent common.MapStr `config:"extra_body_content"` - Header *Header `config:"header"` + Header *headerConfig `config:"header"` IDField string `config:"id_field"` RequestField string `config:"req_field"` URLField string `config:"url_field"` @@ -52,76 +52,76 @@ type Pagination struct { } // IsEnabled returns true if the `enable` field is set to true in the yaml. -func (p *Pagination) IsEnabled() bool { +func (p *paginationConfig) isEnabled() bool { return p != nil && (p.Enabled == nil || *p.Enabled) } // HTTP Header information for pagination -type Header struct { +type headerConfig struct { FieldName string `config:"field_name" validate:"required"` RegexPattern *regexp.Regexp `config:"regex_pattern" validate:"required"` } // HTTP Header Rate Limit information -type RateLimit struct { +type rateLimitConfig struct { Limit string `config:"limit"` Reset string `config:"reset"` Remaining string `config:"remaining"` } -type DateCursor struct { - Enabled *bool `config:"enabled"` - Field string `config:"field"` - URLField string `config:"url_field" validate:"required"` - ValueTemplate *Template `config:"value_template"` - DateFormat string `config:"date_format"` - InitialInterval time.Duration `config:"initial_interval"` +type dateCursorConfig struct { + Enabled *bool `config:"enabled"` + Field string `config:"field"` + URLField string `config:"url_field" validate:"required"` + ValueTemplate *templateConfig `config:"value_template"` + DateFormat string `config:"date_format"` + InitialInterval time.Duration `config:"initial_interval"` } -type Template struct { +type templateConfig struct { *template.Template } -func (t *Template) Unpack(in string) error { +func (t *templateConfig) Unpack(in string) error { tpl, err := template.New("tpl").Parse(in) if err != nil { return err } - *t = Template{Template: tpl} + *t = templateConfig{Template: tpl} return nil } -type URL struct { +type urlConfig struct { *url.URL } -func (u *URL) Unpack(in string) error { +func (u *urlConfig) Unpack(in string) error { parsed, err := url.Parse(in) if err != nil { return err } - *u = URL{URL: parsed} + *u = urlConfig{URL: parsed} return nil } // IsEnabled returns true if the `enable` field is set to true in the yaml. -func (dc *DateCursor) IsEnabled() bool { +func (dc *dateCursorConfig) isEnabled() bool { return dc != nil && (dc.Enabled == nil || *dc.Enabled) } // IsEnabled returns true if the `enable` field is set to true in the yaml. -func (dc *DateCursor) GetDateFormat() string { +func (dc *dateCursorConfig) getDateFormat() string { if dc.DateFormat == "" { return time.RFC3339 } return dc.DateFormat } -func (dc *DateCursor) Validate() error { +func (dc *dateCursorConfig) Validate() error { if dc.DateFormat == "" { return nil } @@ -154,7 +154,7 @@ func (c *config) Validate() error { } } } - if c.OAuth2.IsEnabled() { + if c.OAuth2.isEnabled() { if c.APIKey != "" || c.AuthenticationScheme != "" { return errors.New("invalid configuration: oauth2 and api_key or authentication_scheme cannot be set simultaneously") } @@ -162,7 +162,7 @@ func (c *config) Validate() error { return nil } -func defaultConfig() config { +func newDefaultConfig() config { var c config c.HTTPMethod = "GET" c.HTTPClientTimeout = 60 * time.Second diff --git a/x-pack/filebeat/input/httpjson/config_oauth.go b/x-pack/filebeat/input/httpjson/config_oauth.go index 0ff55dcbc33..d7412fd0ba8 100644 --- a/x-pack/filebeat/input/httpjson/config_oauth.go +++ b/x-pack/filebeat/input/httpjson/config_oauth.go @@ -20,32 +20,32 @@ import ( "golang.org/x/oauth2/google" ) -// An OAuth2Provider represents a supported oauth provider. -type OAuth2Provider string +// An oauth2Provider represents a supported oauth provider. +type oauth2Provider string const ( - OAuth2ProviderDefault OAuth2Provider = "" // OAuth2ProviderDefault means no specific provider is set. - OAuth2ProviderAzure OAuth2Provider = "azure" // OAuth2ProviderAzure AzureAD. - OAuth2ProviderGoogle OAuth2Provider = "google" // OAuth2ProviderGoogle Google. + oauth2ProviderDefault oauth2Provider = "" // OAuth2ProviderDefault means no specific provider is set. + oauth2ProviderAzure oauth2Provider = "azure" // OAuth2ProviderAzure AzureAD. + oauth2ProviderGoogle oauth2Provider = "google" // OAuth2ProviderGoogle Google. ) -func (p *OAuth2Provider) Unpack(in string) error { - *p = OAuth2Provider(in) +func (p *oauth2Provider) Unpack(in string) error { + *p = oauth2Provider(in) return nil } -func (p OAuth2Provider) canonical() OAuth2Provider { - return OAuth2Provider(strings.ToLower(string(p))) +func (p oauth2Provider) canonical() oauth2Provider { + return oauth2Provider(strings.ToLower(string(p))) } -// OAuth2 contains information about oauth2 authentication settings. -type OAuth2 struct { +// oauth2Config contains information about oauth2 authentication settings. +type oauth2Config struct { // common oauth fields ClientID string `config:"client.id"` ClientSecret string `config:"client.secret"` Enabled *bool `config:"enabled"` EndpointParams map[string][]string `config:"endpoint_params"` - Provider OAuth2Provider `config:"provider"` + Provider oauth2Provider `config:"provider"` Scopes []string `config:"scopes"` TokenURL string `config:"token_url"` @@ -61,25 +61,26 @@ type OAuth2 struct { } // IsEnabled returns true if the `enable` field is set to true in the yaml. -func (o *OAuth2) IsEnabled() bool { +func (o *oauth2Config) isEnabled() bool { return o != nil && (o.Enabled == nil || *o.Enabled) } // Client wraps the given http.Client and returns a new one that will use the oauth authentication. -func (o *OAuth2) Client(ctx context.Context, client *http.Client) (*http.Client, error) { - ctx = context.WithValue(ctx, oauth2.HTTPClient, client) +func (o *oauth2Config) client(ctx context.Context, client *http.Client) (*http.Client, error) { + // only required to let oauth2 library to find our custom client in the context + ctx = context.WithValue(context.Background(), oauth2.HTTPClient, client) - switch o.GetProvider() { - case OAuth2ProviderAzure, OAuth2ProviderDefault: + switch o.getProvider() { + case oauth2ProviderAzure, oauth2ProviderDefault: creds := clientcredentials.Config{ ClientID: o.ClientID, ClientSecret: o.ClientSecret, - TokenURL: o.GetTokenURL(), + TokenURL: o.getTokenURL(), Scopes: o.Scopes, - EndpointParams: o.GetEndpointParams(), + EndpointParams: o.getEndpointParams(), } return creds.Client(ctx), nil - case OAuth2ProviderGoogle: + case oauth2ProviderGoogle: if o.GoogleJWTFile != "" { cfg, err := google.JWTConfigFromJSON(o.GoogleCredentialsJSON, o.Scopes...) if err != nil { @@ -100,9 +101,9 @@ func (o *OAuth2) Client(ctx context.Context, client *http.Client) (*http.Client, } // GetTokenURL returns the TokenURL. -func (o *OAuth2) GetTokenURL() string { - switch o.GetProvider() { - case OAuth2ProviderAzure: +func (o *oauth2Config) getTokenURL() string { + switch o.getProvider() { + case oauth2ProviderAzure: if o.TokenURL == "" { return endpoints.AzureAD(o.AzureTenantID).TokenURL } @@ -112,14 +113,14 @@ func (o *OAuth2) GetTokenURL() string { } // GetProvider returns provider in its canonical form. -func (o OAuth2) GetProvider() OAuth2Provider { +func (o oauth2Config) getProvider() oauth2Provider { return o.Provider.canonical() } // GetEndpointParams returns endpoint params with any provider ones combined. -func (o OAuth2) GetEndpointParams() map[string][]string { - switch o.GetProvider() { - case OAuth2ProviderAzure: +func (o oauth2Config) getEndpointParams() map[string][]string { + switch o.getProvider() { + case oauth2ProviderAzure: if o.AzureResource != "" { if o.EndpointParams == nil { o.EndpointParams = map[string][]string{} @@ -132,18 +133,18 @@ func (o OAuth2) GetEndpointParams() map[string][]string { } // Validate checks if oauth2 config is valid. -func (o *OAuth2) Validate() error { - switch o.GetProvider() { - case OAuth2ProviderAzure: +func (o *oauth2Config) Validate() error { + switch o.getProvider() { + case oauth2ProviderAzure: return o.validateAzureProvider() - case OAuth2ProviderGoogle: + case oauth2ProviderGoogle: return o.validateGoogleProvider() - case OAuth2ProviderDefault: + case oauth2ProviderDefault: if o.TokenURL == "" || o.ClientID == "" || o.ClientSecret == "" { return errors.New("invalid configuration: both token_url and client credentials must be provided") } default: - return fmt.Errorf("invalid configuration: unknown provider %q", o.GetProvider()) + return fmt.Errorf("invalid configuration: unknown provider %q", o.getProvider()) } return nil } @@ -151,7 +152,7 @@ func (o *OAuth2) Validate() error { // findDefaultGoogleCredentials will default to google.FindDefaultCredentials and will only be changed for testing purposes var findDefaultGoogleCredentials = google.FindDefaultCredentials -func (o *OAuth2) validateGoogleProvider() error { +func (o *oauth2Config) validateGoogleProvider() error { if o.TokenURL != "" || o.ClientID != "" || o.ClientSecret != "" || o.AzureTenantID != "" || o.AzureResource != "" || len(o.EndpointParams) > 0 { return errors.New("invalid configuration: none of token_url and client credentials can be used, use google.credentials_file, google.jwt_file, google.credentials_json or ADC instead") @@ -191,7 +192,7 @@ func (o *OAuth2) validateGoogleProvider() error { return fmt.Errorf("invalid configuration: no authentication credentials were configured or detected (ADC)") } -func (o *OAuth2) populateCredentialsJSONFromFile(file string) error { +func (o *oauth2Config) populateCredentialsJSONFromFile(file string) error { if _, err := os.Stat(file); os.IsNotExist(err) { return fmt.Errorf("invalid configuration: the file %q cannot be found", file) } @@ -210,7 +211,7 @@ func (o *OAuth2) populateCredentialsJSONFromFile(file string) error { return nil } -func (o *OAuth2) validateAzureProvider() error { +func (o *oauth2Config) validateAzureProvider() error { if o.TokenURL == "" && o.AzureTenantID == "" { return errors.New("invalid configuration: at least one of token_url or tenant_id must be provided") } diff --git a/x-pack/filebeat/input/httpjson/config_oauth_test.go b/x-pack/filebeat/input/httpjson/config_oauth_test.go index 3fa0eed4284..67ec63b6650 100644 --- a/x-pack/filebeat/input/httpjson/config_oauth_test.go +++ b/x-pack/filebeat/input/httpjson/config_oauth_test.go @@ -11,8 +11,8 @@ import ( func TestProviderCanonical(t *testing.T) { const ( - a OAuth2Provider = "gOoGle" - b OAuth2Provider = "google" + a oauth2Provider = "gOoGle" + b oauth2Provider = "google" ) if a.canonical() != b.canonical() { @@ -21,74 +21,74 @@ func TestProviderCanonical(t *testing.T) { } func TestGetProviderIsCanonical(t *testing.T) { - const expected OAuth2Provider = "google" + const expected oauth2Provider = "google" - oauth2 := OAuth2{Provider: "GOogle"} - if oauth2.GetProvider() != expected { + oauth2 := oauth2Config{Provider: "GOogle"} + if oauth2.getProvider() != expected { t.Fatal("GetProvider should return canonical provider") } } func TestIsEnabled(t *testing.T) { - oauth2 := OAuth2{} - if !oauth2.IsEnabled() { + oauth2 := oauth2Config{} + if !oauth2.isEnabled() { t.Fatal("OAuth2 should be enabled by default") } var enabled = false oauth2.Enabled = &enabled - if oauth2.IsEnabled() { + if oauth2.isEnabled() { t.Fatal("OAuth2 should be disabled") } enabled = true - if !oauth2.IsEnabled() { + if !oauth2.isEnabled() { t.Fatal("OAuth2 should be enabled") } } func TestGetTokenURL(t *testing.T) { const expected = "http://localhost" - oauth2 := OAuth2{TokenURL: "http://localhost"} - if got := oauth2.GetTokenURL(); got != expected { + oauth2 := oauth2Config{TokenURL: "http://localhost"} + if got := oauth2.getTokenURL(); got != expected { t.Fatalf("GetTokenURL should return the provided TokenURL but got %q", got) } } func TestGetTokenURLWithAzure(t *testing.T) { const expectedWithoutTenantID = "http://localhost" - oauth2 := OAuth2{TokenURL: "http://localhost", Provider: "azure"} - if got := oauth2.GetTokenURL(); got != expectedWithoutTenantID { + oauth2 := oauth2Config{TokenURL: "http://localhost", Provider: "azure"} + if got := oauth2.getTokenURL(); got != expectedWithoutTenantID { t.Fatalf("GetTokenURL should return the provided TokenURL but got %q", got) } oauth2.TokenURL = "" oauth2.AzureTenantID = "a_tenant_id" const expectedWithTenantID = "https://login.microsoftonline.com/a_tenant_id/oauth2/v2.0/token" - if got := oauth2.GetTokenURL(); got != expectedWithTenantID { + if got := oauth2.getTokenURL(); got != expectedWithTenantID { t.Fatalf("GetTokenURL should return the generated TokenURL but got %q", got) } } func TestGetEndpointParams(t *testing.T) { var expected = map[string][]string{"foo": {"bar"}} - oauth2 := OAuth2{EndpointParams: map[string][]string{"foo": {"bar"}}} - if got := oauth2.GetEndpointParams(); !reflect.DeepEqual(got, expected) { + oauth2 := oauth2Config{EndpointParams: map[string][]string{"foo": {"bar"}}} + if got := oauth2.getEndpointParams(); !reflect.DeepEqual(got, expected) { t.Fatalf("GetEndpointParams should return the provided EndpointParams but got %q", got) } } func TestGetEndpointParamsWithAzure(t *testing.T) { var expectedWithoutResource = map[string][]string{"foo": {"bar"}} - oauth2 := OAuth2{Provider: "azure", EndpointParams: map[string][]string{"foo": {"bar"}}} - if got := oauth2.GetEndpointParams(); !reflect.DeepEqual(got, expectedWithoutResource) { + oauth2 := oauth2Config{Provider: "azure", EndpointParams: map[string][]string{"foo": {"bar"}}} + if got := oauth2.getEndpointParams(); !reflect.DeepEqual(got, expectedWithoutResource) { t.Fatalf("GetEndpointParams should return the provided EndpointParams but got %q", got) } oauth2.AzureResource = "baz" var expectedWithResource = map[string][]string{"foo": {"bar"}, "resource": {"baz"}} - if got := oauth2.GetEndpointParams(); !reflect.DeepEqual(got, expectedWithResource) { + if got := oauth2.getEndpointParams(); !reflect.DeepEqual(got, expectedWithResource) { t.Fatalf("GetEndpointParams should return the provided EndpointParams but got %q", got) } } diff --git a/x-pack/filebeat/input/httpjson/config_test.go b/x-pack/filebeat/input/httpjson/config_test.go index 0de07311239..85c7c64848d 100644 --- a/x-pack/filebeat/input/httpjson/config_test.go +++ b/x-pack/filebeat/input/httpjson/config_test.go @@ -25,7 +25,7 @@ func TestConfigValidationCase1(t *testing.T) { "url": "localhost", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() if err := cfg.Unpack(&conf); err == nil { t.Fatal("Configuration validation failed. no_http_body and http_request_body cannot coexist.") } @@ -39,7 +39,7 @@ func TestConfigValidationCase2(t *testing.T) { "url": "localhost", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() if err := cfg.Unpack(&conf); err == nil { t.Fatal("Configuration validation failed. no_http_body and pagination.extra_body_content cannot coexist.") } @@ -53,7 +53,7 @@ func TestConfigValidationCase3(t *testing.T) { "url": "localhost", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() if err := cfg.Unpack(&conf); err == nil { t.Fatal("Configuration validation failed. no_http_body and pagination.req_field cannot coexist.") } @@ -66,7 +66,7 @@ func TestConfigValidationCase4(t *testing.T) { "url": "localhost", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() if err := cfg.Unpack(&conf); err == nil { t.Fatal("Configuration validation failed. pagination.header and pagination.req_field cannot coexist.") } @@ -79,7 +79,7 @@ func TestConfigValidationCase5(t *testing.T) { "url": "localhost", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() if err := cfg.Unpack(&conf); err == nil { t.Fatal("Configuration validation failed. pagination.header and pagination.id_field cannot coexist.") } @@ -92,7 +92,7 @@ func TestConfigValidationCase6(t *testing.T) { "url": "localhost", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() if err := cfg.Unpack(&conf); err == nil { t.Fatal("Configuration validation failed. pagination.header and extra_body_content cannot coexist.") } @@ -105,7 +105,7 @@ func TestConfigValidationCase7(t *testing.T) { "url": "localhost", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() if err := cfg.Unpack(&conf); err == nil { t.Fatal("Configuration validation failed. http_method DELETE is not allowed.") } @@ -116,7 +116,7 @@ func TestConfigMustFailWithInvalidURL(t *testing.T) { "url": "::invalid::", } cfg := common.MustNewConfigFrom(m) - conf := defaultConfig() + conf := newDefaultConfig() err := cfg.Unpack(&conf) assert.EqualError(t, err, `parse "::invalid::": missing protocol scheme accessing 'url'`) } @@ -414,7 +414,7 @@ func TestConfigOauth2Validation(t *testing.T) { } cfg := common.MustNewConfigFrom(c.input) - conf := defaultConfig() + conf := newDefaultConfig() err := cfg.Unpack(&conf) switch { diff --git a/x-pack/filebeat/input/httpjson/date_cursor.go b/x-pack/filebeat/input/httpjson/date_cursor.go index 2a9db44bd2a..66ca659de78 100644 --- a/x-pack/filebeat/input/httpjson/date_cursor.go +++ b/x-pack/filebeat/input/httpjson/date_cursor.go @@ -7,6 +7,7 @@ package httpjson import ( "bytes" "net/url" + "text/template" "time" "github.com/elastic/beats/v7/libbeat/common" @@ -22,13 +23,12 @@ type dateCursor struct { initialInterval time.Duration dateFormat string - value string - valueTpl *Template + valueTpl *template.Template } func newDateCursorFromConfig(config config, log *logp.Logger) *dateCursor { c := &dateCursor{ - enabled: config.DateCursor.IsEnabled(), + enabled: config.DateCursor.isEnabled(), url: *config.URL.URL, } @@ -40,23 +40,23 @@ func newDateCursorFromConfig(config config, log *logp.Logger) *dateCursor { c.field = config.DateCursor.Field c.urlField = config.DateCursor.URLField c.initialInterval = config.DateCursor.InitialInterval - c.dateFormat = config.DateCursor.GetDateFormat() - c.valueTpl = config.DateCursor.ValueTemplate + c.dateFormat = config.DateCursor.getDateFormat() + c.valueTpl = config.DateCursor.ValueTemplate.Template return c } -func (c *dateCursor) getURL() string { +func (c *dateCursor) getURL(prevValue string) string { if !c.enabled { return c.url.String() } var dateStr string - if c.value == "" { + if prevValue == "" { t := timeNow().UTC().Add(-c.initialInterval) dateStr = t.Format(c.dateFormat) } else { - dateStr = c.value + dateStr = prevValue } q := c.url.Query() @@ -66,7 +66,7 @@ func (c *dateCursor) getURL() string { value = dateStr } else { buf := new(bytes.Buffer) - if err := c.valueTpl.Template.Execute(buf, dateStr); err != nil { + if err := c.valueTpl.Execute(buf, dateStr); err != nil { return c.url.String() } value = buf.String() @@ -74,32 +74,33 @@ func (c *dateCursor) getURL() string { q.Set(c.urlField, value) - c.url.RawQuery = q.Encode() + url := c.url + url.RawQuery = q.Encode() - return c.url.String() + return url.String() } -func (c *dateCursor) advance(m common.MapStr) { +func (c *dateCursor) getNextValue(m common.MapStr) string { if c.field == "" { - c.value = time.Now().UTC().Format(c.dateFormat) - return + return time.Now().UTC().Format(c.dateFormat) } v, err := m.GetValue(c.field) if err != nil { c.log.Warnf("date_cursor field: %q", err) - return + return "" } + switch t := v.(type) { case string: _, err := time.Parse(c.dateFormat, t) if err != nil { c.log.Warn("date_cursor field does not have the expected layout") - return + return "" } - c.value = t - default: - c.log.Warn("date_cursor field must be a string, cursor will not advance") - return + return t } + + c.log.Warn("date_cursor field must be a string, cursor will not advance") + return "" } diff --git a/x-pack/filebeat/input/httpjson/input.go b/x-pack/filebeat/input/httpjson/input.go index 766fa364864..5445197f563 100644 --- a/x-pack/filebeat/input/httpjson/input.go +++ b/x-pack/filebeat/input/httpjson/input.go @@ -9,12 +9,14 @@ import ( "fmt" "net" "net/http" + "net/url" "time" "github.com/hashicorp/go-retryablehttp" "go.uber.org/zap" v2 "github.com/elastic/beats/v7/filebeat/input/v2" + cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" stateless "github.com/elastic/beats/v7/filebeat/input/v2/input-stateless" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" @@ -63,30 +65,25 @@ func (log *retryLogger) Warn(format string, args ...interface{}) { log.log.Warnf(format, args...) } -type httpJSONInput struct { - config config - tlsConfig *tlscommon.TLSConfig -} - -func Plugin() v2.Plugin { +func Plugin(log *logp.Logger, store cursor.StateStore) v2.Plugin { + sim := stateless.NewInputManager(statelessConfigure) return v2.Plugin{ Name: inputName, Stability: feature.Beta, Deprecated: false, - Manager: stateless.NewInputManager(configure), - } -} - -func configure(cfg *common.Config) (stateless.Input, error) { - conf := defaultConfig() - if err := cfg.Unpack(&conf); err != nil { - return nil, err + Manager: inputManager{ + stateless: &sim, + cursor: &cursor.InputManager{ + Logger: log, + StateStore: store, + Type: inputName, + Configure: cursorConfigure, + }, + }, } - - return newHTTPJSONInput(conf) } -func newHTTPJSONInput(config config) (*httpJSONInput, error) { +func newTLSConfig(config config) (*tlscommon.TLSConfig, error) { if err := config.Validate(); err != nil { return nil, err } @@ -96,54 +93,53 @@ func newHTTPJSONInput(config config) (*httpJSONInput, error) { return nil, err } - return &httpJSONInput{ - config: config, - tlsConfig: tlsConfig, - }, nil + return tlsConfig, nil } -func (*httpJSONInput) Name() string { return inputName } - -func (in *httpJSONInput) Test(v2.TestContext) error { +func test(url *url.URL) error { port := func() string { - if in.config.URL.Port() != "" { - return in.config.URL.Port() + if url.Port() != "" { + return url.Port() } - switch in.config.URL.Scheme { + switch url.Scheme { case "https": return "443" } return "80" }() - _, err := net.DialTimeout("tcp", net.JoinHostPort(in.config.URL.Hostname(), port), time.Second) + _, err := net.DialTimeout("tcp", net.JoinHostPort(url.Hostname(), port), time.Second) if err != nil { - return fmt.Errorf("url %q is unreachable", in.config.URL) + return fmt.Errorf("url %q is unreachable", url) } return nil } -// Run starts the input and blocks until it ends the execution. -// It will return on context cancellation, any other error will be retried. -func (in *httpJSONInput) Run(ctx v2.Context, publisher stateless.Publisher) error { - log := ctx.Logger.With("url", in.config.URL) +func run( + ctx v2.Context, + config config, + tlsConfig *tlscommon.TLSConfig, + publisher cursor.Publisher, + cursor *cursor.Cursor, +) error { + log := ctx.Logger.With("url", config.URL) stdCtx := ctxtool.FromCanceller(ctx.Cancelation) - httpClient, err := in.newHTTPClient(stdCtx) + httpClient, err := newHTTPClient(stdCtx, config, tlsConfig) if err != nil { return err } - dateCursor := newDateCursorFromConfig(in.config, log) + dateCursor := newDateCursorFromConfig(config, log) - rateLimiter := newRateLimiterFromConfig(in.config, log) + rateLimiter := newRateLimiterFromConfig(config, log) - pagination := newPaginationFromConfig(in.config) + pagination := newPaginationFromConfig(config) requester := newRequester( - in.config, + config, rateLimiter, dateCursor, pagination, @@ -151,12 +147,14 @@ func (in *httpJSONInput) Run(ctx v2.Context, publisher stateless.Publisher) erro log, ) + requester.loadCursor(cursor, log) + // TODO: disallow passing interval = 0 as a mean to run once. - if in.config.Interval == 0 { + if config.Interval == 0 { return requester.processHTTPRequest(stdCtx, publisher) } - err = timed.Periodic(stdCtx, in.config.Interval, func() error { + err = timed.Periodic(stdCtx, config.Interval, func() error { log.Info("Process another repeated request.") if err := requester.processHTTPRequest(stdCtx, publisher); err != nil { log.Error(err) @@ -169,29 +167,29 @@ func (in *httpJSONInput) Run(ctx v2.Context, publisher stateless.Publisher) erro return nil } -func (in *httpJSONInput) newHTTPClient(ctx context.Context) (*http.Client, error) { +func newHTTPClient(ctx context.Context, config config, tlsConfig *tlscommon.TLSConfig) (*http.Client, error) { // Make retryable HTTP client client := &retryablehttp.Client{ HTTPClient: &http.Client{ Transport: &http.Transport{ DialContext: (&net.Dialer{ - Timeout: in.config.HTTPClientTimeout, + Timeout: config.HTTPClientTimeout, }).DialContext, - TLSClientConfig: in.tlsConfig.ToConfig(), + TLSClientConfig: tlsConfig.ToConfig(), DisableKeepAlives: true, }, - Timeout: in.config.HTTPClientTimeout, + Timeout: config.HTTPClientTimeout, }, Logger: newRetryLogger(), - RetryWaitMin: in.config.RetryWaitMin, - RetryWaitMax: in.config.RetryWaitMax, - RetryMax: in.config.RetryMax, + RetryWaitMin: config.RetryWaitMin, + RetryWaitMax: config.RetryWaitMax, + RetryMax: config.RetryMax, CheckRetry: retryablehttp.DefaultRetryPolicy, Backoff: retryablehttp.DefaultBackoff, } - if in.config.OAuth2.IsEnabled() { - return in.config.OAuth2.Client(ctx, client.StandardClient()) + if config.OAuth2.isEnabled() { + return config.OAuth2.client(ctx, client.StandardClient()) } return client.StandardClient(), nil diff --git a/x-pack/filebeat/input/httpjson/input_cursor.go b/x-pack/filebeat/input/httpjson/input_cursor.go new file mode 100644 index 00000000000..d18a91f3918 --- /dev/null +++ b/x-pack/filebeat/input/httpjson/input_cursor.go @@ -0,0 +1,67 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package httpjson + +import ( + v2 "github.com/elastic/beats/v7/filebeat/input/v2" + cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/transport/tlscommon" +) + +type cursorInput struct{} + +func (cursorInput) Name() string { + return "httpjson-cursor" +} + +type source struct { + config config + tlsConfig *tlscommon.TLSConfig +} + +func (src source) Name() string { + return src.config.URL.String() +} + +func cursorConfigure(cfg *common.Config) ([]cursor.Source, cursor.Input, error) { + conf := newDefaultConfig() + if err := cfg.Unpack(&conf); err != nil { + return nil, nil, err + } + return newCursorInput(conf) +} + +func newCursorInput(config config) ([]cursor.Source, cursor.Input, error) { + tlsConfig, err := newTLSConfig(config) + if err != nil { + return nil, nil, err + } + // we only allow one url per config, if we wanted to allow more than one + // each source should hold only one url + return []cursor.Source{ + &source{config: config, + tlsConfig: tlsConfig, + }, + }, + &cursorInput{}, + nil +} + +func (in *cursorInput) Test(src cursor.Source, _ v2.TestContext) error { + return test((src.(*source)).config.URL.URL) +} + +// Run starts the input and blocks until it ends the execution. +// It will return on context cancellation, any other error will be retried. +func (in *cursorInput) Run( + ctx v2.Context, + src cursor.Source, + cursor cursor.Cursor, + publisher cursor.Publisher, +) error { + s := src.(*source) + return run(ctx, s.config, s.tlsConfig, publisher, &cursor) +} diff --git a/x-pack/filebeat/input/httpjson/input_manager.go b/x-pack/filebeat/input/httpjson/input_manager.go new file mode 100644 index 00000000000..21f5066dc05 --- /dev/null +++ b/x-pack/filebeat/input/httpjson/input_manager.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package httpjson + +import ( + "go.uber.org/multierr" + + "github.com/elastic/go-concert/unison" + + v2 "github.com/elastic/beats/v7/filebeat/input/v2" + cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" + stateless "github.com/elastic/beats/v7/filebeat/input/v2/input-stateless" + "github.com/elastic/beats/v7/libbeat/common" +) + +// inputManager wraps one stateless input manager +// and one cursor input manager. It will create one or the other +// based on the config that is passed. +type inputManager struct { + stateless *stateless.InputManager + cursor *cursor.InputManager +} + +var _ v2.InputManager = inputManager{} + +// Init initializes both wrapped input managers. +func (m inputManager) Init(grp unison.Group, mode v2.Mode) error { + return multierr.Append( + m.stateless.Init(grp, mode), + m.cursor.Init(grp, mode), + ) +} + +// Create creates a cursor input manager if the config has a date cursor set up, +// otherwise it creates a stateless input manager. +func (m inputManager) Create(cfg *common.Config) (v2.Input, error) { + var config config + if err := cfg.Unpack(&config); err != nil { + return nil, err + } + + if config.DateCursor != nil { + return m.cursor.Create(cfg) + } + + return m.stateless.Create(cfg) +} diff --git a/x-pack/filebeat/input/httpjson/input_stateless.go b/x-pack/filebeat/input/httpjson/input_stateless.go new file mode 100644 index 00000000000..c7ebf6c3d4c --- /dev/null +++ b/x-pack/filebeat/input/httpjson/input_stateless.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package httpjson + +import ( + v2 "github.com/elastic/beats/v7/filebeat/input/v2" + stateless "github.com/elastic/beats/v7/filebeat/input/v2/input-stateless" + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/transport/tlscommon" +) + +type statelessInput struct { + config config + tlsConfig *tlscommon.TLSConfig +} + +func (statelessInput) Name() string { + return "httpjson-stateless" +} + +func statelessConfigure(cfg *common.Config) (stateless.Input, error) { + conf := newDefaultConfig() + if err := cfg.Unpack(&conf); err != nil { + return nil, err + } + return newStatelessInput(conf) +} + +func newStatelessInput(config config) (*statelessInput, error) { + tlsConfig, err := newTLSConfig(config) + if err != nil { + return nil, err + } + return &statelessInput{config: config, tlsConfig: tlsConfig}, nil +} + +func (in *statelessInput) Test(v2.TestContext) error { + return test(in.config.URL.URL) +} + +type statelessPublisher struct { + wrapped stateless.Publisher +} + +func (pub statelessPublisher) Publish(event beat.Event, _ interface{}) error { + pub.wrapped.Publish(event) + return nil +} + +// Run starts the input and blocks until it ends the execution. +// It will return on context cancellation, any other error will be retried. +func (in *statelessInput) Run(ctx v2.Context, publisher stateless.Publisher) error { + pub := statelessPublisher{wrapped: publisher} + return run(ctx, in.config, in.tlsConfig, pub, nil) +} diff --git a/x-pack/filebeat/input/httpjson/httpjson_test.go b/x-pack/filebeat/input/httpjson/input_test.go similarity index 96% rename from x-pack/filebeat/input/httpjson/httpjson_test.go rename to x-pack/filebeat/input/httpjson/input_test.go index b541c16002e..242811d2795 100644 --- a/x-pack/filebeat/input/httpjson/httpjson_test.go +++ b/x-pack/filebeat/input/httpjson/input_test.go @@ -23,7 +23,7 @@ import ( beattest "github.com/elastic/beats/v7/libbeat/publisher/testing" ) -func TestHTTPJSONInput(t *testing.T) { +func TestStatelessHTTPJSONInput(t *testing.T) { testCases := []struct { name string setupServer func(*testing.T, http.HandlerFunc, map[string]interface{}) @@ -224,20 +224,23 @@ func TestHTTPJSONInput(t *testing.T) { cfg := common.MustNewConfigFrom(tc.baseConfig) - input, err := configure(cfg) + conf := newDefaultConfig() + assert.NoError(t, cfg.Unpack(&conf)) + + input, err := newStatelessInput(conf) assert.NoError(t, err) - assert.Equal(t, "httpjson", input.Name()) + assert.Equal(t, "httpjson-stateless", input.Name()) assert.NoError(t, input.Test(v2.TestContext{})) - pub := beattest.NewChanClient(len(tc.expected)) - t.Cleanup(func() { _ = pub.Close() }) + chanClient := beattest.NewChanClient(len(tc.expected)) + t.Cleanup(func() { _ = chanClient.Close() }) ctx, cancel := newV2Context() t.Cleanup(cancel) var g errgroup.Group - g.Go(func() error { return input.Run(ctx, pub) }) + g.Go(func() error { return input.Run(ctx, chanClient) }) timeout := time.NewTimer(5 * time.Second) t.Cleanup(func() { _ = timeout.Stop() }) @@ -249,7 +252,7 @@ func TestHTTPJSONInput(t *testing.T) { case <-timeout.C: t.Errorf("timed out waiting for %d events", len(tc.expected)) return - case got := <-pub.Channel: + case got := <-chanClient.Channel: val, err := got.Fields.GetValue("message") assert.NoError(t, err) assert.JSONEq(t, tc.expected[receivedCount], val.(string)) diff --git a/x-pack/filebeat/input/httpjson/pagination.go b/x-pack/filebeat/input/httpjson/pagination.go index 9a7bf82b2b4..020bc783055 100644 --- a/x-pack/filebeat/input/httpjson/pagination.go +++ b/x-pack/filebeat/input/httpjson/pagination.go @@ -16,7 +16,7 @@ import ( type pagination struct { extraBodyContent common.MapStr - header *Header + header *headerConfig idField string requestField string urlField string @@ -24,7 +24,7 @@ type pagination struct { } func newPaginationFromConfig(config config) *pagination { - if !config.Pagination.IsEnabled() { + if !config.Pagination.isEnabled() { return nil } return &pagination{ diff --git a/x-pack/filebeat/input/httpjson/pagination_test.go b/x-pack/filebeat/input/httpjson/pagination_test.go index 9b04de75819..32e3261c1e6 100644 --- a/x-pack/filebeat/input/httpjson/pagination_test.go +++ b/x-pack/filebeat/input/httpjson/pagination_test.go @@ -42,7 +42,7 @@ func TestCreateRequestInfoFromBody(t *testing.T) { contentMap: common.MapStr{}, headers: common.MapStr{}, } - err := pagination.setRequestInfoFromBody( + _ = pagination.setRequestInfoFromBody( common.MapStr(m), common.MapStr(m), ri, diff --git a/x-pack/filebeat/input/httpjson/rate_limiter.go b/x-pack/filebeat/input/httpjson/rate_limiter.go index 57d206224ac..93c2b4a3fe7 100644 --- a/x-pack/filebeat/input/httpjson/rate_limiter.go +++ b/x-pack/filebeat/input/httpjson/rate_limiter.go @@ -122,7 +122,7 @@ func (r *rateLimiter) getRateLimit(header http.Header) (int64, error) { if err != nil { return 0, fmt.Errorf("failed to parse rate-limit reset value: %w", err) } - if time.Unix(epoch, 0).Sub(time.Now()) <= 0 { + if time.Until(time.Unix(epoch, 0)) <= 0 { return 0, nil } diff --git a/x-pack/filebeat/input/httpjson/requester.go b/x-pack/filebeat/input/httpjson/requester.go index b5f58179aa0..df0a1efb1eb 100644 --- a/x-pack/filebeat/input/httpjson/requester.go +++ b/x-pack/filebeat/input/httpjson/requester.go @@ -14,7 +14,7 @@ import ( "net/http" "strings" - stateless "github.com/elastic/beats/v7/filebeat/input/v2/input-stateless" + cursor "github.com/elastic/beats/v7/filebeat/input/v2/input-cursor" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/logp" ) @@ -40,6 +40,8 @@ type requester struct { authScheme string jsonObjects string splitEventsBy string + + cursorState cursorState } func newRequester( @@ -72,9 +74,9 @@ type response struct { } // processHTTPRequest processes HTTP request, and handles pagination if enabled -func (r *requester) processHTTPRequest(ctx context.Context, publisher stateless.Publisher) error { +func (r *requester) processHTTPRequest(ctx context.Context, publisher cursor.Publisher) error { ri := &requestInfo{ - url: r.dateCursor.getURL(), + url: r.dateCursor.getURL(r.cursorState.LastDateCursorValue), contentMap: common.MapStr{}, headers: r.headers, } @@ -166,7 +168,7 @@ func (r *requester) processHTTPRequest(ctx context.Context, publisher stateless. } if lastObj != nil && r.dateCursor.enabled { - r.dateCursor.advance(common.MapStr(lastObj)) + r.updateCursorState(ri.url, r.dateCursor.getNextValue(common.MapStr(lastObj))) } return nil @@ -210,7 +212,7 @@ func (r *requester) createHTTPRequest(ctx context.Context, ri *requestInfo) (*ht } // processEventArray publishes an event for each object contained in the array. It returns the last object in the array and an error if any. -func (r *requester) processEventArray(publisher stateless.Publisher, events []interface{}) (map[string]interface{}, error) { +func (r *requester) processEventArray(publisher cursor.Publisher, events []interface{}) (map[string]interface{}, error) { var last map[string]interface{} for _, t := range events { switch v := t.(type) { @@ -221,7 +223,9 @@ func (r *requester) processEventArray(publisher stateless.Publisher, events []in if err != nil { return nil, fmt.Errorf("failed to marshal %+v: %w", e, err) } - publisher.Publish(makeEvent(string(d))) + if err := publisher.Publish(makeEvent(string(d)), r.cursorState); err != nil { + return nil, fmt.Errorf("failed to publish: %w", err) + } } default: return nil, fmt.Errorf("expected only JSON objects in the array but got a %T", v) @@ -273,3 +277,23 @@ func splitEvent(splitKey string, event map[string]interface{}) []map[string]inte return events } + +type cursorState struct { + LastCalledURL string + LastDateCursorValue string +} + +func (r *requester) updateCursorState(url, value string) { + r.cursorState.LastCalledURL = url + r.cursorState.LastDateCursorValue = value +} + +func (r *requester) loadCursor(c *cursor.Cursor, log *logp.Logger) { + if c == nil || c.IsNew() { + return + } + + if err := c.Unpack(&r.cursorState); err != nil { + log.Errorf("Reset http cursor state. Failed to read from registry: %v", err) + } +} From 2996b6f1891ec03f48ab5cf2d2b989b94e7ec1d9 Mon Sep 17 00:00:00 2001 From: Blake Rouse Date: Tue, 29 Sep 2020 11:01:15 -0400 Subject: [PATCH 019/156] [Elastic Agent] Add install/uninstall sub-command (#21206) * Add install command. * Fix binary name on darwin. * Fix install of mkdir. * Update shell wrapper path for darwin. * Add ability to fix broken installation. * Fix issues with install/uninstall. * Add dedicated uninstall command. * Add enrollment at the end of install command. * Fix installation of shell wrapper. * Fix root_windows.go * Fix uninstall on Windows. * Add sleep to removal on Windows. * Fix sleep to timeout in uninstall subcommand. * Fix uninstall for nested timeout with cmd.exe. * Fix uninstall on windows to actually sleep correctly. * Fix formatting. * Add changelog. * Fixes for mage check. * Create the symlink on Windows on install, fix issue with enroll questions during install. * Refactor to remove the paths.yml and symlink dance on Windows, because new install command handles that. * Cleanup repeat GA warning. * Fix symlink on Windows. * Fix control socket on windows. * Fix socket path and authority on Windows. * Fix username matching for SYSTEM. * Fix socket path on darwin. * Fix darwin service name. Fix uninstall on systemd. * Fix install on linux. * Fix RunningInstalled on Linux. * Prevent upgrade unless conditions are correct. * Add ability to force upgradable with DEV=true when built. * Fixes from code review. * Fix issue with service description. --- NOTICE.txt | 109 +++++++++++++ dev-tools/notice/rules.json | 3 +- .../templates/linux/elastic-agent.sh.tmpl | 1 - go.mod | 3 + go.sum | 11 ++ libbeat/common/cli/input.go | 43 +++++ libbeat/common/cli/input_test.go | 63 +++++++ x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + x-pack/elastic-agent/magefile.go | 1 + .../pkg/agent/application/paths/paths.go | 108 +++++------- .../agent/application/upgrade/step_mark.go | 54 +----- .../agent/application/upgrade/step_relink.go | 14 +- .../pkg/agent/application/upgrade/upgrade.go | 45 +++-- x-pack/elastic-agent/pkg/agent/cmd/checks.go | 57 ------- .../pkg/agent/cmd/checks_windows.go | 114 ------------- x-pack/elastic-agent/pkg/agent/cmd/common.go | 59 +------ x-pack/elastic-agent/pkg/agent/cmd/enroll.go | 50 +++++- x-pack/elastic-agent/pkg/agent/cmd/install.go | 154 ++++++++++++++++++ .../elastic-agent/pkg/agent/cmd/uninstall.go | 95 +++++++++++ .../elastic-agent/pkg/agent/control/addr.go | 7 + .../pkg/agent/control/addr_windows.go | 7 + .../pkg/agent/control/server/listener.go | 1 - .../agent/control/server/listener_windows.go | 31 +++- .../pkg/agent/install/install.go | 142 ++++++++++++++++ .../pkg/agent/install/install_unix.go | 13 ++ .../pkg/agent/install/install_windows.go | 35 ++++ .../pkg/agent/install/installed.go | 75 +++++++++ .../elastic-agent/pkg/agent/install/paths.go | 30 ++++ .../pkg/agent/install/paths_darwin.go | 29 ++++ .../pkg/agent/install/paths_windows.go | 27 +++ .../pkg/agent/install/root_unix.go | 19 +++ .../pkg/agent/install/root_windows.go | 27 +++ x-pack/elastic-agent/pkg/agent/install/svc.go | 38 +++++ .../pkg/agent/install/svc_unix.go | 15 ++ .../pkg/agent/install/svc_windows.go | 49 ++++++ .../pkg/agent/install/uninstall.go | 71 ++++++++ x-pack/elastic-agent/pkg/agent/warn/warn.go | 1 + x-pack/elastic-agent/pkg/release/upgrade.go | 10 ++ x-pack/elastic-agent/pkg/release/version.go | 17 ++ 39 files changed, 1242 insertions(+), 387 deletions(-) create mode 100644 libbeat/common/cli/input.go create mode 100644 libbeat/common/cli/input_test.go delete mode 100644 x-pack/elastic-agent/pkg/agent/cmd/checks.go delete mode 100644 x-pack/elastic-agent/pkg/agent/cmd/checks_windows.go create mode 100644 x-pack/elastic-agent/pkg/agent/cmd/install.go create mode 100644 x-pack/elastic-agent/pkg/agent/cmd/uninstall.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/install.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/install_unix.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/install_windows.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/installed.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/paths.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/paths_darwin.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/paths_windows.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/root_unix.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/root_windows.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/svc.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/svc_unix.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/svc_windows.go create mode 100644 x-pack/elastic-agent/pkg/agent/install/uninstall.go create mode 100644 x-pack/elastic-agent/pkg/release/upgrade.go diff --git a/NOTICE.txt b/NOTICE.txt index 748fe0f5e98..527c1304379 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -10907,6 +10907,36 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------- +Dependency : github.com/blakerouse/service +Version: v1.1.1-0.20200924160513-057808572ffa +Licence type (autodetected): Zlib +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/blakerouse/service@v1.1.1-0.20200924160513-057808572ffa/LICENSE: + +Copyright (c) 2015 Daniel Theophanes + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. + + -------------------------------------------------------------------------------- Dependency : github.com/lib/pq Version: v1.1.2-0.20190507191818-2ff3cb3adc01 @@ -11843,6 +11873,37 @@ Contents of probable licence file $GOMODCACHE/github.com/oklog/ulid@v1.3.1/LICEN limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/otiai10/copy +Version: v1.2.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/otiai10/copy@v1.2.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2018 otiai10 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + -------------------------------------------------------------------------------- Dependency : github.com/pierrre/gotestcover Version: v0.0.0-20160517101806-924dca7d15f0 @@ -34009,6 +34070,54 @@ Contents of probable licence file $GOMODCACHE/github.com/opencontainers/runtime- limitations under the License. +-------------------------------------------------------------------------------- +Dependency : github.com/otiai10/curr +Version: v1.0.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/otiai10/curr@v1.0.0/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2020 Hiromu Ochiai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/otiai10/mint +Version: v1.3.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/otiai10/mint@v1.3.1/LICENSE: + +Copyright 2017 otiai10 (Hiromu OCHIAI) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + -------------------------------------------------------------------------------- Dependency : github.com/oxtoacart/bpool Version: v0.0.0-20150712133111-4e1c5567d7c2 diff --git a/dev-tools/notice/rules.json b/dev-tools/notice/rules.json index 73ce763cdae..c9638a9c6cf 100644 --- a/dev-tools/notice/rules.json +++ b/dev-tools/notice/rules.json @@ -9,7 +9,8 @@ "ISC", "MIT", "MPL-2.0", - "Public Domain" + "Public Domain", + "Zlib" ], "maybelist": [ "EPL-1.0", diff --git a/dev-tools/packaging/templates/linux/elastic-agent.sh.tmpl b/dev-tools/packaging/templates/linux/elastic-agent.sh.tmpl index 744abc05702..835b5955324 100644 --- a/dev-tools/packaging/templates/linux/elastic-agent.sh.tmpl +++ b/dev-tools/packaging/templates/linux/elastic-agent.sh.tmpl @@ -6,6 +6,5 @@ exec /usr/share/{{.BeatName}}/bin/{{.BeatName}} \ --path.home /var/lib/{{.BeatName}} \ --path.config /etc/{{.BeatName}} \ - --path.data /var/lib/{{.BeatName}}/data \ --path.logs /var/log/{{.BeatName}} \ "$@" diff --git a/go.mod b/go.mod index 2fafe750879..09cd086cbee 100644 --- a/go.mod +++ b/go.mod @@ -107,6 +107,7 @@ require ( github.com/josephspurrier/goversioninfo v0.0.0-20190209210621-63e6d1acd3dd github.com/jpillora/backoff v1.0.0 // indirect github.com/jstemmer/go-junit-report v0.9.1 + github.com/kardianos/service v1.1.0 github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/lib/pq v1.1.2-0.20190507191818-2ff3cb3adc01 github.com/magefile/mage v1.10.0 @@ -123,6 +124,7 @@ require ( github.com/oklog/ulid v1.3.1 github.com/opencontainers/go-digest v1.0.0-rc1.0.20190228220655-ac19fd6e7483 // indirect github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 // indirect + github.com/otiai10/copy v1.2.0 github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0 github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.0 @@ -195,6 +197,7 @@ replace ( github.com/fsnotify/fsnotify => github.com/adriansr/fsnotify v0.0.0-20180417234312-c9bbe1f46f1d github.com/google/gopacket => github.com/adriansr/gopacket v1.1.18-0.20200327165309-dd62abfa8a41 github.com/insomniacslk/dhcp => github.com/elastic/dhcp v0.0.0-20200227161230-57ec251c7eb3 // indirect + github.com/kardianos/service => github.com/blakerouse/service v1.1.1-0.20200924160513-057808572ffa github.com/tonistiigi/fifo => github.com/containerd/fifo v0.0.0-20190816180239-bda0ff6ed73c golang.org/x/tools => golang.org/x/tools v0.0.0-20200602230032-c00d67ef29d0 // release 1.14 ) diff --git a/go.sum b/go.sum index 44f6eeb2ba0..031f1faa095 100644 --- a/go.sum +++ b/go.sum @@ -127,6 +127,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/blakerouse/service v1.1.1-0.20200924160513-057808572ffa h1:aXHPZwx8Y5z8r+1WPylnu095usTf6QSshaHs6nVMBc0= +github.com/blakerouse/service v1.1.1-0.20200924160513-057808572ffa/go.mod h1:RrJI2xn5vve/r32U5suTbeaSGoMU6GbNPoj36CVYcHc= github.com/blakesmith/ar v0.0.0-20150311145944-8bd4349a67f2 h1:oMCHnXa6CCCafdPDbMh/lWRhRByN0VFLvv+g+ayx1SI= github.com/blakesmith/ar v0.0.0-20150311145944-8bd4349a67f2/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= @@ -563,6 +565,14 @@ github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rm github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 h1:CXwSGu/LYmbjEab5aMCs5usQRVBGThelUKBNnoSOuso= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -817,6 +827,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/libbeat/common/cli/input.go b/libbeat/common/cli/input.go new file mode 100644 index 00000000000..a6a516fd3d4 --- /dev/null +++ b/libbeat/common/cli/input.go @@ -0,0 +1,43 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cli + +import ( + "bufio" + "fmt" + "io" + "os" + + "github.com/pkg/errors" +) + +// ReadInput shows the text and ask the user to provide input. +func ReadInput(prompt string) (string, error) { + reader := bufio.NewReader(os.Stdin) + return input(reader, prompt) +} + +func input(r io.Reader, prompt string) (string, error) { + reader := bufio.NewScanner(r) + fmt.Print(prompt + " ") + + if !reader.Scan() { + return "", errors.New("error reading user input") + } + return reader.Text(), nil +} diff --git a/libbeat/common/cli/input_test.go b/libbeat/common/cli/input_test.go new file mode 100644 index 00000000000..de87b5efe2a --- /dev/null +++ b/libbeat/common/cli/input_test.go @@ -0,0 +1,63 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package cli + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestReadInput(t *testing.T) { + tests := []struct { + name string + input string + res string + }{ + { + name: "Question 1?", + input: "\n", + res: "", + }, + { + name: "Question 2?", + input: "full string input\n", + res: "full string input", + }, + { + name: "Question 3?", + input: "123456789\n", + res: "123456789", + }, + { + name: "Question 4?", + input: "false\n", + res: "false", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + r := strings.NewReader(test.input) + result, err := input(r, test.name) + assert.NoError(t, err) + assert.Equal(t, test.res, result) + }) + } +} diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index 3963dda9a12..be0cfc459e8 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -26,3 +26,4 @@ - Add support for dynamic inputs with providers and `{{variable|"default"}}` substitution. {pull}20839[20839] - Add support for EQL based condition on inputs {pull}20994[20994] - Send `fleet.host.id` to Endpoint Security {pull}21042[21042] +- Add `install` and `uninstall` subcommands {pull}21206[21206] diff --git a/x-pack/elastic-agent/magefile.go b/x-pack/elastic-agent/magefile.go index 7296e8189be..4fa067f8f8b 100644 --- a/x-pack/elastic-agent/magefile.go +++ b/x-pack/elastic-agent/magefile.go @@ -658,6 +658,7 @@ func buildVars() map[string]string { if isDevFlag, devFound := os.LookupEnv(devEnv); devFound { if isDev, err := strconv.ParseBool(isDevFlag); err == nil && isDev { vars["github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release.allowEmptyPgp"] = "true" + vars["github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release.allowUpgrade"] = "true" } } diff --git a/x-pack/elastic-agent/pkg/agent/application/paths/paths.go b/x-pack/elastic-agent/pkg/agent/application/paths/paths.go index 48544ec7593..b646f3796ba 100644 --- a/x-pack/elastic-agent/pkg/agent/application/paths/paths.go +++ b/x-pack/elastic-agent/pkg/agent/application/paths/paths.go @@ -6,121 +6,87 @@ package paths import ( "flag" + "fmt" "os" "path/filepath" - "runtime" - "sync" + "strings" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/config" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" ) var ( - homePath string - configPath string - dataPath string - logsPath string - serviceName string - - overridesLoader sync.Once + topPath string + configPath string + logsPath string ) func init() { - initialHome := initialHome() + topPath = initialTop() + configPath = topPath + logsPath = topPath fs := flag.CommandLine - fs.StringVar(&homePath, "path.home", initialHome, "Agent root path") - fs.StringVar(&configPath, "path.config", initialHome, "Config path is the directory Agent looks for its config file") - fs.StringVar(&dataPath, "path.data", filepath.Join(initialHome, "data"), "Data path contains Agent managed binaries") - fs.StringVar(&logsPath, "path.logs", initialHome, "Logs path contains Agent log output") + fs.StringVar(&topPath, "path.home", topPath, "Agent root path") + fs.StringVar(&configPath, "path.config", configPath, "Config path is the directory Agent looks for its config file") + fs.StringVar(&logsPath, "path.logs", logsPath, "Logs path contains Agent log output") } -// UpdatePaths update paths based on changes in paths file. -func UpdatePaths() { - getOverrides() -} - -func getOverrides() { - type paths struct { - HomePath string `config:"path.home" yaml:"path.home"` - ConfigPath string `config:"path.config" yaml:"path.config"` - DataPath string `config:"path.data" yaml:"path.data"` - LogsPath string `config:"path.logs" yaml:"path.logs"` - ServiceName string `config:"path.service_name" yaml:"path.service_name"` - } - - defaults := &paths{ - HomePath: homePath, - ConfigPath: configPath, - DataPath: dataPath, - LogsPath: logsPath, - } - - pathsFile := filepath.Join(dataPath, "paths.yml") - rawConfig, err := config.LoadYAML(pathsFile) - if err != nil { - return - } - - rawConfig.Unpack(defaults) - homePath = defaults.HomePath - configPath = defaults.ConfigPath - dataPath = defaults.DataPath - logsPath = defaults.LogsPath - serviceName = defaults.ServiceName -} - -// ServiceName return predefined service name if defined by initial call. -func ServiceName() string { - // needs to do this at this place because otherwise it will - // get overwritten by flags behavior. - overridesLoader.Do(getOverrides) - return serviceName +// Top returns the top directory for Elastic Agent, all the versioned +// home directories live under this top-level/data/elastic-agent-${hash} +func Top() string { + return topPath } // Home returns a directory where binary lives -// Executable is not supported on nacl. func Home() string { - overridesLoader.Do(getOverrides) - return homePath + return versionedHome(topPath) } // Config returns a directory where configuration file lives func Config() string { - overridesLoader.Do(getOverrides) return configPath } // Data returns the data directory for Agent func Data() string { - overridesLoader.Do(getOverrides) - return dataPath + return filepath.Join(Top(), "data") } // Logs returns a the log directory for Agent func Logs() string { - overridesLoader.Do(getOverrides) return logsPath } +// initialTop returns the initial top-level path for the binary +// +// When nested in top-level/data/elastic-agent-${hash}/ the result is top-level/. +func initialTop() string { + exePath := retrieveExecutablePath() + if insideData(exePath) { + return filepath.Dir(filepath.Dir(exePath)) + } + return exePath +} + +// retrieveExecutablePath returns the executing binary, even if the started binary was a symlink func retrieveExecutablePath() string { execPath, err := os.Executable() if err != nil { panic(err) } - evalPath, err := filepath.EvalSymlinks(execPath) if err != nil { panic(err) } - return filepath.Dir(evalPath) } -func initialHome() string { - exePath := retrieveExecutablePath() - if runtime.GOOS == "windows" { - return exePath - } +// insideData returns true when the exePath is inside of the current Agents data path. +func insideData(exePath string) bool { + expectedPath := filepath.Join("data", fmt.Sprintf("elastic-agent-%s", release.ShortCommit())) + return strings.HasSuffix(exePath, expectedPath) +} - return filepath.Dir(filepath.Dir(exePath)) // is two level up the executable (symlink evaluated) +func versionedHome(base string) string { + return filepath.Join(base, "data", fmt.Sprintf("elastic-agent-%s", release.ShortCommit())) } diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go index 0d8253bb9ca..53920e6ecff 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_mark.go @@ -6,11 +6,8 @@ package upgrade import ( "context" - "fmt" "io/ioutil" - "os" "path/filepath" - "runtime" "time" "gopkg.in/yaml.v2" @@ -41,10 +38,6 @@ type updateMarker struct { // markUpgrade marks update happened so we can handle grace period func (h *Upgrader) markUpgrade(ctx context.Context, hash string, action *fleetapi.ActionUpgrade) error { - if err := updateHomePath(hash); err != nil { - return err - } - prevVersion := release.Version() prevHash := release.Commit() if len(prevHash) > hashLen { @@ -69,55 +62,10 @@ func (h *Upgrader) markUpgrade(ctx context.Context, hash string, action *fleetap return errors.New(err, errors.TypeFilesystem, "failed to create update marker file", errors.M(errors.MetaKeyPath, markerPath)) } - activeCommitPath := filepath.Join(paths.Config(), agentCommitFile) + activeCommitPath := filepath.Join(paths.Top(), agentCommitFile) if err := ioutil.WriteFile(activeCommitPath, []byte(hash), 0644); err != nil { return errors.New(err, errors.TypeFilesystem, "failed to update active commit", errors.M(errors.MetaKeyPath, activeCommitPath)) } return nil } - -func updateHomePath(hash string) error { - if err := createPathsSymlink(hash); err != nil { - return errors.New(err, errors.TypeFilesystem, "failed to create paths symlink") - } - - pathsMap := make(map[string]string) - pathsFilepath := filepath.Join(paths.Data(), "paths.yml") - - pathsBytes, err := ioutil.ReadFile(pathsFilepath) - if err != nil { - return errors.New(err, errors.TypeConfig, "failed to read paths file") - } - - if err := yaml.Unmarshal(pathsBytes, &pathsMap); err != nil { - return errors.New(err, errors.TypeConfig, "failed to parse paths file") - } - - pathsMap["path.home"] = filepath.Join(filepath.Dir(paths.Home()), fmt.Sprintf("%s-%s", agentName, hash)) - - pathsBytes, err = yaml.Marshal(pathsMap) - if err != nil { - return errors.New(err, errors.TypeConfig, "failed to marshal paths file") - } - - return ioutil.WriteFile(pathsFilepath, pathsBytes, 0740) -} - -func createPathsSymlink(hash string) error { - // only on windows, as windows resolves PWD using symlinks in a different way. - // we create symlink for each versioned agent inside `data/` directory - // on other systems path is shared - if runtime.GOOS != "windows" { - return nil - } - - dir := filepath.Join(paths.Data(), fmt.Sprintf("%s-%s", agentName, hash)) - versionedPath := filepath.Join(dir, "data", "paths.yml") - if err := os.MkdirAll(filepath.Dir(versionedPath), 0700); err != nil { - return err - } - - pathsCfgPath := filepath.Join(paths.Data(), "paths.yml") - return os.Symlink(pathsCfgPath, versionedPath) -} diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_relink.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_relink.go index 48d22de36cf..7cbd78d4849 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_relink.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_relink.go @@ -21,22 +21,22 @@ func (u *Upgrader) changeSymlink(ctx context.Context, newHash string) error { // create symlink to elastic-agent-{hash} hashedDir := fmt.Sprintf("%s-%s", agentName, newHash) - agentBakName := agentName + ".bak" - symlinkPath := filepath.Join(paths.Config(), agentName) - newPath := filepath.Join(paths.Data(), hashedDir, agentName) + agentPrevName := agentName + ".prev" + symlinkPath := filepath.Join(paths.Top(), agentName) + newPath := filepath.Join(paths.Top(), "data", hashedDir, agentName) // handle windows suffixes if runtime.GOOS == "windows" { - agentBakName = agentName + ".exe.back" //.bak is already used + agentPrevName = agentName + ".exe.prev" symlinkPath += ".exe" newPath += ".exe" } - bakNewPath := filepath.Join(paths.Config(), agentBakName) - if err := os.Symlink(newPath, bakNewPath); err != nil { + prevNewPath := filepath.Join(paths.Top(), agentPrevName) + if err := os.Symlink(newPath, prevNewPath); err != nil { return errors.New(err, errors.TypeFilesystem, "failed to update agent symlink") } // safely rotate - return file.SafeFileRotate(symlinkPath, bakNewPath) + return file.SafeFileRotate(symlinkPath, prevNewPath) } diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go index 08c38aba8c5..9c2c4f02286 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go @@ -17,6 +17,7 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/info" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/paths" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/install" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/artifact" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/fleetapi" @@ -32,11 +33,12 @@ const ( // Upgrader performs an upgrade type Upgrader struct { - settings *artifact.Config - log *logger.Logger - closers []context.CancelFunc - reexec reexecManager - acker acker + settings *artifact.Config + log *logger.Logger + closers []context.CancelFunc + reexec reexecManager + acker acker + upgradable bool } type reexecManager interface { @@ -51,16 +53,28 @@ type acker interface { // NewUpgrader creates an upgrader which is capable of performing upgrade operation func NewUpgrader(settings *artifact.Config, log *logger.Logger, closers []context.CancelFunc, reexec reexecManager, a acker) *Upgrader { return &Upgrader{ - settings: settings, - log: log, - closers: closers, - reexec: reexec, - acker: a, + settings: settings, + log: log, + closers: closers, + reexec: reexec, + acker: a, + upgradable: getUpgradable(), } } +// Upgradable returns true if the Elastic Agent can be upgraded. +func (u *Upgrader) Upgradable() bool { + return u.upgradable +} + // Upgrade upgrades running agent func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) error { + if !u.upgradable { + return fmt.Errorf( + "cannot be upgraded; must be installed with install sub-command and " + + "running under control of the systems supervisor") + } + archivePath, err := u.downloadArtifact(ctx, a.Version, a.SourceURI) if err != nil { return err @@ -134,15 +148,16 @@ func (u *Upgrader) Ack(ctx context.Context) error { return ioutil.WriteFile(markerFile, markerBytes, 0600) } -func isSubdir(base, target string) (bool, error) { - relPath, err := filepath.Rel(base, target) - return strings.HasPrefix(relPath, ".."), err -} - func rollbackInstall(hash string) { os.RemoveAll(filepath.Join(paths.Data(), fmt.Sprintf("%s-%s", agentName, hash))) } +func getUpgradable() bool { + // only upgradable if running from Agent installer and running under the + // control of the system supervisor (or built specifically with upgrading enabled) + return release.Upgradable() || (install.RunningInstalled() && install.RunningUnderSupervisor()) +} + func copyActionStore(newHash string) error { currentActionStorePath := info.AgentActionStoreFile() diff --git a/x-pack/elastic-agent/pkg/agent/cmd/checks.go b/x-pack/elastic-agent/pkg/agent/cmd/checks.go deleted file mode 100644 index 4fee7497009..00000000000 --- a/x-pack/elastic-agent/pkg/agent/cmd/checks.go +++ /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; -// you may not use this file except in compliance with the Elastic License. - -// +build !windows - -package cmd - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "github.com/spf13/cobra" - - // import logp flags - _ "github.com/elastic/beats/v7/libbeat/logp/configure" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/paths" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" -) - -// preRunCheck is noop because -// - darwin.tar - symlink created during packaging -// - linux.tar - symlink created during packaging -// - linux.rpm - symlink created using install script -// - linux.deb - symlink created using install script -// - linux.docker - symlink created using Dockerfile -func preRunCheck(flags *globalFlags) func(cmd *cobra.Command, args []string) error { - return func(cmd *cobra.Command, args []string) error { - if sn := paths.ServiceName(); sn != "" { - // paths were created we're running as child. - return nil - } - - // get versioned path - smallHash := fmt.Sprintf("elastic-agent-%s", smallHash(release.Commit())) - commitFilepath := filepath.Join(paths.Config(), commitFile) // use other file in the future - if content, err := ioutil.ReadFile(commitFilepath); err == nil { - smallHash = hashedDirName(content) - } - - origExecPath, err := os.Executable() - if err != nil { - return err - } - reexecPath := filepath.Join(paths.Data(), smallHash, filepath.Base(origExecPath)) - - // generate paths - if err := generatePaths(filepath.Dir(reexecPath), origExecPath); err != nil { - return err - } - - paths.UpdatePaths() - return nil - } -} diff --git a/x-pack/elastic-agent/pkg/agent/cmd/checks_windows.go b/x-pack/elastic-agent/pkg/agent/cmd/checks_windows.go deleted file mode 100644 index 36108c8e08b..00000000000 --- a/x-pack/elastic-agent/pkg/agent/cmd/checks_windows.go +++ /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; -// you may not use this file except in compliance with the Elastic License. - -// +build windows - -package cmd - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - - "github.com/spf13/cobra" - - // import logp flags - _ "github.com/elastic/beats/v7/libbeat/logp/configure" - - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/paths" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/reexec" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/configuration" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/config" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/core/logger" - "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" -) - -func preRunCheck(flags *globalFlags) func(cmd *cobra.Command, args []string) error { - return func(cmd *cobra.Command, args []string) error { - if sn := paths.ServiceName(); sn != "" { - // replacing with correct service name so we - // can talk to service manager. - if !filepath.IsAbs(os.Args[0]) { - os.Args[0] = sn - } - - // paths were created we're running as child. - return nil - } - - smallHash := fmt.Sprintf("elastic-agent-%s", smallHash(release.Commit())) - commitFilepath := filepath.Join(paths.Config(), commitFile) - if content, err := ioutil.ReadFile(commitFilepath); err == nil { - smallHash = hashedDirName(content) - } - - // rename itself - origExecPath, err := os.Executable() - if err != nil { - return err - } - - if err := os.Rename(origExecPath, origExecPath+".bak"); err != nil { - return err - } - - // create symlink to elastic-agent-{hash} - reexecPath := filepath.Join(paths.Data(), smallHash, filepath.Base(origExecPath)) - if err := os.Symlink(reexecPath, origExecPath); err != nil { - return err - } - - // generate paths - if err := generatePaths(filepath.Dir(reexecPath), origExecPath); err != nil { - return err - } - - paths.UpdatePaths() - - // reexec if running run - if cmd.Use == "run" { - pathConfigFile := flags.Config() - rawConfig, err := config.LoadYAML(pathConfigFile) - if err != nil { - return errors.New(err, - fmt.Sprintf("could not read configuration file %s", pathConfigFile), - errors.TypeFilesystem, - errors.M(errors.MetaKeyPath, pathConfigFile)) - } - - cfg, err := configuration.NewFromConfig(rawConfig) - if err != nil { - return errors.New(err, - fmt.Sprintf("could not parse configuration file %s", pathConfigFile), - errors.TypeFilesystem, - errors.M(errors.MetaKeyPath, pathConfigFile)) - } - - logger, err := logger.NewFromConfig("", cfg.Settings.LoggingConfig) - if err != nil { - return err - } - - rexLogger := logger.Named("reexec") - rm := reexec.NewManager(rexLogger, reexecPath) - - argsOverrides := []string{ - "--path.data", paths.Data(), - "--path.home", filepath.Dir(reexecPath), - "--path.config", paths.Config(), - } - rm.ReExec(argsOverrides...) - - // trigger reexec - rm.ShutdownComplete() - - // return without running Run method - os.Exit(0) - } - - return nil - } -} diff --git a/x-pack/elastic-agent/pkg/agent/cmd/common.go b/x-pack/elastic-agent/pkg/agent/cmd/common.go index d5c195566bd..8ca5700f3c6 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/common.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/common.go @@ -6,15 +6,10 @@ package cmd import ( "flag" - "fmt" - "io/ioutil" "os" "path/filepath" - "runtime" - "strings" "github.com/spf13/cobra" - "gopkg.in/yaml.v2" // import logp flags _ "github.com/elastic/beats/v7/libbeat/logp/configure" @@ -58,7 +53,6 @@ func NewCommandWithArgs(args []string, streams *cli.IOStreams) *cobra.Command { // path flags cmd.PersistentFlags().AddGoFlag(flag.CommandLine.Lookup("path.home")) cmd.PersistentFlags().AddGoFlag(flag.CommandLine.Lookup("path.config")) - cmd.PersistentFlags().AddGoFlag(flag.CommandLine.Lookup("path.data")) cmd.PersistentFlags().AddGoFlag(flag.CommandLine.Lookup("path.logs")) cmd.PersistentFlags().StringVarP(&flags.PathConfigFile, "c", "c", defaultConfig, `Configuration file, relative to path.config`) @@ -72,6 +66,8 @@ func NewCommandWithArgs(args []string, streams *cli.IOStreams) *cobra.Command { run := newRunCommandWithArgs(flags, args, streams) cmd.AddCommand(basecmd.NewDefaultCommandsWithArgs(args, streams)...) cmd.AddCommand(run) + cmd.AddCommand(newInstallCommandWithArgs(flags, args, streams)) + cmd.AddCommand(newUninstallCommandWithArgs(flags, args, streams)) cmd.AddCommand(newEnrollCommandWithArgs(flags, args, streams)) cmd.AddCommand(newInspectCommandWithArgs(flags, args, streams)) @@ -80,58 +76,7 @@ func NewCommandWithArgs(args []string, streams *cli.IOStreams) *cobra.Command { if reexec != nil { cmd.AddCommand(reexec) } - cmd.PersistentPreRunE = preRunCheck(flags) cmd.Run = run.Run return cmd } - -func hashedDirName(filecontent []byte) string { - s := strings.TrimSpace(string(filecontent)) - if len(s) == 0 { - return "elastic-agent" - } - - s = smallHash(s) - - return fmt.Sprintf("elastic-agent-%s", s) -} - -func smallHash(hash string) string { - if len(hash) > hashLen { - hash = hash[:hashLen] - } - - return hash -} - -func generatePaths(dir, origExec string) error { - pathsCfg := map[string]interface{}{ - "path.data": paths.Data(), - "path.home": dir, - "path.config": paths.Config(), - "path.service_name": origExec, - } - - pathsCfgPath := filepath.Join(paths.Data(), "paths.yml") - pathsContent, err := yaml.Marshal(pathsCfg) - if err != nil { - return err - } - - if err := ioutil.WriteFile(pathsCfgPath, pathsContent, 0740); err != nil { - return err - } - - if runtime.GOOS == "windows" { - // due to two binaries we need to do a path dance - // as versioned binary will look for path inside it's own directory - versionedPath := filepath.Join(dir, "data", "paths.yml") - if err := os.MkdirAll(filepath.Dir(versionedPath), 0700); err != nil { - return err - } - return os.Symlink(pathsCfgPath, versionedPath) - } - - return nil -} diff --git a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go index 6749b57b250..6a604554136 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go @@ -42,18 +42,55 @@ func newEnrollCommandWithArgs(flags *globalFlags, _ []string, streams *cli.IOStr }, } + addEnrollFlags(cmd) + cmd.Flags().BoolP("force", "f", false, "Force overwrite the current and do not prompt for confirmation") + cmd.Flags().Bool("no-restart", false, "Skip restarting the currently running daemon") + + // used by install command + cmd.Flags().BoolP("from-install", "", false, "Set by install command to signal this was executed from install") + cmd.Flags().MarkHidden("from-install") + + return cmd +} + +func addEnrollFlags(cmd *cobra.Command) { cmd.Flags().StringP("certificate-authorities", "a", "", "Comma separated list of root certificate for server verifications") cmd.Flags().StringP("ca-sha256", "p", "", "Comma separated list of certificate authorities hash pins used for certificate verifications") - cmd.Flags().BoolP("force", "f", false, "Force overwrite the current and do not prompt for confirmation") cmd.Flags().BoolP("insecure", "i", false, "Allow insecure connection to Kibana") cmd.Flags().StringP("staging", "", "", "Configures agent to download artifacts from a staging build") - cmd.Flags().Bool("no-restart", false, "Skip restarting the currently running daemon") +} - return cmd +func buildEnrollmentFlags(cmd *cobra.Command) []string { + ca, _ := cmd.Flags().GetString("certificate-authorities") + sha256, _ := cmd.Flags().GetString("ca-sha256") + insecure, _ := cmd.Flags().GetBool("insecure") + staging, _ := cmd.Flags().GetString("staging") + + args := []string{} + if ca != "" { + args = append(args, "--certificate-authorities") + args = append(args, ca) + } + if sha256 != "" { + args = append(args, "--ca-sha256") + args = append(args, sha256) + } + if insecure { + args = append(args, "--insecure") + } + if staging != "" { + args = append(args, "--staging") + args = append(args, staging) + } + return args } func enroll(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args []string) error { - warn.PrintNotGA(streams.Out) + fromInstall, _ := cmd.Flags().GetBool("from-install") + if !fromInstall { + warn.PrintNotGA(streams.Out) + } + pathConfigFile := flags.Config() rawConfig, err := application.LoadConfigFromFile(pathConfigFile) if err != nil { @@ -79,13 +116,16 @@ func enroll(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args } force, _ := cmd.Flags().GetBool("force") + if fromInstall { + force = true + } if !force { confirm, err := c.Confirm("This will replace your current settings. Do you want to continue?", true) if err != nil { return errors.New(err, "problem reading prompt response") } if !confirm { - fmt.Fprintln(streams.Out, "Enrollment was canceled by the user") + fmt.Fprintln(streams.Out, "Enrollment was cancelled by the user") return nil } } diff --git a/x-pack/elastic-agent/pkg/agent/cmd/install.go b/x-pack/elastic-agent/pkg/agent/cmd/install.go new file mode 100644 index 00000000000..177f79912c9 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/cmd/install.go @@ -0,0 +1,154 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package cmd + +import ( + "fmt" + "os" + "os/exec" + + "github.com/spf13/cobra" + + c "github.com/elastic/beats/v7/libbeat/common/cli" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/install" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/warn" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/cli" +) + +func newInstallCommandWithArgs(flags *globalFlags, _ []string, streams *cli.IOStreams) *cobra.Command { + cmd := &cobra.Command{ + Use: "install", + Short: "Install Elastic Agent permanently on this system", + Long: `This will install Elastic Agent permanently on this system and will become managed by the systems service manager. + +Unless all the require command-line parameters are provided or -f is used this command will ask questions on how you +would like the Agent to operate. +`, + Run: func(c *cobra.Command, args []string) { + if err := installCmd(streams, c, flags, args); err != nil { + fmt.Fprintf(streams.Err, "%v\n", err) + os.Exit(1) + } + }, + } + + cmd.Flags().StringP("kibana-url", "k", "", "URL of Kibana to enroll Agent into Fleet") + cmd.Flags().StringP("enrollment-token", "t", "", "Enrollment token to use to enroll Agent into Fleet") + cmd.Flags().BoolP("force", "f", false, "Force overwrite the current and do not prompt for confirmation") + addEnrollFlags(cmd) + + return cmd +} + +func installCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args []string) error { + if !install.HasRoot() { + return fmt.Errorf("unable to perform install command, not executed with %s permissions", install.PermissionUser) + } + status, reason := install.Status() + if status == install.Installed { + return fmt.Errorf("already installed at: %s", install.InstallPath) + } + + warn.PrintNotGA(streams.Out) + force, _ := cmd.Flags().GetBool("force") + if status == install.Broken { + if !force { + fmt.Fprintf(streams.Out, "Elastic Agent is installed but currently broken: %s\n", reason) + confirm, err := c.Confirm(fmt.Sprintf("Continuing will re-install Elastic Agent over the current installation at %s. Do you want to continue?", install.InstallPath), true) + if err != nil { + return fmt.Errorf("Error: problem reading prompt response") + } + if !confirm { + return fmt.Errorf("installation was cancelled by the user") + } + } + } else { + if !force { + confirm, err := c.Confirm(fmt.Sprintf("Elastic Agent will be installed at %s and will run as a service. Do you want to continue?", install.InstallPath), true) + if err != nil { + return fmt.Errorf("Error: problem reading prompt response") + } + if !confirm { + return fmt.Errorf("installation was cancelled by the user") + } + } + } + + err := install.Install() + if err != nil { + return fmt.Errorf("Error: %s", err) + } + err = install.StartService() + if err != nil { + fmt.Fprintf(streams.Out, "Installation of required system files was successful, but starting of the service failed.\n") + return err + } + fmt.Fprintf(streams.Out, "Installation was successful and Elastic Agent is running.\n") + + askEnroll := true + kibana, _ := cmd.Flags().GetString("kibana-url") + token, _ := cmd.Flags().GetString("enrollment-token") + if kibana != "" && token != "" { + askEnroll = false + } + if force { + askEnroll = false + } + if askEnroll { + confirm, err := c.Confirm("Do you want to enroll this Agent into Fleet?", true) + if err != nil { + return fmt.Errorf("problem reading prompt response") + } + if !confirm { + // not enrolling, all done (standalone mode) + return nil + } + } + if !askEnroll && (kibana == "" || token == "") { + // force was performed without required enrollment arguments, all done (standalone mode) + return nil + } + + if kibana == "" { + kibana, err = c.ReadInput("Kibana URL you want to enroll this Agent into:") + if err != nil { + return fmt.Errorf("problem reading prompt response") + } + if kibana == "" { + fmt.Fprintf(streams.Out, "Enrollment cancelled because no URL was provided.\n") + return nil + } + } + if token == "" { + token, err = c.ReadInput("Fleet enrollment token:") + if err != nil { + return fmt.Errorf("problem reading prompt response") + } + if token == "" { + fmt.Fprintf(streams.Out, "Enrollment cancelled because no enrollment token was provided.\n") + return nil + } + } + + enrollArgs := []string{"enroll", kibana, token, "--from-install"} + enrollArgs = append(enrollArgs, buildEnrollmentFlags(cmd)...) + enrollCmd := exec.Command(install.ExecutablePath(), enrollArgs...) + enrollCmd.Stdin = os.Stdin + enrollCmd.Stdout = os.Stdout + enrollCmd.Stderr = os.Stderr + err = enrollCmd.Start() + if err != nil { + return fmt.Errorf("failed to execute enroll command: %s", err) + } + err = enrollCmd.Wait() + if err == nil { + return nil + } + exitErr, ok := err.(*exec.ExitError) + if ok { + return fmt.Errorf("enroll command failed with exit code: %d", exitErr.ExitCode()) + } + return fmt.Errorf("enroll command failed for unknown reason: %s", err) +} diff --git a/x-pack/elastic-agent/pkg/agent/cmd/uninstall.go b/x-pack/elastic-agent/pkg/agent/cmd/uninstall.go new file mode 100644 index 00000000000..d215a15e337 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/cmd/uninstall.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package cmd + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + + "github.com/spf13/cobra" + + c "github.com/elastic/beats/v7/libbeat/common/cli" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/install" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/cli" +) + +func newUninstallCommandWithArgs(flags *globalFlags, _ []string, streams *cli.IOStreams) *cobra.Command { + cmd := &cobra.Command{ + Use: "uninstall", + Short: "Uninstall permanent Elastic Agent from this system", + Long: `This will uninstall permanent Elastic Agent from this system and will no longer be managed by this system. + +Unless -f is used this command will ask confirmation before performing removal. +`, + Run: func(c *cobra.Command, args []string) { + if err := uninstallCmd(streams, c, flags, args); err != nil { + fmt.Fprintf(streams.Err, "%v\n", err) + os.Exit(1) + } + }, + } + + cmd.Flags().BoolP("force", "f", false, "Force overwrite the current and do not prompt for confirmation") + + return cmd +} + +func uninstallCmd(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args []string) error { + if !install.HasRoot() { + return fmt.Errorf("unable to perform uninstall command, not executed with %s permissions", install.PermissionUser) + } + status, reason := install.Status() + if status == install.NotInstalled { + return fmt.Errorf("not installed") + } + if status == install.Installed && !install.RunningInstalled() { + return fmt.Errorf("can only be uninstall by executing the installed Elastic Agent at: %s", install.ExecutablePath()) + } + + force, _ := cmd.Flags().GetBool("force") + if status == install.Broken { + if !force { + fmt.Fprintf(streams.Out, "Elastic Agent is installed but currently broken: %s\n", reason) + confirm, err := c.Confirm(fmt.Sprintf("Continuing will uninstall the broken Elastic Agent at %s. Do you want to continue?", install.InstallPath), true) + if err != nil { + return fmt.Errorf("problem reading prompt response") + } + if !confirm { + return fmt.Errorf("uninstall was cancelled by the user") + } + } + } else { + if !force { + confirm, err := c.Confirm(fmt.Sprintf("Elastic Agent will be uninstalled from your system at %s. Do you want to continue?", install.InstallPath), true) + if err != nil { + return fmt.Errorf("problem reading prompt response") + } + if !confirm { + return fmt.Errorf("uninstall was cancelled by the user") + } + } + } + + err := install.Uninstall() + if err != nil { + return err + } + fmt.Fprintf(streams.Out, "Elastic Agent has been uninstalled.\n") + + if runtime.GOOS == "windows" { + // The installation path will still exists because we are executing from that + // directory. So cmd.exe is spawned that sleeps for 2 seconds (using ping, recommend way from + // from Windows) then rmdir is performed. + rmdir := exec.Command( + filepath.Join(os.Getenv("windir"), "system32", "cmd.exe"), + "/C", "ping", "-n", "2", "127.0.0.1", "&&", "rmdir", "/s", "/q", install.InstallPath) + _ = rmdir.Start() + } + + return nil +} diff --git a/x-pack/elastic-agent/pkg/agent/control/addr.go b/x-pack/elastic-agent/pkg/agent/control/addr.go index 20bc1e6a005..31005e8e34d 100644 --- a/x-pack/elastic-agent/pkg/agent/control/addr.go +++ b/x-pack/elastic-agent/pkg/agent/control/addr.go @@ -11,10 +11,17 @@ import ( "fmt" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/paths" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/install" ) // Address returns the address to connect to Elastic Agent daemon. func Address() string { + // when installed the control address is fixed + if install.RunningInstalled() { + return install.SocketPath + } + + // not install, adjust the path based on data path data := paths.Data() // entire string cannot be longer than 107 characters, this forces the // length to always be 88 characters (but unique per data path) diff --git a/x-pack/elastic-agent/pkg/agent/control/addr_windows.go b/x-pack/elastic-agent/pkg/agent/control/addr_windows.go index bf2e164fbae..cbfcdf2c99e 100644 --- a/x-pack/elastic-agent/pkg/agent/control/addr_windows.go +++ b/x-pack/elastic-agent/pkg/agent/control/addr_windows.go @@ -11,10 +11,17 @@ import ( "fmt" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/application/paths" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/install" ) // Address returns the address to connect to Elastic Agent daemon. func Address() string { + // when installed the control address is fixed + if install.RunningInstalled() { + return install.SocketPath + } + + // not install, adjust the path based on data path data := paths.Data() // entire string cannot be longer than 256 characters, this forces the // length to always be 87 characters (but unique per data path) diff --git a/x-pack/elastic-agent/pkg/agent/control/server/listener.go b/x-pack/elastic-agent/pkg/agent/control/server/listener.go index 7edfc7b8ee9..3090f3d140d 100644 --- a/x-pack/elastic-agent/pkg/agent/control/server/listener.go +++ b/x-pack/elastic-agent/pkg/agent/control/server/listener.go @@ -8,7 +8,6 @@ package server import ( "fmt" - "net" "os" "path/filepath" diff --git a/x-pack/elastic-agent/pkg/agent/control/server/listener_windows.go b/x-pack/elastic-agent/pkg/agent/control/server/listener_windows.go index f98c32bcee3..eaedc9f88f2 100644 --- a/x-pack/elastic-agent/pkg/agent/control/server/listener_windows.go +++ b/x-pack/elastic-agent/pkg/agent/control/server/listener_windows.go @@ -10,6 +10,8 @@ import ( "net" "os/user" + "github.com/pkg/errors" + "github.com/elastic/beats/v7/libbeat/api/npipe" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/control" @@ -18,11 +20,7 @@ import ( // createListener creates a named pipe listener on Windows func createListener(_ *logger.Logger) (net.Listener, error) { - u, err := user.Current() - if err != nil { - return nil, err - } - sd, err := npipe.DefaultSD(u.Username) + sd, err := securityDescriptor() if err != nil { return nil, err } @@ -32,3 +30,26 @@ func createListener(_ *logger.Logger) (net.Listener, error) { func cleanupListener(_ *logger.Logger) { // nothing to do on windows } + +func securityDescriptor() (string, error) { + u, err := user.Current() + if err != nil { + return "", errors.Wrap(err, "failed to get current user") + } + // Named pipe security and access rights. + // We create the pipe and the specific users should only be able to write to it. + // See docs: https://docs.microsoft.com/en-us/windows/win32/ipc/named-pipe-security-and-access-rights + // String definition: https://docs.microsoft.com/en-us/windows/win32/secauthz/ace-strings + // Give generic read/write access to the specified user. + descriptor := "D:P(A;;GA;;;" + u.Uid + ")" + if u.Username == "NT AUTHORITY\\SYSTEM" { + // running as SYSTEM, include Administrators group so Administrators can talk over + // the named pipe to the running Elastic Agent system process + admin, err := user.LookupGroup("Administrators") + if err != nil { + return "", errors.Wrap(err, "failed to lookup Administrators group") + } + descriptor += "(A;;GA;;;" + admin.Gid + ")" + } + return descriptor, nil +} diff --git a/x-pack/elastic-agent/pkg/agent/install/install.go b/x-pack/elastic-agent/pkg/agent/install/install.go new file mode 100644 index 00000000000..2705ea0bfd9 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/install.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package install + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/otiai10/copy" + + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" +) + +// Install installs Elastic Agent persistently on the system including creating and starting its service. +func Install() error { + dir, err := findDirectory() + if err != nil { + return errors.New(err, "failed to discover the source directory for installation", errors.TypeFilesystem) + } + + // uninstall current installation + err = Uninstall() + if err != nil { + return err + } + + // ensure parent directory exists, copy source into install path + err = os.MkdirAll(filepath.Dir(InstallPath), 0755) + if err != nil { + return errors.New( + err, + fmt.Sprintf("failed to create installation parent directory (%s)", filepath.Dir(InstallPath)), + errors.M("directory", filepath.Dir(InstallPath))) + } + err = copy.Copy(dir, InstallPath, copy.Options{ + OnSymlink: func(_ string) copy.SymlinkAction { + return copy.Shallow + }, + Sync: true, + }) + if err != nil { + return errors.New( + err, + fmt.Sprintf("failed to copy source directory (%s) to destination (%s)", dir, InstallPath), + errors.M("source", dir), errors.M("destination", InstallPath)) + } + + // place shell wrapper, if present on platform + if ShellWrapperPath != "" { + err = ioutil.WriteFile(ShellWrapperPath, []byte(ShellWrapper), 0755) + if err != nil { + return errors.New( + err, + fmt.Sprintf("failed to write shell wrapper (%s)", ShellWrapperPath), + errors.M("destination", ShellWrapperPath)) + } + } + + // post install (per platform) + err = postInstall() + if err != nil { + return err + } + + // install service + svc, err := newService() + if err != nil { + return err + } + err = svc.Install() + if err != nil { + return errors.New( + err, + fmt.Sprintf("failed to install service (%s)", ServiceName), + errors.M("service", ServiceName)) + } + return nil +} + +// StartService starts the installed service. +// +// This should only be called after Install is successful. +func StartService() error { + svc, err := newService() + if err != nil { + return err + } + err = svc.Start() + if err != nil { + return errors.New( + err, + fmt.Sprintf("failed to start service (%s)", ServiceName), + errors.M("service", ServiceName)) + } + return nil +} + +// findDirectory returns the directory to copy into the installation location. +// +// This also verifies that the discovered directory is a valid directory for installation. +func findDirectory() (string, error) { + execPath, err := os.Executable() + if err != nil { + return "", err + } + execPath, err = filepath.Abs(execPath) + if err != nil { + return "", err + } + sourceDir := filepath.Dir(execPath) + if insideData(sourceDir) { + // executable path is being reported as being down inside of data path + // move up to directories to perform the copy + sourceDir = filepath.Dir(filepath.Dir(sourceDir)) + } + err = verifyDirectory(sourceDir) + if err != nil { + return "", err + } + return sourceDir, nil +} + +// verifyDirectory ensures that the directory includes the executable. +func verifyDirectory(dir string) error { + _, err := os.Stat(filepath.Join(dir, BinaryName)) + if os.IsNotExist(err) { + return fmt.Errorf("missing %s", BinaryName) + } + return nil +} + +// insideData returns true when the exePath is inside of the current Agents data path. +func insideData(exePath string) bool { + expectedPath := filepath.Join("data", fmt.Sprintf("elastic-agent-%s", release.ShortCommit())) + return strings.HasSuffix(exePath, expectedPath) +} diff --git a/x-pack/elastic-agent/pkg/agent/install/install_unix.go b/x-pack/elastic-agent/pkg/agent/install/install_unix.go new file mode 100644 index 00000000000..07d696d580a --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/install_unix.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build !windows + +package install + +// postInstall performs post installation for unix-based systems. +func postInstall() error { + // do nothing + return nil +} diff --git a/x-pack/elastic-agent/pkg/agent/install/install_windows.go b/x-pack/elastic-agent/pkg/agent/install/install_windows.go new file mode 100644 index 00000000000..ec10467ce79 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/install_windows.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build windows + +package install + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" +) + +// postInstall performs post installation for Windows systems. +func postInstall() error { + // delete the top-level elastic-agent.exe + binary := filepath.Join(InstallPath, BinaryName) + err := os.Remove(binary) + if err != nil { + // do not handle does not exist, it should have existed + return err + } + + // create top-level symlink to nested binary + realBinary := filepath.Join(InstallPath, "data", fmt.Sprintf("elastic-agent-%s", release.ShortCommit()), BinaryName) + err = os.Symlink(realBinary, binary) + if err != nil { + return err + } + + return nil +} diff --git a/x-pack/elastic-agent/pkg/agent/install/installed.go b/x-pack/elastic-agent/pkg/agent/install/installed.go new file mode 100644 index 00000000000..9f294078242 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/installed.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package install + +import ( + "os" + "path/filepath" + + "github.com/kardianos/service" +) + +// StatusType is the return status types. +type StatusType int + +const ( + // NotInstalled returned when Elastic Agent is not installed. + NotInstalled StatusType = iota + // Installed returned when Elastic Agent is installed currectly. + Installed + // Broken returned when Elastic Agent is installed but broken. + Broken +) + +// Status returns the installation status of Agent. +func Status() (StatusType, string) { + expected := filepath.Join(InstallPath, BinaryName) + status, reason := checkService() + _, err := os.Stat(expected) + if os.IsNotExist(err) { + if status == Installed { + // service installed, but no install path + return Broken, "service exists but installation path is missing" + } + return NotInstalled, "no install path or service" + } + if status == NotInstalled { + // install path present, but not service + return Broken, reason + } + return Installed, "" +} + +// RunningInstalled returns true when executing Agent is the installed Agent. +// +// This verifies the running executable path based on hard-coded paths +// for each platform type. +func RunningInstalled() bool { + expected := filepath.Join(InstallPath, BinaryName) + execPath, _ := os.Executable() + execPath, _ = filepath.Abs(execPath) + execName := filepath.Base(execPath) + execDir := filepath.Dir(execPath) + if insideData(execDir) { + // executable path is being reported as being down inside of data path + // move up to directories to perform the comparison + execDir = filepath.Dir(filepath.Dir(execDir)) + execPath = filepath.Join(execDir, execName) + } + return expected == execPath +} + +// checkService only checks the status of the service. +func checkService() (StatusType, string) { + svc, err := newService() + if err != nil { + return NotInstalled, "unable to check service status" + } + status, _ := svc.Status() + if status == service.StatusUnknown { + return NotInstalled, "service is not installed" + } + return Installed, "" +} diff --git a/x-pack/elastic-agent/pkg/agent/install/paths.go b/x-pack/elastic-agent/pkg/agent/install/paths.go new file mode 100644 index 00000000000..5936c31926a --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/paths.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build !darwin +// +build !windows + +package install + +const ( + // BinaryName is the name of the installed binary. + BinaryName = "elastic-agent" + + // InstallPath is the installation path using for install command. + InstallPath = "/opt/Elastic/Agent" + + // SocketPath is the socket path used when installed. + SocketPath = "unix:///run/elastic-agent.sock" + + // ServiceName is the service name when installed. + ServiceName = "elastic-agent" + + // ShellWrapperPath is the path to the installed shell wrapper. + ShellWrapperPath = "/usr/bin/elastic-agent" + + // ShellWrapper is the wrapper that is installed. + ShellWrapper = `#!/bin/sh +exec /opt/Elastic/Agent/elastic-agent $@ +` +) diff --git a/x-pack/elastic-agent/pkg/agent/install/paths_darwin.go b/x-pack/elastic-agent/pkg/agent/install/paths_darwin.go new file mode 100644 index 00000000000..f6ebcdfdbae --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/paths_darwin.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build darwin + +package install + +const ( + // BinaryName is the name of the installed binary. + BinaryName = "elastic-agent" + + // InstallPath is the installation path using for install command. + InstallPath = "/Library/Elastic/Agent" + + // SocketPath is the socket path used when installed. + SocketPath = "unix:///var/run/elastic-agent.sock" + + // ServiceName is the service name when installed. + ServiceName = "co.elastic.elastic-agent" + + // ShellWrapperPath is the path to the installed shell wrapper. + ShellWrapperPath = "/usr/local/bin/elastic-agent" + + // ShellWrapper is the wrapper that is installed. + ShellWrapper = `#!/bin/sh +exec /Library/Elastic/Agent/elastic-agent $@ +` +) diff --git a/x-pack/elastic-agent/pkg/agent/install/paths_windows.go b/x-pack/elastic-agent/pkg/agent/install/paths_windows.go new file mode 100644 index 00000000000..3af4c79d941 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/paths_windows.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build windows + +package install + +const ( + // BinaryName is the name of the installed binary. + BinaryName = "elastic-agent.exe" + + // InstallPath is the installation path using for install command. + InstallPath = `C:\Program Files\Elastic\Agent` + + // SocketPath is the socket path used when installed. + SocketPath = `\\.\pipe\elastic-agent-system` + + // ServiceName is the service name when installed. + ServiceName = "Elastic Agent" + + // ShellWrapperPath is the path to the installed shell wrapper. + ShellWrapperPath = "" // no wrapper on Windows + + // ShellWrapper is the wrapper that is installed. + ShellWrapper = "" // no wrapper on Windows +) diff --git a/x-pack/elastic-agent/pkg/agent/install/root_unix.go b/x-pack/elastic-agent/pkg/agent/install/root_unix.go new file mode 100644 index 00000000000..b79f104d98d --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/root_unix.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build !windows + +package install + +import "os" + +const ( + // PermissionUser is the permission level the user needs to be. + PermissionUser = "root" +) + +// HasRoot returns true if the user has root permissions. +func HasRoot() bool { + return os.Getegid() == 0 +} diff --git a/x-pack/elastic-agent/pkg/agent/install/root_windows.go b/x-pack/elastic-agent/pkg/agent/install/root_windows.go new file mode 100644 index 00000000000..c72432084ac --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/root_windows.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build windows + +package install + +import ( + "os" +) + +const ( + // PermissionUser is the permission level the user needs to be. + PermissionUser = "Administrator" +) + +// HasRoot returns true if the user has Administrator/SYSTEM permissions. +func HasRoot() bool { + // only valid rights can open the physical drive + f, err := os.Open("\\\\.\\PHYSICALDRIVE0") + if err != nil { + return false + } + defer f.Close() + return true +} diff --git a/x-pack/elastic-agent/pkg/agent/install/svc.go b/x-pack/elastic-agent/pkg/agent/install/svc.go new file mode 100644 index 00000000000..18cbc6d840f --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/svc.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package install + +import ( + "path/filepath" + + "github.com/kardianos/service" +) + +const ( + // ServiceDisplayName is the service display name for the service. + ServiceDisplayName = "Elastic Agent" + + // ServiceDescription is the description for the service. + ServiceDescription = "Elastic Agent is a unified agent to observe, monitor and protect your system." +) + +// ExecutablePath returns the path for the installed Agents executable. +func ExecutablePath() string { + exec := filepath.Join(InstallPath, BinaryName) + if ShellWrapperPath != "" { + exec = ShellWrapperPath + } + return exec +} + +func newService() (service.Service, error) { + return service.New(nil, &service.Config{ + Name: ServiceName, + DisplayName: ServiceDisplayName, + Description: ServiceDescription, + Executable: ExecutablePath(), + WorkingDirectory: InstallPath, + }) +} diff --git a/x-pack/elastic-agent/pkg/agent/install/svc_unix.go b/x-pack/elastic-agent/pkg/agent/install/svc_unix.go new file mode 100644 index 00000000000..c7acb998489 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/svc_unix.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build !windows + +package install + +import "os" + +// RunningUnderSupervisor returns true when executing Agent is running under +// the supervisor processes of the OS. +func RunningUnderSupervisor() bool { + return os.Getppid() == 1 +} diff --git a/x-pack/elastic-agent/pkg/agent/install/svc_windows.go b/x-pack/elastic-agent/pkg/agent/install/svc_windows.go new file mode 100644 index 00000000000..9084f3b5ea7 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/svc_windows.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +// +build windows + +package install + +import ( + "golang.org/x/sys/windows" +) + +// RunningUnderSupervisor returns true when executing Agent is running under +// the supervisor processes of the OS. +func RunningUnderSupervisor() bool { + serviceSid, err := allocSid(windows.SECURITY_SERVICE_RID) + if err != nil { + return false + } + defer windows.FreeSid(serviceSid) + + t, err := windows.OpenCurrentProcessToken() + if err != nil { + return false + } + defer t.Close() + + gs, err := t.GetTokenGroups() + if err != nil { + return false + } + + for _, g := range gs.AllGroups() { + if windows.EqualSid(g.Sid, serviceSid) { + return true + } + } + return false +} + +func allocSid(subAuth0 uint32) (*windows.SID, error) { + var sid *windows.SID + err := windows.AllocateAndInitializeSid(&windows.SECURITY_NT_AUTHORITY, + 1, subAuth0, 0, 0, 0, 0, 0, 0, 0, &sid) + if err != nil { + return nil, err + } + return sid, nil +} diff --git a/x-pack/elastic-agent/pkg/agent/install/uninstall.go b/x-pack/elastic-agent/pkg/agent/install/uninstall.go new file mode 100644 index 00000000000..381427eb8c7 --- /dev/null +++ b/x-pack/elastic-agent/pkg/agent/install/uninstall.go @@ -0,0 +1,71 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package install + +import ( + "fmt" + "os" + "runtime" + + "github.com/kardianos/service" + + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" +) + +// Uninstall uninstalls persistently Elastic Agent on the system. +func Uninstall() error { + // uninstall the current service + svc, err := newService() + if err != nil { + return err + } + status, _ := svc.Status() + if status == service.StatusRunning { + err := svc.Stop() + if err != nil { + return errors.New( + err, + fmt.Sprintf("failed to stop service (%s)", ServiceName), + errors.M("service", ServiceName)) + } + status = service.StatusStopped + } + if status == service.StatusStopped { + err := svc.Uninstall() + if err != nil { + return errors.New( + err, + fmt.Sprintf("failed to uninstall service (%s)", ServiceName), + errors.M("service", ServiceName)) + } + } + + // remove, if present on platform + if ShellWrapperPath != "" { + err = os.Remove(ShellWrapperPath) + if !os.IsNotExist(err) && err != nil { + return errors.New( + err, + fmt.Sprintf("failed to remove shell wrapper (%s)", ShellWrapperPath), + errors.M("destination", ShellWrapperPath)) + } + } + + // remove existing directory + err = os.RemoveAll(InstallPath) + if err != nil { + if runtime.GOOS == "windows" { + // possible to fail on Windows, because elastic-agent.exe is running from + // this directory. + return nil + } + return errors.New( + err, + fmt.Sprintf("failed to remove installation directory (%s)", InstallPath), + errors.M("directory", InstallPath)) + } + + return nil +} diff --git a/x-pack/elastic-agent/pkg/agent/warn/warn.go b/x-pack/elastic-agent/pkg/agent/warn/warn.go index 03d746992f6..182d2af50b0 100644 --- a/x-pack/elastic-agent/pkg/agent/warn/warn.go +++ b/x-pack/elastic-agent/pkg/agent/warn/warn.go @@ -21,4 +21,5 @@ func LogNotGA(log *logger.Logger) { // PrintNotGA writes to the received writer that the Agent is not GA. func PrintNotGA(output io.Writer) { fmt.Fprintln(output, message) + fmt.Fprintln(output) } diff --git a/x-pack/elastic-agent/pkg/release/upgrade.go b/x-pack/elastic-agent/pkg/release/upgrade.go new file mode 100644 index 00000000000..ac1e8552dd2 --- /dev/null +++ b/x-pack/elastic-agent/pkg/release/upgrade.go @@ -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; +// you may not use this file except in compliance with the Elastic License. + +package release + +// Upgradable return true when release is built specifically for upgrading. +func Upgradable() bool { + return allowUpgrade == "true" +} diff --git a/x-pack/elastic-agent/pkg/release/version.go b/x-pack/elastic-agent/pkg/release/version.go index 37579ac86de..dae609a6733 100644 --- a/x-pack/elastic-agent/pkg/release/version.go +++ b/x-pack/elastic-agent/pkg/release/version.go @@ -12,6 +12,10 @@ import ( libbeatVersion "github.com/elastic/beats/v7/libbeat/version" ) +const ( + hashLen = 6 +) + // snapshot is a flag marking build as a snapshot. var snapshot = "" @@ -19,11 +23,24 @@ var snapshot = "" // without valid pgp var allowEmptyPgp string +// allowUpgrade is used as a debug flag and allows working +// with upgrade without requiring Agent to be installed correctly +var allowUpgrade string + // Commit returns the current build hash or unknown if it was not injected in the build process. func Commit() string { return libbeatVersion.Commit() } +// ShortCommit returns commit up to 6 characters. +func ShortCommit() string { + hash := Commit() + if len(hash) > hashLen { + hash = hash[:hashLen] + } + return hash +} + // BuildTime returns the build time of the binaries. func BuildTime() time.Time { return libbeatVersion.BuildTime() From c9827a8511ac80f1859855c1296ef63c6d2f00f9 Mon Sep 17 00:00:00 2001 From: Pier-Hugues Pellerin Date: Tue, 29 Sep 2020 11:20:12 -0400 Subject: [PATCH 020/156] [Elastic Agent] Rename *ConfigChange to PolicyChange (#20779) [Elastic Agent] Rename *ConfigChange to PolicyChange (#20779) Co-authored-by: Michal Pristas --- x-pack/elastic-agent/CHANGELOG.next.asciidoc | 1 + .../cmd/fakewebapi/action_example.json | 4 +-- .../pkg/agent/application/action_store.go | 18 +++++------ .../agent/application/action_store_test.go | 14 ++++---- .../agent/application/fleet_gateway_test.go | 4 +-- .../handler_action_policy_change.go | 14 ++++---- .../handler_action_policy_change_test.go | 32 +++++++++---------- .../agent/application/inspect_config_cmd.go | 4 +-- .../pkg/agent/application/managed_mode.go | 4 +-- .../agent/application/managed_mode_test.go | 8 ++--- .../pkg/fleetapi/ack_cmd_test.go | 6 ++-- x-pack/elastic-agent/pkg/fleetapi/action.go | 22 ++++++------- .../pkg/fleetapi/checkin_cmd_test.go | 12 +++---- 13 files changed, 72 insertions(+), 71 deletions(-) diff --git a/x-pack/elastic-agent/CHANGELOG.next.asciidoc b/x-pack/elastic-agent/CHANGELOG.next.asciidoc index be0cfc459e8..2ba08864ae8 100644 --- a/x-pack/elastic-agent/CHANGELOG.next.asciidoc +++ b/x-pack/elastic-agent/CHANGELOG.next.asciidoc @@ -10,6 +10,7 @@ - Docker container is not run as root by default. {pull}21213[21213] ==== Bugfixes +- Fix rename *ConfigChange to *PolicyChange to align on changes in the UI. {pull}20779[20779] - Thread safe sorted set {pull}21290[21290] - Copy Action store on upgrade {pull}21298[21298] - Include inputs in action store actions {pull}21298[21298] diff --git a/x-pack/elastic-agent/dev-tools/cmd/fakewebapi/action_example.json b/x-pack/elastic-agent/dev-tools/cmd/fakewebapi/action_example.json index 327b79ed347..f08e98942ea 100644 --- a/x-pack/elastic-agent/dev-tools/cmd/fakewebapi/action_example.json +++ b/x-pack/elastic-agent/dev-tools/cmd/fakewebapi/action_example.json @@ -2,9 +2,9 @@ "action": "checkin", "actions": [ { - "type": "CONFIG_CHANGE", + "type": "POLICY_CHANGE", "data": { - "config": { + "policy": { "id": "default", "outputs": { "default": { diff --git a/x-pack/elastic-agent/pkg/agent/application/action_store.go b/x-pack/elastic-agent/pkg/agent/application/action_store.go index 25dbf7a5b82..ce4ea785cf7 100644 --- a/x-pack/elastic-agent/pkg/agent/application/action_store.go +++ b/x-pack/elastic-agent/pkg/agent/application/action_store.go @@ -35,7 +35,7 @@ func newActionStore(log *logger.Logger, store storeLoad) (*actionStore, error) { } defer reader.Close() - var action actionConfigChangeSerializer + var action ActionPolicyChangeSerializer dec := yaml.NewDecoder(reader) err = dec.Decode(&action) @@ -49,7 +49,7 @@ func newActionStore(log *logger.Logger, store storeLoad) (*actionStore, error) { return nil, err } - apc := fleetapi.ActionConfigChange(action) + apc := fleetapi.ActionPolicyChange(action) return &actionStore{ log: log, @@ -62,7 +62,7 @@ func newActionStore(log *logger.Logger, store storeLoad) (*actionStore, error) { // any other type of action will be silently ignored. func (s *actionStore) Add(a action) { switch v := a.(type) { - case *fleetapi.ActionConfigChange, *fleetapi.ActionUnenroll: + case *fleetapi.ActionPolicyChange, *fleetapi.ActionUnenroll: // Only persist the action if the action is different. if s.action != nil && s.action.ID() == v.ID() { return @@ -79,8 +79,8 @@ func (s *actionStore) Save() error { } var reader io.Reader - if apc, ok := s.action.(*fleetapi.ActionConfigChange); ok { - serialize := actionConfigChangeSerializer(*apc) + if apc, ok := s.action.(*fleetapi.ActionPolicyChange); ok { + serialize := ActionPolicyChangeSerializer(*apc) r, err := yamlToReader(&serialize) if err != nil { @@ -120,7 +120,7 @@ func (s *actionStore) Actions() []action { return []action{s.action} } -// actionConfigChangeSerializer is a struct that adds a YAML serialization, I don't think serialization +// ActionPolicyChangeSerializer is a struct that adds a YAML serialization, I don't think serialization // is a concern of the fleetapi package. I went this route so I don't have to do much refactoring. // // There are four ways to achieve the same results: @@ -130,14 +130,14 @@ func (s *actionStore) Actions() []action { // 4. We have two sets of type. // // This could be done in a refactoring. -type actionConfigChangeSerializer struct { +type ActionPolicyChangeSerializer struct { ActionID string `yaml:"action_id"` ActionType string `yaml:"action_type"` - Config map[string]interface{} `yaml:"config"` + Policy map[string]interface{} `yaml:"policy"` } // Add a guards between the serializer structs and the original struct. -var _ actionConfigChangeSerializer = actionConfigChangeSerializer(fleetapi.ActionConfigChange{}) +var _ ActionPolicyChangeSerializer = ActionPolicyChangeSerializer(fleetapi.ActionPolicyChange{}) // actionUnenrollSerializer is a struct that adds a YAML serialization, type actionUnenrollSerializer struct { diff --git a/x-pack/elastic-agent/pkg/agent/application/action_store_test.go b/x-pack/elastic-agent/pkg/agent/application/action_store_test.go index 4205deda8b6..f2691d66db6 100644 --- a/x-pack/elastic-agent/pkg/agent/application/action_store_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/action_store_test.go @@ -57,10 +57,10 @@ func TestActionStore(t *testing.T) { t.Run("can save to disk known action type", withFile(func(t *testing.T, file string) { - actionConfigChange := &fleetapi.ActionConfigChange{ + ActionPolicyChange := &fleetapi.ActionPolicyChange{ ActionID: "abc123", - ActionType: "CONFIG_CHANGE", - Config: map[string]interface{}{ + ActionType: "POLICY_CHANGE", + Policy: map[string]interface{}{ "hello": "world", }, } @@ -70,7 +70,7 @@ func TestActionStore(t *testing.T) { require.NoError(t, err) require.Equal(t, 0, len(store.Actions())) - store.Add(actionConfigChange) + store.Add(ActionPolicyChange) err = store.Save() require.NoError(t, err) require.Equal(t, 1, len(store.Actions())) @@ -82,12 +82,12 @@ func TestActionStore(t *testing.T) { actions := store1.Actions() require.Equal(t, 1, len(actions)) - require.Equal(t, actionConfigChange, actions[0]) + require.Equal(t, ActionPolicyChange, actions[0]) })) t.Run("when we ACK we save to disk", withFile(func(t *testing.T, file string) { - actionConfigChange := &fleetapi.ActionConfigChange{ + ActionPolicyChange := &fleetapi.ActionPolicyChange{ ActionID: "abc123", } @@ -98,7 +98,7 @@ func TestActionStore(t *testing.T) { acker := newActionStoreAcker(&testAcker{}, store) require.Equal(t, 0, len(store.Actions())) - require.NoError(t, acker.Ack(context.Background(), actionConfigChange)) + require.NoError(t, acker.Ack(context.Background(), ActionPolicyChange)) require.Equal(t, 1, len(store.Actions())) })) } diff --git a/x-pack/elastic-agent/pkg/agent/application/fleet_gateway_test.go b/x-pack/elastic-agent/pkg/agent/application/fleet_gateway_test.go index bd9037416dc..cfcd1f46994 100644 --- a/x-pack/elastic-agent/pkg/agent/application/fleet_gateway_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/fleet_gateway_test.go @@ -208,10 +208,10 @@ func TestFleetGateway(t *testing.T) { { "actions": [ { - "type": "CONFIG_CHANGE", + "type": "POLICY_CHANGE", "id": "id1", "data": { - "config": { + "policy": { "id": "policy-id" } } diff --git a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go index 34fd5716980..81dc1444816 100644 --- a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go +++ b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change.go @@ -13,24 +13,24 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/fleetapi" ) -type handlerConfigChange struct { +type handlerPolicyChange struct { log *logger.Logger emitter emitterFunc } -func (h *handlerConfigChange) Handle(ctx context.Context, a action, acker fleetAcker) error { - h.log.Debugf("handlerConfigChange: action '%+v' received", a) - action, ok := a.(*fleetapi.ActionConfigChange) +func (h *handlerPolicyChange) Handle(ctx context.Context, a action, acker fleetAcker) error { + h.log.Debugf("handlerPolicyChange: action '%+v' received", a) + action, ok := a.(*fleetapi.ActionPolicyChange) if !ok { - return fmt.Errorf("invalid type, expected ActionConfigChange and received %T", a) + return fmt.Errorf("invalid type, expected ActionPolicyChange and received %T", a) } - c, err := LoadConfig(action.Config) + c, err := LoadConfig(action.Policy) if err != nil { return errors.New(err, "could not parse the configuration from the policy", errors.TypeConfig) } - h.log.Debugf("handlerConfigChange: emit configuration for action %+v", a) + h.log.Debugf("handlerPolicyChange: emit configuration for action %+v", a) if err := h.emitter(c); err != nil { return err } diff --git a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go index b95c259e7c7..ce4802b68e6 100644 --- a/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/handler_action_policy_change_test.go @@ -36,13 +36,13 @@ func TestPolicyChange(t *testing.T) { emitter := &mockEmitter{} conf := map[string]interface{}{"hello": "world"} - action := &fleetapi.ActionConfigChange{ + action := &fleetapi.ActionPolicyChange{ ActionID: "abc123", - ActionType: "CONFIG_CHANGE", - Config: conf, + ActionType: "POLICY_CHANGE", + Policy: conf, } - handler := &handlerConfigChange{log: log, emitter: emitter.Emitter} + handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} err := handler.Handle(context.Background(), action, ack) require.NoError(t, err) @@ -54,13 +54,13 @@ func TestPolicyChange(t *testing.T) { emitter := &mockEmitter{err: mockErr} conf := map[string]interface{}{"hello": "world"} - action := &fleetapi.ActionConfigChange{ + action := &fleetapi.ActionPolicyChange{ ActionID: "abc123", - ActionType: "CONFIG_CHANGE", - Config: conf, + ActionType: "POLICY_CHANGE", + Policy: conf, } - handler := &handlerConfigChange{log: log, emitter: emitter.Emitter} + handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} err := handler.Handle(context.Background(), action, ack) require.Error(t, err) @@ -77,13 +77,13 @@ func TestPolicyAcked(t *testing.T) { config := map[string]interface{}{"hello": "world"} actionID := "abc123" - action := &fleetapi.ActionConfigChange{ + action := &fleetapi.ActionPolicyChange{ ActionID: actionID, - ActionType: "CONFIG_CHANGE", - Config: config, + ActionType: "POLICY_CHANGE", + Policy: config, } - handler := &handlerConfigChange{log: log, emitter: emitter.Emitter} + handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} err := handler.Handle(context.Background(), action, tacker) require.Error(t, err) @@ -99,13 +99,13 @@ func TestPolicyAcked(t *testing.T) { config := map[string]interface{}{"hello": "world"} actionID := "abc123" - action := &fleetapi.ActionConfigChange{ + action := &fleetapi.ActionPolicyChange{ ActionID: actionID, - ActionType: "CONFIG_CHANGE", - Config: config, + ActionType: "POLICY_CHANGE", + Policy: config, } - handler := &handlerConfigChange{log: log, emitter: emitter.Emitter} + handler := &handlerPolicyChange{log: log, emitter: emitter.Emitter} err := handler.Handle(context.Background(), action, tacker) require.NoError(t, err) diff --git a/x-pack/elastic-agent/pkg/agent/application/inspect_config_cmd.go b/x-pack/elastic-agent/pkg/agent/application/inspect_config_cmd.go index 2c53fc62bf2..edf1ad8cdf2 100644 --- a/x-pack/elastic-agent/pkg/agent/application/inspect_config_cmd.go +++ b/x-pack/elastic-agent/pkg/agent/application/inspect_config_cmd.go @@ -106,13 +106,13 @@ func loadFleetConfig(cfg *config.Config) (map[string]interface{}, error) { } for _, c := range as.Actions() { - cfgChange, ok := c.(*fleetapi.ActionConfigChange) + cfgChange, ok := c.(*fleetapi.ActionPolicyChange) if !ok { continue } fmt.Println("Action ID:", cfgChange.ID()) - return cfgChange.Config, nil + return cfgChange.Policy, nil } return nil, nil } diff --git a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go index a4e4bf92379..12a9c242780 100644 --- a/x-pack/elastic-agent/pkg/agent/application/managed_mode.go +++ b/x-pack/elastic-agent/pkg/agent/application/managed_mode.go @@ -207,8 +207,8 @@ func newManaged( acker) actionDispatcher.MustRegister( - &fleetapi.ActionConfigChange{}, - &handlerConfigChange{ + &fleetapi.ActionPolicyChange{}, + &handlerPolicyChange{ log: log, emitter: emit, }, diff --git a/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go b/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go index 9b51016a126..81f2419f936 100644 --- a/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/managed_mode_test.go @@ -40,8 +40,8 @@ func TestManagedModeRouting(t *testing.T) { require.NoError(t, err) actionDispatcher.MustRegister( - &fleetapi.ActionConfigChange{}, - &handlerConfigChange{ + &fleetapi.ActionPolicyChange{}, + &handlerPolicyChange{ log: log, emitter: emit, }, @@ -100,9 +100,9 @@ const fleetResponse = ` "action": "checkin", "actions": [{ "agent_id": "17e93530-7f42-11ea-9330-71e968b29fa4", - "type": "CONFIG_CHANGE", + "type": "POLICY_CHANGE", "data": { - "config": { + "policy": { "id": "86561d50-7f3b-11ea-9fab-3db3bdb4efa4", "outputs": { "default": { diff --git a/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go b/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go index a9e3aebc25b..75940e928b7 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go +++ b/x-pack/elastic-agent/pkg/fleetapi/ack_cmd_test.go @@ -46,10 +46,10 @@ func TestAck(t *testing.T) { return mux }, withAPIKey, func(t *testing.T, client clienter) { - action := &ActionConfigChange{ + action := &ActionPolicyChange{ ActionID: "my-id", - ActionType: "CONFIG_CHANGE", - Config: map[string]interface{}{ + ActionType: "POLICY_CHANGE", + Policy: map[string]interface{}{ "id": "config_id", }, } diff --git a/x-pack/elastic-agent/pkg/fleetapi/action.go b/x-pack/elastic-agent/pkg/fleetapi/action.go index efb4e1672aa..d53b7fdfcfb 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/action.go +++ b/x-pack/elastic-agent/pkg/fleetapi/action.go @@ -17,8 +17,8 @@ const ( ActionTypeUpgrade = "UPGRADE" // ActionTypeUnenroll specifies unenroll action. ActionTypeUnenroll = "UNENROLL" - // ActionTypeConfigChange specifies config change action. - ActionTypeConfigChange = "CONFIG_CHANGE" + // ActionTypePolicyChange specifies policy change action. + ActionTypePolicyChange = "POLICY_CHANGE" ) // Action base interface for all the implemented action from the fleet API. @@ -66,14 +66,14 @@ func (a *ActionUnknown) OriginalType() string { return a.originalType } -// ActionConfigChange is a request to apply a new -type ActionConfigChange struct { +// ActionPolicyChange is a request to apply a new +type ActionPolicyChange struct { ActionID string ActionType string - Config map[string]interface{} `json:"config"` + Policy map[string]interface{} `json:"policy"` } -func (a *ActionConfigChange) String() string { +func (a *ActionPolicyChange) String() string { var s strings.Builder s.WriteString("action_id: ") s.WriteString(a.ActionID) @@ -83,12 +83,12 @@ func (a *ActionConfigChange) String() string { } // Type returns the type of the Action. -func (a *ActionConfigChange) Type() string { +func (a *ActionPolicyChange) Type() string { return a.ActionType } // ID returns the ID of the Action. -func (a *ActionConfigChange) ID() string { +func (a *ActionPolicyChange) ID() string { return a.ActionID } @@ -169,14 +169,14 @@ func (a *Actions) UnmarshalJSON(data []byte) error { for _, response := range responses { switch response.ActionType { - case ActionTypeConfigChange: - action = &ActionConfigChange{ + case ActionTypePolicyChange: + action = &ActionPolicyChange{ ActionID: response.ActionID, ActionType: response.ActionType, } if err := json.Unmarshal(response.Data, action); err != nil { return errors.New(err, - "fail to decode CONFIG_CHANGE action", + "fail to decode POLICY_CHANGE action", errors.TypeConfig) } case ActionTypeUnenroll: diff --git a/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go b/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go index 953b86a260e..af8b4da81ea 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go +++ b/x-pack/elastic-agent/pkg/fleetapi/checkin_cmd_test.go @@ -56,10 +56,10 @@ func TestCheckin(t *testing.T) { raw := ` { "actions": [{ - "type": "CONFIG_CHANGE", + "type": "POLICY_CHANGE", "id": "id1", "data": { - "config": { + "policy": { "id": "policy-id", "outputs": { "default": { @@ -102,7 +102,7 @@ func TestCheckin(t *testing.T) { // ActionPolicyChange require.Equal(t, "id1", r.Actions[0].ID()) - require.Equal(t, "CONFIG_CHANGE", r.Actions[0].Type()) + require.Equal(t, "POLICY_CHANGE", r.Actions[0].Type()) }, )) @@ -112,10 +112,10 @@ func TestCheckin(t *testing.T) { { "actions": [ { - "type": "CONFIG_CHANGE", + "type": "POLICY_CHANGE", "id": "id1", "data": { - "config": { + "policy": { "id": "policy-id", "outputs": { "default": { @@ -163,7 +163,7 @@ func TestCheckin(t *testing.T) { // ActionPolicyChange require.Equal(t, "id1", r.Actions[0].ID()) - require.Equal(t, "CONFIG_CHANGE", r.Actions[0].Type()) + require.Equal(t, "POLICY_CHANGE", r.Actions[0].Type()) // UnknownAction require.Equal(t, "id2", r.Actions[1].ID()) From a29dcc27cf8965d20b7919b01ef3f14288515653 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Tue, 29 Sep 2020 09:23:36 -0600 Subject: [PATCH 021/156] Fix debug message to show actual SQS message ID (#20614) --- x-pack/filebeat/input/s3/input.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/filebeat/input/s3/input.go b/x-pack/filebeat/input/s3/input.go index 1085c9dccbd..6b57789b48f 100644 --- a/x-pack/filebeat/input/s3/input.go +++ b/x-pack/filebeat/input/s3/input.go @@ -288,7 +288,7 @@ func (p *s3Input) processorKeepAlive(svcSQS sqsiface.ClientAPI, message sqs.Mess // When ACK done, message will be deleted. Or when message is // not s3 ObjectCreated event related(handleSQSMessage function // failed), it will be removed as well. - p.logger.Debug("Deleting message from SQS: ", message.MessageId) + p.logger.Debug("Deleting message from SQS: ", *message.MessageId) // only delete sqs message when errC is closed with no error err := p.deleteMessage(queueURL, *message.ReceiptHandle, svcSQS) if err != nil { From e6c3d89234a449f671a0a68ccba2a224b0e4a31f Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Tue, 29 Sep 2020 18:40:26 +0200 Subject: [PATCH 022/156] Add UBI 8 image to the dependencies report (#21374) Red Hat certification process requires to include the UBI image in the list of dependencies for the project. Append it to the current list of dependencies. This requires to include a new sourceURL column in the CSV, because UBI images have a different url and source url. This is kept the same for existing dependencies. --- dev-tools/dependencies-report | 11 +++++++++++ dev-tools/notice/dependencies.csv.tmpl | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/dev-tools/dependencies-report b/dev-tools/dependencies-report index a824d0f4bf9..a2662a4ab9a 100755 --- a/dev-tools/dependencies-report +++ b/dev-tools/dependencies-report @@ -41,3 +41,14 @@ go list -m -json all $@ | go run go.elastic.co/go-licence-detector \ -noticeTemplate "$SRCPATH/notice/dependencies.csv.tmpl" \ -noticeOut "$outfile" \ -depsOut "" + + +# Fill-in required values for UBI images +# Check headers in $SRCPATH/notice/dependencies.csv.tmpl: +# name,url,version,revision,license +ubi8url='https://catalog.redhat.com/software/containers/ubi8/ubi-minimal/5c359a62bed8bd75a2c3fba8' +ubi8source='https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz' +ubilicense='Custom;https://www.redhat.com/licenses/EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf,https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz' +cat <> $outfile +Red Hat Universal Base Image,$ubi8url,8,,$ubilicense,$ubi8source +EOF diff --git a/dev-tools/notice/dependencies.csv.tmpl b/dev-tools/notice/dependencies.csv.tmpl index 6ab2a970199..088314378f6 100644 --- a/dev-tools/notice/dependencies.csv.tmpl +++ b/dev-tools/notice/dependencies.csv.tmpl @@ -1,7 +1,7 @@ {{- define "depInfo" -}} {{- range $i, $dep := . }} -{{ $dep.Name }},{{ $dep.URL }},{{ $dep.Version | canonicalVersion }},{{ $dep.Version | revision }},{{ $dep.LicenceType }} +{{ $dep.Name }},{{ $dep.URL }},{{ $dep.Version | canonicalVersion }},{{ $dep.Version | revision }},{{ $dep.LicenceType }},{{ $dep.URL }} {{- end -}} {{- end -}} -name,url,version,revision,license{{ template "depInfo" .Direct }}{{ template "depInfo" .Indirect }} +name,url,version,revision,license,sourceURL{{ template "depInfo" .Direct }}{{ template "depInfo" .Indirect }} From bb84f3f778eb8fd1f23fc5d88d118506c421b355 Mon Sep 17 00:00:00 2001 From: Fae Charlton Date: Tue, 29 Sep 2020 12:51:55 -0400 Subject: [PATCH 023/156] [libbeat] Fix position writing in the disk queue --- libbeat/publisher/queue/diskqueue/state_file.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libbeat/publisher/queue/diskqueue/state_file.go b/libbeat/publisher/queue/diskqueue/state_file.go index 2ff14e3e5e2..d8cbb5690ac 100644 --- a/libbeat/publisher/queue/diskqueue/state_file.go +++ b/libbeat/publisher/queue/diskqueue/state_file.go @@ -82,12 +82,14 @@ func writeQueuePositionToHandle( } // Want to write: version (0), segment id, segment offset. - elems := []interface{}{uint32(0), position.segmentID, position.offset} - for _, elem := range elems { - err = binary.Write(file, binary.LittleEndian, &elem) - if err != nil { - return err - } + err = binary.Write(file, binary.LittleEndian, uint32(0)) + if err != nil { + return err + } + err = binary.Write(file, binary.LittleEndian, position.segmentID) + if err != nil { + return err } - return nil + err = binary.Write(file, binary.LittleEndian, position.offset) + return err } From d8d35a16b0beae02cb8048df2a66c3a743d0633f Mon Sep 17 00:00:00 2001 From: Fae Charlton Date: Tue, 29 Sep 2020 13:00:27 -0400 Subject: [PATCH 024/156] Fix shutdown tracking in s3 input (#21380) --- x-pack/filebeat/input/s3/input.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/filebeat/input/s3/input.go b/x-pack/filebeat/input/s3/input.go index 6b57789b48f..83dc48428ee 100644 --- a/x-pack/filebeat/input/s3/input.go +++ b/x-pack/filebeat/input/s3/input.go @@ -190,11 +190,11 @@ func (p *s3Input) Run() { p.workerWg.Add(1) go p.run(svcSQS, svcS3, visibilityTimeout) - p.workerWg.Done() }) } func (p *s3Input) run(svcSQS sqsiface.ClientAPI, svcS3 s3iface.ClientAPI, visibilityTimeout int64) { + defer p.workerWg.Done() defer p.logger.Infof("s3 input worker for '%v' has stopped.", p.config.QueueURL) p.logger.Infof("s3 input worker has started. with queueURL: %v", p.config.QueueURL) From 7a369caadc1557699e8b86b6e2d1150e76d554b5 Mon Sep 17 00:00:00 2001 From: Brandon Morelli Date: Tue, 29 Sep 2020 11:21:33 -0700 Subject: [PATCH 025/156] docs: fix apt/yum formatting (#21362) --- libbeat/docs/repositories.asciidoc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libbeat/docs/repositories.asciidoc b/libbeat/docs/repositories.asciidoc index a7104414465..1b27a6c0b44 100644 --- a/libbeat/docs/repositories.asciidoc +++ b/libbeat/docs/repositories.asciidoc @@ -122,7 +122,7 @@ sudo apt-get update && sudo apt-get install {beatname_pkg} -------------------------------------------------- sudo systemctl enable {beatname_pkg} -------------------------------------------------- - ++ If your system does not use `systemd` then run: + ["source","sh",subs="attributes"] @@ -224,7 +224,7 @@ sudo yum install {beatname_pkg} -------------------------------------------------- sudo systemctl enable {beatname_pkg} -------------------------------------------------- - ++ If your system does not use `systemd` then run: + ["source","sh",subs="attributes"] @@ -233,4 +233,3 @@ sudo chkconfig --add {beatname_pkg} -------------------------------------------------- endif::[] - From ef6274d0d1e36308a333cbed69846a1bd63528ae Mon Sep 17 00:00:00 2001 From: Fae Charlton Date: Tue, 29 Sep 2020 16:13:38 -0400 Subject: [PATCH 026/156] [libbeat] Enable WriteAheadLimit in the disk queue (#21391) --- libbeat/publisher/queue/diskqueue/config.go | 12 ++++++-- .../publisher/queue/diskqueue/core_loop.go | 28 ++++++++++++------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/libbeat/publisher/queue/diskqueue/config.go b/libbeat/publisher/queue/diskqueue/config.go index f39f608361d..6a165a665db 100644 --- a/libbeat/publisher/queue/diskqueue/config.go +++ b/libbeat/publisher/queue/diskqueue/config.go @@ -106,8 +106,8 @@ func DefaultSettings() Settings { MaxSegmentSize: 100 * (1 << 20), // 100MiB MaxBufferSize: (1 << 30), // 1GiB - ReadAheadLimit: 256, - WriteAheadLimit: 1024, + ReadAheadLimit: 512, + WriteAheadLimit: 2048, } } @@ -129,6 +129,14 @@ func SettingsForUserConfig(config *common.Config) (Settings, error) { // divided by 10. settings.MaxSegmentSize = uint64(userConfig.MaxSize) / 10 } + + if userConfig.ReadAheadLimit != nil { + settings.ReadAheadLimit = *userConfig.ReadAheadLimit + } + if userConfig.WriteAheadLimit != nil { + settings.WriteAheadLimit = *userConfig.WriteAheadLimit + } + return settings, nil } diff --git a/libbeat/publisher/queue/diskqueue/core_loop.go b/libbeat/publisher/queue/diskqueue/core_loop.go index 56a50b5a422..638d9da2f40 100644 --- a/libbeat/publisher/queue/diskqueue/core_loop.go +++ b/libbeat/publisher/queue/diskqueue/core_loop.go @@ -58,10 +58,15 @@ func (dq *diskQueue) run() { // The writer loop completed a request, so check if there is more // data to be sent. dq.maybeWritePending() - // We also check whether the reader loop is waiting for the data - // that was just written. + + // The data that was just written is now available for reading, so check + // if we should start a new read request. dq.maybeReadPending() + // pendingFrames should now be empty. If any producers were blocked + // because pendingFrames hit settings.WriteAheadLimit, wake them up. + dq.maybeUnblockProducers() + // Reader loop handling case readerLoopResponse := <-dq.readerLoop.responseChan: dq.handleReaderLoopResponse(readerLoopResponse) @@ -417,22 +422,25 @@ func (dq *diskQueue) enqueueWriteFrame(frame *writeFrame) { }) } -// canAcceptFrameOfSize checks whether there is enough free space in the -// queue (subject to settings.MaxBufferSize) to accept a new frame with -// the given size. Size includes both the serialized data and the frame -// header / footer; the easy way to do this for a writeFrame is to pass +// canAcceptFrameOfSize checks whether there is enough free space in the queue +// (subject to settings.{MaxBufferSize, WriteAheadLimit}) to accept a new +// frame with the given size. Size includes both the serialized data and the +// frame header / footer; the easy way to do this for a writeFrame is to pass // in frame.sizeOnDisk(). // Capacity calculations do not include requests in the blockedProducers // list (that data is owned by its callers and we can't touch it until // we are ready to respond). That allows this helper to be used both while // handling producer requests and while deciding whether to unblock // producers after free capacity increases. -// If we decide to add limits on how many events / bytes can be stored -// in pendingFrames (to avoid unbounded memory use if the input is faster -// than the disk), this is the function to modify. func (dq *diskQueue) canAcceptFrameOfSize(frameSize uint64) bool { + // If pendingFrames is already at the WriteAheadLimit, we can't accept + // any new frames right now. + if len(dq.pendingFrames) >= dq.settings.WriteAheadLimit { + return false + } + + // If the queue size is unbounded (max == 0), we accept. if dq.settings.MaxBufferSize == 0 { - // Currently we impose no limitations if the queue size is unbounded. return true } From cd28ee52a701df6148ae7f452c38c0b2a4842662 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Wed, 30 Sep 2020 13:28:42 +0200 Subject: [PATCH 027/156] Move Kubernetes events metricset to its own block in reference config (#21407) In the reference configuration the event metricset was in the block of configurations for kube-state-metrics. --- deploy/kubernetes/metricbeat-kubernetes.yaml | 6 ++++-- .../metricbeat/metricbeat-daemonset-configmap.yaml | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/deploy/kubernetes/metricbeat-kubernetes.yaml b/deploy/kubernetes/metricbeat-kubernetes.yaml index 4bc1976e40e..32d1010f4d0 100644 --- a/deploy/kubernetes/metricbeat-kubernetes.yaml +++ b/deploy/kubernetes/metricbeat-kubernetes.yaml @@ -36,8 +36,6 @@ data: - state_cronjob - state_resourcequota - state_statefulset - # Uncomment this to get k8s events: - #- event - module: kubernetes metricsets: - apiserver @@ -46,6 +44,10 @@ data: ssl.certificate_authorities: - /var/run/secrets/kubernetes.io/serviceaccount/ca.crt period: 30s + # Uncomment this to get k8s events: + #- module: kubernetes + # metricsets: + # - event # To enable hints based autodiscover uncomment this: #- type: kubernetes # node: ${NODE_NAME} diff --git a/deploy/kubernetes/metricbeat/metricbeat-daemonset-configmap.yaml b/deploy/kubernetes/metricbeat/metricbeat-daemonset-configmap.yaml index 98fffb86ad0..b95bf478765 100644 --- a/deploy/kubernetes/metricbeat/metricbeat-daemonset-configmap.yaml +++ b/deploy/kubernetes/metricbeat/metricbeat-daemonset-configmap.yaml @@ -36,8 +36,6 @@ data: - state_cronjob - state_resourcequota - state_statefulset - # Uncomment this to get k8s events: - #- event - module: kubernetes metricsets: - apiserver @@ -46,6 +44,10 @@ data: ssl.certificate_authorities: - /var/run/secrets/kubernetes.io/serviceaccount/ca.crt period: 30s + # Uncomment this to get k8s events: + #- module: kubernetes + # metricsets: + # - event # To enable hints based autodiscover uncomment this: #- type: kubernetes # node: ${NODE_NAME} From 222b069bf496b70d7378a58a5cf756de01f60d0c Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Wed, 30 Sep 2020 15:14:15 +0200 Subject: [PATCH 028/156] fix: use a fixed version of setuptools (#21393) --- libbeat/tests/system/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/libbeat/tests/system/requirements.txt b/libbeat/tests/system/requirements.txt index 08843d6144d..86071d5dd65 100644 --- a/libbeat/tests/system/requirements.txt +++ b/libbeat/tests/system/requirements.txt @@ -37,6 +37,7 @@ PyYAML==5.3.1 redis==2.10.6 requests==2.20.0 semver==2.8.1 +setuptools==47.3.2 six==1.15.0 stomp.py==4.1.22 termcolor==1.1.0 From 3deda877fbbc7c136bacf00b2e055f5b3093f594 Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Wed, 30 Sep 2020 15:14:48 +0200 Subject: [PATCH 029/156] fix: mark flaky tests (#21300) * fix: mark flaky test * Apply suggestions from code review * Update libbeat/outputs/elasticsearch/client_integration_test.go * Apply suggestions from code review * Apply suggestions from code review --- auditbeat/module/file_integrity/eventreader_test.go | 2 ++ filebeat/tests/system/test_reload_inputs.py | 3 +++ x-pack/auditbeat/tests/system/test_metricsets.py | 3 +++ 3 files changed, 8 insertions(+) diff --git a/auditbeat/module/file_integrity/eventreader_test.go b/auditbeat/module/file_integrity/eventreader_test.go index 6d9b02f7867..a00367f350a 100644 --- a/auditbeat/module/file_integrity/eventreader_test.go +++ b/auditbeat/module/file_integrity/eventreader_test.go @@ -41,6 +41,7 @@ func init() { const ErrorSharingViolation syscall.Errno = 32 func TestEventReader(t *testing.T) { + t.Skip("Flaky test: about 1/10 of bulds fails https://github.com/elastic/beats/issues/21302") // Make dir to monitor. dir, err := ioutil.TempDir("", "audit") if err != nil { @@ -240,6 +241,7 @@ func TestEventReader(t *testing.T) { } func TestRaces(t *testing.T) { + t.Skip("Flaky test: about 1/20 of bulds fails https://github.com/elastic/beats/issues/21303") const ( fileMode os.FileMode = 0640 N = 100 diff --git a/filebeat/tests/system/test_reload_inputs.py b/filebeat/tests/system/test_reload_inputs.py index 4de554fe2c6..4c5fa1abfba 100644 --- a/filebeat/tests/system/test_reload_inputs.py +++ b/filebeat/tests/system/test_reload_inputs.py @@ -1,4 +1,5 @@ import os +import pytest import time from filebeat import BaseTest @@ -249,6 +250,8 @@ def test_load_configs(self): assert output[0]["message"] == first_line assert output[1]["message"] == second_line + # 1/20 build fails https://github.com/elastic/beats/issues/21307 + @pytest.mark.flaky(reruns=1, reruns_delay=10) def test_reload_same_config(self): """ Test reload same config with same file but different config. Makes sure reloading also works on conflicts. diff --git a/x-pack/auditbeat/tests/system/test_metricsets.py b/x-pack/auditbeat/tests/system/test_metricsets.py index 26bddcef785..d60c1b82ef8 100644 --- a/x-pack/auditbeat/tests/system/test_metricsets.py +++ b/x-pack/auditbeat/tests/system/test_metricsets.py @@ -1,6 +1,7 @@ import jinja2 import os import platform +import pytest import sys import time import unittest @@ -42,6 +43,8 @@ def test_metricset_login(self): # Metricset is beta and that generates a warning, TODO: remove later self.check_metricset("system", "login", COMMON_FIELDS + fields, config, warnings_allowed=True) + # 1/20 build fails https://github.com/elastic/beats/issues/21308 + @pytest.mark.flaky(reruns=1, reruns_delay=10) @unittest.skipIf(sys.platform == "win32", "Not implemented for Windows") @unittest.skipIf(sys.platform.startswith('linux') and not (os.path.isdir("/var/lib/dpkg") or os.path.isdir("/var/lib/rpm")), "Only implemented for dpkg and rpm") From cdfa559a7e230d4162258b639131e589a2336614 Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Wed, 30 Sep 2020 15:15:17 +0200 Subject: [PATCH 030/156] docs: Prepare Changelog for 7.9.2 (#21229) (#21403) * Close changelog for 7.9.2 * Update CHANGELOG.next.asciidoc * Apply suggestions from code review --- CHANGELOG.asciidoc | 41 +++++++++++++++++++++++++++++++++++++++++ CHANGELOG.next.asciidoc | 4 ++++ 2 files changed, 45 insertions(+) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index b0b31734005..c4d0f48005f 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -3,6 +3,47 @@ :issue: https://github.com/elastic/beats/issues/ :pull: https://github.com/elastic/beats/pull/ +[[release-notes-7.9.2]] +=== Beats version 7.9.2 +https://github.com/elastic/beats/compare/v7.9.1...v7.9.2[View commits] + +==== Breaking changes + +*Affecting all Beats* + +- Autodiscover doesn't generate any configuration when a variable is missing. Previously it generated an incomplete configuration. {pull}20898[20898] + +==== Bugfixes + +*Affecting all Beats* + +- Explicitly detect missing variables in autodiscover configuration, log them at the debug level. {issue}20568[20568] {pull}20898[20898] +- Fix `libbeat.output.write.bytes` and `libbeat.output.read.bytes` metrics of the Elasticsearch output. {issue}20752[20752] {pull}21197[21197] + +*Filebeat* + +- Provide backwards compatibility for the `set` processor when Elasticsearch is less than 7.9.0. {pull}20908[20908] +- Fix an error updating file size being logged when EOF is reached. {pull}21048[21048] +- Fix error when processing AWS Cloudtrail Digest logs. {pull}21086[21086] {issue}20943[20943] + +*Metricbeat* + +- The Kibana collector applies backoff when errored at getting usage stats {pull}20772[20772] +- The `elasticsearch/index` metricset only requests wildcard expansion for hidden indices if the monitored Elasticsearch cluster supports it. {pull}20938[20938] +- Fix panic index out of range error when getting AWS account name. {pull}21101[21101] {issue}21095[21095] +- Handle missing counters in the application_pool metricset. {pull}21071[21071] + +*Functionbeat* + +- Do not need Google credentials if not required for the operation. {issue}17329[17329] {pull}21072[21072] +- Fix dependency issues of GCP functions. {issue}20830[20830] {pull}21070[21070] + +==== Added + +*Affecting all Beats* + +- Add container ECS fields in kubernetes metadata. {pull}20984[20984] + [[release-notes-7.9.1]] === Beats version 7.9.1 https://github.com/elastic/beats/compare/v7.9.0...v7.9.1[View commits] diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 1b5b1bd16bb..223dace9e49 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -23,6 +23,8 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Autodiscover doesn't generate any configuration when a variable is missing. Previously it generated an incomplete configuration. {pull}20898[20898] - Remove redundant `cloudfoundry.*.timestamp` fields. This value is set in `@timestamp`. {pull}21175[21175] - Allow embedding of CAs, Certificate of private keys for anything that support TLS in ouputs and inputs https://github.com/elastic/beats/pull/21179 +- Update to Golang 1.12.1. {pull}11330[11330] +- Disable Alibaba Cloud and Tencent Cloud metadata providers by default. {pull}13812[12812] *Auditbeat* @@ -74,6 +76,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix PANW field spelling "veredict" to "verdict" on event.action {pull}18808[18808] - Removed experimental modules `citrix`, `kaspersky`, `rapid7` and `tenable`. {pull}20706[20706] - Add support for GMT timezone offsets in `decode_cef`. {pull}20993[20993] +- Fix parsing of Elasticsearch node name by `elasticsearch/slowlog` fileset. {pull}14547[14547] *Heartbeat* @@ -356,6 +359,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Fix timestamp handling in remote_write. {pull}21166[21166] - Fix remote_write flaky test. {pull}21173[21173] - Visualization title fixes in aws, azure and googlecloud compute dashboards. {pull}21098[21098] +- Add a switch to the driver definition on SQL module to use pretty names {pull}17378[17378] *Packetbeat* From cba5245b313e40d409b14b362859b427841df0b3 Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Wed, 30 Sep 2020 16:21:34 +0200 Subject: [PATCH 031/156] docs: add link to release notes for 7.9.2 (#21405) (#21419) --- libbeat/docs/release.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/libbeat/docs/release.asciidoc b/libbeat/docs/release.asciidoc index 4215186d430..24e0ee43651 100644 --- a/libbeat/docs/release.asciidoc +++ b/libbeat/docs/release.asciidoc @@ -8,6 +8,7 @@ This section summarizes the changes in each release. Also read <> for more detail about changes that affect upgrade. +* <> * <> * <> * <> From cadd5ff70e679f76e41f32daa1d56734ddf3ae8c Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Wed, 30 Sep 2020 16:49:44 +0100 Subject: [PATCH 032/156] [JJBB] Set shallow cloning to 10 (#21409) --- .ci/jobs/apm-beats-update.yml | 2 +- .ci/jobs/beats-tester.yml | 2 +- .ci/jobs/beats-windows-mbp.yml | 2 +- .ci/jobs/beats.yml | 2 +- .ci/jobs/golang-crossbuild-mbp.yml | 2 +- .ci/jobs/packaging.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.ci/jobs/apm-beats-update.yml b/.ci/jobs/apm-beats-update.yml index 8bdc322f65a..2ae688ffab7 100644 --- a/.ci/jobs/apm-beats-update.yml +++ b/.ci/jobs/apm-beats-update.yml @@ -48,7 +48,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-tester.yml b/.ci/jobs/beats-tester.yml index 522abfa5e5c..808123a225e 100644 --- a/.ci/jobs/beats-tester.yml +++ b/.ci/jobs/beats-tester.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-windows-mbp.yml b/.ci/jobs/beats-windows-mbp.yml index 64efa009979..7ea26c9ba18 100644 --- a/.ci/jobs/beats-windows-mbp.yml +++ b/.ci/jobs/beats-windows-mbp.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 4 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats.yml b/.ci/jobs/beats.yml index 1e393bab6b9..3e4c8e50980 100644 --- a/.ci/jobs/beats.yml +++ b/.ci/jobs/beats.yml @@ -46,7 +46,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/golang-crossbuild-mbp.yml b/.ci/jobs/golang-crossbuild-mbp.yml index 46303790610..45175d169f6 100644 --- a/.ci/jobs/golang-crossbuild-mbp.yml +++ b/.ci/jobs/golang-crossbuild-mbp.yml @@ -31,7 +31,7 @@ before: true prune: true shallow-clone: true - depth: 4 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/packaging.yml b/.ci/jobs/packaging.yml index 0dce4d4672b..fd6fb9f90c6 100644 --- a/.ci/jobs/packaging.yml +++ b/.ci/jobs/packaging.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false From 3253dbfecbf2570aa4beea6704da6c2ea53c1666 Mon Sep 17 00:00:00 2001 From: Ivan Fernandez Calvo Date: Wed, 30 Sep 2020 18:47:13 +0200 Subject: [PATCH 033/156] ci: pipeline to generate the changelog (#21426) --- .ci/jobs/beats-release-changelog.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .ci/jobs/beats-release-changelog.yml diff --git a/.ci/jobs/beats-release-changelog.yml b/.ci/jobs/beats-release-changelog.yml new file mode 100644 index 00000000000..1cbd94c7168 --- /dev/null +++ b/.ci/jobs/beats-release-changelog.yml @@ -0,0 +1,20 @@ +--- +- job: + name: Beats/Release/beats-release-changelog + display-name: 'Prepare the Changelog for a Release' + description: 'Automate the steps to prepare the Changelog for a Release' + view: Beats + project-type: pipeline + pipeline-scm: + script-path: release_scripts/pipeline-release-changelog.groovy + scm: + - git: + url: git@github.com:elastic/ingest-dev.git + refspec: +refs/heads/*:refs/remotes/origin/* +refs/pull/*/head:refs/remotes/origin/pr/* + wipe-workspace: 'True' + name: origin + shallow-clone: true + credentials-id: f6c7695a-671e-4f4f-a331-acdce44ff9ba + reference-repo: /var/lib/jenkins/.git-references/ingest-dev.git + branches: + - master From fd52ca5adff8a68370e98ae89e101e4060776020 Mon Sep 17 00:00:00 2001 From: Lee Hinman <57081003+leehinman@users.noreply.github.com> Date: Wed, 30 Sep 2020 13:02:05 -0500 Subject: [PATCH 034/156] [Winlogbeat] Move winlogbeat javascript processor to libbeat (#21402) * Move winlogbeat processor to libbeat - needed for filebeat winlog input - changed name to windows - also register as winlogbeat for backwards compatibility --- libbeat/processors/script/javascript/module/include.go | 1 + .../script/javascript/module/windows}/doc.go | 6 +++--- .../script/javascript/module/windows/windows.go | 10 ++++++---- .../script/javascript/module/windows/windows_test.go | 2 +- winlogbeat/cmd/root.go | 1 - .../module/powershell/config/winlogbeat-powershell.js | 4 ++-- .../module/security/config/winlogbeat-security.js | 4 ++-- .../module/sysmon/config/winlogbeat-sysmon.js | 4 ++-- x-pack/winlogbeat/module/testing_windows.go | 1 - 9 files changed, 17 insertions(+), 16 deletions(-) rename {winlogbeat/processors/script/javascript/module/winlogbeat => libbeat/processors/script/javascript/module/windows}/doc.go (82%) rename winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat.go => libbeat/processors/script/javascript/module/windows/windows.go (87%) rename winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat_test.go => libbeat/processors/script/javascript/module/windows/windows_test.go (99%) diff --git a/libbeat/processors/script/javascript/module/include.go b/libbeat/processors/script/javascript/module/include.go index f30e423e7a2..b498dc90e21 100644 --- a/libbeat/processors/script/javascript/module/include.go +++ b/libbeat/processors/script/javascript/module/include.go @@ -24,4 +24,5 @@ import ( _ "github.com/elastic/beats/v7/libbeat/processors/script/javascript/module/path" _ "github.com/elastic/beats/v7/libbeat/processors/script/javascript/module/processor" _ "github.com/elastic/beats/v7/libbeat/processors/script/javascript/module/require" + _ "github.com/elastic/beats/v7/libbeat/processors/script/javascript/module/windows" ) diff --git a/winlogbeat/processors/script/javascript/module/winlogbeat/doc.go b/libbeat/processors/script/javascript/module/windows/doc.go similarity index 82% rename from winlogbeat/processors/script/javascript/module/winlogbeat/doc.go rename to libbeat/processors/script/javascript/module/windows/doc.go index fc782636d09..bca46a94340 100644 --- a/winlogbeat/processors/script/javascript/module/winlogbeat/doc.go +++ b/libbeat/processors/script/javascript/module/windows/doc.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -// Package winlogbeat registers the winlogbeat module with the javascript script -// processor. The module has utilities specific to Winlogbeat like parsing +// Package windows registers the windows module with the javascript script +// processor. The module has utilities specific to Windows like parsing // Windows command lines. -package winlogbeat +package windows diff --git a/winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat.go b/libbeat/processors/script/javascript/module/windows/windows.go similarity index 87% rename from winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat.go rename to libbeat/processors/script/javascript/module/windows/windows.go index dc9439c5c67..2bbe7817fad 100644 --- a/winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat.go +++ b/libbeat/processors/script/javascript/module/windows/windows.go @@ -17,7 +17,7 @@ // +build windows -package winlogbeat +package windows import ( "syscall" @@ -60,11 +60,11 @@ func commandLineToArgvW(in string) ([]string, error) { return args, nil } -// Require registers the winlogbeat module that has utilities specific to -// Winlogbeat like parsing Windows command lines. It can be accessed using: +// Require registers the windows module that has utilities specific to +// Windows like parsing Windows command lines. It can be accessed using: // // // javascript -// var winlogbeat = require('winlogbeat'); +// var windows = require('windows'); // func Require(vm *goja.Runtime, module *goja.Object) { o := module.Get("exports").(*goja.Object) @@ -74,9 +74,11 @@ func Require(vm *goja.Runtime, module *goja.Object) { // Enable adds path to the given runtime. func Enable(runtime *goja.Runtime) { + runtime.Set("windows", require.Require(runtime, "windows")) runtime.Set("winlogbeat", require.Require(runtime, "winlogbeat")) } func init() { + require.RegisterNativeModule("windows", Require) require.RegisterNativeModule("winlogbeat", Require) } diff --git a/winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat_test.go b/libbeat/processors/script/javascript/module/windows/windows_test.go similarity index 99% rename from winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat_test.go rename to libbeat/processors/script/javascript/module/windows/windows_test.go index 45c339cc1f2..be213a79ba8 100644 --- a/winlogbeat/processors/script/javascript/module/winlogbeat/winlogbeat_test.go +++ b/libbeat/processors/script/javascript/module/windows/windows_test.go @@ -17,7 +17,7 @@ // +build windows -package winlogbeat +package windows import ( "testing" diff --git a/winlogbeat/cmd/root.go b/winlogbeat/cmd/root.go index 7e25e717813..2cd26a9fe8e 100644 --- a/winlogbeat/cmd/root.go +++ b/winlogbeat/cmd/root.go @@ -30,7 +30,6 @@ import ( // Import processors and supporting modules. _ "github.com/elastic/beats/v7/libbeat/processors/script" _ "github.com/elastic/beats/v7/libbeat/processors/timestamp" - _ "github.com/elastic/beats/v7/winlogbeat/processors/script/javascript/module/winlogbeat" ) const ( diff --git a/x-pack/winlogbeat/module/powershell/config/winlogbeat-powershell.js b/x-pack/winlogbeat/module/powershell/config/winlogbeat-powershell.js index 71ce567ccc7..4ef1155086b 100644 --- a/x-pack/winlogbeat/module/powershell/config/winlogbeat-powershell.js +++ b/x-pack/winlogbeat/module/powershell/config/winlogbeat-powershell.js @@ -5,7 +5,7 @@ var powershell = (function () { var path = require("path"); var processor = require("processor"); - var winlogbeat = require("winlogbeat"); + var windows = require("windows"); var normalizeCommonFieldNames = new processor.Convert({ fields: [ @@ -183,7 +183,7 @@ var powershell = (function () { if (!commandLine) { return; } - evt.Put(target, winlogbeat.splitCommandLine(commandLine)); + evt.Put(target, windows.splitCommandLine(commandLine)); }; var addProcessArgs = function (evt) { diff --git a/x-pack/winlogbeat/module/security/config/winlogbeat-security.js b/x-pack/winlogbeat/module/security/config/winlogbeat-security.js index 9a0899165b9..5a8e91b677b 100644 --- a/x-pack/winlogbeat/module/security/config/winlogbeat-security.js +++ b/x-pack/winlogbeat/module/security/config/winlogbeat-security.js @@ -5,7 +5,7 @@ var security = (function () { var path = require("path"); var processor = require("processor"); - var winlogbeat = require("winlogbeat"); + var windows = require("windows"); // Logon Types // https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/basic-audit-logon-events @@ -1670,7 +1670,7 @@ var security = (function () { if (!cl) { return; } - evt.Put("process.args", winlogbeat.splitCommandLine(cl)); + evt.Put("process.args", windows.splitCommandLine(cl)); evt.Put("process.command_line", cl); }) .Build(); diff --git a/x-pack/winlogbeat/module/sysmon/config/winlogbeat-sysmon.js b/x-pack/winlogbeat/module/sysmon/config/winlogbeat-sysmon.js index 5fcedb9e40e..5b09c98fc32 100644 --- a/x-pack/winlogbeat/module/sysmon/config/winlogbeat-sysmon.js +++ b/x-pack/winlogbeat/module/sysmon/config/winlogbeat-sysmon.js @@ -15,7 +15,7 @@ if (!String.prototype.startsWith) { var sysmon = (function () { var path = require("path"); var processor = require("processor"); - var winlogbeat = require("winlogbeat"); + var windows = require("windows"); var net = require("net"); // Windows error codes for DNS. This list was generated using @@ -311,7 +311,7 @@ var sysmon = (function () { if (!commandLine) { return; } - evt.Put(target, winlogbeat.splitCommandLine(commandLine)); + evt.Put(target, windows.splitCommandLine(commandLine)); }; var splitProcessArgs = function (evt) { diff --git a/x-pack/winlogbeat/module/testing_windows.go b/x-pack/winlogbeat/module/testing_windows.go index 12b2102070f..058e2320a9d 100644 --- a/x-pack/winlogbeat/module/testing_windows.go +++ b/x-pack/winlogbeat/module/testing_windows.go @@ -28,7 +28,6 @@ import ( // Register javascript modules. _ "github.com/elastic/beats/v7/libbeat/processors/script/javascript/module" - _ "github.com/elastic/beats/v7/winlogbeat/processors/script/javascript/module/winlogbeat" ) var update = flag.Bool("update", false, "update golden files") From eae9f5c156467f2f23df5afc4e73b63c01e3091b Mon Sep 17 00:00:00 2001 From: Lee Hinman <57081003+leehinman@users.noreply.github.com> Date: Wed, 30 Sep 2020 13:09:57 -0500 Subject: [PATCH 035/156] Add field limit check for AWS Cloudtrail flattened fields (#21388) add 32k length check for - aws.cloudtrail.flattened.request_parameters - aws.cloudtrail.flattened.response_elements - aws.cloudtrail.flattened.additional_eventdata - aws.cloudtrail.flattened.service_event_details Closes #21382 --- CHANGELOG.next.asciidoc | 1 + .../module/aws/cloudtrail/ingest/pipeline.yml | 62 ++++++++----------- 2 files changed, 26 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 223dace9e49..a96a23db9d8 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -275,6 +275,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Handle multiple upstreams in ingress-controller. {pull}21215[21215] - Provide backwards compatibility for the `append` processor when Elasticsearch is less than 7.10.0. {pull}21159[21159] - Fix checkpoint module when logs contain time field. {pull}20567[20567] +- Add field limit check for AWS Cloudtrail flattened fields. {pull}21388[21388] {issue}21382[21382] *Heartbeat* diff --git a/x-pack/filebeat/module/aws/cloudtrail/ingest/pipeline.yml b/x-pack/filebeat/module/aws/cloudtrail/ingest/pipeline.yml index 8421e12d7f0..8ceec6ff100 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/ingest/pipeline.yml +++ b/x-pack/filebeat/module/aws/cloudtrail/ingest/pipeline.yml @@ -146,37 +146,36 @@ processors: field: "json.errorMessage" target_field: "aws.cloudtrail.error_message" ignore_failure: true - - rename: - field: json.requestParameters - target_field: "aws.cloudtrail.flattened.request_parameters" - if: ctx?.json?.requestParameters != null - script: lang: painless source: | - if (ctx.aws.cloudtrail.flattened.request_parameters != null) { - ctx.aws.cloudtrail.request_parameters = ctx.aws.cloudtrail.flattened.request_parameters.toString(); + if (ctx.aws.cloudtrail?.flattened == null) { + Map map = new HashMap(); + ctx.aws.cloudtrail.put("flattened", map); + } + if (ctx.json.requestParameters != null) { + ctx.aws.cloudtrail.request_parameters = ctx.json.requestParameters.toString(); + if (ctx.aws.cloudtrail.request_parameters.length() < 32766) { + ctx.aws.cloudtrail.flattened.put("request_parameters", ctx.json.requestParameters); + } } - ignore_failure: true - - rename: - field: json.responseElements - target_field: "aws.cloudtrail.flattened.response_elements" - if: ctx?.json?.responseElements != null - - script: - lang: painless - source: | - if (ctx.aws.cloudtrail.flattened.response_elements != null) { - ctx.aws.cloudtrail.response_elements = ctx.aws.cloudtrail.flattened.response_elements.toString(); + if (ctx.json.responseElements != null) { + ctx.aws.cloudtrail.response_elements = ctx.json.responseElements.toString(); + if (ctx.aws.cloudtrail.response_elements.length() < 32766) { + ctx.aws.cloudtrail.flattened.put("response_elements", ctx.json.responseElements); + } } - ignore_failure: true - - rename: - field: json.additionalEventData - target_field: "aws.cloudtrail.flattened.additional_eventdata" - if: ctx?.json?.additionalEventData != null - - script: - lang: painless - source: | - if (ctx.aws.cloudtrail.flattened.additional_eventdata != null) { - ctx.aws.cloudtrail.additional_eventdata = ctx.aws.cloudtrail.flattened.additional_eventdata.toString(); + if (ctx.json.additionalEventData != null) { + ctx.aws.cloudtrail.additional_eventdata = ctx.json.additionalEventData.toString(); + if (ctx.aws.cloudtrail.additional_eventdata.length() < 32766) { + ctx.aws.cloudtrail.flattened.put("additional_eventdata", ctx.json.additionalEventData); + } + } + if (ctx.json.serviceEventDetails != null) { + ctx.aws.cloudtrail.service_event_details = ctx.json.serviceEventDetails.toString(); + if (ctx.aws.cloudtrail.service_event_details.length() < 32766) { + ctx.aws.cloudtrail.flattened.put("service_event_details", ctx.json.serviceEventDetails); + } } ignore_failure: true - rename: @@ -219,17 +218,6 @@ processors: field: "json.recipientAccountId" target_field: "aws.cloudtrail.recipient_account_id" ignore_failure: true - - rename: - field: json.serviceEventDetails - target_field: "aws.cloudtrail.flattened.service_event_details" - if: ctx?.json?.serviceEventDetails != null - - script: - lang: painless - source: | - if (ctx.aws.cloudtrail.flattened.service_event_details != null) { - ctx.aws.cloudtrail.service_event_details = ctx.aws.cloudtrail.flattened.service_event_details.toString(); - } - ignore_failure: true - rename: field: "json.sharedEventId" target_field: "aws.cloudtrail.shared_event_id" From f07eeaa02a1100be29cf1f2fa045a6c4a8d8a16d Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Thu, 1 Oct 2020 08:52:03 +0200 Subject: [PATCH 036/156] [Ingest Manager] Upgrade Action: make source URI optional (#21372) [Ingest Manager] Upgrade Action: make source URI optional (#21372) --- .../pkg/agent/application/upgrade/step_unpack.go | 4 ++-- .../pkg/agent/application/upgrade/upgrade.go | 15 +++++++++++++-- x-pack/elastic-agent/pkg/fleetapi/action.go | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_unpack.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_unpack.go index ae3d05edd16..8efb2de2140 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/step_unpack.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/step_unpack.go @@ -23,8 +23,8 @@ import ( "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" ) -// untar unpacks archive correctly, skips root (symlink, config...) unpacks data/* -func (u *Upgrader) unpack(ctx context.Context, version, sourceURI, archivePath string) (string, error) { +// unpack unpacks archive correctly, skips root (symlink, config...) unpacks data/* +func (u *Upgrader) unpack(ctx context.Context, version, archivePath string) (string, error) { // unpack must occur in directory that holds the installation directory // or the extraction will be double nested var hash string diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go index 9c2c4f02286..de3a577281d 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go @@ -75,12 +75,13 @@ func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) error "running under control of the systems supervisor") } - archivePath, err := u.downloadArtifact(ctx, a.Version, a.SourceURI) + sourceURI, err := u.sourceURI(a.Version, a.SourceURI) + archivePath, err := u.downloadArtifact(ctx, a.Version, sourceURI) if err != nil { return err } - newHash, err := u.unpack(ctx, a.Version, a.SourceURI, archivePath) + newHash, err := u.unpack(ctx, a.Version, archivePath) if err != nil { return err } @@ -147,6 +148,16 @@ func (u *Upgrader) Ack(ctx context.Context) error { return ioutil.WriteFile(markerFile, markerBytes, 0600) } +func (u *Upgrader) sourceURI(version, retrievedURI string) (string, error) { + if strings.HasSuffix(version, "-SNAPSHOT") && retrievedURI == "" { + return "", errors.New("snapshot upgrade requires source uri", errors.TypeConfig) + } + if retrievedURI != "" { + return retrievedURI, nil + } + + return u.settings.SourceURI, nil +} func rollbackInstall(hash string) { os.RemoveAll(filepath.Join(paths.Data(), fmt.Sprintf("%s-%s", agentName, hash))) diff --git a/x-pack/elastic-agent/pkg/fleetapi/action.go b/x-pack/elastic-agent/pkg/fleetapi/action.go index d53b7fdfcfb..2329546629c 100644 --- a/x-pack/elastic-agent/pkg/fleetapi/action.go +++ b/x-pack/elastic-agent/pkg/fleetapi/action.go @@ -97,7 +97,7 @@ type ActionUpgrade struct { ActionID string `json:"id" yaml:"id"` ActionType string `json:"type" yaml:"type"` Version string `json:"version" yaml:"version"` - SourceURI string `json:"source_uri" yaml:"source_uri"` + SourceURI string `json:"source_uri,omitempty" yaml:"source_uri,omitempty"` } func (a *ActionUpgrade) String() string { From 690afe941f3d08f7abd49f09e1a8845331673853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20=C3=81lvarez?= Date: Thu, 1 Oct 2020 09:14:01 +0200 Subject: [PATCH 037/156] Initial spec file for apm-server (#21225) Start with Elasticsearch output only for now --- .../elastic-agent/spec/apm-server.yml.disabled | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 x-pack/elastic-agent/spec/apm-server.yml.disabled diff --git a/x-pack/elastic-agent/spec/apm-server.yml.disabled b/x-pack/elastic-agent/spec/apm-server.yml.disabled new file mode 100644 index 00000000000..c84405dfadd --- /dev/null +++ b/x-pack/elastic-agent/spec/apm-server.yml.disabled @@ -0,0 +1,16 @@ +name: APM-Server +cmd: apm-server +artifact: apm-server +args: ["-E", "management.enabled=true", "-E", "management.mode=x-pack-fleet"] +rules: + - fix_stream: {} + - filter_values: + selector: inputs + key: type + values: + - apm + - filter: + selectors: + - inputs + - output +when: length(${inputs}) > 0 and hasKey(${output}, 'elasticsearch') From cb624cfd18ac07e06e633a3d960d0926bd759730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Thu, 1 Oct 2020 10:24:01 +0200 Subject: [PATCH 038/156] Add initial skeleton of filestream input (#21427) ## What does this PR do? This PR adds the skeleton of the new `filestream` input. The name of the input can be changed. The input was renamed from `logfile` because we are not going to provide the same options as the current `log` input. As `logfile` is already used by Agent for the `log` input, it is easier to adopt a new input with a different name. The PR seems big, but the contents of `filebeat/input/filestream/internal/input-logfile` is basically the same as `filebeat/input/v2/input-cursor`. It is separated into a different folder because when the time comes, we would like to unify the two input types. The main difference between the two inputs is that the `configure` function of `input-logfile` returns a `Prospector` which finds inputs dynamically. Whereas `input-cursor` requires a list of paths without globbing. The following files need review: * filebeat/input/filestream/input.go * filebeat/input/filestream/internal/input-logfile/fswatch.go * filebeat/input/filestream/internal/input-logfile/harvester.go * filebeat/input/filestream/internal/input-logfile/input.go * filebeat/input/filestream/internal/input-logfile/prospector.go * filebeat/input/filestream/prospector.go The others are the same as `input-cursor`. Also, updated tests are coming in a new PR. ## Related issues First step https://github.com/elastic/beats/issues/20243 --- filebeat/input/filestream/input.go | 68 ++++ .../internal/input-logfile/clean.go | 124 +++++++ .../internal/input-logfile/clean_test.go | 162 ++++++++ .../internal/input-logfile/cursor.go | 43 +++ .../internal/input-logfile/cursor_test.go | 124 +++++++ .../filestream/internal/input-logfile/doc.go | 58 +++ .../internal/input-logfile/fswatch.go | 65 ++++ .../internal/input-logfile/harvester.go | 125 +++++++ .../internal/input-logfile/input.go | 106 ++++++ .../internal/input-logfile/manager.go | 199 ++++++++++ .../internal/input-logfile/prospector.go | 35 ++ .../internal/input-logfile/publish.go | 153 ++++++++ .../internal/input-logfile/publish_test.go | 158 ++++++++ .../internal/input-logfile/store.go | 324 ++++++++++++++++ .../internal/input-logfile/store_test.go | 351 ++++++++++++++++++ filebeat/input/filestream/prospector.go | 38 ++ 16 files changed, 2133 insertions(+) create mode 100644 filebeat/input/filestream/input.go create mode 100644 filebeat/input/filestream/internal/input-logfile/clean.go create mode 100644 filebeat/input/filestream/internal/input-logfile/clean_test.go create mode 100644 filebeat/input/filestream/internal/input-logfile/cursor.go create mode 100644 filebeat/input/filestream/internal/input-logfile/cursor_test.go create mode 100644 filebeat/input/filestream/internal/input-logfile/doc.go create mode 100644 filebeat/input/filestream/internal/input-logfile/fswatch.go create mode 100644 filebeat/input/filestream/internal/input-logfile/harvester.go create mode 100644 filebeat/input/filestream/internal/input-logfile/input.go create mode 100644 filebeat/input/filestream/internal/input-logfile/manager.go create mode 100644 filebeat/input/filestream/internal/input-logfile/prospector.go create mode 100644 filebeat/input/filestream/internal/input-logfile/publish.go create mode 100644 filebeat/input/filestream/internal/input-logfile/publish_test.go create mode 100644 filebeat/input/filestream/internal/input-logfile/store.go create mode 100644 filebeat/input/filestream/internal/input-logfile/store_test.go create mode 100644 filebeat/input/filestream/prospector.go diff --git a/filebeat/input/filestream/input.go b/filebeat/input/filestream/input.go new file mode 100644 index 00000000000..487a5f01c2a --- /dev/null +++ b/filebeat/input/filestream/input.go @@ -0,0 +1,68 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package filestream + +import ( + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/feature" + "github.com/elastic/beats/v7/libbeat/logp" +) + +// filestream is the input for reading from files which +// are actively written by other applications. +type filestream struct{} + +const pluginName = "filestream" + +// Plugin creates a new filestream input plugin for creating a stateful input. +func Plugin(log *logp.Logger, store loginp.StateStore) input.Plugin { + return input.Plugin{ + Name: pluginName, + Stability: feature.Experimental, + Deprecated: false, + Info: "filestream input", + Doc: "The filestream input collects logs from the local filestream service", + Manager: &loginp.InputManager{ + Logger: log, + StateStore: store, + Type: pluginName, + Configure: configure, + }, + } +} + +func configure(cfg *common.Config) (loginp.Prospector, loginp.Harvester, error) { + panic("TODO: implement me") +} + +func (inp *filestream) Name() string { return pluginName } + +func (inp *filestream) Test(src loginp.Source, ctx input.TestContext) error { + panic("TODO: implement me") +} + +func (inp *filestream) Run( + ctx input.Context, + src loginp.Source, + cursor loginp.Cursor, + publisher loginp.Publisher, +) error { + panic("TODO: implement me") +} diff --git a/filebeat/input/filestream/internal/input-logfile/clean.go b/filebeat/input/filestream/internal/input-logfile/clean.go new file mode 100644 index 00000000000..d738dabbc55 --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/clean.go @@ -0,0 +1,124 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "time" + + "github.com/elastic/go-concert/timed" + "github.com/elastic/go-concert/unison" + + "github.com/elastic/beats/v7/libbeat/logp" +) + +// cleaner removes finished entries from the registry file. +type cleaner struct { + log *logp.Logger +} + +// run starts a loop that tries to clean entries from the registry. +// The cleaner locks the store, such that no new states can be created +// during the cleanup phase. Only resources that are finished and whos TTL +// (clean_timeout setting) has expired will be removed. +// +// Resources are considered "Finished" if they do not have a current owner (active input), and +// if they have no pending updates that still need to be written to the registry file after associated +// events have been ACKed by the outputs. +// The event acquisition timestamp is used as reference to clean resources. If a resources was blocked +// for a long time, and the life time has been exhausted, then the resource will be removed immediately +// once the last event has been ACKed. +func (c *cleaner) run(canceler unison.Canceler, store *store, interval time.Duration) { + started := time.Now() + timed.Periodic(canceler, interval, func() error { + gcStore(c.log, started, store) + return nil + }) +} + +// gcStore looks for resources to remove and deletes these. `gcStore` receives +// the start timestamp of the cleaner as reference. If we have entries without +// updates in the registry, that are older than `started`, we will use `started +// + ttl` to decide if an entry will be removed. This way old entries are not +// removed immediately on startup if the Beat is down for a longer period of +// time. +func gcStore(log *logp.Logger, started time.Time, store *store) { + log.Debugf("Start store cleanup") + defer log.Debugf("Done store cleanup") + + states := store.ephemeralStore + states.mu.Lock() + defer states.mu.Unlock() + + keys := gcFind(states.table, started, time.Now()) + if len(keys) == 0 { + log.Debug("No entries to remove were found") + return + } + + if err := gcClean(store, keys); err != nil { + log.Errorf("Failed to remove all entries from the registry: %+v", err) + } +} + +// gcFind searches the store of resources that can be removed. A set of keys to delete is returned. +func gcFind(table map[string]*resource, started, now time.Time) map[string]struct{} { + keys := map[string]struct{}{} + for key, resource := range table { + clean := checkCleanResource(started, now, resource) + if !clean { + // do not clean the resource if it is still live or not serialized to the persistent store yet. + continue + } + keys[key] = struct{}{} + } + + return keys +} + +// gcClean removes key value pairs in the removeSet from the store. +// If deletion in the persistent store fails the entry is kept in memory and +// eventually cleaned up later. +func gcClean(store *store, removeSet map[string]struct{}) error { + for key := range removeSet { + if err := store.persistentStore.Remove(key); err != nil { + return err + } + delete(store.ephemeralStore.table, key) + } + return nil +} + +// checkCleanResource returns true for a key-value pair is assumed to be old, +// if is not in use and there are no more pending updates that still need to be +// written to the persistent store anymore. +func checkCleanResource(started, now time.Time, resource *resource) bool { + if !resource.Finished() { + return false + } + + resource.stateMutex.Lock() + defer resource.stateMutex.Unlock() + + ttl := resource.internalState.TTL + reference := resource.internalState.Updated + if started.After(reference) { + reference = started + } + + return reference.Add(ttl).Before(now) && resource.stored +} diff --git a/filebeat/input/filestream/internal/input-logfile/clean_test.go b/filebeat/input/filestream/internal/input-logfile/clean_test.go new file mode 100644 index 00000000000..83e5bff412f --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/clean_test.go @@ -0,0 +1,162 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/logp" +) + +func TestGCStore(t *testing.T) { + t.Run("empty store", func(t *testing.T) { + started := time.Now() + + backend := createSampleStore(t, nil) + store := testOpenStore(t, "test", backend) + defer store.Release() + + gcStore(logp.NewLogger("test"), started, store) + + want := map[string]state{} + checkEqualStoreState(t, want, backend.snapshot()) + }) + + t.Run("state is still alive", func(t *testing.T) { + started := time.Now() + const ttl = 60 * time.Second + + initState := map[string]state{ + "test::key": { + TTL: ttl, + Updated: started.Add(-ttl / 2), + }, + } + + backend := createSampleStore(t, initState) + store := testOpenStore(t, "test", backend) + defer store.Release() + + gcStore(logp.NewLogger("test"), started, store) + + checkEqualStoreState(t, initState, backend.snapshot()) + }) + + t.Run("old state can be removed", func(t *testing.T) { + const ttl = 60 * time.Second + started := time.Now().Add(-5 * ttl) // cleanup process is running for a while already + + initState := map[string]state{ + "test::key": { + TTL: ttl, + Updated: started.Add(-ttl), + }, + } + + backend := createSampleStore(t, initState) + store := testOpenStore(t, "test", backend) + defer store.Release() + + gcStore(logp.NewLogger("test"), started, store) + + want := map[string]state{} + checkEqualStoreState(t, want, backend.snapshot()) + }) + + t.Run("old state is not removed if cleanup is not active long enough", func(t *testing.T) { + const ttl = 60 * time.Minute + started := time.Now() + + initState := map[string]state{ + "test::key": { + TTL: ttl, + Updated: started.Add(-2 * ttl), + }, + } + + backend := createSampleStore(t, initState) + store := testOpenStore(t, "test", backend) + defer store.Release() + + gcStore(logp.NewLogger("test"), started, store) + + checkEqualStoreState(t, initState, backend.snapshot()) + }) + + t.Run("old state but resource is accessed", func(t *testing.T) { + const ttl = 60 * time.Second + started := time.Now().Add(-5 * ttl) // cleanup process is running for a while already + + initState := map[string]state{ + "test::key": { + TTL: ttl, + Updated: started.Add(-ttl), + }, + } + + backend := createSampleStore(t, initState) + store := testOpenStore(t, "test", backend) + defer store.Release() + + // access resource and check it is not gc'ed + res := store.Get("test::key") + gcStore(logp.NewLogger("test"), started, store) + checkEqualStoreState(t, initState, backend.snapshot()) + + // release resource and check it gets gc'ed + res.Release() + want := map[string]state{} + gcStore(logp.NewLogger("test"), started, store) + checkEqualStoreState(t, want, backend.snapshot()) + }) + + t.Run("old state but resource has pending updates", func(t *testing.T) { + const ttl = 60 * time.Second + started := time.Now().Add(-5 * ttl) // cleanup process is running for a while already + + initState := map[string]state{ + "test::key": { + TTL: ttl, + Updated: started.Add(-ttl), + }, + } + + backend := createSampleStore(t, initState) + store := testOpenStore(t, "test", backend) + defer store.Release() + + // create pending update operation + res := store.Get("test::key") + op, err := createUpdateOp(store, res, "test-state-update") + require.NoError(t, err) + res.Release() + + // cleanup fails + gcStore(logp.NewLogger("test"), started, store) + checkEqualStoreState(t, initState, backend.snapshot()) + + // cancel operation (no more pending operations) and try to gc again + op.done(1) + gcStore(logp.NewLogger("test"), started, store) + want := map[string]state{} + checkEqualStoreState(t, want, backend.snapshot()) + }) +} diff --git a/filebeat/input/filestream/internal/input-logfile/cursor.go b/filebeat/input/filestream/internal/input-logfile/cursor.go new file mode 100644 index 00000000000..37de24fe56c --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/cursor.go @@ -0,0 +1,43 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +// Cursor allows the input to check if cursor status has been stored +// in the past and unpack the status into a custom structure. +type Cursor struct { + store *store + resource *resource +} + +func makeCursor(store *store, res *resource) Cursor { + return Cursor{store: store, resource: res} +} + +// IsNew returns true if no cursor information has been stored +// for the current Source. +func (c Cursor) IsNew() bool { return c.resource.IsNew() } + +// Unpack deserialized the cursor state into to. Unpack fails if no pointer is +// given, or if the structure to points to is not compatible with the document +// stored. +func (c Cursor) Unpack(to interface{}) error { + if c.IsNew() { + return nil + } + return c.resource.UnpackCursor(to) +} diff --git a/filebeat/input/filestream/internal/input-logfile/cursor_test.go b/filebeat/input/filestream/internal/input-logfile/cursor_test.go new file mode 100644 index 00000000000..db2ff0c3a30 --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/cursor_test.go @@ -0,0 +1,124 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestCursor_IsNew(t *testing.T) { + t.Run("true if key is not in store", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + + cursor := makeCursor(store, store.Get("test::key")) + require.True(t, cursor.IsNew()) + }) + + t.Run("true if key is in store but without cursor value", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key": {Cursor: nil}, + })) + defer store.Release() + + cursor := makeCursor(store, store.Get("test::key")) + require.True(t, cursor.IsNew()) + }) + + t.Run("false if key with cursor value is in persistent store", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key": {Cursor: "test"}, + })) + defer store.Release() + + cursor := makeCursor(store, store.Get("test::key")) + require.False(t, cursor.IsNew()) + }) + + t.Run("false if key with cursor value is in memory store only", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key": {Cursor: nil}, + })) + defer store.Release() + + res := store.Get("test::key") + op, err := createUpdateOp(store, res, "test-state-update") + require.NoError(t, err) + defer op.done(1) + + cursor := makeCursor(store, res) + require.False(t, cursor.IsNew()) + }) +} + +func TestCursor_Unpack(t *testing.T) { + t.Run("nothing to unpack if key is new", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + + var st string + cursor := makeCursor(store, store.Get("test::key")) + + require.NoError(t, cursor.Unpack(&st)) + require.Equal(t, "", st) + }) + + t.Run("unpack fails if types are not compatible", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key": {Cursor: "test"}, + })) + defer store.Release() + + var st struct{ A uint } + cursor := makeCursor(store, store.Get("test::key")) + require.Error(t, cursor.Unpack(&st)) + }) + + t.Run("unpack from state in persistent store", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key": {Cursor: "test"}, + })) + defer store.Release() + + var st string + cursor := makeCursor(store, store.Get("test::key")) + + require.NoError(t, cursor.Unpack(&st)) + require.Equal(t, "test", st) + }) + + t.Run("unpack from in memory state if updates are pending", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key": {Cursor: "test"}, + })) + defer store.Release() + + res := store.Get("test::key") + op, err := createUpdateOp(store, res, "test-state-update") + require.NoError(t, err) + defer op.done(1) + + var st string + cursor := makeCursor(store, store.Get("test::key")) + + require.NoError(t, cursor.Unpack(&st)) + require.Equal(t, "test-state-update", st) + }) +} diff --git a/filebeat/input/filestream/internal/input-logfile/doc.go b/filebeat/input/filestream/internal/input-logfile/doc.go new file mode 100644 index 00000000000..cf318d4bfed --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/doc.go @@ -0,0 +1,58 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Package cursor provides an InputManager for use with the v2 API, that is +// capable of storing an internal cursor state between restarts. +// +// The InputManager requires authors to Implement a configuration function and +// the cursor.Input interface. The configuration function returns a slice of +// sources ([]Source) that it has read from the configuration object, and the +// actual Input that will be used to collect events from each configured +// source. +// When Run a go-routine will be started per configured source. If two inputs have +// configured the same source, only one will be active, while the other waits +// for the resource to become free. +// The manager keeps track of the state per source. When publishing an event a +// new cursor value can be passed as well. Future instance of the input can +// read the last published cursor state. +// +// For each source an in-memory and a persitent state are tracked. Internal +// meta updates by the input manager can not be read by Inputs, and will be +// written to the persistent store immediately. Cursor state updates are read +// and update by the input. Cursor updates are written to the persistent store +// only after the events have been ACKed by the output. Internally the input +// manager keeps track of already ACKed updates and pending ACKs. +// In order to guarantee progress even if the pbulishing is slow or blocked, all cursor +// updates are written to the in-memory state immediately. Source without any +// pending updates are in-sync (in-memory state == persistet state). All +// updates are ordered, but we allow the in-memory state to be ahead of the +// persistent state. +// When an input is started, the cursor state is read from the in-memory state. +// This way a new input instance can continue where other inputs have been +// stopped, even if we still have in-flight events from older input instances. +// The coordination between inputs guarantees that all updates are always in +// order. +// +// When a shutdown signal is received, the publisher is directly disconnected +// from the outputs. As all coordination is directly handled by the +// InputManager, shutdown will be immediate (once the input itself has +// returned), and can not be blocked by the outputs. +// +// An input that is about to collect a source that is already collected by +// another input will wait until the other input has returned or the current +// input did receive a shutdown signal. +package input_logfile diff --git a/filebeat/input/filestream/internal/input-logfile/fswatch.go b/filebeat/input/filestream/internal/input-logfile/fswatch.go new file mode 100644 index 00000000000..685b54253a4 --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/fswatch.go @@ -0,0 +1,65 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "os" + + "github.com/elastic/go-concert/unison" +) + +const ( + OpDone Operation = iota + OpCreate + OpWrite + OpDelete + OpRename +) + +// Operation describes what happened to a file. +type Operation uint8 + +// FSEvent returns inforamation about file system changes. +type FSEvent struct { + // NewPath is the new path of the file. + NewPath string + // OldPath is the previous path to the file, is it was + // deleted or renamed. + OldPath string + // Op is the file system event: create, write, rename, remove + Op Operation + // Info describes the file in the event. + Info os.FileInfo +} + +// FSScanner retrieves a list of files from the file system. +type FSScanner interface { + // GetFiles returns the list of monitored files. + // The keys of the map are the paths to the files and + // the values are the FileInfos describing the file. + GetFiles() map[string]os.FileInfo +} + +// FSWatcher returns file events of the monitored files. +type FSWatcher interface { + // Run is the event loop which watchers for changes + // in the file system and returns events based on the data. + Run(unison.Canceler) + // Event returns the next event captured by FSWatcher. + Event() FSEvent +} diff --git a/filebeat/input/filestream/internal/input-logfile/harvester.go b/filebeat/input/filestream/internal/input-logfile/harvester.go new file mode 100644 index 00000000000..d2f184cac7b --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/harvester.go @@ -0,0 +1,125 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "context" + "fmt" + "runtime/debug" + "time" + + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/go-concert/ctxtool" + "github.com/elastic/go-concert/unison" +) + +// Harvester is the reader which collects the lines from +// the configured source. +type Harvester interface { + // Name returns the type of the Harvester + Name() string + // Test checks if the Harvester can be started with the given configuration. + Test(Source, input.TestContext) error + // Run is the event loop which reads from the source + // and forwards it to the publisher. + Run(input.Context, Source, Cursor, Publisher) error +} + +// HarvesterGroup is responsible for running the +// Harvesters started by the Prospector. +type HarvesterGroup struct { + manager *InputManager + readers map[string]context.CancelFunc + pipeline beat.PipelineConnector + harvester Harvester + cleanTimeout time.Duration + store *store + tg unison.TaskGroup +} + +// Run starts the Harvester for a Source. +func (hg *HarvesterGroup) Run(ctx input.Context, s Source) error { + log := ctx.Logger.With("source", s.Name()) + log.Debug("Starting harvester for file") + + harvesterCtx, cancelHarvester := context.WithCancel(ctxtool.FromCanceller(ctx.Cancelation)) + ctx.Cancelation = harvesterCtx + + resource, err := hg.manager.lock(ctx, s.Name()) + if err != nil { + cancelHarvester() + return err + } + + if _, ok := hg.readers[s.Name()]; ok { + cancelHarvester() + log.Debug("A harvester is already running for file") + return nil + } + hg.readers[s.Name()] = cancelHarvester + + hg.store.UpdateTTL(resource, hg.cleanTimeout) + + client, err := hg.pipeline.ConnectWith(beat.ClientConfig{ + CloseRef: ctx.Cancelation, + ACKHandler: newInputACKHandler(ctx.Logger), + }) + if err != nil { + cancelHarvester() + return err + } + + cursor := makeCursor(hg.store, resource) + publisher := &cursorPublisher{canceler: ctx.Cancelation, client: client, cursor: &cursor} + + go func(cancel context.CancelFunc) { + defer client.Close() + defer log.Debug("Stopped harvester for file") + defer cancel() + defer releaseResource(resource) + defer delete(hg.readers, s.Name()) + + defer func() { + if v := recover(); v != nil { + err := fmt.Errorf("harvester panic with: %+v\n%s", v, debug.Stack()) + ctx.Logger.Errorf("Harvester crashed with: %+v", err) + } + }() + + err := hg.harvester.Run(ctx, s, cursor, publisher) + if err != nil { + log.Errorf("Harvester stopped: %v", err) + } + }(cancelHarvester) + return nil +} + +// Cancel stops the running Harvester for a given Source. +func (hg *HarvesterGroup) Cancel(s Source) error { + if cancel, ok := hg.readers[s.Name()]; ok { + cancel() + return nil + } + return fmt.Errorf("no such harvester %s", s.Name()) +} + +func releaseResource(resource *resource) { + resource.lock.Unlock() + resource.Release() +} diff --git a/filebeat/input/filestream/internal/input-logfile/input.go b/filebeat/input/filestream/internal/input-logfile/input.go new file mode 100644 index 00000000000..7084315b0c1 --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/input.go @@ -0,0 +1,106 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "context" + "time" + + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common/acker" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/go-concert/ctxtool" + "github.com/elastic/go-concert/unison" +) + +type managedInput struct { + manager *InputManager + prospector Prospector + harvester Harvester + cleanTimeout time.Duration +} + +// Name is required to implement the v2.Input interface +func (inp *managedInput) Name() string { return inp.harvester.Name() } + +// Test runs the Test method for each configured source. +func (inp *managedInput) Test(ctx input.TestContext) error { + return inp.prospector.Test() +} + +// Run +func (inp *managedInput) Run( + ctx input.Context, + pipeline beat.PipelineConnector, +) (err error) { + // Setup cancellation using a custom cancel context. All workers will be + // stopped if one failed badly by returning an error. + cancelCtx, cancel := context.WithCancel(ctxtool.FromCanceller(ctx.Cancelation)) + defer cancel() + ctx.Cancelation = cancelCtx + + store := inp.manager.store + store.Retain() + defer store.Release() + + hg := &HarvesterGroup{ + pipeline: pipeline, + readers: make(map[string]context.CancelFunc), + manager: inp.manager, + cleanTimeout: inp.cleanTimeout, + harvester: inp.harvester, + store: store, + tg: unison.TaskGroup{}, + } + + stateStore, err := inp.manager.StateStore.Access() + if err != nil { + return err + } + defer stateStore.Close() + + inp.prospector.Run(ctx, stateStore, hg) + + return nil +} + +func newInputACKHandler(log *logp.Logger) beat.ACKer { + return acker.EventPrivateReporter(func(acked int, private []interface{}) { + var n uint + var last int + for i := 0; i < len(private); i++ { + current := private[i] + if current == nil { + continue + } + + if _, ok := current.(*updateOp); !ok { + continue + } + + n++ + last = i + } + + if n == 0 { + return + } + private[last].(*updateOp).Execute(n) + }) +} diff --git a/filebeat/input/filestream/internal/input-logfile/manager.go b/filebeat/input/filestream/internal/input-logfile/manager.go new file mode 100644 index 00000000000..db3c600d2bc --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/manager.go @@ -0,0 +1,199 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "errors" + "sync" + "time" + + "github.com/urso/sderr" + + "github.com/elastic/go-concert/unison" + + input "github.com/elastic/beats/v7/filebeat/input/v2" + v2 "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/statestore" +) + +// InputManager is used to create, manage, and coordinate stateful inputs and +// their persistent state. +// The InputManager ensures that only one input can be active for a unique source. +// If two inputs have overlapping sources, both can still collect data, but +// only one input will collect from the common source. +// +// The InputManager automatically cleans up old entries without an active +// input, and without any pending update operations for the persistent store. +// +// The Type field is used to create the key name in the persistent store. Users +// are allowed to add a custome per input configuration ID using the `id` +// setting, to collect the same source multiple times, but with different +// state. The key name in the persistent store becomes -[]- +type InputManager struct { + Logger *logp.Logger + + // StateStore gives the InputManager access to the persitent key value store. + StateStore StateStore + + // Type must contain the name of the input type. It is used to create the key name + // for all sources the inputs collect from. + Type string + + // DefaultCleanTimeout configures the key/value garbage collection interval. + // The InputManager will only collect keys for the configured 'Type' + DefaultCleanTimeout time.Duration + + // Configure returns an array of Sources, and a configured Input instances + // that will be used to collect events from each source. + Configure func(cfg *common.Config) (Prospector, Harvester, error) + + initOnce sync.Once + initErr error + store *store +} + +// Source describe a source the input can collect data from. +// The `Name` method must return an unique name, that will be used to identify +// the source in the persistent state store. +type Source interface { + Name() string +} + +var errNoSourceConfigured = errors.New("no source has been configured") +var errNoInputRunner = errors.New("no input runner available") + +// StateStore interface and configurations used to give the Manager access to the persistent store. +type StateStore interface { + Access() (*statestore.Store, error) + CleanupInterval() time.Duration +} + +func (cim *InputManager) init() error { + cim.initOnce.Do(func() { + if cim.DefaultCleanTimeout <= 0 { + cim.DefaultCleanTimeout = 30 * time.Minute + } + + log := cim.Logger.With("input_type", cim.Type) + var store *store + store, cim.initErr = openStore(log, cim.StateStore, cim.Type) + if cim.initErr != nil { + return + } + + cim.store = store + }) + + return cim.initErr +} + +// Init starts background processes for deleting old entries from the +// persistent store if mode is ModeRun. +func (cim *InputManager) Init(group unison.Group, mode v2.Mode) error { + if mode != v2.ModeRun { + return nil + } + + if err := cim.init(); err != nil { + return err + } + + log := cim.Logger.With("input_type", cim.Type) + + store := cim.store + cleaner := &cleaner{log: log} + store.Retain() + err := group.Go(func(canceler unison.Canceler) error { + defer cim.shutdown() + defer store.Release() + interval := cim.StateStore.CleanupInterval() + if interval <= 0 { + interval = 5 * time.Minute + } + cleaner.run(canceler, store, interval) + return nil + }) + if err != nil { + store.Release() + cim.shutdown() + return sderr.Wrap(err, "Can not start registry cleanup process") + } + + return nil +} + +func (cim *InputManager) shutdown() { + cim.store.Release() +} + +// Create builds a new v2.Input using the provided Configure function. +// The Input will run a go-routine per source that has been configured. +func (cim *InputManager) Create(config *common.Config) (input.Input, error) { + if err := cim.init(); err != nil { + return nil, err + } + + settings := struct { + ID string `config:"id"` + CleanTimeout time.Duration `config:"clean_timeout"` + }{ID: "", CleanTimeout: cim.DefaultCleanTimeout} + if err := config.Unpack(&settings); err != nil { + return nil, err + } + + prospector, harvester, err := cim.Configure(config) + if err != nil { + return nil, err + } + if harvester == nil { + return nil, errNoInputRunner + } + + return &managedInput{ + manager: cim, + prospector: prospector, + harvester: harvester, + cleanTimeout: settings.CleanTimeout, + }, nil +} + +// Lock locks a key for exclusive access and returns an resource that can be used to modify +// the cursor state and unlock the key. +func (cim *InputManager) lock(ctx input.Context, key string) (*resource, error) { + resource := cim.store.Get(key) + err := lockResource(ctx.Logger, resource, ctx.Cancelation) + if err != nil { + resource.Release() + return nil, err + } + return resource, nil +} + +func lockResource(log *logp.Logger, resource *resource, canceler input.Canceler) error { + if !resource.lock.TryLock() { + log.Infof("Resource '%v' currently in use, waiting...", resource.key) + err := resource.lock.LockContext(canceler) + if err != nil { + log.Infof("Input for resource '%v' has been stopped while waiting", resource.key) + return err + } + } + return nil +} diff --git a/filebeat/input/filestream/internal/input-logfile/prospector.go b/filebeat/input/filestream/internal/input-logfile/prospector.go new file mode 100644 index 00000000000..9488596eb2c --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/prospector.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/statestore" +) + +// Prospector is responsible for starting, stopping harvesters +// based on the retrieved information about the configured paths. +// It also updates the statestore with the meta data of the running harvesters. +type Prospector interface { + // Run starts the event loop and handles the incoming events + // either by starting/stopping a harvester, or updating the statestore. + Run(input.Context, *statestore.Store, *HarvesterGroup) + // Test checks if the Prospector is able to run the configuration + // specified by the user. + Test() error +} diff --git a/filebeat/input/filestream/internal/input-logfile/publish.go b/filebeat/input/filestream/internal/input-logfile/publish.go new file mode 100644 index 00000000000..547a82c479f --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/publish.go @@ -0,0 +1,153 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "time" + + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common/transform/typeconv" + "github.com/elastic/beats/v7/libbeat/statestore" +) + +// Publisher is used to publish an event and update the cursor in a single call to Publish. +// Inputs are allowed to pass `nil` as cursor state. In this case the state is not updated, but the +// event will still be published as is. +type Publisher interface { + Publish(event beat.Event, cursor interface{}) error +} + +// cursorPublisher implements the Publisher interface and used internally by the managedInput. +// When publishing an event with cursor state updates, the cursorPublisher +// updates the in memory state and create an updateOp that is used to schedule +// an update for the persistent store. The updateOp is run by the inputs ACK +// handler, persisting the pending update. +type cursorPublisher struct { + canceler input.Canceler + client beat.Client + cursor *Cursor +} + +// updateOp keeps track of pending updates that are not written to the persistent store yet. +// Update operations are ordered. The input manager guarantees that only one +// input can create update operation for a source, such that new input +// instances can add update operations to be executed after already pending +// update operations from older inputs instances that have been shutdown. +type updateOp struct { + store *store + resource *resource + + // state updates to persist + timestamp time.Time + ttl time.Duration + delta interface{} +} + +// Publish publishes an event. Publish returns false if the inputs cancellation context has been marked as done. +// If cursorUpdate is not nil, Publish updates the in memory state and create and updateOp for the pending update. +// It overwrite event.Private with the update operation, before finally sending the event. +// The ACK ordering in the publisher pipeline guarantees that update operations +// will be ACKed and executed in the correct order. +func (c *cursorPublisher) Publish(event beat.Event, cursorUpdate interface{}) error { + if cursorUpdate == nil { + return c.forward(event) + } + + op, err := createUpdateOp(c.cursor.store, c.cursor.resource, cursorUpdate) + if err != nil { + return err + } + + event.Private = op + return c.forward(event) +} + +func (c *cursorPublisher) forward(event beat.Event) error { + c.client.Publish(event) + if c.canceler == nil { + return nil + } + return c.canceler.Err() +} + +func createUpdateOp(store *store, resource *resource, updates interface{}) (*updateOp, error) { + ts := time.Now() + + resource.stateMutex.Lock() + defer resource.stateMutex.Unlock() + + cursor := resource.pendingCursor + if resource.activeCursorOperations == 0 { + var tmp interface{} + typeconv.Convert(&tmp, cursor) + resource.pendingCursor = tmp + cursor = tmp + } + if err := typeconv.Convert(&cursor, updates); err != nil { + return nil, err + } + resource.pendingCursor = cursor + + resource.Retain() + resource.activeCursorOperations++ + return &updateOp{ + resource: resource, + store: store, + timestamp: ts, + delta: updates, + }, nil +} + +// done releases resources held by the last N updateOps. +func (op *updateOp) done(n uint) { + op.resource.UpdatesReleaseN(n) + op.resource = nil + *op = updateOp{} +} + +// Execute updates the persistent store with the scheduled changes and releases the resource. +func (op *updateOp) Execute(n uint) { + resource := op.resource + defer op.done(n) + + resource.stateMutex.Lock() + defer resource.stateMutex.Unlock() + + resource.activeCursorOperations -= n + if resource.activeCursorOperations == 0 { + resource.cursor = resource.pendingCursor + resource.pendingCursor = nil + } else { + typeconv.Convert(&resource.cursor, op.delta) + } + + if resource.internalState.Updated.Before(op.timestamp) { + resource.internalState.Updated = op.timestamp + } + + err := op.store.persistentStore.Set(resource.key, resource.inSyncStateSnapshot()) + if err != nil { + if !statestore.IsClosed(err) { + op.store.log.Errorf("Failed to update state in the registry for '%v'", resource.key) + } + } else { + resource.internalInSync = true + resource.stored = true + } +} diff --git a/filebeat/input/filestream/internal/input-logfile/publish_test.go b/filebeat/input/filestream/internal/input-logfile/publish_test.go new file mode 100644 index 00000000000..ede25670a95 --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/publish_test.go @@ -0,0 +1,158 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/beat" + pubtest "github.com/elastic/beats/v7/libbeat/publisher/testing" +) + +func TestPublish(t *testing.T) { + t.Run("event with cursor state creates update operation", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + cursor := makeCursor(store, store.Get("test::key")) + + var actual beat.Event + client := &pubtest.FakeClient{ + PublishFunc: func(event beat.Event) { actual = event }, + } + publisher := cursorPublisher{nil, client, &cursor} + publisher.Publish(beat.Event{}, "test") + + require.NotNil(t, actual.Private) + }) + + t.Run("event without cursor creates no update operation", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + cursor := makeCursor(store, store.Get("test::key")) + + var actual beat.Event + client := &pubtest.FakeClient{ + PublishFunc: func(event beat.Event) { actual = event }, + } + publisher := cursorPublisher{nil, client, &cursor} + publisher.Publish(beat.Event{}, nil) + require.Nil(t, actual.Private) + }) + + t.Run("publish returns error if context has been cancelled", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.TODO()) + cancel() + + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + cursor := makeCursor(store, store.Get("test::key")) + + publisher := cursorPublisher{ctx, &pubtest.FakeClient{}, &cursor} + err := publisher.Publish(beat.Event{}, nil) + require.Equal(t, context.Canceled, err) + }) +} + +func TestOp_Execute(t *testing.T) { + t.Run("applying final op marks the key as finished", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + res := store.Get("test::key") + + // create op and release resource. The 'resource' must still be active + op := mustCreateUpdateOp(t, store, res, "test-updated-cursor-state") + res.Release() + require.False(t, res.Finished()) + + // this was the last op, the resource should become inactive + op.Execute(1) + require.True(t, res.Finished()) + + // validate state: + inSyncCursor := storeInSyncSnapshot(store)["test::key"].Cursor + inMemCursor := storeMemorySnapshot(store)["test::key"].Cursor + want := "test-updated-cursor-state" + assert.Equal(t, want, inSyncCursor) + assert.Equal(t, want, inMemCursor) + }) + + t.Run("acking multiple ops applies the latest update and marks key as finished", func(t *testing.T) { + // when acking N events, intermediate updates are dropped in favor of the latest update operation. + // This test checks that the resource is correctly marked as finished. + + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + res := store.Get("test::key") + + // create update operations and release resource. The 'resource' must still be active + mustCreateUpdateOp(t, store, res, "test-updated-cursor-state-dropped") + op := mustCreateUpdateOp(t, store, res, "test-updated-cursor-state-final") + res.Release() + require.False(t, res.Finished()) + + // this was the last op, the resource should become inactive + op.Execute(2) + require.True(t, res.Finished()) + + // validate state: + inSyncCursor := storeInSyncSnapshot(store)["test::key"].Cursor + inMemCursor := storeMemorySnapshot(store)["test::key"].Cursor + want := "test-updated-cursor-state-final" + assert.Equal(t, want, inSyncCursor) + assert.Equal(t, want, inMemCursor) + }) + + t.Run("ACK only subset of pending ops will only update up to ACKed state", func(t *testing.T) { + // when acking N events, intermediate updates are dropped in favor of the latest update operation. + // This test checks that the resource is correctly marked as finished. + + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + res := store.Get("test::key") + + // create update operations and release resource. The 'resource' must still be active + op1 := mustCreateUpdateOp(t, store, res, "test-updated-cursor-state-intermediate") + op2 := mustCreateUpdateOp(t, store, res, "test-updated-cursor-state-final") + res.Release() + require.False(t, res.Finished()) + + defer op2.done(1) // cleanup after test + + // this was the intermediate op, the resource should still be active + op1.Execute(1) + require.False(t, res.Finished()) + + // validate state (in memory state is always up to data to most recent update): + inSyncCursor := storeInSyncSnapshot(store)["test::key"].Cursor + inMemCursor := storeMemorySnapshot(store)["test::key"].Cursor + assert.Equal(t, "test-updated-cursor-state-intermediate", inSyncCursor) + assert.Equal(t, "test-updated-cursor-state-final", inMemCursor) + }) +} + +func mustCreateUpdateOp(t *testing.T, store *store, resource *resource, updates interface{}) *updateOp { + op, err := createUpdateOp(store, resource, updates) + if err != nil { + t.Fatalf("Failed to create update op: %v", err) + } + return op +} diff --git a/filebeat/input/filestream/internal/input-logfile/store.go b/filebeat/input/filestream/internal/input-logfile/store.go new file mode 100644 index 00000000000..8267565f551 --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/store.go @@ -0,0 +1,324 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "strings" + "sync" + "time" + + "github.com/elastic/beats/v7/libbeat/common/atomic" + "github.com/elastic/beats/v7/libbeat/common/cleanup" + "github.com/elastic/beats/v7/libbeat/common/transform/typeconv" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/statestore" + "github.com/elastic/go-concert" + "github.com/elastic/go-concert/unison" +) + +// store encapsulates the persistent store and the in memory state store, that +// can be ahead of the the persistent store. +// The store lifetime is managed by a reference counter. Once all owners (the +// session, and the resource cleaner) have dropped ownership, backing resources +// will be released and closed. +type store struct { + log *logp.Logger + refCount concert.RefCount + persistentStore *statestore.Store + ephemeralStore *states +} + +// states stores resource states in memory. When a cursor for an input is updated, +// it's state is updated first. The entry in the persistent store 'follows' the internal state. +// As long as a resources stored in states is not 'Finished', the in memory +// store is assumed to be ahead (in memory and persistent state are out of +// sync). +type states struct { + mu sync.Mutex + table map[string]*resource +} + +// resource holds the in memory state and keeps track of pending updates and inputs collecting +// event for the resource its key. +// A resource is assumed active for as long as at least one input has (or tries +// to) acuired the lock, and as long as there are pending updateOp instances in +// the pipeline not ACKed yet. The key can not gc'ed by the cleaner, as long as the resource is active. +// +// State chagnes and writes to the persistent store are protected using the +// stateMutex, to ensure full consistency between direct writes and updates +// after ACK. +type resource struct { + // pending counts the number of Inputs and outstanding registry updates. + // as long as pending is > 0 the resource is in used and must not be garbage collected. + pending atomic.Uint64 + + // lock guarantees only one input create updates for this entry + lock unison.Mutex + + // key of the resource as used for the registry. + key string + + // stateMutex is used to lock the resource when it is update/read from + // multiple go-routines like the ACK handler or the input publishing an + // event. + // stateMutex is used to access the fields 'stored', 'state' and 'internalInSync' + stateMutex sync.Mutex + + // stored indicates that the state is available in the registry file. It is false for new entries. + stored bool + + // internalInSync is true if all 'Internal' metadata like TTL or update timestamp are in sync. + // Normally resources are added when being created. But if operations failed we will retry inserting + // them on each update operation until we eventually succeeded + internalInSync bool + + activeCursorOperations uint + internalState stateInternal + + // cursor states. The cursor holds the state as it is currently known to the + // persistent store, while pendingCursor contains the most recent update + // (in-memory state), that still needs to be synced to the persistent store. + // The pendingCursor is nil if there are no pending updates. + // When processing update operations on ACKs, the state is applied to cursor + // first, which is finally written to the persistent store. This ensures that + // we always write the complete state of the key/value pair. + cursor interface{} + pendingCursor interface{} +} + +type ( + // state represents the full document as it is stored in the registry. + // + // The TTL and Update fields are for internal use only. + // + // The `Cursor` namespace is used to store the cursor information that are + // required to continue processing from the last known position. Cursor + // updates in the registry file are only executed after events have been + // ACKed by the outputs. Therefore the cursor MUST NOT include any + // information that are require to identify/track the source we are + // collecting from. + state struct { + TTL time.Duration + Updated time.Time + Cursor interface{} + } + + stateInternal struct { + TTL time.Duration + Updated time.Time + } +) + +// hook into store close for testing purposes +var closeStore = (*store).close + +func openStore(log *logp.Logger, statestore StateStore, prefix string) (*store, error) { + ok := false + + persistentStore, err := statestore.Access() + if err != nil { + return nil, err + } + defer cleanup.IfNot(&ok, func() { persistentStore.Close() }) + + states, err := readStates(log, persistentStore, prefix) + if err != nil { + return nil, err + } + + ok = true + return &store{ + log: log, + persistentStore: persistentStore, + ephemeralStore: states, + }, nil +} + +func (s *store) Retain() { s.refCount.Retain() } +func (s *store) Release() { + if s.refCount.Release() { + closeStore(s) + } +} + +func (s *store) close() { + if err := s.persistentStore.Close(); err != nil { + s.log.Errorf("Closing registry store did report an error: %+v", err) + } +} + +// Get returns the resource for the key. +// A new shared resource is generated if the key is not known. The generated +// resource is not synced to disk yet. +func (s *store) Get(key string) *resource { + return s.ephemeralStore.Find(key, true) +} + +// UpdateTTL updates the time-to-live of a resource. Inactive resources with expired TTL are subject to removal. +// The TTL value is part of the internal state, and will be written immediately to the persistent store. +// On update the resource its `cursor` state is used, to keep the cursor state in sync with the current known +// on disk store state. +func (s *store) UpdateTTL(resource *resource, ttl time.Duration) { + resource.stateMutex.Lock() + defer resource.stateMutex.Unlock() + if resource.stored && resource.internalState.TTL == ttl { + return + } + + resource.internalState.TTL = ttl + if resource.internalState.Updated.IsZero() { + resource.internalState.Updated = time.Now() + } + + err := s.persistentStore.Set(resource.key, state{ + TTL: resource.internalState.TTL, + Updated: resource.internalState.Updated, + Cursor: resource.cursor, + }) + if err != nil { + s.log.Errorf("Failed to update resource management fields for '%v'", resource.key) + resource.internalInSync = false + } else { + resource.stored = true + resource.internalInSync = true + } +} + +// Find returns the resource for a given key. If the key is unknown and create is set to false nil will be returned. +// The resource returned by Find is marked as active. (*resource).Release must be called to mark the resource as inactive again. +func (s *states) Find(key string, create bool) *resource { + s.mu.Lock() + defer s.mu.Unlock() + + if resource := s.table[key]; resource != nil { + resource.Retain() + return resource + } + + if !create { + return nil + } + + // resource is owned by table(session) and input that uses the resource. + resource := &resource{ + stored: false, + key: key, + lock: unison.MakeMutex(), + } + s.table[key] = resource + resource.Retain() + return resource +} + +// IsNew returns true if we have no state recorded for the current resource. +func (r *resource) IsNew() bool { + r.stateMutex.Lock() + defer r.stateMutex.Unlock() + return r.pendingCursor == nil && r.cursor == nil +} + +// Retain is used to indicate that 'resource' gets an additional 'owner'. +// Owners of an resource can be active inputs or pending update operations +// not yet written to disk. +func (r *resource) Retain() { r.pending.Inc() } + +// Release reduced the owner ship counter of the resource. +func (r *resource) Release() { r.pending.Dec() } + +// UpdatesReleaseN is used to release ownership of N pending update operations. +func (r *resource) UpdatesReleaseN(n uint) { + r.pending.Sub(uint64(n)) +} + +// Finished returns true if the resource is not in use and if there are no pending updates +// that still need to be written to the registry. +func (r *resource) Finished() bool { return r.pending.Load() == 0 } + +// UnpackCursor deserializes the in memory state. +func (r *resource) UnpackCursor(to interface{}) error { + r.stateMutex.Lock() + defer r.stateMutex.Unlock() + if r.activeCursorOperations == 0 { + return typeconv.Convert(to, r.cursor) + } + return typeconv.Convert(to, r.pendingCursor) +} + +// syncStateSnapshot returns the current insync state based on already ACKed update operations. +func (r *resource) inSyncStateSnapshot() state { + return state{ + TTL: r.internalState.TTL, + Updated: r.internalState.Updated, + Cursor: r.cursor, + } +} + +// stateSnapshot returns the current in memory state, that already contains state updates +// not yet ACKed. +func (r *resource) stateSnapshot() state { + cursor := r.pendingCursor + if r.activeCursorOperations == 0 { + cursor = r.cursor + } + + return state{ + TTL: r.internalState.TTL, + Updated: r.internalState.Updated, + Cursor: cursor, + } +} + +func readStates(log *logp.Logger, store *statestore.Store, prefix string) (*states, error) { + keyPrefix := prefix + "::" + states := &states{ + table: map[string]*resource{}, + } + + err := store.Each(func(key string, dec statestore.ValueDecoder) (bool, error) { + if !strings.HasPrefix(string(key), keyPrefix) { + return true, nil + } + + var st state + if err := dec.Decode(&st); err != nil { + log.Errorf("Failed to read regisry state for '%v', cursor state will be ignored. Error was: %+v", + key, err) + return true, nil + } + + resource := &resource{ + key: key, + stored: true, + lock: unison.MakeMutex(), + internalInSync: true, + internalState: stateInternal{ + TTL: st.TTL, + Updated: st.Updated, + }, + cursor: st.Cursor, + } + states.table[resource.key] = resource + + return true, nil + }) + + if err != nil { + return nil, err + } + return states, nil +} diff --git a/filebeat/input/filestream/internal/input-logfile/store_test.go b/filebeat/input/filestream/internal/input-logfile/store_test.go new file mode 100644 index 00000000000..71ea41298b2 --- /dev/null +++ b/filebeat/input/filestream/internal/input-logfile/store_test.go @@ -0,0 +1,351 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package input_logfile + +import ( + "errors" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/statestore" + "github.com/elastic/beats/v7/libbeat/statestore/storetest" +) + +type testStateStore struct { + Store *statestore.Store + GCPeriod time.Duration +} + +func TestStore_OpenClose(t *testing.T) { + t.Run("releasing store closes", func(t *testing.T) { + var closed bool + cleanup := closeStoreWith(func(s *store) { + closed = true + s.close() + }) + defer cleanup() + + store := testOpenStore(t, "test", nil) + store.Release() + + require.True(t, closed) + }) + + t.Run("fail if persistent store can not be accessed", func(t *testing.T) { + _, err := openStore(logp.NewLogger("test"), testStateStore{}, "test") + require.Error(t, err) + }) + + t.Run("load from empty", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + require.Equal(t, 0, len(storeMemorySnapshot(store))) + require.Equal(t, 0, len(storeInSyncSnapshot(store))) + }) + + t.Run("already available state is loaded", func(t *testing.T) { + states := map[string]state{ + "test::key0": {Cursor: "1"}, + "test::key1": {Cursor: "2"}, + } + + store := testOpenStore(t, "test", createSampleStore(t, states)) + defer store.Release() + + checkEqualStoreState(t, states, storeMemorySnapshot(store)) + checkEqualStoreState(t, states, storeInSyncSnapshot(store)) + }) + + t.Run("ignore entries with wrong index on open", func(t *testing.T) { + states := map[string]state{ + "test::key0": {Cursor: "1"}, + "other::key": {Cursor: "2"}, + } + + store := testOpenStore(t, "test", createSampleStore(t, states)) + defer store.Release() + + want := map[string]state{ + "test::key0": {Cursor: "1"}, + } + checkEqualStoreState(t, want, storeMemorySnapshot(store)) + checkEqualStoreState(t, want, storeInSyncSnapshot(store)) + }) +} + +func TestStore_Get(t *testing.T) { + t.Run("find existing resource", func(t *testing.T) { + cursorState := state{Cursor: "1"} + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key0": cursorState, + })) + defer store.Release() + + res := store.Get("test::key0") + require.NotNil(t, res) + defer res.Release() + + // check in memory state matches matches original persistent state + require.Equal(t, cursorState, res.stateSnapshot()) + // check assumed in-sync state matches matches original persistent state + require.Equal(t, cursorState, res.inSyncStateSnapshot()) + }) + + t.Run("access unknown resource", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + + res := store.Get("test::key") + require.NotNil(t, res) + defer res.Release() + + // new resource has empty state + require.Equal(t, state{}, res.stateSnapshot()) + }) + + t.Run("same resource is returned", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + + res1 := store.Get("test::key") + require.NotNil(t, res1) + defer res1.Release() + + res2 := store.Get("test::key") + require.NotNil(t, res2) + defer res2.Release() + + assert.Equal(t, res1, res2) + }) +} + +func TestStore_UpdateTTL(t *testing.T) { + t.Run("add TTL for new entry to store", func(t *testing.T) { + // when creating a resource we set the TTL and insert a new key value pair without cursor value into the store: + store := testOpenStore(t, "test", createSampleStore(t, nil)) + defer store.Release() + + res := store.Get("test::key") + store.UpdateTTL(res, 60*time.Second) + + want := map[string]state{ + "test::key": { + TTL: 60 * time.Second, + Updated: res.internalState.Updated, + Cursor: nil, + }, + } + + checkEqualStoreState(t, want, storeMemorySnapshot(store)) + checkEqualStoreState(t, want, storeInSyncSnapshot(store)) + }) + + t.Run("update TTL for in-sync resource does not overwrite state", func(t *testing.T) { + store := testOpenStore(t, "test", createSampleStore(t, map[string]state{ + "test::key": { + TTL: 1 * time.Second, + Cursor: "test", + }, + })) + defer store.Release() + + res := store.Get("test::key") + store.UpdateTTL(res, 60*time.Second) + want := map[string]state{ + "test::key": { + Updated: res.internalState.Updated, + TTL: 60 * time.Second, + Cursor: "test", + }, + } + + checkEqualStoreState(t, want, storeMemorySnapshot(store)) + checkEqualStoreState(t, want, storeInSyncSnapshot(store)) + }) + + t.Run("update TTL for resource with pending updates", func(t *testing.T) { + // This test updates the resource TTL while update operations are still + // pending, but not synced to the persistent store yet. + // UpdateTTL changes the state in the persistent store immediately, and must therefore + // serialize the old in-sync state with update meta-data. + + // create store + backend := createSampleStore(t, map[string]state{ + "test::key": { + TTL: 1 * time.Second, + Cursor: "test", + }, + }) + store := testOpenStore(t, "test", backend) + defer store.Release() + + // create pending update operation + res := store.Get("test::key") + op, err := createUpdateOp(store, res, "test-state-update") + require.NoError(t, err) + defer op.done(1) + + // Update key/value pair TTL. This will update the internal state in the + // persistent store only, not modifying the old cursor state yet. + store.UpdateTTL(res, 60*time.Second) + + // validate + wantMemoryState := state{ + Updated: res.internalState.Updated, + TTL: 60 * time.Second, + Cursor: "test-state-update", + } + wantInSyncState := state{ + Updated: res.internalState.Updated, + TTL: 60 * time.Second, + Cursor: "test", + } + + checkEqualStoreState(t, map[string]state{"test::key": wantMemoryState}, storeMemorySnapshot(store)) + checkEqualStoreState(t, map[string]state{"test::key": wantInSyncState}, storeInSyncSnapshot(store)) + checkEqualStoreState(t, map[string]state{"test::key": wantInSyncState}, backend.snapshot()) + }) +} + +func closeStoreWith(fn func(s *store)) func() { + old := closeStore + closeStore = fn + return func() { + closeStore = old + } +} + +func testOpenStore(t *testing.T, prefix string, persistentStore StateStore) *store { + if persistentStore == nil { + persistentStore = createSampleStore(t, nil) + } + + store, err := openStore(logp.NewLogger("test"), persistentStore, prefix) + if err != nil { + t.Fatalf("failed to open the store") + } + return store +} + +func createSampleStore(t *testing.T, data map[string]state) testStateStore { + storeReg := statestore.NewRegistry(storetest.NewMemoryStoreBackend()) + store, err := storeReg.Get("test") + if err != nil { + t.Fatalf("Failed to access store: %v", err) + } + + for k, v := range data { + if err := store.Set(k, v); err != nil { + t.Fatalf("Error when populating the sample store: %v", err) + } + } + + return testStateStore{ + Store: store, + } +} + +func (ts testStateStore) WithGCPeriod(d time.Duration) testStateStore { ts.GCPeriod = d; return ts } +func (ts testStateStore) CleanupInterval() time.Duration { return ts.GCPeriod } +func (ts testStateStore) Access() (*statestore.Store, error) { + if ts.Store == nil { + return nil, errors.New("no store configured") + } + return ts.Store, nil +} + +// snapshot copies all key/value pairs from the persistent store into a table for inspection. +func (ts testStateStore) snapshot() map[string]state { + states := map[string]state{} + err := ts.Store.Each(func(key string, dec statestore.ValueDecoder) (bool, error) { + var st state + if err := dec.Decode(&st); err != nil { + return false, err + } + states[key] = st + return true, nil + }) + + if err != nil { + panic("unexpected decode error from persistent test store") + } + return states +} + +// storeMemorySnapshot copies all key/value pairs into a table for inspection. +// The state returned reflects the in memory state, which can be ahead of the +// persistent state. +// +// Note: The state returned by storeMemorySnapshot is always ahead of the state returned by storeInSyncSnapshot. +// All key value pairs are fully in-sync, if both snapshot functions return the same state. +func storeMemorySnapshot(store *store) map[string]state { + store.ephemeralStore.mu.Lock() + defer store.ephemeralStore.mu.Unlock() + + states := map[string]state{} + for k, res := range store.ephemeralStore.table { + states[k] = res.stateSnapshot() + } + return states +} + +// storeInSyncSnapshot copies all key/value pairs into the table for inspection. +// The state returned reflects the current state that the in-memory tables assumed to be +// written to the persistent store already. + +// Note: The state returned by storeMemorySnapshot is always ahead of the state returned by storeInSyncSnapshot. +// All key value pairs are fully in-sync, if both snapshot functions return the same state. +func storeInSyncSnapshot(store *store) map[string]state { + store.ephemeralStore.mu.Lock() + defer store.ephemeralStore.mu.Unlock() + + states := map[string]state{} + for k, res := range store.ephemeralStore.table { + states[k] = res.inSyncStateSnapshot() + } + return states +} + +// checkEqualStoreState compares 2 store snapshot tables for equality. The test +// fails with Errorf if the state differ. +// +// Note: testify is too strict when comparing timestamp, better use checkEqualStoreState. +func checkEqualStoreState(t *testing.T, want, got map[string]state) bool { + if d := cmp.Diff(want, got); d != "" { + t.Errorf("store state mismatch (-want +got):\n%s", d) + return false + } + return true +} + +// requireEqualStoreState compares 2 store snapshot tables for equality. The test +// fails with Fatalf if the state differ. +// +// Note: testify is too strict when comparing timestamp, better use checkEqualStoreState. +func requireEqualStoreState(t *testing.T, want, got map[string]state) bool { + if d := cmp.Diff(want, got); d != "" { + t.Fatalf("store state mismatch (-want +got):\n%s", d) + return false + } + return true +} diff --git a/filebeat/input/filestream/prospector.go b/filebeat/input/filestream/prospector.go new file mode 100644 index 00000000000..257574b9ca1 --- /dev/null +++ b/filebeat/input/filestream/prospector.go @@ -0,0 +1,38 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package filestream + +import ( + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/statestore" +) + +// fileProspector implements the Prospector interface. +// It contains a file scanner which returns file system events. +// The FS events then trigger either new Harvester runs or updates +// the statestore. +type fileProspector struct{} + +func (p *fileProspector) Run(ctx input.Context, s *statestore.Store, hg *loginp.HarvesterGroup) { + panic("TODO: implement me") +} + +func (p *fileProspector) Test() error { + panic("TODO: implement me") +} From b2244e1b2473b862de540720e28c4747a7ab3cca Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 1 Oct 2020 09:43:21 +0100 Subject: [PATCH 039/156] [JJBB] Use reference repo for fast checkouts (#21410) --- .ci/jobs/beats.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/jobs/beats.yml b/.ci/jobs/beats.yml index 3e4c8e50980..6f59a9bcdf8 100644 --- a/.ci/jobs/beats.yml +++ b/.ci/jobs/beats.yml @@ -53,6 +53,7 @@ recursive: true parent-credentials: true timeout: 100 + reference-repo: /var/lib/jenkins/.git-references/beats.git timeout: '15' use-author: true wipe-workspace: true From 514809a13cd078be71c0bccac03dccc0cc81f0e9 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 1 Oct 2020 12:03:48 +0100 Subject: [PATCH 040/156] Revert "[JJBB] Set shallow cloning to 10 (#21409)" (#21447) This reverts commit cadd5ff70e679f76e41f32daa1d56734ddf3ae8c. --- .ci/jobs/apm-beats-update.yml | 2 +- .ci/jobs/beats-tester.yml | 2 +- .ci/jobs/beats-windows-mbp.yml | 2 +- .ci/jobs/beats.yml | 2 +- .ci/jobs/golang-crossbuild-mbp.yml | 2 +- .ci/jobs/packaging.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.ci/jobs/apm-beats-update.yml b/.ci/jobs/apm-beats-update.yml index 2ae688ffab7..8bdc322f65a 100644 --- a/.ci/jobs/apm-beats-update.yml +++ b/.ci/jobs/apm-beats-update.yml @@ -48,7 +48,7 @@ before: true prune: true shallow-clone: true - depth: 10 + depth: 3 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-tester.yml b/.ci/jobs/beats-tester.yml index 808123a225e..522abfa5e5c 100644 --- a/.ci/jobs/beats-tester.yml +++ b/.ci/jobs/beats-tester.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 10 + depth: 3 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-windows-mbp.yml b/.ci/jobs/beats-windows-mbp.yml index 7ea26c9ba18..64efa009979 100644 --- a/.ci/jobs/beats-windows-mbp.yml +++ b/.ci/jobs/beats-windows-mbp.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 10 + depth: 4 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats.yml b/.ci/jobs/beats.yml index 6f59a9bcdf8..b075d8bbdf2 100644 --- a/.ci/jobs/beats.yml +++ b/.ci/jobs/beats.yml @@ -46,7 +46,7 @@ before: true prune: true shallow-clone: true - depth: 10 + depth: 3 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/golang-crossbuild-mbp.yml b/.ci/jobs/golang-crossbuild-mbp.yml index 45175d169f6..46303790610 100644 --- a/.ci/jobs/golang-crossbuild-mbp.yml +++ b/.ci/jobs/golang-crossbuild-mbp.yml @@ -31,7 +31,7 @@ before: true prune: true shallow-clone: true - depth: 10 + depth: 4 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/packaging.yml b/.ci/jobs/packaging.yml index fd6fb9f90c6..0dce4d4672b 100644 --- a/.ci/jobs/packaging.yml +++ b/.ci/jobs/packaging.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 10 + depth: 3 do-not-fetch-tags: true submodule: disable: false From 075696e6a142762600cd74a1aa1daa749f8af41e Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Thu, 1 Oct 2020 18:04:11 +0200 Subject: [PATCH 041/156] [Ingest Manager] Send snapshot flag together with metadata (#21285) [Ingest Manager] Send snapshot flag together with metadata (#21285) --- .../agent/application/info/agent_metadata.go | 16 +++++++-- .../pkg/agent/application/upgrade/upgrade.go | 36 +++++++++---------- x-pack/elastic-agent/pkg/release/upgrade.go | 4 +-- x-pack/elastic-agent/pkg/release/version.go | 2 +- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/x-pack/elastic-agent/pkg/agent/application/info/agent_metadata.go b/x-pack/elastic-agent/pkg/agent/application/info/agent_metadata.go index c98f9b8e015..c5712646cfb 100644 --- a/x-pack/elastic-agent/pkg/agent/application/info/agent_metadata.go +++ b/x-pack/elastic-agent/pkg/agent/application/info/agent_metadata.go @@ -10,6 +10,7 @@ import ( "runtime" "strings" + "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/install" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/release" "github.com/elastic/go-sysinfo" "github.com/elastic/go-sysinfo/types" @@ -33,6 +34,12 @@ type AgentECSMeta struct { ID string `json:"id"` // Version specifies current version of an agent. Version string `json:"version"` + // Snapshot is a flag specifying that the agent used is a snapshot build. + Snapshot bool `json:"snapshot"` + // BuildOriginal is an extended build information for the agent. + BuildOriginal string `json:"build.original"` + // Upgradeable is a flag specifying if it is possible for agent to be upgraded. + Upgradeable bool `json:"upgradeable"` } // SystemECSMeta is a collection of operating system metadata in ECS compliant object form. @@ -126,8 +133,13 @@ func (i *AgentInfo) ECSMetadata() (*ECSMeta, error) { return &ECSMeta{ Elastic: &ElasticECSMeta{ Agent: &AgentECSMeta{ - ID: i.agentID, - Version: release.Version(), + ID: i.agentID, + Version: release.Version(), + Snapshot: release.Snapshot(), + BuildOriginal: release.Info().String(), + // only upgradeable if running from Agent installer and running under the + // control of the system supervisor (or built specifically with upgrading enabled) + Upgradeable: release.Upgradeable() || (install.RunningInstalled() && install.RunningUnderSupervisor()), }, }, Host: &HostECSMeta{ diff --git a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go index de3a577281d..cac36ef7922 100644 --- a/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go +++ b/x-pack/elastic-agent/pkg/agent/application/upgrade/upgrade.go @@ -33,12 +33,12 @@ const ( // Upgrader performs an upgrade type Upgrader struct { - settings *artifact.Config - log *logger.Logger - closers []context.CancelFunc - reexec reexecManager - acker acker - upgradable bool + settings *artifact.Config + log *logger.Logger + closers []context.CancelFunc + reexec reexecManager + acker acker + upgradeable bool } type reexecManager interface { @@ -53,23 +53,23 @@ type acker interface { // NewUpgrader creates an upgrader which is capable of performing upgrade operation func NewUpgrader(settings *artifact.Config, log *logger.Logger, closers []context.CancelFunc, reexec reexecManager, a acker) *Upgrader { return &Upgrader{ - settings: settings, - log: log, - closers: closers, - reexec: reexec, - acker: a, - upgradable: getUpgradable(), + settings: settings, + log: log, + closers: closers, + reexec: reexec, + acker: a, + upgradeable: getUpgradable(), } } -// Upgradable returns true if the Elastic Agent can be upgraded. -func (u *Upgrader) Upgradable() bool { - return u.upgradable +// Upgradeable returns true if the Elastic Agent can be upgraded. +func (u *Upgrader) Upgradeable() bool { + return u.upgradeable } // Upgrade upgrades running agent func (u *Upgrader) Upgrade(ctx context.Context, a *fleetapi.ActionUpgrade) error { - if !u.upgradable { + if !u.upgradeable { return fmt.Errorf( "cannot be upgraded; must be installed with install sub-command and " + "running under control of the systems supervisor") @@ -164,9 +164,9 @@ func rollbackInstall(hash string) { } func getUpgradable() bool { - // only upgradable if running from Agent installer and running under the + // only upgradeable if running from Agent installer and running under the // control of the system supervisor (or built specifically with upgrading enabled) - return release.Upgradable() || (install.RunningInstalled() && install.RunningUnderSupervisor()) + return release.Upgradeable() || (install.RunningInstalled() && install.RunningUnderSupervisor()) } func copyActionStore(newHash string) error { diff --git a/x-pack/elastic-agent/pkg/release/upgrade.go b/x-pack/elastic-agent/pkg/release/upgrade.go index ac1e8552dd2..2e63eb47ad5 100644 --- a/x-pack/elastic-agent/pkg/release/upgrade.go +++ b/x-pack/elastic-agent/pkg/release/upgrade.go @@ -4,7 +4,7 @@ package release -// Upgradable return true when release is built specifically for upgrading. -func Upgradable() bool { +// Upgradeable return true when release is built specifically for upgrading. +func Upgradeable() bool { return allowUpgrade == "true" } diff --git a/x-pack/elastic-agent/pkg/release/version.go b/x-pack/elastic-agent/pkg/release/version.go index dae609a6733..05f0063afdf 100644 --- a/x-pack/elastic-agent/pkg/release/version.go +++ b/x-pack/elastic-agent/pkg/release/version.go @@ -76,7 +76,7 @@ func Info() VersionInfo { } // String returns the string format for the version information. -func (v *VersionInfo) String() string { +func (v VersionInfo) String() string { var sb strings.Builder sb.WriteString(v.Version) From 8e9298e222f234f158258e1a0b02d712fd6ff954 Mon Sep 17 00:00:00 2001 From: DeDe Morton Date: Thu, 1 Oct 2020 11:59:55 -0700 Subject: [PATCH 042/156] Edit SQL module docs and fix broken doc structure (#21233) * Edit SQL module docs and fix broken doc structure * Apply suggestions from code review Co-authored-by: Brandon Morelli * Run make update Co-authored-by: Brandon Morelli --- metricbeat/docs/modules/sql.asciidoc | 102 +++++++++++------- .../metricbeat/module/sql/_meta/docs.asciidoc | 102 +++++++++++------- .../module/sql/query/_meta/docs.asciidoc | 6 +- 3 files changed, 127 insertions(+), 83 deletions(-) diff --git a/metricbeat/docs/modules/sql.asciidoc b/metricbeat/docs/modules/sql.asciidoc index 69726a1fe7d..6e944cf5c13 100644 --- a/metricbeat/docs/modules/sql.asciidoc +++ b/metricbeat/docs/modules/sql.asciidoc @@ -8,24 +8,45 @@ This file is generated! See scripts/mage/docs_collector.go beta[] -The SQL module allows to execute custom queries against an SQL database and store the results to Elasticsearch. +The SQL module allows you to execute custom queries against an SQL database and +store the results in {es}. -The currently supported databases are the ones already included in Metricbeat, which are: -- PostgreSQL -- MySQL -- Oracle -- Microsoft SQL -- CockroachDB +This module supports the databases that you can monitor with {metricbeat}, +including: -== Quickstart +* PostgreSQL +* MySQL +* Oracle +* Microsoft SQL +* CockroachDB -You can setup the module by activating it first running +To enable the module, run: - metricbeat module enable sql +[source,shell] +---- +metricbeat module enable sql +---- + +After enabling the module, open `modules.d/sql.yml` and set the required +fields: + +`driver`:: The driver can be any driver that has a {metricbeat} module, such as +`mssql` or `postgres`. +`sql_query`:: The single query you want to run. +`sql_response_format`:: Either `variables` or `table`: +`variables`::: Expects a two-column table that looks like a key/value result. +The left column is considered a key and the right column the value. This mode +generates a single event on each fetch operation. +`table`::: Expects any number of columns. This mode generates a single event for +each row. + +[float] +=== Example: capture Innodb-related metrics -Once it is activated, open `modules.d/sql.yml` and fill the required fields. This is an example that captures Innodb related metrics from the result of the query `SHOW GLOBAL STATUS LIKE 'Innodb_system%'` in a MySQL database: +This `sql.yml` configuration shows how to capture Innodb-related metrics that +result from the query `SHOW GLOBAL STATUS LIKE 'Innodb_system%'` in a MySQL +database: -.sql.yml [source,yaml] ---- - module: sql @@ -39,7 +60,8 @@ Once it is activated, open `modules.d/sql.yml` and fill the required fields. Thi sql_response_format: variables ---- -.SHOW GLOBAL STATUS LIKE 'Innodb_system%' +The `SHOW GLOBAL STATUS` query results in this table: + |==== |Variable_name|Value @@ -49,18 +71,11 @@ Once it is activated, open `modules.d/sql.yml` and fill the required fields. Thi |Innodb_system_rows_updated|315 |==== +Results are grouped by type in the result event for convenient mapping in +{es}. For example, `strings` values are grouped into `sql.strings`, `numeric` +into `sql.numeric`, and so on. -Keys in the YAML are defined as follow: - -- `driver`: The drivers currently supported are those which already have a Metricbeat module like `mssql` or `postgres`. -- `sql_query`: Is the single query you want to run -- `sql_response_format`: You have 2 options here: - - `variables`: Expects a table which looks like a key/value result. With 2 columns, left column will be considered a key and the right column the value. This mode generates a single event on each fetch operation. - - `table`: Table mode can contain any number of columns and a single event will be generated for each row. - -Results will be grouped by type in the result event for convenient mapping in Elasticsearch. So `strings` values will be grouped into `sql.strings`, `numeric` into `sql.numeric` and so on and so forth. - -The event generated with the example above looks like this: +The example shown earlier generates this event: [source,json] ---- @@ -112,9 +127,13 @@ The event generated with the example above looks like this: } ---- -In this example, we are querying PostgreSQL and generate a "table" result, hence a single event for each row returned +[float] +=== Example: query PostgreSQL and generate a "table" result + +This `sql.yml` configuration shows how to query PostgreSQL and generate +a "table" result. This configuration generates a single event for each row +returned: -.sql.yml [source,yaml] ---- - module: sql @@ -128,7 +147,8 @@ In this example, we are querying PostgreSQL and generate a "table" result, hence sql_response_format: table ---- -.SELECT datid, datname, blks_read, blks_hit, tup_returned, tup_fetched, stats_reset FROM pg_stat_database +The SELECT query results in this table: + |==== |datid|datname|blks_read|blks_hit|tup_returned|tup_fetched|stats_reset @@ -137,7 +157,8 @@ In this example, we are querying PostgreSQL and generate a "table" result, hence |13407|template0|0|0|0|0| |==== -With 3 rows on the table, three events will be generated with the contents of each row. As an example, below you can see the event created for the first row: +Because the table contains three rows, three events are generated, one event +for each row. For example, this event is created for the first row: [source,json] ---- @@ -194,14 +215,11 @@ With 3 rows on the table, three events will be generated with the contents of ea } ---- +[float] +=== Example: get the buffer catch hit ratio in Oracle -== More examples - -=== Oracle: - -Get the buffer cache hit ratio: +This `sql.yml` configuration shows how to get the buffer cache hit ratio: -.sql.yml [source,yaml] ---- - module: sql @@ -215,6 +233,7 @@ Get the buffer cache hit ratio: sql_response_format: table ---- +The example generates this event: [source,json] ---- @@ -269,11 +288,11 @@ Get the buffer cache hit ratio: } ---- -=== MSSQL +[float] +=== Example: get the buffer cache hit ratio for MSSQL -Get the buffer cache hit ratio: +This `sql.yml` configuration gets the buffer cache hit ratio: -.sql.yml [source,yaml] ---- - module: sql @@ -287,6 +306,8 @@ Get the buffer cache hit ratio: sql_response_format: table ---- +The example generates this event: + [source,json] ---- { @@ -338,11 +359,12 @@ Get the buffer cache hit ratio: } ---- -=== Two or more queries +[float] +=== Example: launch two or more queries -If you want to launch two or more queries, you need to specify them with their full configuration for each query. For example: +To launch two or more queries, specify the full configuration for each query. +For example: -.sql.yml [source,yaml] ---- - module: sql diff --git a/x-pack/metricbeat/module/sql/_meta/docs.asciidoc b/x-pack/metricbeat/module/sql/_meta/docs.asciidoc index 31751f264ec..d445d62e305 100644 --- a/x-pack/metricbeat/module/sql/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/sql/_meta/docs.asciidoc @@ -1,21 +1,42 @@ -The SQL module allows to execute custom queries against an SQL database and store the results to Elasticsearch. +The SQL module allows you to execute custom queries against an SQL database and +store the results in {es}. -The currently supported databases are the ones already included in Metricbeat, which are: -- PostgreSQL -- MySQL -- Oracle -- Microsoft SQL -- CockroachDB +This module supports the databases that you can monitor with {metricbeat}, +including: -== Quickstart +* PostgreSQL +* MySQL +* Oracle +* Microsoft SQL +* CockroachDB -You can setup the module by activating it first running +To enable the module, run: - metricbeat module enable sql +[source,shell] +---- +metricbeat module enable sql +---- + +After enabling the module, open `modules.d/sql.yml` and set the required +fields: + +`driver`:: The driver can be any driver that has a {metricbeat} module, such as +`mssql` or `postgres`. +`sql_query`:: The single query you want to run. +`sql_response_format`:: Either `variables` or `table`: +`variables`::: Expects a two-column table that looks like a key/value result. +The left column is considered a key and the right column the value. This mode +generates a single event on each fetch operation. +`table`::: Expects any number of columns. This mode generates a single event for +each row. -Once it is activated, open `modules.d/sql.yml` and fill the required fields. This is an example that captures Innodb related metrics from the result of the query `SHOW GLOBAL STATUS LIKE 'Innodb_system%'` in a MySQL database: +[float] +=== Example: capture Innodb-related metrics + +This `sql.yml` configuration shows how to capture Innodb-related metrics that +result from the query `SHOW GLOBAL STATUS LIKE 'Innodb_system%'` in a MySQL +database: -.sql.yml [source,yaml] ---- - module: sql @@ -29,7 +50,8 @@ Once it is activated, open `modules.d/sql.yml` and fill the required fields. Thi sql_response_format: variables ---- -.SHOW GLOBAL STATUS LIKE 'Innodb_system%' +The `SHOW GLOBAL STATUS` query results in this table: + |==== |Variable_name|Value @@ -39,18 +61,11 @@ Once it is activated, open `modules.d/sql.yml` and fill the required fields. Thi |Innodb_system_rows_updated|315 |==== +Results are grouped by type in the result event for convenient mapping in +{es}. For example, `strings` values are grouped into `sql.strings`, `numeric` +into `sql.numeric`, and so on. -Keys in the YAML are defined as follow: - -- `driver`: The drivers currently supported are those which already have a Metricbeat module like `mssql` or `postgres`. -- `sql_query`: Is the single query you want to run -- `sql_response_format`: You have 2 options here: - - `variables`: Expects a table which looks like a key/value result. With 2 columns, left column will be considered a key and the right column the value. This mode generates a single event on each fetch operation. - - `table`: Table mode can contain any number of columns and a single event will be generated for each row. - -Results will be grouped by type in the result event for convenient mapping in Elasticsearch. So `strings` values will be grouped into `sql.strings`, `numeric` into `sql.numeric` and so on and so forth. - -The event generated with the example above looks like this: +The example shown earlier generates this event: [source,json] ---- @@ -102,9 +117,13 @@ The event generated with the example above looks like this: } ---- -In this example, we are querying PostgreSQL and generate a "table" result, hence a single event for each row returned +[float] +=== Example: query PostgreSQL and generate a "table" result + +This `sql.yml` configuration shows how to query PostgreSQL and generate +a "table" result. This configuration generates a single event for each row +returned: -.sql.yml [source,yaml] ---- - module: sql @@ -118,7 +137,8 @@ In this example, we are querying PostgreSQL and generate a "table" result, hence sql_response_format: table ---- -.SELECT datid, datname, blks_read, blks_hit, tup_returned, tup_fetched, stats_reset FROM pg_stat_database +The SELECT query results in this table: + |==== |datid|datname|blks_read|blks_hit|tup_returned|tup_fetched|stats_reset @@ -127,7 +147,8 @@ In this example, we are querying PostgreSQL and generate a "table" result, hence |13407|template0|0|0|0|0| |==== -With 3 rows on the table, three events will be generated with the contents of each row. As an example, below you can see the event created for the first row: +Because the table contains three rows, three events are generated, one event +for each row. For example, this event is created for the first row: [source,json] ---- @@ -184,14 +205,11 @@ With 3 rows on the table, three events will be generated with the contents of ea } ---- +[float] +=== Example: get the buffer catch hit ratio in Oracle -== More examples +This `sql.yml` configuration shows how to get the buffer cache hit ratio: -=== Oracle: - -Get the buffer cache hit ratio: - -.sql.yml [source,yaml] ---- - module: sql @@ -205,6 +223,7 @@ Get the buffer cache hit ratio: sql_response_format: table ---- +The example generates this event: [source,json] ---- @@ -259,11 +278,11 @@ Get the buffer cache hit ratio: } ---- -=== MSSQL +[float] +=== Example: get the buffer cache hit ratio for MSSQL -Get the buffer cache hit ratio: +This `sql.yml` configuration gets the buffer cache hit ratio: -.sql.yml [source,yaml] ---- - module: sql @@ -277,6 +296,8 @@ Get the buffer cache hit ratio: sql_response_format: table ---- +The example generates this event: + [source,json] ---- { @@ -328,11 +349,12 @@ Get the buffer cache hit ratio: } ---- -=== Two or more queries +[float] +=== Example: launch two or more queries -If you want to launch two or more queries, you need to specify them with their full configuration for each query. For example: +To launch two or more queries, specify the full configuration for each query. +For example: -.sql.yml [source,yaml] ---- - module: sql diff --git a/x-pack/metricbeat/module/sql/query/_meta/docs.asciidoc b/x-pack/metricbeat/module/sql/query/_meta/docs.asciidoc index df05a99c95c..8f48f8507de 100644 --- a/x-pack/metricbeat/module/sql/query/_meta/docs.asciidoc +++ b/x-pack/metricbeat/module/sql/query/_meta/docs.asciidoc @@ -1,4 +1,4 @@ -The sql `query` metricset collect rows returned by a query. +The sql `query` metricset collects rows returned by a query. -Fields names (columns) will be returned as lowercase. -Values will be returned as numeric or string. \ No newline at end of file +Field names (columns) are returned as lowercase strings. Values are returned as numeric +or string. From 13a54632caa9c69f1126733addbfa2e69a34f2d4 Mon Sep 17 00:00:00 2001 From: Andrew Kroh Date: Thu, 1 Oct 2020 23:04:30 -0400 Subject: [PATCH 043/156] Update Filebeat module expected logs files (#21454) Elasticsearch added country_name to the list of default field for geo in https://github.com/elastic/elasticsearch/pull/62915. So the expected files needed updated. --- .../test/darwin-2.4.23.log-expected.json | 3 + .../access/test/ssl-request.log-expected.json | 1 + .../apache/error/test/test.log-expected.json | 2 + .../log/test/default.log-expected.json | 1 + .../log/test/haproxy.log-expected.json | 1 + .../iis/access/test/test.log-expected.json | 2 + .../test/iis_error_url.log-expected.json | 8 + .../iis/error/test/test.log-expected.json | 3 + .../access/test/access.log-expected.json | 8 + .../test/test-with-host.log-expected.json | 4 + .../nginx/access/test/test.log-expected.json | 4 + .../test/test.log-expected.json | 2 +- .../auth/test/secure-rhel7.log-expected.json | 35 ++ .../system/auth/test/test.log-expected.json | 2 + .../access/test/test.log-expected.json | 4 + .../test/assume-role-json.log-expected.json | 1 + .../create-key-pair-json.log-expected.json | 1 + .../test/update-trail-json.log-expected.json | 1 + .../application-lb-http.log-expected.json | 10 + .../aws/elb/test/elb-http.log-expected.json | 5 + .../aws/elb/test/elb-tcp.log-expected.json | 6 + .../test/example-nlb-tcp.log-expected.json | 1 + .../test/s3_server_access.log-expected.json | 6 + .../accept-reject-traffic.log-expected.json | 4 + .../test/tcp-flag-sequence.log-expected.json | 1 + .../test/activitylogs.log-expected.json | 2 + .../supporttickets_write.log-expected.json | 2 + .../test/signinlogs.log-expected.json | 2 + .../test/generated.log-expected.json | 4 +- .../module/cef/log/test/cef.log-expected.json | 3 + .../cef/log/test/checkpoint.log-expected.json | 1 + .../test/checkpoint.log-expected.json | 45 ++ .../additional_messages.log-expected.json | 10 + .../cisco/asa/test/asa-fix.log-expected.json | 1 + .../asa/test/dap_records.log-expected.json | 1 + .../cisco/ftd/test/dns.log-expected.json | 21 + .../security-connection.log-expected.json | 6 + .../security-file-malware.log-expected.json | 2 + .../security-malware-site.log-expected.json | 2 + .../test/cisco-ios-syslog.log-expected.json | 7 + .../meraki/test/generated.log-expected.json | 128 ++--- .../test/generated.log-expected.json | 40 +- .../corepas/test/generated.log-expected.json | 418 +++++++------- .../log/test/envoy-json.log-expected.json | 1 + .../log/test/envoy.log-expected.json | 1 + .../bigipafm/test/generated.log-expected.json | 402 +++++++------- .../bigipapm/test/generated.log-expected.json | 12 +- .../test/generated.log-expected.json | 176 +++--- .../firewall/test/fortinet.log-expected.json | 29 + .../test/generated.log-expected.json | 24 +- .../test/generated.log-expected.json | 320 +++++------ .../audit-log-entries.json.log-expected.json | 2 + .../firewall/test/test.log-expected.json | 3 + ...in-application-test.json.log-expected.json | 18 +- ...admin-calendar-test.json.log-expected.json | 26 +- ...ite-admin-chat-test.json.log-expected.json | 8 +- ...admin-chromeos-test.json.log-expected.json | 42 +- ...admin-contacts-test.json.log-expected.json | 2 +- ...delegatedadmin-test.json.log-expected.json | 16 +- ...ite-admin-docs-test.json.log-expected.json | 8 +- ...e-admin-domain-test.json.log-expected.json | 170 +++--- ...te-admin-gmail-test.json.log-expected.json | 20 +- ...e-admin-groups-test.json.log-expected.json | 28 +- ...admin-licenses-test.json.log-expected.json | 16 +- ...e-admin-mobile-test.json.log-expected.json | 62 +-- ...uite-admin-org-test.json.log-expected.json | 34 +- ...admin-security-test.json.log-expected.json | 48 +- ...te-admin-sites-test.json.log-expected.json | 10 +- ...ite-admin-user-test.json.log-expected.json | 150 +++--- .../gsuite-drive-test.json.log-expected.json | 56 +- .../gsuite-groups-test.json.log-expected.json | 50 +- .../gsuite-login-test.json.log-expected.json | 20 +- .../gsuite-saml-test.json.log-expected.json | 4 +- ...-user_accounts-test.json.log-expected.json | 16 +- .../test/generated.log-expected.json | 456 ++++++++-------- .../iptables/log/test/geo.log-expected.json | 1 + .../test/generated.log-expected.json | 20 +- .../test/misp-test.json.log-expected.json | 1 + .../test/generated.log-expected.json | 28 +- .../test/04-sharepoint.log-expected.json | 4 + .../06-sharepointfileop.log-expected.json | 11 + .../audit/test/08-azuread.log-expected.json | 99 ++++ .../test/14-sp-sharing-op.log-expected.json | 5 + .../15-azuread-sts-logon.log-expected.json | 69 +++ .../audit/test/22-yammer.log-expected.json | 1 + .../okta-system-test.json.log-expected.json | 3 + .../test/pan_inc_other.log-expected.json | 1 + .../test/pan_inc_threat.log-expected.json | 100 ++++ .../test/pan_inc_traffic.log-expected.json | 95 ++++ .../panw/panos/test/threat.log-expected.json | 76 +++ .../panw/panos/test/traffic.log-expected.json | 98 ++++ .../log/test/generated.log-expected.json | 54 +- .../firewall/test/general.log-expected.json | 6 + .../firewall/test/generated.log-expected.json | 80 +-- .../utm/test/generated.log-expected.json | 90 ++-- .../xg/test/anti-spam.log-expected.json | 6 + .../xg/test/anti-virus.log-expected.json | 6 + .../sophos/xg/test/atp.log-expected.json | 4 + .../sophos/xg/test/cfilter.log-expected.json | 10 + .../sophos/xg/test/event.log-expected.json | 6 + .../sophos/xg/test/firewall.log-expected.json | 9 + .../sophos/xg/test/idp.log-expected.json | 3 + .../sophos/xg/test/waf.log-expected.json | 6 + .../squid/log/test/access1.log-expected.json | 420 +++++++++------ .../eve/test/eve-alerts.log-expected.json | 20 + .../eve/test/eve-small.log-expected.json | 1 + .../test/generated.log-expected.json | 14 +- .../test/connection-json.log-expected.json | 3 + .../http/test/http-json.log-expected.json | 1 + .../zeek/irc/test/irc-json.log-expected.json | 3 + .../notice/test/notice-json.log-expected.json | 2 + .../zeek/sip/test/sip-json.log-expected.json | 5 + .../zeek/ssl/test/ssl-json.log-expected.json | 2 + .../test/traceroute-json.log-expected.json | 1 + .../tunnel/test/tunnel-json.log-expected.json | 2 + .../zia/test/generated.log-expected.json | 508 +++++++++--------- .../zscaler/zia/test/test.log-expected.json | 4 +- 117 files changed, 2951 insertions(+), 1968 deletions(-) diff --git a/filebeat/module/apache/access/test/darwin-2.4.23.log-expected.json b/filebeat/module/apache/access/test/darwin-2.4.23.log-expected.json index 9c61a6065af..1f3600f2e09 100644 --- a/filebeat/module/apache/access/test/darwin-2.4.23.log-expected.json +++ b/filebeat/module/apache/access/test/darwin-2.4.23.log-expected.json @@ -76,6 +76,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -105,6 +106,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -134,6 +136,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", diff --git a/filebeat/module/apache/access/test/ssl-request.log-expected.json b/filebeat/module/apache/access/test/ssl-request.log-expected.json index 9898d82cef0..3eb3e283b19 100644 --- a/filebeat/module/apache/access/test/ssl-request.log-expected.json +++ b/filebeat/module/apache/access/test/ssl-request.log-expected.json @@ -38,6 +38,7 @@ "source.address": "11.19.0.217", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "11.19.0.217", diff --git a/filebeat/module/apache/error/test/test.log-expected.json b/filebeat/module/apache/error/test/test.log-expected.json index fbc9605ef38..d9f470db46a 100644 --- a/filebeat/module/apache/error/test/test.log-expected.json +++ b/filebeat/module/apache/error/test/test.log-expected.json @@ -56,6 +56,7 @@ "source.geo.city_name": "Newnan", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 33.3708, "source.geo.location.lon": -84.8154, "source.geo.region_iso_code": "US-GA", @@ -84,6 +85,7 @@ "source.geo.city_name": "Beijing", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 39.9288, "source.geo.location.lon": 116.3889, "source.geo.region_iso_code": "CN-BJ", diff --git a/filebeat/module/haproxy/log/test/default.log-expected.json b/filebeat/module/haproxy/log/test/default.log-expected.json index f58515d6172..4da9bc98f17 100644 --- a/filebeat/module/haproxy/log/test/default.log-expected.json +++ b/filebeat/module/haproxy/log/test/default.log-expected.json @@ -30,6 +30,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", diff --git a/filebeat/module/haproxy/log/test/haproxy.log-expected.json b/filebeat/module/haproxy/log/test/haproxy.log-expected.json index 474b7a5e5d3..b33e80ab073 100644 --- a/filebeat/module/haproxy/log/test/haproxy.log-expected.json +++ b/filebeat/module/haproxy/log/test/haproxy.log-expected.json @@ -47,6 +47,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", diff --git a/filebeat/module/iis/access/test/test.log-expected.json b/filebeat/module/iis/access/test/test.log-expected.json index adb56a2eadd..786333c1379 100644 --- a/filebeat/module/iis/access/test/test.log-expected.json +++ b/filebeat/module/iis/access/test/test.log-expected.json @@ -34,6 +34,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -127,6 +128,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", diff --git a/filebeat/module/iis/error/test/iis_error_url.log-expected.json b/filebeat/module/iis/error/test/iis_error_url.log-expected.json index 0cb2fb038b4..8adb2e6d1d0 100644 --- a/filebeat/module/iis/error/test/iis_error_url.log-expected.json +++ b/filebeat/module/iis/error/test/iis_error_url.log-expected.json @@ -30,6 +30,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", @@ -67,6 +68,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", @@ -104,6 +106,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", @@ -141,6 +144,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", @@ -178,6 +182,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", @@ -215,6 +220,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", @@ -252,6 +258,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", @@ -289,6 +296,7 @@ "source.address": "149.42.83.135", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "149.42.83.135", diff --git a/filebeat/module/iis/error/test/test.log-expected.json b/filebeat/module/iis/error/test/test.log-expected.json index 50ec549dd6b..506ee6ba2ed 100644 --- a/filebeat/module/iis/error/test/test.log-expected.json +++ b/filebeat/module/iis/error/test/test.log-expected.json @@ -66,6 +66,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -108,6 +109,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -146,6 +148,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", diff --git a/filebeat/module/nginx/access/test/access.log-expected.json b/filebeat/module/nginx/access/test/access.log-expected.json index 92519cc1e81..7981a316c95 100644 --- a/filebeat/module/nginx/access/test/access.log-expected.json +++ b/filebeat/module/nginx/access/test/access.log-expected.json @@ -32,6 +32,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -80,6 +81,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -127,6 +129,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -174,6 +177,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -222,6 +226,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -269,6 +274,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -316,6 +322,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", @@ -363,6 +370,7 @@ "source.geo.city_name": "Germersheim", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.2231, "source.geo.location.lon": 8.3639, "source.geo.region_iso_code": "DE-RP", diff --git a/filebeat/module/nginx/access/test/test-with-host.log-expected.json b/filebeat/module/nginx/access/test/test-with-host.log-expected.json index a1968695184..e07836ce520 100644 --- a/filebeat/module/nginx/access/test/test-with-host.log-expected.json +++ b/filebeat/module/nginx/access/test/test-with-host.log-expected.json @@ -115,6 +115,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -164,6 +165,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -216,6 +218,7 @@ "source.geo.city_name": "Springfield", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 39.7647, "source.geo.location.lon": -89.7379, "source.geo.region_iso_code": "US-IL", @@ -260,6 +263,7 @@ "source.address": "2a03:0000:10ff:f00f:0000:0000:0:8000", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PT", + "source.geo.country_name": "Portugal", "source.geo.location.lat": 39.5, "source.geo.location.lon": -8.0, "source.ip": "2a03:0000:10ff:f00f:0000:0000:0:8000", diff --git a/filebeat/module/nginx/access/test/test.log-expected.json b/filebeat/module/nginx/access/test/test.log-expected.json index 75caf6cf9f8..b27c9ccf19b 100644 --- a/filebeat/module/nginx/access/test/test.log-expected.json +++ b/filebeat/module/nginx/access/test/test.log-expected.json @@ -112,6 +112,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -159,6 +160,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -209,6 +211,7 @@ "source.geo.city_name": "Springfield", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 39.7647, "source.geo.location.lon": -89.7379, "source.geo.region_iso_code": "US-IL", @@ -251,6 +254,7 @@ "source.address": "2a03:0000:10ff:f00f:0000:0000:0:8000", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PT", + "source.geo.country_name": "Portugal", "source.geo.location.lat": 39.5, "source.geo.location.lon": -8.0, "source.ip": "2a03:0000:10ff:f00f:0000:0000:0:8000", diff --git a/filebeat/module/nginx/ingress_controller/test/test.log-expected.json b/filebeat/module/nginx/ingress_controller/test/test.log-expected.json index e8b09bc1abd..89c37b4a38e 100644 --- a/filebeat/module/nginx/ingress_controller/test/test.log-expected.json +++ b/filebeat/module/nginx/ingress_controller/test/test.log-expected.json @@ -1322,4 +1322,4 @@ "user_agent.os.version": "10.14", "user_agent.version": "72.0." } -] +] \ No newline at end of file diff --git a/filebeat/module/system/auth/test/secure-rhel7.log-expected.json b/filebeat/module/system/auth/test/secure-rhel7.log-expected.json index 7d8ece1d7f2..50134594bfc 100644 --- a/filebeat/module/system/auth/test/secure-rhel7.log-expected.json +++ b/filebeat/module/system/auth/test/secure-rhel7.log-expected.json @@ -33,6 +33,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -94,6 +95,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -155,6 +157,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -284,6 +287,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -345,6 +349,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -406,6 +411,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -467,6 +473,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -528,6 +535,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -691,6 +699,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -752,6 +761,7 @@ "source.as.organization.name": "CHINANET Guangdong province network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 23.1167, "source.geo.location.lon": 113.25, "source.geo.region_iso_code": "CN-GD", @@ -813,6 +823,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -874,6 +885,7 @@ "source.as.organization.name": "CHINANET Guangdong province network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 23.1167, "source.geo.location.lon": 113.25, "source.geo.region_iso_code": "CN-GD", @@ -935,6 +947,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -996,6 +1009,7 @@ "source.as.organization.name": "CHINANET Guangdong province network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 23.1167, "source.geo.location.lon": 113.25, "source.geo.region_iso_code": "CN-GD", @@ -1074,6 +1088,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1135,6 +1150,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1264,6 +1280,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1325,6 +1342,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1386,6 +1404,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1447,6 +1466,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1508,6 +1528,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1637,6 +1658,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1698,6 +1720,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1759,6 +1782,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1820,6 +1844,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -1881,6 +1906,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -2010,6 +2036,7 @@ "source.as.organization.name": "CHINANET Guangdong province network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 23.1167, "source.geo.location.lon": 113.25, "source.geo.region_iso_code": "CN-GD", @@ -2071,6 +2098,7 @@ "source.as.organization.name": "CHINANET Guangdong province network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 23.1167, "source.geo.location.lon": 113.25, "source.geo.region_iso_code": "CN-GD", @@ -2132,6 +2160,7 @@ "source.as.organization.name": "CHINANET Guangdong province network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 23.1167, "source.geo.location.lon": 113.25, "source.geo.region_iso_code": "CN-GD", @@ -2244,6 +2273,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -2305,6 +2335,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -2366,6 +2397,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -2427,6 +2459,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -2488,6 +2521,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", @@ -2617,6 +2651,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 28.55, "source.geo.location.lon": 115.9333, "source.geo.region_iso_code": "CN-JX", diff --git a/filebeat/module/system/auth/test/test.log-expected.json b/filebeat/module/system/auth/test/test.log-expected.json index 88d32188bb7..dc677ebb58c 100644 --- a/filebeat/module/system/auth/test/test.log-expected.json +++ b/filebeat/module/system/auth/test/test.log-expected.json @@ -140,6 +140,7 @@ "source.as.organization.name": "CHINANET Guangdong province network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 23.1167, "source.geo.location.lon": 113.25, "source.geo.region_iso_code": "CN-GD", @@ -196,6 +197,7 @@ "source.geo.city_name": "Hangzhou", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 30.294, "source.geo.location.lon": 120.1619, "source.geo.region_iso_code": "CN-ZJ", diff --git a/filebeat/module/traefik/access/test/test.log-expected.json b/filebeat/module/traefik/access/test/test.log-expected.json index a5723ed5c27..631673fe351 100644 --- a/filebeat/module/traefik/access/test/test.log-expected.json +++ b/filebeat/module/traefik/access/test/test.log-expected.json @@ -69,6 +69,7 @@ "source.geo.city_name": "Berlin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 52.4473, "source.geo.location.lon": 13.4531, "source.geo.region_iso_code": "DE-BE", @@ -116,6 +117,7 @@ "source.geo.city_name": "Ottawa", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "CA", + "source.geo.country_name": "Canada", "source.geo.location.lat": 45.2691, "source.geo.location.lon": -75.7518, "source.geo.region_iso_code": "CA-ON", @@ -203,6 +205,7 @@ "source.geo.city_name": "Warsaw", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PL", + "source.geo.country_name": "Poland", "source.geo.location.lat": 52.25, "source.geo.location.lon": 21.0, "source.geo.region_iso_code": "PL-14", @@ -249,6 +252,7 @@ "source.geo.city_name": "Gda\u0144sk", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PL", + "source.geo.country_name": "Poland", "source.geo.location.lat": 54.3605, "source.geo.location.lon": 18.649, "source.geo.region_iso_code": "PL-22", diff --git a/x-pack/filebeat/module/aws/cloudtrail/test/assume-role-json.log-expected.json b/x-pack/filebeat/module/aws/cloudtrail/test/assume-role-json.log-expected.json index 3bdb628e7fb..47691a242dc 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/test/assume-role-json.log-expected.json +++ b/x-pack/filebeat/module/aws/cloudtrail/test/assume-role-json.log-expected.json @@ -63,6 +63,7 @@ "source.as.organization.name": "CHINA UNICOM China169 Backbone", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 29.5569, "source.geo.location.lon": 106.5531, "source.geo.region_iso_code": "CN-CQ", diff --git a/x-pack/filebeat/module/aws/cloudtrail/test/create-key-pair-json.log-expected.json b/x-pack/filebeat/module/aws/cloudtrail/test/create-key-pair-json.log-expected.json index 5783ade81ed..41cca74d099 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/test/create-key-pair-json.log-expected.json +++ b/x-pack/filebeat/module/aws/cloudtrail/test/create-key-pair-json.log-expected.json @@ -39,6 +39,7 @@ "source.geo.city_name": "Ashburn", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 39.0481, "source.geo.location.lon": -77.4728, "source.geo.region_iso_code": "US-VA", diff --git a/x-pack/filebeat/module/aws/cloudtrail/test/update-trail-json.log-expected.json b/x-pack/filebeat/module/aws/cloudtrail/test/update-trail-json.log-expected.json index c9ee01ef238..1531a7c1e5a 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/test/update-trail-json.log-expected.json +++ b/x-pack/filebeat/module/aws/cloudtrail/test/update-trail-json.log-expected.json @@ -32,6 +32,7 @@ "source.geo.city_name": "Boardman", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 45.8491, "source.geo.location.lon": -119.7143, "source.geo.region_iso_code": "US-OR", diff --git a/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json b/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json index a566b2f9478..28e1564e928 100644 --- a/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json +++ b/x-pack/filebeat/module/aws/elb/test/application-lb-http.log-expected.json @@ -35,6 +35,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -83,6 +84,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -131,6 +133,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -179,6 +182,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -227,6 +231,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -275,6 +280,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -323,6 +329,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -375,6 +382,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -427,6 +435,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -479,6 +488,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", diff --git a/x-pack/filebeat/module/aws/elb/test/elb-http.log-expected.json b/x-pack/filebeat/module/aws/elb/test/elb-http.log-expected.json index c1916fd1ec2..48701c8a985 100644 --- a/x-pack/filebeat/module/aws/elb/test/elb-http.log-expected.json +++ b/x-pack/filebeat/module/aws/elb/test/elb-http.log-expected.json @@ -31,6 +31,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", @@ -74,6 +75,7 @@ "source.geo.city_name": "Mytishchi", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.9089, "source.geo.location.lon": 37.7339, "source.geo.region_iso_code": "RU-MOS", @@ -117,6 +119,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -160,6 +163,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -203,6 +207,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", diff --git a/x-pack/filebeat/module/aws/elb/test/elb-tcp.log-expected.json b/x-pack/filebeat/module/aws/elb/test/elb-tcp.log-expected.json index 8b394e2b07e..e960e211763 100644 --- a/x-pack/filebeat/module/aws/elb/test/elb-tcp.log-expected.json +++ b/x-pack/filebeat/module/aws/elb/test/elb-tcp.log-expected.json @@ -25,6 +25,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -61,6 +62,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -97,6 +99,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -133,6 +136,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -169,6 +173,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", @@ -205,6 +210,7 @@ "source.geo.city_name": "Teruel", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.3456, "source.geo.location.lon": -1.1065, "source.geo.region_iso_code": "ES-TE", diff --git a/x-pack/filebeat/module/aws/elb/test/example-nlb-tcp.log-expected.json b/x-pack/filebeat/module/aws/elb/test/example-nlb-tcp.log-expected.json index e9564154424..b5db726de69 100644 --- a/x-pack/filebeat/module/aws/elb/test/example-nlb-tcp.log-expected.json +++ b/x-pack/filebeat/module/aws/elb/test/example-nlb-tcp.log-expected.json @@ -30,6 +30,7 @@ "source.geo.city_name": "Ashburn", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 39.0481, "source.geo.location.lon": -77.4728, "source.geo.region_iso_code": "US-VA", diff --git a/x-pack/filebeat/module/aws/s3access/test/s3_server_access.log-expected.json b/x-pack/filebeat/module/aws/s3access/test/s3_server_access.log-expected.json index 273b1512556..187f7f33589 100644 --- a/x-pack/filebeat/module/aws/s3access/test/s3_server_access.log-expected.json +++ b/x-pack/filebeat/module/aws/s3access/test/s3_server_access.log-expected.json @@ -33,6 +33,7 @@ "geo.city_name": "Ashburn", "geo.continent_name": "North America", "geo.country_iso_code": "US", + "geo.country_name": "United States", "geo.location.lat": 39.0481, "geo.location.lon": -77.4728, "geo.region_iso_code": "US-VA", @@ -95,6 +96,7 @@ "geo.city_name": "Ashburn", "geo.continent_name": "North America", "geo.country_iso_code": "US", + "geo.country_name": "United States", "geo.location.lat": 39.0481, "geo.location.lon": -77.4728, "geo.region_iso_code": "US-VA", @@ -158,6 +160,7 @@ "geo.city_name": "Ashburn", "geo.continent_name": "North America", "geo.country_iso_code": "US", + "geo.country_name": "United States", "geo.location.lat": 39.0481, "geo.location.lon": -77.4728, "geo.region_iso_code": "US-VA", @@ -220,6 +223,7 @@ "geo.city_name": "Ashburn", "geo.continent_name": "North America", "geo.country_iso_code": "US", + "geo.country_name": "United States", "geo.location.lat": 39.0481, "geo.location.lon": -77.4728, "geo.region_iso_code": "US-VA", @@ -279,6 +283,7 @@ "geo.city_name": "Teruel", "geo.continent_name": "Europe", "geo.country_iso_code": "ES", + "geo.country_name": "Spain", "geo.location.lat": 40.3456, "geo.location.lon": -1.1065, "geo.region_iso_code": "ES-TE", @@ -331,6 +336,7 @@ "geo.city_name": "Denver", "geo.continent_name": "North America", "geo.country_iso_code": "US", + "geo.country_name": "United States", "geo.location.lat": 39.7044, "geo.location.lon": -105.0023, "geo.region_iso_code": "US-CO", diff --git a/x-pack/filebeat/module/aws/vpcflow/test/accept-reject-traffic.log-expected.json b/x-pack/filebeat/module/aws/vpcflow/test/accept-reject-traffic.log-expected.json index 170b8851ec9..1f1b3e061b2 100644 --- a/x-pack/filebeat/module/aws/vpcflow/test/accept-reject-traffic.log-expected.json +++ b/x-pack/filebeat/module/aws/vpcflow/test/accept-reject-traffic.log-expected.json @@ -13,6 +13,7 @@ "destination.as.organization.name": "Consorci de Serveis Universitaris de Catalunya", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "ES", + "destination.geo.country_name": "Spain", "destination.geo.location.lat": 40.4172, "destination.geo.location.lon": -3.684, "destination.ip": "158.109.0.1", @@ -47,6 +48,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", @@ -72,6 +74,7 @@ "destination.as.organization.name": "Consorci de Serveis Universitaris de Catalunya", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "ES", + "destination.geo.country_name": "Spain", "destination.geo.location.lat": 40.4172, "destination.geo.location.lon": -3.684, "destination.ip": "158.109.0.1", @@ -106,6 +109,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", diff --git a/x-pack/filebeat/module/aws/vpcflow/test/tcp-flag-sequence.log-expected.json b/x-pack/filebeat/module/aws/vpcflow/test/tcp-flag-sequence.log-expected.json index 6b7b788ac97..ba0293752ca 100644 --- a/x-pack/filebeat/module/aws/vpcflow/test/tcp-flag-sequence.log-expected.json +++ b/x-pack/filebeat/module/aws/vpcflow/test/tcp-flag-sequence.log-expected.json @@ -49,6 +49,7 @@ "source.geo.city_name": "Dublin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "IE", + "source.geo.country_name": "Ireland", "source.geo.location.lat": 53.3338, "source.geo.location.lon": -6.2488, "source.geo.region_iso_code": "IE-L", diff --git a/x-pack/filebeat/module/azure/activitylogs/test/activitylogs.log-expected.json b/x-pack/filebeat/module/azure/activitylogs/test/activitylogs.log-expected.json index 4c0e8d4701a..3f86faee084 100644 --- a/x-pack/filebeat/module/azure/activitylogs/test/activitylogs.log-expected.json +++ b/x-pack/filebeat/module/azure/activitylogs/test/activitylogs.log-expected.json @@ -47,6 +47,7 @@ "fileset.name": "activitylogs", "geo.continent_name": "Europe", "geo.country_iso_code": "GB", + "geo.country_name": "United Kingdom", "geo.location.lat": 51.4964, "geo.location.lon": -0.1224, "input.type": "log", @@ -55,6 +56,7 @@ "service.type": "azure", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "GB", + "source.geo.country_name": "United Kingdom", "source.geo.location.lat": 51.4964, "source.geo.location.lon": -0.1224, "source.ip": "51.251.141.41", diff --git a/x-pack/filebeat/module/azure/activitylogs/test/supporttickets_write.log-expected.json b/x-pack/filebeat/module/azure/activitylogs/test/supporttickets_write.log-expected.json index db962bd4df6..5f14108e4c4 100644 --- a/x-pack/filebeat/module/azure/activitylogs/test/supporttickets_write.log-expected.json +++ b/x-pack/filebeat/module/azure/activitylogs/test/supporttickets_write.log-expected.json @@ -52,6 +52,7 @@ "fileset.name": "activitylogs", "geo.continent_name": "Asia", "geo.country_iso_code": "JP", + "geo.country_name": "Japan", "geo.location.lat": 35.69, "geo.location.lon": 139.69, "input.type": "log", @@ -62,6 +63,7 @@ "source.as.organization.name": "KDDI CORPORATION", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "JP", + "source.geo.country_name": "Japan", "source.geo.location.lat": 35.69, "source.geo.location.lon": 139.69, "source.ip": "111.111.111.11", diff --git a/x-pack/filebeat/module/azure/signinlogs/test/signinlogs.log-expected.json b/x-pack/filebeat/module/azure/signinlogs/test/signinlogs.log-expected.json index 6a0f96ae261..db0643ccf25 100644 --- a/x-pack/filebeat/module/azure/signinlogs/test/signinlogs.log-expected.json +++ b/x-pack/filebeat/module/azure/signinlogs/test/signinlogs.log-expected.json @@ -66,6 +66,7 @@ "source.geo.city_name": "Farnham Royal", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "GB", + "source.geo.country_name": "United Kingdom", "source.geo.location.lat": 51.5333, "source.geo.location.lon": -0.6167, "source.geo.region_iso_code": "GB-BKM", @@ -145,6 +146,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "8.8.8.8", diff --git a/x-pack/filebeat/module/barracuda/spamfirewall/test/generated.log-expected.json b/x-pack/filebeat/module/barracuda/spamfirewall/test/generated.log-expected.json index ff70486fab5..ed4c2bb4d7f 100644 --- a/x-pack/filebeat/module/barracuda/spamfirewall/test/generated.log-expected.json +++ b/x-pack/filebeat/module/barracuda/spamfirewall/test/generated.log-expected.json @@ -496,8 +496,8 @@ "observer.type": "Anti-Virus", "observer.vendor": "Barracuda", "related.ip": [ - "10.18.165.35", - "10.110.109.5" + "10.110.109.5", + "10.18.165.35" ], "rsa.internal.messageid": "outbound/smtp", "rsa.investigations.event_cat": 1901000000, diff --git a/x-pack/filebeat/module/cef/log/test/cef.log-expected.json b/x-pack/filebeat/module/cef/log/test/cef.log-expected.json index ca0127defbd..d2902dc24b6 100644 --- a/x-pack/filebeat/module/cef/log/test/cef.log-expected.json +++ b/x-pack/filebeat/module/cef/log/test/cef.log-expected.json @@ -45,6 +45,7 @@ "service.type": "cef", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "6.7.8.9", @@ -77,6 +78,7 @@ "destination.geo.city_name": "Moscow", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7527, "destination.geo.location.lon": 37.6172, "destination.geo.region_iso_code": "RU-MOW", @@ -114,6 +116,7 @@ "service.type": "cef", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "6.7.8.9", diff --git a/x-pack/filebeat/module/cef/log/test/checkpoint.log-expected.json b/x-pack/filebeat/module/cef/log/test/checkpoint.log-expected.json index 8d027229032..eefe063490d 100644 --- a/x-pack/filebeat/module/cef/log/test/checkpoint.log-expected.json +++ b/x-pack/filebeat/module/cef/log/test/checkpoint.log-expected.json @@ -48,6 +48,7 @@ "destination.geo.city_name": "Des Moines", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 41.6006, "destination.geo.location.lon": -93.6112, "destination.geo.region_iso_code": "US-IA", diff --git a/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json index fd07aa51eca..30fc5952b01 100644 --- a/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json +++ b/x-pack/filebeat/module/checkpoint/firewall/test/checkpoint.log-expected.json @@ -150,6 +150,7 @@ "destination.geo.city_name": "Tel Aviv", "destination.geo.continent_name": "Asia", "destination.geo.country_iso_code": "IL", + "destination.geo.country_name": "Israel", "destination.geo.location.lat": 32.0678, "destination.geo.location.lon": 34.7647, "destination.geo.region_iso_code": "IL-TA", @@ -270,6 +271,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -388,6 +390,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -506,6 +509,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -624,6 +628,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.81.142.43", @@ -742,6 +747,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -860,6 +866,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -978,6 +985,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -1096,6 +1104,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -1214,6 +1223,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -1332,6 +1342,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -1450,6 +1461,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -1568,6 +1580,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -1686,6 +1699,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -1804,6 +1818,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -1922,6 +1937,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -2040,6 +2056,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -2206,6 +2223,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -2298,6 +2316,7 @@ "destination.geo.city_name": "Tel Aviv", "destination.geo.continent_name": "Asia", "destination.geo.country_iso_code": "IL", + "destination.geo.country_name": "Israel", "destination.geo.location.lat": 32.0678, "destination.geo.location.lon": 34.7647, "destination.geo.region_iso_code": "IL-TA", @@ -2526,6 +2545,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -2644,6 +2664,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -2762,6 +2783,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -2880,6 +2902,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -2998,6 +3021,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -3116,6 +3140,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -3282,6 +3307,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -3400,6 +3426,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -3518,6 +3545,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -3636,6 +3664,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -3754,6 +3783,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -3818,6 +3848,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -3990,6 +4021,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -4108,6 +4140,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -4254,6 +4287,7 @@ "destination.geo.city_name": "Tel Aviv", "destination.geo.continent_name": "Asia", "destination.geo.country_iso_code": "IL", + "destination.geo.country_name": "Israel", "destination.geo.location.lat": 32.0678, "destination.geo.location.lon": 34.7647, "destination.geo.region_iso_code": "IL-TA", @@ -4428,6 +4462,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.81.142.43", @@ -4546,6 +4581,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -4664,6 +4700,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -4782,6 +4819,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -4900,6 +4938,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -5018,6 +5057,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", @@ -5136,6 +5176,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -5254,6 +5295,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.41", @@ -5372,6 +5414,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.36", @@ -5490,6 +5533,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.99.234.45", @@ -5608,6 +5652,7 @@ "destination.as.organization.name": "Sucuri", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "192.124.249.31", diff --git a/x-pack/filebeat/module/cisco/asa/test/additional_messages.log-expected.json b/x-pack/filebeat/module/cisco/asa/test/additional_messages.log-expected.json index 73d42d43af7..66cc3da4b0c 100644 --- a/x-pack/filebeat/module/cisco/asa/test/additional_messages.log-expected.json +++ b/x-pack/filebeat/module/cisco/asa/test/additional_messages.log-expected.json @@ -1136,6 +1136,7 @@ "destination.geo.city_name": "Thousand Oaks", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 34.197, "destination.geo.location.lon": -118.8199, "destination.geo.region_iso_code": "US-CA", @@ -2417,6 +2418,7 @@ "destination.geo.city_name": "Clermont-Ferrand", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", "destination.geo.location.lat": 45.7838, "destination.geo.location.lon": 3.0966, "destination.geo.region_iso_code": "FR-63", @@ -2467,6 +2469,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", @@ -2542,6 +2545,7 @@ "destination.geo.city_name": "Riga", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "LV", + "destination.geo.country_name": "Latvia", "destination.geo.location.lat": 56.9496, "destination.geo.location.lon": 24.0978, "destination.geo.region_iso_code": "LV-RIX", @@ -2927,6 +2931,7 @@ "source.geo.city_name": "London", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "GB", + "source.geo.country_name": "United Kingdom", "source.geo.location.lat": 51.5888, "source.geo.location.lon": -0.0247, "source.geo.region_iso_code": "GB-ENG", @@ -2946,6 +2951,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5888, "destination.geo.location.lon": -0.0247, "destination.geo.region_iso_code": "GB-ENG", @@ -3029,6 +3035,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "8.8.8.8", @@ -3075,6 +3082,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "8.8.8.8", @@ -3093,6 +3101,7 @@ "destination.geo.city_name": "Stoke Newington", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5638, "destination.geo.location.lon": -0.0765, "destination.geo.region_iso_code": "GB-HCK", @@ -3139,6 +3148,7 @@ "source.geo.city_name": "Dublin", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "IE", + "source.geo.country_name": "Ireland", "source.geo.location.lat": 53.3338, "source.geo.location.lon": -6.2488, "source.geo.region_iso_code": "IE-L", diff --git a/x-pack/filebeat/module/cisco/asa/test/asa-fix.log-expected.json b/x-pack/filebeat/module/cisco/asa/test/asa-fix.log-expected.json index 94f2b616d27..a57299252ca 100644 --- a/x-pack/filebeat/module/cisco/asa/test/asa-fix.log-expected.json +++ b/x-pack/filebeat/module/cisco/asa/test/asa-fix.log-expected.json @@ -509,6 +509,7 @@ "destination.address": "1.2.33.40", "destination.geo.continent_name": "Asia", "destination.geo.country_iso_code": "CN", + "destination.geo.country_name": "China", "destination.geo.location.lat": 23.1167, "destination.geo.location.lon": 113.25, "destination.geo.region_iso_code": "CN-GD", diff --git a/x-pack/filebeat/module/cisco/asa/test/dap_records.log-expected.json b/x-pack/filebeat/module/cisco/asa/test/dap_records.log-expected.json index bb691462f78..e86dd81aead 100644 --- a/x-pack/filebeat/module/cisco/asa/test/dap_records.log-expected.json +++ b/x-pack/filebeat/module/cisco/asa/test/dap_records.log-expected.json @@ -35,6 +35,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", diff --git a/x-pack/filebeat/module/cisco/ftd/test/dns.log-expected.json b/x-pack/filebeat/module/cisco/ftd/test/dns.log-expected.json index 37efb99f483..b7b065dea1c 100644 --- a/x-pack/filebeat/module/cisco/ftd/test/dns.log-expected.json +++ b/x-pack/filebeat/module/cisco/ftd/test/dns.log-expected.json @@ -39,6 +39,7 @@ "destination.bytes": 145, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -147,6 +148,7 @@ "destination.bytes": 193, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -253,6 +255,7 @@ "destination.bytes": 166, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -361,6 +364,7 @@ "destination.bytes": 200, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -468,6 +472,7 @@ "destination.bytes": 193, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -574,6 +579,7 @@ "destination.bytes": 166, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -683,6 +689,7 @@ "destination.bytes": 199, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -789,6 +796,7 @@ "destination.bytes": 221, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -896,6 +904,7 @@ "destination.bytes": 166, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1004,6 +1013,7 @@ "destination.bytes": 722, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1111,6 +1121,7 @@ "destination.geo.city_name": "Seattle", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 47.6109, "destination.geo.location.lon": -122.3303, "destination.geo.region_iso_code": "US-WA", @@ -1217,6 +1228,7 @@ "destination.bytes": 313, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1322,6 +1334,7 @@ "destination.bytes": 180, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", "destination.geo.location.lat": 48.8582, "destination.geo.location.lon": 2.3387, "destination.ip": "9.9.9.9", @@ -1428,6 +1441,7 @@ "destination.bytes": 108, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", "destination.geo.location.lat": 48.8582, "destination.geo.location.lon": 2.3387, "destination.ip": "9.9.9.9", @@ -1535,6 +1549,7 @@ "destination.bytes": 162, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", "destination.geo.location.lat": 48.8582, "destination.geo.location.lon": 2.3387, "destination.ip": "9.9.9.9", @@ -1643,6 +1658,7 @@ "destination.bytes": 199, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1749,6 +1765,7 @@ "destination.bytes": 166, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1855,6 +1872,7 @@ "destination.bytes": 166, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1961,6 +1979,7 @@ "destination.bytes": 221, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -2066,6 +2085,7 @@ "destination.bytes": 131, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -2173,6 +2193,7 @@ "destination.bytes": 722, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", diff --git a/x-pack/filebeat/module/cisco/ftd/test/security-connection.log-expected.json b/x-pack/filebeat/module/cisco/ftd/test/security-connection.log-expected.json index 3cef5df9a0f..7490bc1ac57 100644 --- a/x-pack/filebeat/module/cisco/ftd/test/security-connection.log-expected.json +++ b/x-pack/filebeat/module/cisco/ftd/test/security-connection.log-expected.json @@ -217,6 +217,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -321,6 +322,7 @@ "destination.bytes": 314, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -422,6 +424,7 @@ "destination.geo.city_name": "Frankfurt am Main", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 50.1188, "destination.geo.location.lon": 8.6843, "destination.geo.region_iso_code": "DE-HE", @@ -526,6 +529,7 @@ "destination.geo.city_name": "Frankfurt am Main", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 50.1188, "destination.geo.location.lon": 8.6843, "destination.geo.region_iso_code": "DE-HE", @@ -633,6 +637,7 @@ "destination.geo.city_name": "Magdeburg", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 52.1333, "destination.geo.location.lon": 11.6167, "destination.geo.region_iso_code": "DE-ST", @@ -736,6 +741,7 @@ "destination.geo.city_name": "Magdeburg", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 52.1333, "destination.geo.location.lon": 11.6167, "destination.geo.region_iso_code": "DE-ST", diff --git a/x-pack/filebeat/module/cisco/ftd/test/security-file-malware.log-expected.json b/x-pack/filebeat/module/cisco/ftd/test/security-file-malware.log-expected.json index 8ab3e55fc87..135a2979210 100644 --- a/x-pack/filebeat/module/cisco/ftd/test/security-file-malware.log-expected.json +++ b/x-pack/filebeat/module/cisco/ftd/test/security-file-malware.log-expected.json @@ -581,6 +581,7 @@ "destination.geo.city_name": "Magdeburg", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 52.1333, "destination.geo.location.lon": 11.6167, "destination.geo.region_iso_code": "DE-ST", @@ -763,6 +764,7 @@ "destination.geo.city_name": "Frankfurt am Main", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 50.1188, "destination.geo.location.lon": 8.6843, "destination.geo.region_iso_code": "DE-HE", diff --git a/x-pack/filebeat/module/cisco/ftd/test/security-malware-site.log-expected.json b/x-pack/filebeat/module/cisco/ftd/test/security-malware-site.log-expected.json index 73ab6378da1..0b669eb5dff 100644 --- a/x-pack/filebeat/module/cisco/ftd/test/security-malware-site.log-expected.json +++ b/x-pack/filebeat/module/cisco/ftd/test/security-malware-site.log-expected.json @@ -44,6 +44,7 @@ "destination.bytes": 246, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", "destination.geo.location.lat": 48.8582, "destination.geo.location.lon": 2.3387, "destination.ip": "2.2.2.2", @@ -102,6 +103,7 @@ "source.geo.city_name": "Seattle", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 47.6348, "source.geo.location.lon": -122.3451, "source.geo.region_iso_code": "US-WA", diff --git a/x-pack/filebeat/module/cisco/ios/test/cisco-ios-syslog.log-expected.json b/x-pack/filebeat/module/cisco/ios/test/cisco-ios-syslog.log-expected.json index 3485b3ff583..0695d3730aa 100644 --- a/x-pack/filebeat/module/cisco/ios/test/cisco-ios-syslog.log-expected.json +++ b/x-pack/filebeat/module/cisco/ios/test/cisco-ios-syslog.log-expected.json @@ -331,6 +331,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.10.46", @@ -828,6 +829,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.10.46", @@ -1022,6 +1024,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.10.46", @@ -1122,6 +1125,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1210,6 +1214,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "8.8.8.8", @@ -1296,6 +1301,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.10.46", @@ -1537,6 +1543,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.10.46", diff --git a/x-pack/filebeat/module/cisco/meraki/test/generated.log-expected.json b/x-pack/filebeat/module/cisco/meraki/test/generated.log-expected.json index beeffa9b5eb..93b25705912 100644 --- a/x-pack/filebeat/module/cisco/meraki/test/generated.log-expected.json +++ b/x-pack/filebeat/module/cisco/meraki/test/generated.log-expected.json @@ -122,8 +122,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.155.236.240", - "10.112.46.169" + "10.112.46.169", + "10.155.236.240" ], "rsa.internal.messageid": "flows", "rsa.misc.action": [ @@ -345,8 +345,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.134.0.141", - "10.210.213.18" + "10.210.213.18", + "10.134.0.141" ], "rsa.internal.event_desc": "atquovosecurity_event iumto", "rsa.internal.messageid": "security_event", @@ -519,8 +519,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.85.10.165", - "10.53.150.119" + "10.53.150.119", + "10.85.10.165" ], "rsa.internal.messageid": "events", "rsa.misc.event_source": "appliance", @@ -623,8 +623,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.205.47.51", - "10.219.84.37" + "10.219.84.37", + "10.205.47.51" ], "rsa.internal.messageid": "events", "rsa.misc.event_source": "appliance", @@ -831,8 +831,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.31.77.157", - "10.12.182.70" + "10.12.182.70", + "10.31.77.157" ], "rsa.internal.event_desc": "uiac security_event epte", "rsa.internal.messageid": "security_event", @@ -896,8 +896,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.135.217.12", - "10.93.68.231" + "10.93.68.231", + "10.135.217.12" ], "rsa.internal.messageid": "flows", "rsa.misc.action": [ @@ -960,8 +960,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.247.30.212", - "10.66.89.5" + "10.66.89.5", + "10.247.30.212" ], "rsa.internal.messageid": "flows", "rsa.misc.action": [ @@ -1064,8 +1064,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.54.37.86", - "10.58.64.108" + "10.58.64.108", + "10.54.37.86" ], "rsa.internal.messageid": "ids-alerts", "rsa.misc.event_type": "ids-alerts", @@ -1142,8 +1142,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.183.44.198", - "10.0.200.27" + "10.0.200.27", + "10.183.44.198" ], "rsa.internal.event_desc": "uradi security_event tot", "rsa.internal.messageid": "security_event", @@ -1177,8 +1177,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.148.124.84", - "10.28.144.180" + "10.28.144.180", + "10.148.124.84" ], "rsa.internal.messageid": "events", "rsa.misc.event_source": "appliance", @@ -1215,8 +1215,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.98.194.212", - "10.204.230.166" + "10.204.230.166", + "10.98.194.212" ], "rsa.counters.dclass_r1": "enimadmi", "rsa.internal.messageid": "events", @@ -1312,8 +1312,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.150.245.88", - "10.242.77.170" + "10.242.77.170", + "10.150.245.88" ], "rsa.internal.messageid": "ids-alerts", "rsa.misc.event_type": "ids-alerts", @@ -1447,8 +1447,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.230.6.127", - "10.111.157.56" + "10.111.157.56", + "10.230.6.127" ], "rsa.internal.messageid": "flows", "rsa.misc.action": [ @@ -1486,8 +1486,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.179.40.170", - "10.193.219.34" + "10.193.219.34", + "10.179.40.170" ], "rsa.counters.dclass_r1": "emip", "rsa.internal.messageid": "events", @@ -1638,8 +1638,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.124.63.4", - "10.90.99.245" + "10.90.99.245", + "10.124.63.4" ], "rsa.internal.event_desc": "etconsec", "rsa.internal.messageid": "security_event", @@ -1733,8 +1733,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.196.96.162", - "10.81.234.34" + "10.81.234.34", + "10.196.96.162" ], "rsa.internal.event_desc": "Utenima security_event iqua", "rsa.internal.messageid": "security_event", @@ -1903,8 +1903,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.86.188.179", - "10.201.168.116" + "10.201.168.116", + "10.86.188.179" ], "rsa.internal.messageid": "events", "rsa.misc.event_source": "appliance", @@ -2011,8 +2011,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.120.4.9", - "10.97.46.16" + "10.97.46.16", + "10.120.4.9" ], "rsa.internal.messageid": "ids-alerts", "rsa.misc.event_type": "ids-alerts", @@ -2084,8 +2084,8 @@ "uames4985.mail.localdomain" ], "related.ip": [ - "10.150.163.151", - "10.144.57.239" + "10.144.57.239", + "10.150.163.151" ], "rsa.internal.messageid": "events", "rsa.misc.event_source": "appliance", @@ -2126,8 +2126,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.54.44.231", - "10.52.202.158" + "10.52.202.158", + "10.54.44.231" ], "rsa.internal.messageid": "ids-alerts", "rsa.misc.event_type": "ids-alerts", @@ -2252,8 +2252,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.2.110.73", - "10.103.49.129" + "10.103.49.129", + "10.2.110.73" ], "rsa.counters.dclass_r1": "orumS", "rsa.internal.messageid": "events", @@ -2292,8 +2292,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.132.176.96", - "10.158.61.228" + "10.158.61.228", + "10.132.176.96" ], "rsa.counters.dclass_r1": "eserun", "rsa.internal.messageid": "events", @@ -2333,8 +2333,8 @@ "lors2232.api.example" ], "related.ip": [ - "10.46.217.155", - "10.105.136.146" + "10.105.136.146", + "10.46.217.155" ], "rsa.internal.messageid": "events", "rsa.misc.event_source": "appliance", @@ -2374,8 +2374,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.123.62.215", - "10.245.199.23" + "10.245.199.23", + "10.123.62.215" ], "rsa.db.index": "iusmodt", "rsa.internal.messageid": "flows", @@ -2480,8 +2480,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.246.152.72", - "10.34.62.190" + "10.34.62.190", + "10.246.152.72" ], "rsa.internal.event_desc": "Nem", "rsa.internal.messageid": "security_event", @@ -2758,8 +2758,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.65.0.157", - "10.17.111.91" + "10.17.111.91", + "10.65.0.157" ], "rsa.db.index": "nostrum", "rsa.internal.messageid": "flows", @@ -2893,8 +2893,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.199.103.185", - "10.51.121.223" + "10.51.121.223", + "10.199.103.185" ], "rsa.internal.event_desc": "dipi security_event ecatc", "rsa.internal.messageid": "security_event", @@ -2988,8 +2988,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.113.152.241", - "10.121.37.244" + "10.121.37.244", + "10.113.152.241" ], "rsa.internal.messageid": "flows", "rsa.misc.action": [ @@ -3067,8 +3067,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.200.98.243", - "10.101.13.122" + "10.101.13.122", + "10.200.98.243" ], "rsa.counters.dclass_r1": "uteirur", "rsa.internal.messageid": "events", @@ -3143,8 +3143,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.147.165.30", - "10.195.90.73" + "10.195.90.73", + "10.147.165.30" ], "rsa.internal.messageid": "ids-alerts", "rsa.misc.event_type": "ids-alerts", @@ -3206,8 +3206,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.162.202.14", - "10.137.166.97" + "10.137.166.97", + "10.162.202.14" ], "rsa.internal.messageid": "ids-alerts", "rsa.misc.event_type": "ids-alerts", @@ -3330,8 +3330,8 @@ "observer.type": "Wireless", "observer.vendor": "Cisco", "related.ip": [ - "10.75.122.111", - "10.85.59.172" + "10.85.59.172", + "10.75.122.111" ], "rsa.counters.dclass_r1": "sequat", "rsa.internal.messageid": "events", diff --git a/x-pack/filebeat/module/citrix/netscaler/test/generated.log-expected.json b/x-pack/filebeat/module/citrix/netscaler/test/generated.log-expected.json index cb772d91268..837f7b744a7 100644 --- a/x-pack/filebeat/module/citrix/netscaler/test/generated.log-expected.json +++ b/x-pack/filebeat/module/citrix/netscaler/test/generated.log-expected.json @@ -101,8 +101,8 @@ "observer.type": "Firewall", "observer.vendor": "Citrix", "related.ip": [ - "10.72.11.247", - "10.134.175.248" + "10.134.175.248", + "10.72.11.247" ], "rsa.counters.dclass_c1": 1279, "rsa.db.index": "antium", @@ -185,10 +185,10 @@ "observer.vendor": "Citrix", "related.ip": [ "10.96.119.12", + "10.156.210.168", "10.21.92.218", - "10.83.234.60", "10.109.68.21", - "10.156.210.168" + "10.83.234.60" ], "related.user": [ "picia" @@ -1332,11 +1332,11 @@ "observer.type": "Firewall", "observer.vendor": "Citrix", "related.ip": [ - "10.45.114.111", - "10.180.83.140", - "10.243.226.122", "10.117.94.131", - "10.3.23.172" + "10.180.83.140", + "10.3.23.172", + "10.45.114.111", + "10.243.226.122" ], "related.user": [ "ehender" @@ -2085,8 +2085,8 @@ "observer.vendor": "Citrix", "related.ip": [ "10.225.146.5", - "10.41.65.89", - "10.80.5.101" + "10.80.5.101", + "10.41.65.89" ], "related.user": [ "picia" @@ -2209,8 +2209,8 @@ "observer.vendor": "Citrix", "related.ip": [ "10.33.231.173", - "10.183.26.222", - "10.22.34.206" + "10.22.34.206", + "10.183.26.222" ], "related.user": [ "abill" @@ -2585,10 +2585,10 @@ "observer.vendor": "Citrix", "related.ip": [ "10.148.244.55", + "10.76.129.136", "10.133.153.174", - "10.8.82.22", "10.113.135.78", - "10.76.129.136" + "10.8.82.22" ], "related.user": [ "asiar" @@ -2662,8 +2662,8 @@ "rsa.db.index": "aturE", "rsa.internal.messageid": "APPFW_REFERER_HEADER", "rsa.misc.action": [ - "remip", - "cancel" + "cancel", + "remip" ], "rsa.misc.policy_name": "oNemoeni", "rsa.misc.rule": "citation", @@ -2938,9 +2938,9 @@ "observer.vendor": "Citrix", "related.ip": [ "10.29.202.248", - "10.161.218.47", + "10.206.5.50", "10.247.251.223", - "10.206.5.50" + "10.161.218.47" ], "rsa.internal.event_desc": "A Server side and a Client side TCP connection is delinked. This is not tracked by Netscaler", "rsa.internal.messageid": "TCP_OTHERCONN_DELINK", @@ -3076,8 +3076,8 @@ "observer.type": "Firewall", "observer.vendor": "Citrix", "related.ip": [ - "10.148.72.78", - "10.37.99.189" + "10.37.99.189", + "10.148.72.78" ], "rsa.crypto.cipher_src": "ritatis", "rsa.crypto.ssl_ver_src": "ugitsed", diff --git a/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json b/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json index 2bf31b06a52..4056ed473ca 100644 --- a/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json +++ b/x-pack/filebeat/module/cyberark/corepas/test/generated.log-expected.json @@ -20,9 +20,9 @@ "10.208.15.216" ], "related.user": [ - "quasiarc", "itv", - "utl" + "utl", + "quasiarc" ], "rsa.db.index": "nes", "rsa.internal.event_desc": "pexe", @@ -71,9 +71,9 @@ "10.175.75.18" ], "related.user": [ + "dolore", "nnumqu", - "orev", - "dolore" + "orev" ], "rsa.db.database": "umdo", "rsa.db.index": "vol", @@ -130,8 +130,8 @@ "anti4454.api.example" ], "related.ip": [ - "10.51.132.10", - "10.46.185.46" + "10.46.185.46", + "10.51.132.10" ], "related.user": [ "incid", @@ -197,9 +197,9 @@ "10.53.192.140" ], "related.user": [ - "psumquia", + "atcup", "ptass", - "atcup" + "psumquia" ], "rsa.db.database": "aperi", "rsa.db.index": "llumd", @@ -253,9 +253,9 @@ "10.81.199.122" ], "related.user": [ - "oremips", + "eos", "giatq", - "eos" + "oremips" ], "rsa.db.index": "tempo", "rsa.internal.event_desc": "uian", @@ -300,13 +300,13 @@ "temq1198.internal.example" ], "related.ip": [ - "10.139.186.201", - "10.172.14.142" + "10.172.14.142", + "10.139.186.201" ], "related.user": [ + "uam", "tcupida", - "aboris", - "uam" + "aboris" ], "rsa.db.database": "isiu", "rsa.db.index": "iatisu", @@ -363,13 +363,13 @@ "tenbyCic5882.api.home" ], "related.ip": [ - "10.104.111.129", - "10.47.76.251" + "10.47.76.251", + "10.104.111.129" ], "related.user": [ - "ele", "etconsec", - "ipis" + "ipis", + "ele" ], "rsa.db.database": "riat", "rsa.db.index": "umdolor", @@ -423,9 +423,9 @@ "10.116.120.216" ], "related.user": [ + "quiratio", "umdo", - "animi", - "quiratio" + "animi" ], "rsa.db.index": "oll", "rsa.internal.event_desc": "rumet", @@ -474,9 +474,9 @@ "10.62.54.220" ], "related.user": [ - "taevi", "psum", - "rnatura" + "rnatura", + "taevi" ], "rsa.db.database": "emeumfug", "rsa.db.index": "omn", @@ -530,9 +530,9 @@ "10.74.237.180" ], "related.user": [ - "tnon", "ema", - "cup" + "cup", + "tnon" ], "rsa.db.index": "remeumf", "rsa.internal.event_desc": "lup", @@ -574,8 +574,8 @@ "10.18.165.35" ], "related.user": [ - "modocons", "remeum", + "modocons", "lor" ], "rsa.db.index": "etM", @@ -618,9 +618,9 @@ "10.74.253.127" ], "related.user": [ + "onproide", "icab", - "tema", - "onproide" + "tema" ], "rsa.db.index": "mqui", "rsa.internal.event_desc": "eomnisis", @@ -664,8 +664,8 @@ "tlabo6088.www.localdomain" ], "related.ip": [ - "10.92.8.15", - "10.189.109.245" + "10.189.109.245", + "10.92.8.15" ], "related.user": [ "inima", @@ -722,9 +722,9 @@ "10.21.78.128" ], "related.user": [ - "upt", + "giatquov", "taut", - "giatquov" + "upt" ], "rsa.db.index": "iadese", "rsa.internal.event_desc": "deFinibu", @@ -766,9 +766,9 @@ "10.18.109.121" ], "related.user": [ - "pida", "hil", - "tatn" + "tatn", + "pida" ], "rsa.db.index": "quip", "rsa.internal.event_desc": "ecillu", @@ -813,13 +813,13 @@ "iavolu5352.localhost" ], "related.ip": [ - "10.63.37.192", - "10.225.115.13" + "10.225.115.13", + "10.63.37.192" ], "related.user": [ "iunt", - "reetd", - "equep" + "equep", + "reetd" ], "rsa.db.database": "aliqu", "rsa.db.index": "mipsumd", @@ -876,13 +876,13 @@ "estiae3750.api.corp" ], "related.ip": [ - "10.47.202.102", - "10.95.64.124" + "10.95.64.124", + "10.47.202.102" ], "related.user": [ "run", - "ice", - "ntor" + "ntor", + "ice" ], "rsa.db.database": "ite", "rsa.db.index": "iquipex", @@ -999,13 +999,13 @@ "etMalor4236.www5.host" ], "related.ip": [ - "10.53.168.235", - "10.125.160.129" + "10.125.160.129", + "10.53.168.235" ], "related.user": [ "abi", - "one", - "ione" + "ione", + "one" ], "rsa.db.database": "sperna", "rsa.db.index": "estia", @@ -1066,9 +1066,9 @@ "10.227.177.121" ], "related.user": [ - "iduntu", "liqui", - "tasuntex" + "tasuntex", + "iduntu" ], "rsa.db.database": "rvel", "rsa.db.index": "onsecte", @@ -1129,8 +1129,8 @@ "nsecte3304.mail.corp" ], "related.ip": [ - "10.98.182.220", - "10.167.85.181" + "10.167.85.181", + "10.98.182.220" ], "related.user": [ "fde", @@ -1189,9 +1189,9 @@ "10.89.208.95" ], "related.user": [ + "iciadese", "icabo", - "sintoc", - "iciadese" + "sintoc" ], "rsa.db.index": "eni", "rsa.internal.event_desc": "rcitati", @@ -1236,13 +1236,13 @@ "nevo4284.internal.local" ], "related.ip": [ - "10.72.148.32", - "10.214.191.180" + "10.214.191.180", + "10.72.148.32" ], "related.user": [ + "uteirure", "tDuisaut", - "luptatev", - "uteirure" + "luptatev" ], "rsa.db.database": "uamest", "rsa.db.index": "uae", @@ -1299,13 +1299,13 @@ "itas981.mail.domain" ], "related.ip": [ - "10.252.124.150", - "10.136.190.236" + "10.136.190.236", + "10.252.124.150" ], "related.user": [ - "ipsumd", + "com", "litessec", - "com" + "ipsumd" ], "rsa.db.database": "tasn", "rsa.db.index": "squirati", @@ -1424,12 +1424,12 @@ "rQuisau5300.www5.example" ], "related.ip": [ - "10.154.4.197", - "10.216.84.30" + "10.216.84.30", + "10.154.4.197" ], "related.user": [ - "untu", - "intoc" + "intoc", + "untu" ], "rsa.db.database": "oditem", "rsa.db.index": "borios", @@ -1529,13 +1529,13 @@ "uamei2389.internal.example" ], "related.ip": [ - "10.65.175.9", - "10.193.83.81" + "10.193.83.81", + "10.65.175.9" ], "related.user": [ - "umqu", "ritatise", - "essequam" + "essequam", + "umqu" ], "rsa.db.database": "ender", "rsa.db.index": "entorev", @@ -1589,9 +1589,9 @@ "10.205.72.243" ], "related.user": [ - "umdolo", "isiuta", - "tatn" + "tatn", + "umdolo" ], "rsa.db.index": "proide", "rsa.internal.event_desc": "ameiusm", @@ -1633,8 +1633,8 @@ "10.107.9.163" ], "related.user": [ - "mquisno", "sit", + "mquisno", "mac" ], "rsa.db.index": "sit", @@ -1677,9 +1677,9 @@ "10.80.101.72" ], "related.user": [ - "asiarc", + "umSe", "quidexea", - "umSe" + "asiarc" ], "rsa.db.index": "veli", "rsa.internal.event_desc": "quatu", @@ -1728,8 +1728,8 @@ "10.39.10.155" ], "related.user": [ - "aboreetd", "urExcept", + "aboreetd", "ptass" ], "rsa.db.database": "teirured", @@ -1828,9 +1828,9 @@ "10.71.238.250" ], "related.user": [ - "reseo", + "moenimi", "aec", - "moenimi" + "reseo" ], "rsa.db.index": "mac", "rsa.internal.event_desc": "quamest", @@ -1875,13 +1875,13 @@ "rum5798.home" ], "related.ip": [ - "10.226.101.180", - "10.226.20.199" + "10.226.20.199", + "10.226.101.180" ], "related.user": [ + "ritt", "rationev", - "veniamqu", - "ritt" + "veniamqu" ], "rsa.db.database": "conse", "rsa.db.index": "imveniam", @@ -1944,8 +1944,8 @@ ], "related.user": [ "quaUten", - "cab", - "utaliqu" + "utaliqu", + "cab" ], "rsa.db.database": "isciv", "rsa.db.index": "nofd", @@ -2002,9 +2002,9 @@ "10.70.147.120" ], "related.user": [ + "cidunt", "tten", - "emqu", - "cidunt" + "emqu" ], "rsa.db.index": "eaqu", "rsa.internal.event_desc": "quidol", @@ -2049,12 +2049,12 @@ "tesse1089.www.host" ], "related.ip": [ - "10.178.242.100", - "10.24.111.229" + "10.24.111.229", + "10.178.242.100" ], "related.user": [ - "loi", "dqu", + "loi", "idid" ], "rsa.db.database": "tenatuse", @@ -2110,8 +2110,8 @@ ], "related.user": [ "ritati", - "mmodoc", - "untincul" + "untincul", + "mmodoc" ], "rsa.db.index": "emvele", "rsa.internal.event_desc": "oluptas", @@ -2153,9 +2153,9 @@ "10.30.243.163" ], "related.user": [ + "illu", "mven", - "dolore", - "illu" + "dolore" ], "rsa.db.index": "idol", "rsa.internal.event_desc": "lore", @@ -2204,9 +2204,9 @@ "10.6.79.159" ], "related.user": [ - "midestl", + "amvo", "quid", - "amvo" + "midestl" ], "rsa.db.database": "urExce", "rsa.db.index": "ectiono", @@ -2263,13 +2263,13 @@ "aecatcup2241.www5.test" ], "related.ip": [ - "10.237.170.202", - "10.70.147.46" + "10.70.147.46", + "10.237.170.202" ], "related.user": [ "liquide", - "atDu", - "rcit" + "rcit", + "atDu" ], "rsa.db.database": "taedict", "rsa.db.index": "loremeu", @@ -2326,13 +2326,13 @@ "mad5185.www5.localhost" ], "related.ip": [ - "10.228.118.81", - "10.179.50.138" + "10.179.50.138", + "10.228.118.81" ], "related.user": [ "emoe", - "itasper", - "tatemU" + "tatemU", + "itasper" ], "rsa.db.database": "toditaut", "rsa.db.index": "ugit", @@ -2393,9 +2393,9 @@ "10.234.165.130" ], "related.user": [ + "henderit", "emip", - "iuntNequ", - "henderit" + "iuntNequ" ], "rsa.db.database": "veniamqu", "rsa.db.index": "atquo", @@ -2449,8 +2449,8 @@ "10.199.5.49" ], "related.user": [ - "turadipi", "emip", + "turadipi", "olorema" ], "rsa.db.index": "ataevi", @@ -2544,9 +2544,9 @@ "10.120.167.217" ], "related.user": [ - "animid", "dolorem", - "rsp" + "rsp", + "animid" ], "rsa.db.database": "tsuntinc", "rsa.db.index": "quovo", @@ -2603,13 +2603,13 @@ "mporainc2064.home" ], "related.ip": [ - "10.117.137.159", - "10.141.213.219" + "10.141.213.219", + "10.117.137.159" ], "related.user": [ "accusa", - "ate", - "atev" + "atev", + "ate" ], "rsa.db.database": "nibus", "rsa.db.index": "ser", @@ -2671,8 +2671,8 @@ ], "related.user": [ "eavol", - "rem", - "etconsec" + "etconsec", + "rem" ], "rsa.db.database": "oditempo", "rsa.db.index": "deF", @@ -2735,8 +2735,8 @@ "10.38.28.151" ], "related.user": [ - "tiumto", "incidid", + "tiumto", "mipsumqu" ], "rsa.db.database": "abor", @@ -2796,13 +2796,13 @@ "dolori6232.api.invalid" ], "related.ip": [ - "10.255.28.56", - "10.214.245.95" + "10.214.245.95", + "10.255.28.56" ], "related.user": [ "umdolors", - "uptatem", - "rerepre" + "rerepre", + "uptatem" ], "rsa.db.database": "odt", "rsa.db.index": "riosa", @@ -2856,8 +2856,8 @@ "10.45.35.180" ], "related.user": [ - "mip", "Utenima", + "mip", "qui" ], "rsa.db.index": "boree", @@ -2900,9 +2900,9 @@ "10.141.200.133" ], "related.user": [ - "enim", "iame", - "ess" + "ess", + "enim" ], "rsa.db.index": "nofdeFi", "rsa.internal.event_desc": "isnostru", @@ -2944,9 +2944,9 @@ "10.83.238.145" ], "related.user": [ - "ugi", + "runtmo", "illoi", - "runtmo" + "ugi" ], "rsa.db.index": "eetdo", "rsa.internal.event_desc": "quaer", @@ -2995,9 +2995,9 @@ "10.39.143.155" ], "related.user": [ + "sedquiac", "tem", - "tperspic", - "sedquiac" + "tperspic" ], "rsa.db.database": "radipis", "rsa.db.index": "nse", @@ -3059,8 +3059,8 @@ ], "related.user": [ "minim", - "unt", - "CSe" + "CSe", + "unt" ], "rsa.db.database": "atu", "rsa.db.index": "roi", @@ -3117,13 +3117,13 @@ "olu5333.www.domain" ], "related.ip": [ - "10.168.132.175", - "10.210.61.109" + "10.210.61.109", + "10.168.132.175" ], "related.user": [ + "eursinto", "giatquov", - "iamea", - "eursinto" + "iamea" ], "rsa.db.database": "ici", "rsa.db.index": "iquaUt", @@ -3223,8 +3223,8 @@ ], "related.user": [ "oeni", - "etquasia", - "xplic" + "xplic", + "etquasia" ], "rsa.db.index": "hend", "rsa.internal.event_desc": "piscivel", @@ -3271,8 +3271,8 @@ ], "related.user": [ "rsitvol", - "iati", - "Nemoenim" + "Nemoenim", + "iati" ], "rsa.db.index": "eFini", "rsa.internal.event_desc": "acom", @@ -3322,8 +3322,8 @@ ], "related.user": [ "orissu", - "eufug", - "ine" + "ine", + "eufug" ], "rsa.db.database": "stquidol", "rsa.db.index": "imadmini", @@ -3377,9 +3377,9 @@ "10.70.83.200" ], "related.user": [ - "ihilmole", + "metco", "riat", - "metco" + "ihilmole" ], "rsa.db.index": "urQuis", "rsa.internal.event_desc": "iutaliq", @@ -3491,9 +3491,9 @@ "10.52.150.104" ], "related.user": [ - "texplica", "eritq", - "oinBCSed" + "oinBCSed", + "texplica" ], "rsa.db.database": "lit", "rsa.db.index": "ritati", @@ -3554,9 +3554,9 @@ "10.61.175.217" ], "related.user": [ + "runtm", "ntexpl", - "tat", - "runtm" + "tat" ], "rsa.db.database": "rere", "rsa.db.index": "nonn", @@ -3610,9 +3610,9 @@ "10.150.30.95" ], "related.user": [ - "atnonpr", + "mini", "uisnos", - "mini" + "atnonpr" ], "rsa.db.index": "smod", "rsa.internal.event_desc": "isn", @@ -3654,8 +3654,8 @@ "10.98.71.45" ], "related.user": [ - "CSe", "fugitse", + "CSe", "onse" ], "rsa.db.index": "Dui", @@ -3698,9 +3698,9 @@ "10.252.251.143" ], "related.user": [ + "nonn", "remq", - "rspic", - "nonn" + "rspic" ], "rsa.db.index": "nre", "rsa.internal.event_desc": "tev", @@ -3742,8 +3742,8 @@ "10.197.203.167" ], "related.user": [ - "uta", "iumdo", + "uta", "eserun" ], "rsa.db.index": "smo", @@ -3786,9 +3786,9 @@ "10.187.170.23" ], "related.user": [ + "ibusBo", "sectetu", - "enima", - "ibusBo" + "enima" ], "rsa.db.index": "uido", "rsa.internal.event_desc": "lab", @@ -3833,13 +3833,13 @@ "involu1450.www.localhost" ], "related.ip": [ - "10.250.248.215", - "10.123.62.215" + "10.123.62.215", + "10.250.248.215" ], "related.user": [ "aevitaed", - "quaeratv", - "tinculpa" + "tinculpa", + "quaeratv" ], "rsa.db.database": "lica", "rsa.db.index": "uisnos", @@ -3997,9 +3997,9 @@ "10.154.172.82" ], "related.user": [ + "onnumqua", "nesci", - "tetura", - "onnumqua" + "tetura" ], "rsa.db.index": "oinBCSed", "rsa.internal.event_desc": "ntor", @@ -4041,9 +4041,9 @@ "10.47.63.70" ], "related.user": [ - "expl", "tpers", - "midestl" + "midestl", + "expl" ], "rsa.db.index": "olu", "rsa.internal.event_desc": "odocons", @@ -4085,9 +4085,9 @@ "10.178.160.245" ], "related.user": [ + "fdeFinib", "turQuis", - "olupta", - "fdeFinib" + "olupta" ], "rsa.db.index": "rsint", "rsa.internal.event_desc": "odico", @@ -4195,13 +4195,13 @@ "nimve2787.mail.test" ], "related.ip": [ - "10.222.32.183", - "10.65.207.234" + "10.65.207.234", + "10.222.32.183" ], "related.user": [ + "eve", "itame", - "eruntmo", - "eve" + "eruntmo" ], "rsa.db.database": "udexerc", "rsa.db.index": "volup", @@ -4255,8 +4255,8 @@ "10.16.181.60" ], "related.user": [ - "oinven", "gnama", + "oinven", "olore" ], "rsa.db.index": "uatu", @@ -4299,9 +4299,9 @@ "10.91.213.82" ], "related.user": [ - "illoin", "amnis", - "uianon" + "uianon", + "illoin" ], "rsa.db.index": "ons", "rsa.internal.event_desc": "temaccus", @@ -4343,9 +4343,9 @@ "10.204.214.98" ], "related.user": [ + "porissus", "tdolo", - "eprehe", - "porissus" + "eprehe" ], "rsa.db.index": "abo", "rsa.internal.event_desc": "ecte", @@ -4388,8 +4388,8 @@ ], "related.user": [ "etc", - "moenimip", - "evel" + "evel", + "moenimip" ], "rsa.db.index": "iarchit", "rsa.internal.event_desc": "apari", @@ -4434,13 +4434,13 @@ "ama6820.mail.example" ], "related.ip": [ - "10.26.33.181", - "10.26.137.126" + "10.26.137.126", + "10.26.33.181" ], "related.user": [ - "audant", + "taevit", "ati", - "taevit" + "audant" ], "rsa.db.database": "com", "rsa.db.index": "mveni", @@ -4497,13 +4497,13 @@ "olupt966.www5.corp" ], "related.ip": [ - "10.142.161.116", - "10.148.195.208" + "10.148.195.208", + "10.142.161.116" ], "related.user": [ - "mpori", "isi", - "quaerat" + "quaerat", + "mpori" ], "rsa.db.database": "squamest", "rsa.db.index": "pteu", @@ -4560,13 +4560,13 @@ "lit4112.www.localhost" ], "related.ip": [ - "10.10.174.253", - "10.107.24.54" + "10.107.24.54", + "10.10.174.253" ], "related.user": [ - "hend", + "itinvo", "uptasn", - "itinvo" + "hend" ], "rsa.db.database": "lup", "rsa.db.index": "isau", @@ -4621,8 +4621,8 @@ "10.87.92.17" ], "related.user": [ - "tamr", "luptate", + "tamr", "eeufug" ], "rsa.db.index": "oreeufug", @@ -4672,13 +4672,13 @@ "dictasun3408.internal.invalid" ], "related.ip": [ - "10.161.51.135", - "10.231.51.136" + "10.231.51.136", + "10.161.51.135" ], "related.user": [ "Finibus", - "asper", - "accus" + "accus", + "asper" ], "rsa.db.database": "litani", "rsa.db.index": "arch", @@ -4732,9 +4732,9 @@ "10.51.17.32" ], "related.user": [ + "itten", "mquido", - "llum", - "itten" + "llum" ], "rsa.db.index": "uscipit", "rsa.internal.event_desc": "llitani", @@ -4776,9 +4776,9 @@ "10.108.123.148" ], "related.user": [ - "cusa", + "ollita", "mmodicon", - "ollita" + "cusa" ], "rsa.db.index": "ercitati", "rsa.internal.event_desc": "pteurs", @@ -4828,8 +4828,8 @@ "10.198.187.144" ], "related.user": [ - "rsitamet", "equatD", + "rsitamet", "ons" ], "rsa.db.database": "periam", @@ -4888,9 +4888,9 @@ "10.61.140.120" ], "related.user": [ - "naaliq", "loru", - "equa" + "equa", + "naaliq" ], "rsa.db.index": "umfugiat", "rsa.internal.event_desc": "ora", @@ -4939,9 +4939,9 @@ "10.93.24.151" ], "related.user": [ - "sequamn", "ite", - "nven" + "nven", + "sequamn" ], "rsa.db.database": "fugi", "rsa.db.index": "nesciu", @@ -4995,9 +4995,9 @@ "10.101.45.225" ], "related.user": [ - "cipitla", "emi", - "uinesc" + "uinesc", + "cipitla" ], "rsa.db.index": "caecat", "rsa.internal.event_desc": "tsunt", @@ -5088,9 +5088,9 @@ "10.33.112.100" ], "related.user": [ - "ptatemse", "aliqu", - "enimad" + "enimad", + "ptatemse" ], "rsa.db.index": "Except", "rsa.internal.event_desc": "cons", @@ -5135,12 +5135,12 @@ "isno4595.local" ], "related.ip": [ - "10.151.110.250", - "10.94.152.238" + "10.94.152.238", + "10.151.110.250" ], "related.user": [ - "tla", "neavol", + "tla", "pidatatn" ], "rsa.db.database": "itaedict", @@ -5198,13 +5198,13 @@ "tatemse5403.home" ], "related.ip": [ - "10.146.61.5", - "10.77.9.17" + "10.77.9.17", + "10.146.61.5" ], "related.user": [ - "tevel", "umS", - "alorumwr" + "alorumwr", + "tevel" ], "rsa.db.database": "amremap", "rsa.db.index": "aqu", @@ -5305,8 +5305,8 @@ "reprehe650.www.corp" ], "related.ip": [ - "10.200.162.248", - "10.31.86.83" + "10.31.86.83", + "10.200.162.248" ], "related.user": [ "onnu", diff --git a/x-pack/filebeat/module/envoyproxy/log/test/envoy-json.log-expected.json b/x-pack/filebeat/module/envoyproxy/log/test/envoy-json.log-expected.json index e6ca9516ad0..483625d8bea 100644 --- a/x-pack/filebeat/module/envoyproxy/log/test/envoy-json.log-expected.json +++ b/x-pack/filebeat/module/envoyproxy/log/test/envoy-json.log-expected.json @@ -7,6 +7,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", diff --git a/x-pack/filebeat/module/envoyproxy/log/test/envoy.log-expected.json b/x-pack/filebeat/module/envoyproxy/log/test/envoy.log-expected.json index 1c9482cefdb..703b5e977b3 100644 --- a/x-pack/filebeat/module/envoyproxy/log/test/envoy.log-expected.json +++ b/x-pack/filebeat/module/envoyproxy/log/test/envoy.log-expected.json @@ -140,6 +140,7 @@ "destination.as.organization.name": "Fastly", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "151.101.66.217", diff --git a/x-pack/filebeat/module/f5/bigipafm/test/generated.log-expected.json b/x-pack/filebeat/module/f5/bigipafm/test/generated.log-expected.json index d1729062282..13fe3560c05 100644 --- a/x-pack/filebeat/module/f5/bigipafm/test/generated.log-expected.json +++ b/x-pack/filebeat/module/f5/bigipafm/test/generated.log-expected.json @@ -24,10 +24,10 @@ "tatemac3541.api.corp" ], "related.ip": [ + "10.208.121.85", "10.165.201.71", - "10.228.193.207", "10.11.196.142", - "10.208.121.85" + "10.228.193.207" ], "related.user": [ "billoi" @@ -93,9 +93,9 @@ ], "related.ip": [ "10.51.132.10", - "10.162.9.235", + "10.92.202.200", "10.94.67.230", - "10.92.202.200" + "10.162.9.235" ], "related.user": [ "byC" @@ -228,9 +228,9 @@ ], "related.ip": [ "10.12.44.169", - "10.202.66.28", + "10.131.233.27", "10.50.112.141", - "10.131.233.27" + "10.202.66.28" ], "related.user": [ "elits" @@ -296,9 +296,9 @@ ], "related.ip": [ "10.159.182.171", + "10.206.197.113", "10.151.111.38", - "10.96.35.212", - "10.206.197.113" + "10.96.35.212" ], "related.user": [ "mol" @@ -365,8 +365,8 @@ "related.ip": [ "10.126.177.162", "10.213.113.28", - "10.169.144.147", - "10.89.163.114" + "10.89.163.114", + "10.169.144.147" ], "related.user": [ "ist" @@ -430,10 +430,10 @@ "ittenbyC7838.api.localdomain" ], "related.ip": [ - "10.101.223.43", - "10.18.124.28", + "10.146.88.52", "10.103.107.47", - "10.146.88.52" + "10.101.223.43", + "10.18.124.28" ], "related.user": [ "rudexerc" @@ -498,8 +498,8 @@ "ume465.corp" ], "related.ip": [ - "10.150.220.75", "10.189.109.245", + "10.150.220.75", "10.69.57.206", "10.110.99.17" ], @@ -565,8 +565,8 @@ "iciatisu1463.www5.localdomain" ], "related.ip": [ - "10.199.34.241", "10.121.219.204", + "10.199.34.241", "10.153.136.222", "10.19.194.101" ], @@ -632,9 +632,9 @@ "aliqu6801.api.localdomain" ], "related.ip": [ - "10.57.103.192", "10.64.141.105", "10.46.27.57", + "10.57.103.192", "10.182.199.231" ], "related.user": [ @@ -699,10 +699,10 @@ "itame189.domain" ], "related.ip": [ - "10.32.67.231", - "10.3.134.237", + "10.164.6.207", "10.160.210.31", - "10.164.6.207" + "10.3.134.237", + "10.32.67.231" ], "related.user": [ "pic" @@ -768,8 +768,8 @@ ], "related.ip": [ "10.42.138.192", - "10.201.6.10", "10.235.101.253", + "10.201.6.10", "10.182.178.217" ], "related.user": [ @@ -835,9 +835,9 @@ "stlabo1228.mail.host" ], "related.ip": [ - "10.86.101.235", - "10.194.247.171", "10.151.161.70", + "10.194.247.171", + "10.86.101.235", "10.22.102.198" ], "related.user": [ @@ -904,9 +904,9 @@ ], "related.ip": [ "10.174.252.105", - "10.204.35.15", + "10.167.172.155", "10.107.168.60", - "10.167.172.155" + "10.204.35.15" ], "related.user": [ "mnisi" @@ -971,9 +971,9 @@ ], "related.ip": [ "10.99.249.210", + "10.214.249.164", "10.182.191.174", - "10.81.26.208", - "10.214.249.164" + "10.81.26.208" ], "related.user": [ "upta" @@ -1037,9 +1037,9 @@ "sauteiru4554.api.domain" ], "related.ip": [ + "10.220.5.143", "10.88.101.53", "10.201.238.90", - "10.220.5.143", "10.101.226.128" ], "related.user": [ @@ -1104,10 +1104,10 @@ "untut4046.internal.domain" ], "related.ip": [ - "10.243.218.215", - "10.217.150.196", + "10.30.133.66", "10.157.18.252", - "10.30.133.66" + "10.243.218.215", + "10.217.150.196" ], "related.user": [ "evit" @@ -1171,10 +1171,10 @@ "quid3147.mail.home" ], "related.ip": [ - "10.167.227.44", "10.181.133.187", "10.148.161.250", - "10.66.181.6" + "10.66.181.6", + "10.167.227.44" ], "related.user": [ "adipisc" @@ -1239,10 +1239,10 @@ "umdolo1029.mail.localhost" ], "related.ip": [ - "10.74.11.43", - "10.54.17.32", "10.84.163.178", - "10.107.9.163" + "10.107.9.163", + "10.54.17.32", + "10.74.11.43" ], "related.user": [ "mquisno" @@ -1307,9 +1307,9 @@ ], "related.ip": [ "10.230.129.252", - "10.184.73.211", + "10.112.32.213", "10.192.229.221", - "10.112.32.213" + "10.184.73.211" ], "related.user": [ "odi" @@ -1374,10 +1374,10 @@ "paquioff624.mail.invalid" ], "related.ip": [ - "10.161.148.64", + "10.198.213.189", "10.199.216.143", - "10.7.200.140", - "10.198.213.189" + "10.161.148.64", + "10.7.200.140" ], "related.user": [ "ccaeca" @@ -1441,10 +1441,10 @@ "mex2054.mail.corp" ], "related.ip": [ + "10.65.232.27", "10.206.96.56", - "10.22.187.69", "10.128.157.27", - "10.65.232.27" + "10.22.187.69" ], "related.user": [ "uaeab" @@ -1509,9 +1509,9 @@ ], "related.ip": [ "10.194.210.62", - "10.68.253.120", "10.183.130.225", - "10.71.114.14" + "10.71.114.14", + "10.68.253.120" ], "related.user": [ "admin" @@ -1576,10 +1576,10 @@ "loi7596.www5.home" ], "related.ip": [ - "10.47.255.237", - "10.45.253.103", "10.107.45.175", - "10.31.177.226" + "10.31.177.226", + "10.47.255.237", + "10.45.253.103" ], "related.user": [ "remagn" @@ -1644,10 +1644,10 @@ "nsequat1971.internal.invalid" ], "related.ip": [ + "10.225.212.189", "10.44.58.106", - "10.55.105.113", "10.213.94.135", - "10.225.212.189" + "10.55.105.113" ], "related.user": [ "dquia" @@ -1711,9 +1711,9 @@ "ectiono2241.lan" ], "related.ip": [ - "10.255.74.136", "10.69.161.78", "10.163.209.70", + "10.255.74.136", "10.2.114.9" ], "related.user": [ @@ -1778,10 +1778,10 @@ "umetMal1664.mail.lan" ], "related.ip": [ - "10.46.115.216", - "10.252.102.110", + "10.184.59.148", "10.12.129.137", - "10.184.59.148" + "10.46.115.216", + "10.252.102.110" ], "related.user": [ "perspici" @@ -1848,8 +1848,8 @@ "related.ip": [ "10.81.184.7", "10.199.194.79", - "10.155.204.243", - "10.105.52.140" + "10.105.52.140", + "10.155.204.243" ], "related.user": [ "eetd" @@ -1916,8 +1916,8 @@ "related.ip": [ "10.251.231.142", "10.177.238.45", - "10.18.226.72", - "10.110.2.166" + "10.110.2.166", + "10.18.226.72" ], "related.user": [ "taliqui" @@ -1982,10 +1982,10 @@ "iutali7297.www.domain" ], "related.ip": [ + "10.192.98.247", "10.99.202.229", - "10.100.199.226", "10.190.122.27", - "10.192.98.247" + "10.100.199.226" ], "related.user": [ "lloinven" @@ -2050,10 +2050,10 @@ "orumw5960.www5.home" ], "related.ip": [ + "10.172.154.97", "10.248.111.207", - "10.162.97.197", "10.37.193.70", - "10.172.154.97" + "10.162.97.197" ], "related.user": [ "culpaq" @@ -2117,10 +2117,10 @@ "oinv5493.internal.domain" ], "related.ip": [ + "10.36.63.31", "10.171.221.230", "10.222.165.250", - "10.45.35.180", - "10.36.63.31" + "10.45.35.180" ], "related.user": [ "otamr" @@ -2184,9 +2184,9 @@ "tnonproi195.api.home" ], "related.ip": [ - "10.1.171.61", - "10.199.127.211", "10.83.238.145", + "10.199.127.211", + "10.1.171.61", "10.238.4.219" ], "related.user": [ @@ -2252,9 +2252,9 @@ ], "related.ip": [ "10.170.252.219", - "10.65.141.244", + "10.44.226.104", "10.74.213.42", - "10.44.226.104" + "10.65.141.244" ], "related.user": [ "Nequepo" @@ -2385,10 +2385,10 @@ "redo6311.api.invalid" ], "related.ip": [ - "10.176.64.28", + "10.169.123.103", "10.97.138.181", "10.205.174.181", - "10.169.123.103" + "10.176.64.28" ], "related.user": [ "eseruntm" @@ -2453,10 +2453,10 @@ "dolorem1698.www.domain" ], "related.ip": [ + "10.204.4.40", "10.75.120.11", - "10.169.101.161", "10.53.101.131", - "10.204.4.40" + "10.169.101.161" ], "related.user": [ "tquo" @@ -2521,10 +2521,10 @@ "evitae7333.www.lan" ], "related.ip": [ - "10.156.117.169", "10.28.51.219", - "10.6.222.112", - "10.87.120.87" + "10.156.117.169", + "10.87.120.87", + "10.6.222.112" ], "related.user": [ "onsequu" @@ -2589,9 +2589,9 @@ ], "related.ip": [ "10.247.44.59", + "10.4.126.103", "10.57.89.155", - "10.253.167.17", - "10.4.126.103" + "10.253.167.17" ], "related.user": [ "ntorever" @@ -2655,10 +2655,10 @@ "olorsi2746.internal.localhost" ], "related.ip": [ - "10.36.69.125", "10.15.240.220", + "10.143.183.208", "10.248.206.210", - "10.143.183.208" + "10.36.69.125" ], "related.user": [ "met" @@ -2724,8 +2724,8 @@ ], "related.ip": [ "10.69.170.107", - "10.6.32.7", "10.34.133.2", + "10.6.32.7", "10.142.186.43" ], "related.user": [ @@ -2791,10 +2791,10 @@ "ender5647.www5.example" ], "related.ip": [ - "10.59.103.10", - "10.170.165.164", "10.121.153.197", - "10.142.22.24" + "10.142.22.24", + "10.59.103.10", + "10.170.165.164" ], "related.user": [ "borumSec" @@ -2859,9 +2859,9 @@ "sis3986.internal.lan" ], "related.ip": [ - "10.19.99.129", - "10.247.114.30", "10.176.83.7", + "10.247.114.30", + "10.19.99.129", "10.133.10.122" ], "related.user": [ @@ -2927,10 +2927,10 @@ "uatu2894.api.lan" ], "related.ip": [ + "10.64.139.17", "10.70.7.23", - "10.40.177.138", "10.8.29.219", - "10.64.139.17" + "10.40.177.138" ], "related.user": [ "rep" @@ -2996,8 +2996,8 @@ "related.ip": [ "10.2.189.20", "10.67.221.220", - "10.67.173.228", - "10.180.62.222" + "10.180.62.222", + "10.67.173.228" ], "related.user": [ "uptasnul" @@ -3062,10 +3062,10 @@ "uian521.www.example" ], "related.ip": [ - "10.147.127.181", + "10.196.176.243", "10.209.52.47", "10.56.134.118", - "10.196.176.243" + "10.147.127.181" ], "related.user": [ "tasu" @@ -3130,9 +3130,9 @@ ], "related.ip": [ "10.226.24.84", - "10.248.140.59", + "10.85.13.237", "10.231.18.90", - "10.85.13.237" + "10.248.140.59" ], "related.user": [ "Nem" @@ -3197,10 +3197,10 @@ "ntsunt4894.mail.domain" ], "related.ip": [ - "10.59.215.207", - "10.207.183.204", + "10.203.46.215", "10.8.224.72", - "10.203.46.215" + "10.207.183.204", + "10.59.215.207" ], "related.user": [ "eruntmo" @@ -3265,10 +3265,10 @@ "mexer3864.api.corp" ], "related.ip": [ - "10.98.154.146", "10.73.84.95", + "10.255.145.22", "10.230.38.148", - "10.255.145.22" + "10.98.154.146" ], "related.user": [ "sitam" @@ -3332,10 +3332,10 @@ "oluptat6960.www5.test" ], "related.ip": [ - "10.166.142.198", "10.105.120.162", - "10.175.181.138", - "10.211.29.187" + "10.211.29.187", + "10.166.142.198", + "10.175.181.138" ], "related.user": [ "tium" @@ -3400,10 +3400,10 @@ "fugiatnu2498.www.localhost" ], "related.ip": [ - "10.182.213.195", - "10.195.139.25", "10.122.133.162", - "10.220.202.102" + "10.220.202.102", + "10.182.213.195", + "10.195.139.25" ], "related.user": [ "aquae" @@ -3535,10 +3535,10 @@ "exer447.internal.localhost" ], "related.ip": [ - "10.241.143.145", - "10.35.190.164", "10.21.58.162", - "10.113.65.192" + "10.35.190.164", + "10.113.65.192", + "10.241.143.145" ], "related.user": [ "porin" @@ -3672,9 +3672,9 @@ ], "related.ip": [ "10.150.153.61", - "10.22.213.196", + "10.125.150.220", "10.120.50.13", - "10.125.150.220" + "10.22.213.196" ], "related.user": [ "inculpa" @@ -3739,10 +3739,10 @@ "edquiaco6562.api.lan" ], "related.ip": [ + "10.113.2.13", "10.85.52.249", - "10.229.155.171", "10.238.171.184", - "10.113.2.13" + "10.229.155.171" ], "related.user": [ "tatiset" @@ -3808,9 +3808,9 @@ ], "related.ip": [ "10.249.174.35", + "10.198.150.185", "10.51.245.225", - "10.220.1.249", - "10.198.150.185" + "10.220.1.249" ], "related.user": [ "quela" @@ -3875,8 +3875,8 @@ "eosqui3723.api.localdomain" ], "related.ip": [ - "10.38.185.31", "10.251.82.195", + "10.38.185.31", "10.190.96.181", "10.152.157.32" ], @@ -3942,10 +3942,10 @@ "itaedict199.mail.corp" ], "related.ip": [ - "10.103.102.242", - "10.190.247.194", "10.230.112.179", - "10.211.198.50" + "10.211.198.50", + "10.103.102.242", + "10.190.247.194" ], "related.user": [ "tDuisaut" @@ -4010,9 +4010,9 @@ ], "related.ip": [ "10.219.83.199", + "10.251.101.61", "10.47.223.155", - "10.101.13.122", - "10.251.101.61" + "10.101.13.122" ], "related.user": [ "ectetur" @@ -4077,10 +4077,10 @@ "saute7421.www.invalid" ], "related.ip": [ + "10.83.136.233", "10.31.86.83", - "10.21.30.43", "10.21.80.157", - "10.83.136.233" + "10.21.30.43" ], "related.user": [ "litsed" @@ -4145,9 +4145,9 @@ "oluptas1637.home" ], "related.ip": [ - "10.27.181.27", "10.45.152.205", "10.194.197.107", + "10.27.181.27", "10.195.90.73" ], "related.user": [ @@ -4213,10 +4213,10 @@ "ididu5505.api.localdomain" ], "related.ip": [ - "10.222.2.132", - "10.183.90.25", "10.43.239.97", - "10.129.161.18" + "10.129.161.18", + "10.183.90.25", + "10.222.2.132" ], "related.user": [ "aedicta" @@ -4280,10 +4280,10 @@ "mqui1099.api.corp" ], "related.ip": [ + "10.248.156.138", "10.67.129.100", - "10.231.167.171", "10.189.162.131", - "10.248.156.138" + "10.231.167.171" ], "related.user": [ "sedquia" @@ -4348,9 +4348,9 @@ "siuta2155.lan" ], "related.ip": [ + "10.63.103.30", "10.6.146.184", "10.185.107.27", - "10.63.103.30", "10.142.106.66" ], "related.user": [ @@ -4415,10 +4415,10 @@ "tatiset4191.localdomain" ], "related.ip": [ - "10.93.39.237", "10.119.179.182", + "10.214.93.200", "10.0.202.9", - "10.214.93.200" + "10.93.39.237" ], "related.user": [ "tionofd" @@ -4484,8 +4484,8 @@ ], "related.ip": [ "10.28.145.163", - "10.252.204.162", "10.123.154.140", + "10.252.204.162", "10.30.189.166" ], "related.user": [ @@ -4550,9 +4550,9 @@ "idolo6535.internal.example" ], "related.ip": [ + "10.46.162.198", "10.145.128.250", "10.79.49.3", - "10.46.162.198", "10.29.122.183" ], "related.user": [ @@ -4618,10 +4618,10 @@ "one7728.api.localdomain" ], "related.ip": [ - "10.166.169.167", - "10.65.174.196", + "10.142.235.217", "10.177.232.136", - "10.142.235.217" + "10.65.174.196", + "10.166.169.167" ], "related.user": [ "olors" @@ -4686,9 +4686,9 @@ "uptatem4446.internal.localhost" ], "related.ip": [ - "10.29.217.44", "10.215.184.154", "10.191.78.86", + "10.29.217.44", "10.53.188.140" ], "related.user": [ @@ -4754,8 +4754,8 @@ "emq2514.api.localhost" ], "related.ip": [ - "10.135.77.156", "10.46.222.149", + "10.135.77.156", "10.76.148.147", "10.74.74.129" ], @@ -4821,10 +4821,10 @@ "agna5654.www.corp" ], "related.ip": [ - "10.145.49.29", + "10.130.203.37", "10.96.200.223", - "10.11.146.253", - "10.130.203.37" + "10.145.49.29", + "10.11.146.253" ], "related.user": [ "mvele" @@ -4888,10 +4888,10 @@ "ipi4827.mail.lan" ], "related.ip": [ - "10.24.23.209", "10.162.78.48", - "10.48.75.140", - "10.162.2.180" + "10.162.2.180", + "10.24.23.209", + "10.48.75.140" ], "related.user": [ "rumwr" @@ -4955,10 +4955,10 @@ "sequatD163.internal.example" ], "related.ip": [ - "10.151.206.38", - "10.66.92.83", "10.119.12.186", - "10.97.105.115" + "10.97.105.115", + "10.151.206.38", + "10.66.92.83" ], "related.user": [ "nproide" @@ -5022,10 +5022,10 @@ "itamet1303.invalid" ], "related.ip": [ - "10.64.76.142", "10.169.139.250", "10.12.148.73", - "10.201.132.114" + "10.201.132.114", + "10.64.76.142" ], "related.user": [ "borisnis" @@ -5090,10 +5090,10 @@ "epr3512.internal.domain" ], "related.ip": [ - "10.111.128.11", - "10.9.236.18", "10.35.38.185", - "10.200.116.191" + "10.200.116.191", + "10.111.128.11", + "10.9.236.18" ], "related.user": [ "umfug" @@ -5157,10 +5157,10 @@ "uredol2174.home" ], "related.ip": [ - "10.134.238.8", "10.191.27.182", - "10.236.67.227", - "10.240.62.238" + "10.134.238.8", + "10.240.62.238", + "10.236.67.227" ], "related.user": [ "tlabo" @@ -5224,10 +5224,10 @@ "ididunt7607.mail.localhost" ], "related.ip": [ - "10.109.14.142", "10.22.231.91", - "10.65.35.64", - "10.165.66.92" + "10.165.66.92", + "10.109.14.142", + "10.65.35.64" ], "related.user": [ "perna" @@ -5292,9 +5292,9 @@ ], "related.ip": [ "10.64.161.215", + "10.29.230.203", "10.71.112.86", - "10.89.221.90", - "10.29.230.203" + "10.89.221.90" ], "related.user": [ "rnatur" @@ -5358,10 +5358,10 @@ "nonn1650.www.test" ], "related.ip": [ - "10.221.199.137", - "10.88.226.76", + "10.140.118.182", "10.79.208.135", - "10.140.118.182" + "10.221.199.137", + "10.88.226.76" ], "related.user": [ "erspic" @@ -5426,10 +5426,10 @@ "acons3940.api.lan" ], "related.ip": [ + "10.133.48.55", "10.35.73.208", - "10.126.61.230", "10.189.244.22", - "10.133.48.55" + "10.126.61.230" ], "related.user": [ "tia" @@ -5493,8 +5493,8 @@ "suscipit587.www.localhost" ], "related.ip": [ - "10.240.94.109", "10.239.194.105", + "10.240.94.109", "10.81.154.115", "10.35.65.72" ], @@ -5562,8 +5562,8 @@ ], "related.ip": [ "10.150.56.227", - "10.52.70.192", "10.248.72.104", + "10.52.70.192", "10.38.253.213" ], "related.user": [ @@ -5629,10 +5629,10 @@ "borios1067.www5.home" ], "related.ip": [ - "10.218.15.164", - "10.62.218.239", "10.73.172.186", - "10.203.193.134" + "10.203.193.134", + "10.218.15.164", + "10.62.218.239" ], "related.user": [ "reh" @@ -5696,9 +5696,9 @@ "msequ323.www.example" ], "related.ip": [ + "10.60.20.76", "10.10.46.43", "10.131.127.113", - "10.60.20.76", "10.136.211.234" ], "related.user": [ @@ -5764,10 +5764,10 @@ "tdolorem813.internal.host" ], "related.ip": [ + "10.50.177.151", "10.248.0.74", - "10.233.181.250", "10.187.237.220", - "10.50.177.151" + "10.233.181.250" ], "related.user": [ "ugiatq" @@ -5832,10 +5832,10 @@ "volupt4626.internal.test" ], "related.ip": [ - "10.96.223.46", - "10.80.129.81", + "10.248.248.120", "10.189.43.11", - "10.248.248.120" + "10.80.129.81", + "10.96.223.46" ], "related.user": [ "iatn" @@ -5900,9 +5900,9 @@ "ntium5103.www5.localhost" ], "related.ip": [ - "10.91.115.139", - "10.102.109.199", "10.173.114.63", + "10.102.109.199", + "10.91.115.139", "10.66.106.186" ], "related.user": [ @@ -5968,9 +5968,9 @@ "orpori3334.www.local" ], "related.ip": [ + "10.159.155.88", "10.0.175.17", "10.198.157.122", - "10.159.155.88", "10.221.223.127" ], "related.user": [ @@ -6035,10 +6035,10 @@ "equu7361.www5.localdomain" ], "related.ip": [ - "10.252.136.130", - "10.189.70.237", "10.30.20.187", - "10.7.212.201" + "10.7.212.201", + "10.189.70.237", + "10.252.136.130" ], "related.user": [ "ugiat" @@ -6103,10 +6103,10 @@ "tse2979.internal.localhost" ], "related.ip": [ - "10.60.224.93", - "10.242.121.165", "10.83.105.69", - "10.102.109.194" + "10.102.109.194", + "10.60.224.93", + "10.242.121.165" ], "related.user": [ "mni" @@ -6171,10 +6171,10 @@ "uisnostr2390.mail.domain" ], "related.ip": [ + "10.17.20.93", "10.219.174.45", - "10.181.134.69", "10.251.167.219", - "10.17.20.93" + "10.181.134.69" ], "related.user": [ "Uteni" @@ -6239,10 +6239,10 @@ "luptate4811.mail.example" ], "related.ip": [ - "10.28.233.253", - "10.37.14.20", + "10.223.99.90", "10.30.117.82", - "10.223.99.90" + "10.37.14.20", + "10.28.233.253" ], "related.user": [ "numqua" @@ -6307,10 +6307,10 @@ "lites1614.www.corp" ], "related.ip": [ - "10.57.85.113", - "10.8.32.17", + "10.125.20.22", "10.50.61.114", - "10.125.20.22" + "10.57.85.113", + "10.8.32.17" ], "related.user": [ "qua" @@ -6375,9 +6375,9 @@ "lorinrep7686.mail.corp" ], "related.ip": [ - "10.200.28.55", - "10.215.224.27", "10.113.78.101", + "10.215.224.27", + "10.200.28.55", "10.181.63.82" ], "related.user": [ @@ -6443,10 +6443,10 @@ "nderit6272.mail.example" ], "related.ip": [ - "10.243.43.168", + "10.169.95.128", "10.177.14.106", "10.139.20.223", - "10.169.95.128" + "10.243.43.168" ], "related.user": [ "ofd" @@ -6512,9 +6512,9 @@ ], "related.ip": [ "10.92.168.198", - "10.90.93.4", "10.39.100.88", - "10.18.176.44" + "10.18.176.44", + "10.90.93.4" ], "related.user": [ "adminima" @@ -6579,9 +6579,9 @@ "essequam1161.domain" ], "related.ip": [ - "10.163.203.191", "10.193.43.135", "10.49.68.8", + "10.163.203.191", "10.173.13.179" ], "related.user": [ @@ -6647,9 +6647,9 @@ ], "related.ip": [ "10.240.47.113", - "10.209.226.7", + "10.84.64.28", "10.31.147.51", - "10.84.64.28" + "10.209.226.7" ], "related.user": [ "ull" @@ -6714,9 +6714,9 @@ "item3647.home" ], "related.ip": [ + "10.52.13.192", "10.225.189.229", "10.86.1.244", - "10.52.13.192", "10.32.20.4" ], "related.user": [ diff --git a/x-pack/filebeat/module/f5/bigipapm/test/generated.log-expected.json b/x-pack/filebeat/module/f5/bigipapm/test/generated.log-expected.json index fe5ce75e182..81c2af5f702 100644 --- a/x-pack/filebeat/module/f5/bigipapm/test/generated.log-expected.json +++ b/x-pack/filebeat/module/f5/bigipapm/test/generated.log-expected.json @@ -367,8 +367,8 @@ "observer.vendor": "F5", "process.pid": 2289, "related.ip": [ - "10.204.123.107", - "10.225.160.182" + "10.225.160.182", + "10.204.123.107" ], "rsa.internal.messageid": "01490500", "rsa.misc.log_session_id": "eFinib", @@ -983,8 +983,8 @@ "observer.vendor": "F5", "process.pid": 4318, "related.ip": [ - "10.169.101.161", - "10.122.204.151" + "10.122.204.151", + "10.169.101.161" ], "rsa.internal.messageid": "01490500", "rsa.misc.log_session_id": "snulap", @@ -1565,8 +1565,8 @@ "observer.vendor": "F5", "process.pid": 1973, "related.ip": [ - "10.47.99.72", - "10.187.64.126" + "10.187.64.126", + "10.47.99.72" ], "rsa.internal.messageid": "01490500", "rsa.misc.category": "oremipsu", diff --git a/x-pack/filebeat/module/fortinet/clientendpoint/test/generated.log-expected.json b/x-pack/filebeat/module/fortinet/clientendpoint/test/generated.log-expected.json index 69eab97fe35..2633519ac68 100644 --- a/x-pack/filebeat/module/fortinet/clientendpoint/test/generated.log-expected.json +++ b/x-pack/filebeat/module/fortinet/clientendpoint/test/generated.log-expected.json @@ -25,8 +25,8 @@ "litesse6379.api.domain" ], "related.ip": [ - "10.150.92.220", - "10.102.123.34" + "10.102.123.34", + "10.150.92.220" ], "related.user": [ "sumdo" @@ -143,8 +143,8 @@ "quis1130.internal.corp" ], "related.ip": [ - "10.118.175.9", - "10.173.116.41" + "10.173.116.41", + "10.118.175.9" ], "related.user": [ "uame" @@ -261,8 +261,8 @@ "enimad2283.internal.domain" ], "related.ip": [ - "10.245.142.250", - "10.70.0.60" + "10.70.0.60", + "10.245.142.250" ], "related.user": [ "eos" @@ -379,8 +379,8 @@ "iutal13.api.localdomain" ], "related.ip": [ - "10.12.44.169", - "10.214.225.125" + "10.214.225.125", + "10.12.44.169" ], "related.user": [ "erep" @@ -438,8 +438,8 @@ "uovol492.www.localhost" ], "related.ip": [ - "10.198.136.50", - "10.66.108.11" + "10.66.108.11", + "10.198.136.50" ], "related.user": [ "uptatev" @@ -556,8 +556,8 @@ "eniam7007.api.invalid" ], "related.ip": [ - "10.54.231.100", - "10.203.5.162" + "10.203.5.162", + "10.54.231.100" ], "related.user": [ "umdolore" @@ -615,8 +615,8 @@ "snulapar3794.api.domain" ], "related.ip": [ - "10.65.83.160", - "10.136.252.240" + "10.136.252.240", + "10.65.83.160" ], "related.user": [ "ender" @@ -674,8 +674,8 @@ "liq5883.localdomain" ], "related.ip": [ - "10.210.213.18", - "10.57.40.29" + "10.57.40.29", + "10.210.213.18" ], "related.user": [ "onse" @@ -969,8 +969,8 @@ "tion1761.home" ], "related.ip": [ - "10.73.69.75", - "10.19.201.13" + "10.19.201.13", + "10.73.69.75" ], "related.user": [ "tat" @@ -1028,8 +1028,8 @@ "santium4235.api.local" ], "related.ip": [ - "10.84.105.75", - "10.78.151.178" + "10.78.151.178", + "10.84.105.75" ], "related.user": [ "iquaUten" @@ -1087,8 +1087,8 @@ "CSed2857.www5.example" ], "related.ip": [ - "10.25.192.202", - "10.135.233.146" + "10.135.233.146", + "10.25.192.202" ], "related.user": [ "emeumfu" @@ -1146,8 +1146,8 @@ "equep5085.mail.domain" ], "related.ip": [ - "10.104.134.200", - "10.121.219.204" + "10.121.219.204", + "10.104.134.200" ], "related.user": [ "uptat" @@ -1205,8 +1205,8 @@ "conseq557.mail.lan" ], "related.ip": [ - "10.225.160.182", - "10.191.105.82" + "10.191.105.82", + "10.225.160.182" ], "related.user": [ "eirure" @@ -1323,8 +1323,8 @@ "lit5929.test" ], "related.ip": [ - "10.153.111.103", - "10.6.167.7" + "10.6.167.7", + "10.153.111.103" ], "related.user": [ "eumfug" @@ -1618,8 +1618,8 @@ "xeacomm6855.api.corp" ], "related.ip": [ - "10.168.90.81", - "10.101.57.120" + "10.101.57.120", + "10.168.90.81" ], "related.user": [ "eporr" @@ -1913,8 +1913,8 @@ "eprehen3224.www5.localdomain" ], "related.ip": [ - "10.195.2.130", - "10.75.99.127" + "10.75.99.127", + "10.195.2.130" ], "related.user": [ "inibusB" @@ -1972,8 +1972,8 @@ "ptasn6599.www.localhost" ], "related.ip": [ - "10.201.238.90", - "10.245.104.182" + "10.245.104.182", + "10.201.238.90" ], "related.user": [ "ovol" @@ -2090,8 +2090,8 @@ "gitsedqu2649.mail.lan" ], "related.ip": [ - "10.184.18.202", - "10.4.157.1" + "10.4.157.1", + "10.184.18.202" ], "related.user": [ "oditem" @@ -2208,8 +2208,8 @@ "tut2703.www.host" ], "related.ip": [ - "10.27.16.118", - "10.83.177.2" + "10.83.177.2", + "10.27.16.118" ], "related.user": [ "borios" @@ -2385,8 +2385,8 @@ "tot5313.mail.invalid" ], "related.ip": [ - "10.9.18.237", - "10.9.12.248" + "10.9.12.248", + "10.9.18.237" ], "related.user": [ "uradi" @@ -2444,8 +2444,8 @@ "rumet3801.internal.domain" ], "related.ip": [ - "10.41.123.102", - "10.83.130.226" + "10.83.130.226", + "10.41.123.102" ], "related.user": [ "tenim" @@ -2562,8 +2562,8 @@ "sequat7273.api.host" ], "related.ip": [ - "10.134.18.114", - "10.142.25.100" + "10.142.25.100", + "10.134.18.114" ], "related.user": [ "osqui" @@ -2621,8 +2621,8 @@ "uidol4575.localhost" ], "related.ip": [ - "10.28.118.160", - "10.223.119.218" + "10.223.119.218", + "10.28.118.160" ], "related.user": [ "ntsunt" @@ -2916,8 +2916,8 @@ "iosamnis1047.internal.localdomain" ], "related.ip": [ - "10.210.89.183", - "10.150.245.88" + "10.150.245.88", + "10.210.89.183" ], "related.user": [ "sequa" @@ -2975,8 +2975,8 @@ "orroq6677.internal.example" ], "related.ip": [ - "10.85.185.13", - "10.180.195.43" + "10.180.195.43", + "10.85.185.13" ], "related.user": [ "voluptas" @@ -3093,8 +3093,8 @@ "itaedict7233.mail.localdomain" ], "related.ip": [ - "10.86.11.48", - "10.248.165.185" + "10.248.165.185", + "10.86.11.48" ], "related.user": [ "dquiac" @@ -3152,8 +3152,8 @@ "numquam5869.internal.example" ], "related.ip": [ - "10.118.6.177", - "10.47.125.38" + "10.47.125.38", + "10.118.6.177" ], "related.user": [ "quunt" @@ -3211,8 +3211,8 @@ "onu6137.api.home" ], "related.ip": [ - "10.60.142.127", - "10.50.233.155" + "10.50.233.155", + "10.60.142.127" ], "related.user": [ "atv" @@ -3270,8 +3270,8 @@ "aecatcup2241.www5.test" ], "related.ip": [ - "10.28.82.189", - "10.120.10.211" + "10.120.10.211", + "10.28.82.189" ], "related.user": [ "rcit" @@ -3388,8 +3388,8 @@ "mveleum4322.www5.host" ], "related.ip": [ - "10.226.5.189", - "10.125.165.144" + "10.125.165.144", + "10.226.5.189" ], "related.user": [ "mvolu" @@ -3565,8 +3565,8 @@ "nreprehe715.api.home" ], "related.ip": [ - "10.17.87.79", - "10.123.199.198" + "10.123.199.198", + "10.17.87.79" ], "related.user": [ "ratvolu" @@ -3624,8 +3624,8 @@ "unte893.internal.host" ], "related.ip": [ - "10.38.86.177", - "10.115.68.40" + "10.115.68.40", + "10.38.86.177" ], "related.user": [ "mpo" @@ -4096,8 +4096,8 @@ "squira4455.api.domain" ], "related.ip": [ - "10.196.96.162", - "10.34.131.224" + "10.34.131.224", + "10.196.96.162" ], "related.user": [ "tnonproi" @@ -4804,8 +4804,8 @@ "lamcola4879.www5.localdomain" ], "related.ip": [ - "10.14.204.36", - "10.85.104.146" + "10.85.104.146", + "10.14.204.36" ], "related.user": [ "emp" @@ -4863,8 +4863,8 @@ "edquian330.mail.local" ], "related.ip": [ - "10.208.18.210", - "10.30.246.132" + "10.30.246.132", + "10.208.18.210" ], "related.user": [ "veniam" @@ -4922,8 +4922,8 @@ "santi837.api.domain" ], "related.ip": [ - "10.19.119.17", - "10.106.249.91" + "10.106.249.91", + "10.19.119.17" ], "related.user": [ "lit" @@ -5040,8 +5040,8 @@ "nonn4478.host" ], "related.ip": [ - "10.164.207.42", - "10.164.120.197" + "10.164.120.197", + "10.164.207.42" ], "related.user": [ "pta" @@ -5099,8 +5099,8 @@ "amquaer3985.www5.example" ], "related.ip": [ - "10.183.189.133", - "10.154.191.225" + "10.154.191.225", + "10.183.189.133" ], "related.user": [ "ita" @@ -5276,8 +5276,8 @@ "orumS757.www5.corp" ], "related.ip": [ - "10.91.2.135", - "10.126.245.73" + "10.126.245.73", + "10.91.2.135" ], "related.user": [ "olore" @@ -5335,8 +5335,8 @@ "emi4534.www.localdomain" ], "related.ip": [ - "10.137.85.123", - "10.183.243.246" + "10.183.243.246", + "10.137.85.123" ], "related.user": [ "cid" @@ -5453,8 +5453,8 @@ "aturQu7083.mail.host" ], "related.ip": [ - "10.79.73.195", - "10.125.143.153" + "10.125.143.153", + "10.79.73.195" ], "related.user": [ "emip" @@ -5571,8 +5571,8 @@ "siarc6339.internal.corp" ], "related.ip": [ - "10.222.245.80", - "10.87.90.49" + "10.87.90.49", + "10.222.245.80" ], "related.user": [ "ptatemse" @@ -5689,8 +5689,8 @@ "byC5766.internal.home" ], "related.ip": [ - "10.105.97.134", - "10.204.178.19" + "10.204.178.19", + "10.105.97.134" ], "related.user": [ "mexercit" @@ -5866,8 +5866,8 @@ "porissu1470.domain" ], "related.ip": [ - "10.180.90.112", - "10.116.153.19" + "10.116.153.19", + "10.180.90.112" ], "related.user": [ "itessequ" diff --git a/x-pack/filebeat/module/fortinet/firewall/test/fortinet.log-expected.json b/x-pack/filebeat/module/fortinet/firewall/test/fortinet.log-expected.json index 367d81f9868..1bc7032f6d2 100644 --- a/x-pack/filebeat/module/fortinet/firewall/test/fortinet.log-expected.json +++ b/x-pack/filebeat/module/fortinet/firewall/test/fortinet.log-expected.json @@ -6,6 +6,7 @@ "destination.bytes": 1130, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -81,6 +82,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -151,6 +153,7 @@ "destination.bytes": 6812, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -225,6 +228,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -299,6 +303,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -373,6 +378,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -442,6 +448,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -512,6 +519,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -585,6 +593,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -654,6 +663,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -714,6 +724,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.4.4", @@ -825,6 +836,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.4.4", @@ -874,6 +886,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "8.8.8.8", @@ -889,6 +902,7 @@ "destination.as.organization.name": "Level 3 Parent, LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.4.5.4", @@ -942,6 +956,7 @@ "source.as.organization.name": "Quad9", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "FR", + "source.geo.country_name": "France", "source.geo.location.lat": 48.8582, "source.geo.location.lon": 2.3387, "source.ip": "9.9.9.9", @@ -1049,6 +1064,7 @@ "destination.as.organization.name": "Level 3 Parent, LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.5.4", @@ -1100,6 +1116,7 @@ "service.type": "fortinet", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "7.6.3.4", @@ -1186,6 +1203,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.6", @@ -1235,6 +1253,7 @@ "destination.as.organization.name": "Level 3 Parent, LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.5.4", @@ -1396,6 +1415,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1465,6 +1485,7 @@ "destination.bytes": 65446, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.6.4.7", @@ -1532,6 +1553,7 @@ "source.geo.city_name": "Beijing", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 39.9288, "source.geo.location.lon": 116.3889, "source.geo.region_iso_code": "CN-BJ", @@ -1553,6 +1575,7 @@ "destination.bytes": 20, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "2001:4860:4860::8888", @@ -1613,6 +1636,7 @@ "source.bytes": 3014, "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "2001:4860:4860::8888", @@ -1629,6 +1653,7 @@ "destination.bytes": 10, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1689,6 +1714,7 @@ "source.bytes": 0, "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "9.7.7.7", @@ -1772,6 +1798,7 @@ "destination.bytes": 77654, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1857,6 +1884,7 @@ "source.geo.city_name": "Ashburn", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 39.0481, "source.geo.location.lon": -77.4728, "source.geo.region_iso_code": "US-VA", @@ -1879,6 +1907,7 @@ "destination.as.organization.name": "Dailymotion S.A.", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "FR", + "destination.geo.country_name": "France", "destination.geo.location.lat": 48.8582, "destination.geo.location.lon": 2.3387, "destination.ip": "195.8.215.136", diff --git a/x-pack/filebeat/module/fortinet/fortimail/test/generated.log-expected.json b/x-pack/filebeat/module/fortinet/fortimail/test/generated.log-expected.json index e3803f80ef3..0f8cf25378a 100644 --- a/x-pack/filebeat/module/fortinet/fortimail/test/generated.log-expected.json +++ b/x-pack/filebeat/module/fortinet/fortimail/test/generated.log-expected.json @@ -994,8 +994,8 @@ "observer.type": "Firewall", "observer.vendor": "Fortinet", "related.ip": [ - "10.68.246.187", - "10.140.7.83" + "10.140.7.83", + "10.68.246.187" ], "rsa.email.email_dst": "gna", "rsa.email.email_src": "icabo", @@ -1248,8 +1248,8 @@ "atise3421.www5.localdomain" ], "related.ip": [ - "10.179.210.218", - "10.73.207.70" + "10.73.207.70", + "10.179.210.218" ], "rsa.email.email_dst": "rumSecti", "rsa.email.email_src": "taut", @@ -3094,8 +3094,8 @@ "taevitae6868.www.corp" ], "related.ip": [ - "10.60.164.100", - "10.161.1.146" + "10.161.1.146", + "10.60.164.100" ], "rsa.email.email_dst": "nproiden", "rsa.email.email_src": "etconse", @@ -3194,8 +3194,8 @@ "tetura7106.www5.corp" ], "related.ip": [ - "10.93.239.216", - "10.44.35.57" + "10.44.35.57", + "10.93.239.216" ], "rsa.email.email_dst": "ciun", "rsa.email.email_src": "vento", @@ -3794,8 +3794,8 @@ "observer.type": "Firewall", "observer.vendor": "Fortinet", "related.ip": [ - "10.251.183.113", - "10.201.105.58" + "10.201.105.58", + "10.251.183.113" ], "rsa.email.email_dst": "ionemu", "rsa.email.email_src": "ent", @@ -3838,8 +3838,8 @@ "observer.type": "Firewall", "observer.vendor": "Fortinet", "related.ip": [ - "10.209.203.156", - "10.132.139.98" + "10.132.139.98", + "10.209.203.156" ], "rsa.email.email_dst": "borisnis", "rsa.email.email_src": "pariat", diff --git a/x-pack/filebeat/module/fortinet/fortimanager/test/generated.log-expected.json b/x-pack/filebeat/module/fortinet/fortimanager/test/generated.log-expected.json index 78030aa2c53..ee8c3414d5e 100644 --- a/x-pack/filebeat/module/fortinet/fortimanager/test/generated.log-expected.json +++ b/x-pack/filebeat/module/fortinet/fortimanager/test/generated.log-expected.json @@ -26,8 +26,8 @@ "observer.vendor": "Fortinet", "related.ip": [ "10.44.173.44", - "10.20.234.169", - "10.189.58.145" + "10.189.58.145", + "10.20.234.169" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -244,8 +244,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.131.233.27", "10.27.88.95", + "10.131.233.27", "10.50.112.141" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -314,8 +314,8 @@ "olo7148.mail.home" ], "related.ip": [ - "10.87.212.179", - "10.157.213.15" + "10.157.213.15", + "10.87.212.179" ], "related.user": [ "rveli" @@ -405,8 +405,8 @@ "agna7678.internal.host" ], "related.ip": [ - "10.76.73.140", - "10.114.150.67" + "10.114.150.67", + "10.76.73.140" ], "related.user": [ "aperia" @@ -507,8 +507,8 @@ "rsa.investigations.event_vcat": "quae", "rsa.misc.OS": "qui", "rsa.misc.action": [ - "accept", - "iadese" + "iadese", + "accept" ], "rsa.misc.category": "aturve", "rsa.misc.client": "utei", @@ -582,9 +582,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.114.16.155", + "10.186.85.3", "10.176.216.90", - "10.186.85.3" + "10.114.16.155" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -828,9 +828,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ + "10.58.214.16", "10.238.164.74", - "10.106.162.153", - "10.58.214.16" + "10.106.162.153" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -972,8 +972,8 @@ "rsa.investigations.event_vcat": "xer", "rsa.misc.OS": "fugi", "rsa.misc.action": [ - "umdolo", - "deny" + "deny", + "umdolo" ], "rsa.misc.category": "conseq", "rsa.misc.client": "cusant", @@ -1127,8 +1127,8 @@ "rsa.investigations.event_vcat": "psumqu", "rsa.misc.OS": "oraincid", "rsa.misc.action": [ - "ritt", - "deny" + "deny", + "ritt" ], "rsa.misc.category": "idunt", "rsa.misc.client": "siu", @@ -1202,9 +1202,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.98.194.212", "10.51.213.42", - "10.233.120.207" + "10.233.120.207", + "10.98.194.212" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -1266,9 +1266,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ + "10.245.187.229", "10.67.132.242", - "10.241.132.176", - "10.245.187.229" + "10.241.132.176" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -1335,8 +1335,8 @@ "tore7088.www.invalid" ], "related.ip": [ - "10.199.47.220", - "10.212.214.4" + "10.212.214.4", + "10.199.47.220" ], "related.user": [ "atv" @@ -1437,8 +1437,8 @@ "rsa.investigations.event_vcat": "metcons", "rsa.misc.OS": "ehende", "rsa.misc.action": [ - "deny", - "umf" + "umf", + "deny" ], "rsa.misc.category": "emUte", "rsa.misc.client": "archite", @@ -1517,8 +1517,8 @@ "eturad6143.www.home" ], "related.ip": [ - "10.128.46.70", - "10.95.117.134" + "10.95.117.134", + "10.128.46.70" ], "related.user": [ "enim" @@ -1608,8 +1608,8 @@ "orinrep5386.www.corp" ], "related.ip": [ - "10.253.228.140", - "10.208.21.135" + "10.208.21.135", + "10.253.228.140" ], "related.user": [ "inculp" @@ -1619,8 +1619,8 @@ "rsa.investigations.event_vcat": "emagn", "rsa.misc.OS": "oditempo", "rsa.misc.action": [ - "ugitse", - "cancel" + "cancel", + "ugitse" ], "rsa.misc.category": "magnid", "rsa.misc.client": "sci", @@ -1699,8 +1699,8 @@ "henderi724.www5.home" ], "related.ip": [ - "10.3.23.172", - "10.243.226.122" + "10.243.226.122", + "10.3.23.172" ], "related.user": [ "olorem" @@ -1710,8 +1710,8 @@ "rsa.investigations.event_vcat": "ess", "rsa.misc.OS": "equatDu", "rsa.misc.action": [ - "cancel", - "emullamc" + "emullamc", + "cancel" ], "rsa.misc.category": "niamquis", "rsa.misc.client": "tutlabo", @@ -1801,8 +1801,8 @@ "rsa.investigations.event_vcat": "snostrum", "rsa.misc.OS": "tiaecon", "rsa.misc.action": [ - "cancel", - "atiset" + "atiset", + "cancel" ], "rsa.misc.category": "ehende", "rsa.misc.client": "umquam", @@ -1878,8 +1878,8 @@ "observer.vendor": "Fortinet", "related.ip": [ "10.117.63.181", - "10.247.53.179", - "10.168.20.20" + "10.168.20.20", + "10.247.53.179" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -1947,8 +1947,8 @@ "tasnul4179.internal.host" ], "related.ip": [ - "10.141.156.217", - "10.53.168.187" + "10.53.168.187", + "10.141.156.217" ], "related.user": [ "amqu" @@ -1958,8 +1958,8 @@ "rsa.investigations.event_vcat": "illumq", "rsa.misc.OS": "idata", "rsa.misc.action": [ - "emacc", - "block" + "block", + "emacc" ], "rsa.misc.category": "ueporro", "rsa.misc.client": "veli", @@ -2050,8 +2050,8 @@ "rsa.investigations.event_vcat": "eturadip", "rsa.misc.OS": "turadip", "rsa.misc.action": [ - "accept", - "odoc" + "odoc", + "accept" ], "rsa.misc.category": "volup", "rsa.misc.client": "tur", @@ -2232,8 +2232,8 @@ "rsa.investigations.event_vcat": "uatu", "rsa.misc.OS": "tnulapar", "rsa.misc.action": [ - "deny", - "odic" + "odic", + "deny" ], "rsa.misc.category": "deri", "rsa.misc.client": "scivelit", @@ -2307,8 +2307,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.37.161.101", "10.111.182.212", + "10.37.161.101", "10.17.209.252" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -2371,9 +2371,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.170.196.181", + "10.153.166.133", "10.158.175.98", - "10.153.166.133" + "10.170.196.181" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -2526,9 +2526,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.174.17.46", + "10.38.168.190", "10.77.105.81", - "10.38.168.190" + "10.174.17.46" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -2654,9 +2654,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.214.156.161", + "10.66.90.225", "10.145.194.12", - "10.66.90.225" + "10.214.156.161" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -2719,8 +2719,8 @@ "observer.vendor": "Fortinet", "related.ip": [ "10.156.208.5", - "10.163.36.101", - "10.6.242.108" + "10.6.242.108", + "10.163.36.101" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -2787,8 +2787,8 @@ "remeum2641.www5.corp" ], "related.ip": [ - "10.68.233.163", - "10.220.148.127" + "10.220.148.127", + "10.68.233.163" ], "related.user": [ "estiaec" @@ -2798,8 +2798,8 @@ "rsa.investigations.event_vcat": "olore", "rsa.misc.OS": "tatem", "rsa.misc.action": [ - "allow", - "itanimi" + "itanimi", + "allow" ], "rsa.misc.category": "psa", "rsa.misc.client": "ugits", @@ -2889,8 +2889,8 @@ "rsa.investigations.event_vcat": "ihi", "rsa.misc.OS": "amquaera", "rsa.misc.action": [ - "allow", - "nimides" + "nimides", + "allow" ], "rsa.misc.category": "mve", "rsa.misc.client": "plica", @@ -2970,8 +2970,8 @@ "mea6298.api.example" ], "related.ip": [ - "10.113.152.241", - "10.115.121.243" + "10.115.121.243", + "10.113.152.241" ], "related.user": [ "norumetM" @@ -3061,8 +3061,8 @@ "iqu7510.internal.corp" ], "related.ip": [ - "10.49.82.45", - "10.179.153.97" + "10.179.153.97", + "10.49.82.45" ], "related.user": [ "dictasun" @@ -3072,8 +3072,8 @@ "rsa.investigations.event_vcat": "tatemse", "rsa.misc.OS": "eturadi", "rsa.misc.action": [ - "ade", - "accept" + "accept", + "ade" ], "rsa.misc.category": "laboreet", "rsa.misc.client": "ano", @@ -3147,8 +3147,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.205.83.138", "10.98.52.184", + "10.205.83.138", "10.99.55.115" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -3211,8 +3211,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.197.128.162", "10.228.11.50", + "10.197.128.162", "10.90.189.248" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -3320,8 +3320,8 @@ "deFinibu3940.internal.lan" ], "related.ip": [ - "10.22.248.52", - "10.124.71.88" + "10.124.71.88", + "10.22.248.52" ], "related.user": [ "tcons" @@ -3331,8 +3331,8 @@ "rsa.investigations.event_vcat": "uiratio", "rsa.misc.OS": "xce", "rsa.misc.action": [ - "cancel", - "cons" + "cons", + "cancel" ], "rsa.misc.category": "ciun", "rsa.misc.client": "amquisn", @@ -3411,8 +3411,8 @@ "tatiset4191.localdomain" ], "related.ip": [ - "10.26.58.20", - "10.185.37.176" + "10.185.37.176", + "10.26.58.20" ], "related.user": [ "eumiure" @@ -3422,8 +3422,8 @@ "rsa.investigations.event_vcat": "iae", "rsa.misc.OS": "evelite", "rsa.misc.action": [ - "essequam", - "block" + "block", + "essequam" ], "rsa.misc.category": "tmollita", "rsa.misc.client": "uiinea", @@ -3497,8 +3497,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.14.145.107", "10.200.12.126", + "10.14.145.107", "10.250.231.196" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -3561,9 +3561,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.225.34.176", "10.21.203.112", - "10.103.36.192" + "10.103.36.192", + "10.225.34.176" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -3625,9 +3625,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.5.67.140", + "10.140.59.161", "10.118.111.183", - "10.140.59.161" + "10.5.67.140" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -3694,8 +3694,8 @@ "nimadmi4084.api.home" ], "related.ip": [ - "10.7.70.169", - "10.28.212.191" + "10.28.212.191", + "10.7.70.169" ], "related.user": [ "itsed" @@ -3705,8 +3705,8 @@ "rsa.investigations.event_vcat": "Loremips", "rsa.misc.OS": "eritquii", "rsa.misc.action": [ - "accept", - "nostru" + "nostru", + "accept" ], "rsa.misc.category": "amnisiu", "rsa.misc.client": "rcita", @@ -3796,8 +3796,8 @@ "rsa.investigations.event_vcat": "uep", "rsa.misc.OS": "iatisund", "rsa.misc.action": [ - "block", - "nvo" + "nvo", + "block" ], "rsa.misc.category": "tenima", "rsa.misc.client": "iuntNe", @@ -4277,8 +4277,8 @@ "ntex5135.corp" ], "related.ip": [ - "10.239.194.105", - "10.234.171.117" + "10.234.171.117", + "10.239.194.105" ], "related.user": [ "tat" @@ -4288,8 +4288,8 @@ "rsa.investigations.event_vcat": "uia", "rsa.misc.OS": "mquae", "rsa.misc.action": [ - "deny", - "tenatus" + "tenatus", + "deny" ], "rsa.misc.category": "abo", "rsa.misc.client": "umtota", @@ -4743,8 +4743,8 @@ "spici5547.internal.test" ], "related.ip": [ - "10.112.242.68", - "10.216.49.112" + "10.216.49.112", + "10.112.242.68" ], "related.user": [ "urmag" @@ -4920,9 +4920,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.246.41.77", "10.228.61.5", - "10.157.22.21" + "10.157.22.21", + "10.246.41.77" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -4984,9 +4984,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ + "10.188.131.18", "10.242.119.111", - "10.239.231.168", - "10.188.131.18" + "10.239.231.168" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -5064,8 +5064,8 @@ "rsa.investigations.event_vcat": "amnihil", "rsa.misc.OS": "tten", "rsa.misc.action": [ - "inea", - "accept" + "accept", + "inea" ], "rsa.misc.category": "quam", "rsa.misc.client": "oreseo", @@ -5184,8 +5184,8 @@ "riaturE1644.www5.example" ], "related.ip": [ - "10.215.144.167", - "10.162.114.52" + "10.162.114.52", + "10.215.144.167" ], "related.user": [ "erspici" @@ -5195,8 +5195,8 @@ "rsa.investigations.event_vcat": "empori", "rsa.misc.OS": "ostru", "rsa.misc.action": [ - "quepor", - "allow" + "allow", + "quepor" ], "rsa.misc.category": "cipitla", "rsa.misc.client": "exeacomm", @@ -5361,9 +5361,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.75.198.93", + "10.51.106.43", "10.137.36.151", - "10.51.106.43" + "10.75.198.93" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -5425,9 +5425,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.7.230.206", "10.154.151.111", - "10.249.93.150" + "10.249.93.150", + "10.7.230.206" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -5505,8 +5505,8 @@ "rsa.investigations.event_vcat": "santiumd", "rsa.misc.OS": "oris", "rsa.misc.action": [ - "deny", - "rsitame" + "rsitame", + "deny" ], "rsa.misc.category": "agnaal", "rsa.misc.client": "urmagn", @@ -5585,8 +5585,8 @@ "dquiac6194.api.lan" ], "related.ip": [ - "10.241.140.241", - "10.180.162.174" + "10.180.162.174", + "10.241.140.241" ], "related.user": [ "nulapar" @@ -5596,8 +5596,8 @@ "rsa.investigations.event_vcat": "luptatev", "rsa.misc.OS": "emipsu", "rsa.misc.action": [ - "ido", - "accept" + "accept", + "ido" ], "rsa.misc.category": "litse", "rsa.misc.client": "evita", @@ -5687,8 +5687,8 @@ "rsa.investigations.event_vcat": "atvolupt", "rsa.misc.OS": "riosam", "rsa.misc.action": [ - "ssitasp", - "deny" + "deny", + "ssitasp" ], "rsa.misc.category": "enimadmi", "rsa.misc.client": "uatDui", @@ -5767,8 +5767,8 @@ "dicta7226.mail.example" ], "related.ip": [ - "10.53.50.77", - "10.4.244.115" + "10.4.244.115", + "10.53.50.77" ], "related.user": [ "idolo" @@ -5853,9 +5853,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.236.211.111", "10.120.212.78", - "10.221.100.157" + "10.221.100.157", + "10.236.211.111" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -5933,8 +5933,8 @@ "rsa.investigations.event_vcat": "lauda", "rsa.misc.OS": "enatuser", "rsa.misc.action": [ - "accept", - "rios" + "rios", + "accept" ], "rsa.misc.category": "aUte", "rsa.misc.client": "iusm", @@ -6009,8 +6009,8 @@ "observer.vendor": "Fortinet", "related.ip": [ "10.123.59.69", - "10.226.255.3", - "10.53.251.202" + "10.53.251.202", + "10.226.255.3" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -6072,9 +6072,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.212.56.26", "10.3.85.176", - "10.29.141.252" + "10.29.141.252", + "10.212.56.26" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -6227,9 +6227,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.11.150.136", + "10.83.98.220", "10.171.60.173", - "10.83.98.220" + "10.11.150.136" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -6291,9 +6291,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ + "10.74.88.209", "10.92.3.166", - "10.238.49.73", - "10.74.88.209" + "10.238.49.73" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -6355,9 +6355,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ + "10.84.200.121", "10.119.248.36", - "10.187.107.47", - "10.84.200.121" + "10.187.107.47" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -6419,9 +6419,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.135.213.17", + "10.30.239.222", "10.167.128.229", - "10.30.239.222" + "10.135.213.17" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -6488,8 +6488,8 @@ "rspic5637.api.local" ], "related.ip": [ - "10.169.133.219", - "10.115.166.48" + "10.115.166.48", + "10.169.133.219" ], "related.user": [ "emq" @@ -6499,8 +6499,8 @@ "rsa.investigations.event_vcat": "iumdol", "rsa.misc.OS": "min", "rsa.misc.action": [ - "eleumiur", - "block" + "block", + "eleumiur" ], "rsa.misc.category": "ero", "rsa.misc.client": "gia", @@ -6579,8 +6579,8 @@ "rror3870.www5.local" ], "related.ip": [ - "10.146.255.40", - "10.226.39.82" + "10.226.39.82", + "10.146.255.40" ], "related.user": [ "caecatcu" @@ -6729,8 +6729,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.66.149.234", "10.186.253.240", + "10.66.149.234", "10.233.128.7" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -6793,9 +6793,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.227.133.134", "10.46.11.114", - "10.173.140.201" + "10.173.140.201", + "10.227.133.134" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -6926,8 +6926,8 @@ "velill3821.mail.invalid" ], "related.ip": [ - "10.97.254.192", - "10.124.34.251" + "10.124.34.251", + "10.97.254.192" ], "related.user": [ "epor" @@ -7012,9 +7012,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.9.41.221", + "10.204.98.238", "10.81.58.91", - "10.204.98.238" + "10.9.41.221" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -7117,8 +7117,8 @@ "observer.vendor": "Fortinet", "related.ip": [ "10.35.84.125", - "10.212.208.70", - "10.37.120.29" + "10.37.120.29", + "10.212.208.70" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -7180,9 +7180,9 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.199.201.26", "10.207.207.106", - "10.143.65.84" + "10.143.65.84", + "10.199.201.26" ], "rsa.internal.messageid": "generic_fortinetmgr_1", "rsa.misc.action": [ @@ -7244,8 +7244,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.41.61.88", "10.204.27.48", + "10.41.61.88", "10.163.236.253" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -7308,8 +7308,8 @@ "observer.type": "Configuration", "observer.vendor": "Fortinet", "related.ip": [ - "10.246.81.164", "10.53.110.111", + "10.246.81.164", "10.185.44.26" ], "rsa.internal.messageid": "generic_fortinetmgr_1", @@ -7378,8 +7378,8 @@ "cupida6106.www5.local" ], "related.ip": [ - "10.146.77.206", - "10.109.172.90" + "10.109.172.90", + "10.146.77.206" ], "related.user": [ "aquaeab" @@ -7469,8 +7469,8 @@ "unt2122.internal.local" ], "related.ip": [ - "10.202.250.141", - "10.38.18.72" + "10.38.18.72", + "10.202.250.141" ], "related.user": [ "maperia" @@ -7662,8 +7662,8 @@ "rsa.investigations.event_vcat": "olupt", "rsa.misc.OS": "rumw", "rsa.misc.action": [ - "block", - "tali" + "tali", + "block" ], "rsa.misc.category": "itsedq", "rsa.misc.client": "esciu", diff --git a/x-pack/filebeat/module/googlecloud/audit/test/audit-log-entries.json.log-expected.json b/x-pack/filebeat/module/googlecloud/audit/test/audit-log-entries.json.log-expected.json index 2d1832bc54a..d8efe2892a5 100644 --- a/x-pack/filebeat/module/googlecloud/audit/test/audit-log-entries.json.log-expected.json +++ b/x-pack/filebeat/module/googlecloud/audit/test/audit-log-entries.json.log-expected.json @@ -282,6 +282,7 @@ "source.geo.city_name": "Moscow", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7527, "source.geo.location.lon": 37.6172, "source.geo.region_iso_code": "RU-MOW", @@ -327,6 +328,7 @@ "source.geo.city_name": "Clermont-Ferrand", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "FR", + "source.geo.country_name": "France", "source.geo.location.lat": 45.7838, "source.geo.location.lon": 3.0966, "source.geo.region_iso_code": "FR-63", diff --git a/x-pack/filebeat/module/googlecloud/firewall/test/test.log-expected.json b/x-pack/filebeat/module/googlecloud/firewall/test/test.log-expected.json index c8b16376e8f..73f9e79c29a 100644 --- a/x-pack/filebeat/module/googlecloud/firewall/test/test.log-expected.json +++ b/x-pack/filebeat/module/googlecloud/firewall/test/test.log-expected.json @@ -6,6 +6,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -801,6 +802,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -866,6 +868,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-application-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-application-test.json.log-expected.json index 7c44c612d13..a3840436672 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-application-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-application-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_APPLICATION_SETTING", "event.category": [ "iam" @@ -42,6 +41,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -56,7 +56,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_APPLICATION_SETTING", "event.category": [ "iam" @@ -97,6 +96,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -111,7 +111,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_APPLICATION_SETTING", "event.category": [ "iam" @@ -152,6 +151,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -166,7 +166,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REORDER_GROUP_BASED_POLICIES_EVENT", "event.category": [ "iam" @@ -206,6 +205,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -220,7 +220,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GPLUS_PREMIUM_FEATURES", "event.category": [ "iam" @@ -255,6 +254,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -269,7 +269,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_MANAGED_CONFIGURATION", "event.category": [ "iam" @@ -304,6 +303,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -318,7 +318,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_MANAGED_CONFIGURATION", "event.category": [ "iam" @@ -353,6 +352,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -367,7 +367,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_MANAGED_CONFIGURATION", "event.category": [ "iam" @@ -402,6 +401,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -416,7 +416,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "FLASHLIGHT_EDU_NON_FEATURED_SERVICES_SELECTED", "event.category": [ "iam" @@ -450,6 +449,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-calendar-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-calendar-test.json.log-expected.json index 88580177907..2a8eb8eb3fe 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-calendar-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-calendar-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_BUILDING", "event.category": [ "iam" @@ -35,6 +34,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -49,7 +49,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_BUILDING", "event.category": [ "iam" @@ -84,6 +83,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -98,7 +98,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_BUILDING", "event.category": [ "iam" @@ -136,6 +135,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -150,7 +150,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_CALENDAR_RESOURCE", "event.category": [ "iam" @@ -185,6 +184,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -199,7 +199,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_CALENDAR_RESOURCE", "event.category": [ "iam" @@ -234,6 +233,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -248,7 +248,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_CALENDAR_RESOURCE_FEATURE", "event.category": [ "iam" @@ -283,6 +282,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -297,7 +297,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_CALENDAR_RESOURCE_FEATURE", "event.category": [ "iam" @@ -332,6 +331,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -346,7 +346,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_CALENDAR_RESOURCE_FEATURE", "event.category": [ "iam" @@ -384,6 +383,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -398,7 +398,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RENAME_CALENDAR_RESOURCE", "event.category": [ "iam" @@ -434,6 +433,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -448,7 +448,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_CALENDAR_RESOURCE", "event.category": [ "iam" @@ -486,6 +485,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -500,7 +500,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CALENDAR_SETTING", "event.category": [ "iam" @@ -541,6 +540,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -555,7 +555,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CANCEL_CALENDAR_EVENTS", "event.category": [ "iam" @@ -590,6 +589,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -604,7 +604,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RELEASE_CALENDAR_RESOURCES", "event.category": [ "iam" @@ -639,6 +638,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chat-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chat-test.json.log-expected.json index 70de8368e2c..4736114f427 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chat-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chat-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MEET_INTEROP_CREATE_GATEWAY", "event.category": [ "iam" @@ -34,6 +33,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -48,7 +48,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MEET_INTEROP_DELETE_GATEWAY", "event.category": [ "iam" @@ -82,6 +81,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -96,7 +96,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MEET_INTEROP_MODIFY_GATEWAY", "event.category": [ "iam" @@ -130,6 +129,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -144,7 +144,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHAT_SETTING", "event.category": [ "iam" @@ -185,6 +184,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chromeos-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chromeos-test.json.log-expected.json index 4ce27e5aff2..00f51c0bc79 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chromeos-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-chromeos-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_ANDROID_APPLICATION_SETTING", "event.category": [ "iam" @@ -42,6 +41,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -56,7 +56,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DEVICE_STATE", "event.category": [ "iam" @@ -93,6 +92,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -107,7 +107,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_APPLICATION_SETTING", "event.category": [ "iam" @@ -149,6 +148,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -163,7 +163,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "SEND_CHROME_OS_DEVICE_COMMAND", "event.category": [ "iam" @@ -198,6 +197,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -212,7 +212,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_DEVICE_ANNOTATION", "event.category": [ "iam" @@ -246,6 +245,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -260,7 +260,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_DEVICE_SETTING", "event.category": [ "iam" @@ -297,6 +296,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -311,7 +311,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_DEVICE_STATE", "event.category": [ "iam" @@ -348,6 +347,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -362,7 +362,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_PUBLIC_SESSION_SETTING", "event.category": [ "iam" @@ -399,6 +398,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -413,7 +413,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "INSERT_CHROME_OS_PRINT_SERVER", "event.category": [ "iam" @@ -447,6 +446,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -461,7 +461,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_CHROME_OS_PRINT_SERVER", "event.category": [ "iam" @@ -495,6 +494,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -509,7 +509,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_CHROME_OS_PRINT_SERVER", "event.category": [ "iam" @@ -545,6 +544,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -559,7 +559,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "INSERT_CHROME_OS_PRINTER", "event.category": [ "iam" @@ -593,6 +592,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -607,7 +607,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_CHROME_OS_PRINTER", "event.category": [ "iam" @@ -641,6 +640,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -655,7 +655,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_CHROME_OS_PRINTER", "event.category": [ "iam" @@ -691,6 +690,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -705,7 +705,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_SETTING", "event.category": [ "iam" @@ -742,6 +741,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -756,7 +756,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CHROME_OS_USER_SETTING", "event.category": [ "iam" @@ -793,6 +792,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -807,7 +807,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ISSUE_DEVICE_COMMAND", "event.category": [ "iam" @@ -846,6 +845,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -860,7 +860,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOVE_DEVICE_TO_ORG_UNIT_DETAILED", "event.category": [ "iam" @@ -897,6 +896,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -911,7 +911,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_CHROME_OS_APPLICATION_SETTINGS", "event.category": [ "iam" @@ -945,6 +944,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -959,7 +959,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_DEVICE", "event.category": [ "iam" @@ -994,6 +993,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1008,7 +1008,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CONTACTS_SETTING", "event.category": [ "iam" @@ -1046,6 +1045,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-contacts-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-contacts-test.json.log-expected.json index ed54f20525a..dee1917e48d 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-contacts-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-contacts-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CONTACTS_SETTING", "event.category": [ "iam" @@ -38,6 +37,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-delegatedadmin-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-delegatedadmin-test.json.log-expected.json index c43835104fa..b5c6d47d8b3 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-delegatedadmin-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-delegatedadmin-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ASSIGN_ROLE", "event.category": [ "iam" @@ -37,6 +36,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -51,7 +51,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_ROLE", "event.category": [ "iam" @@ -86,6 +85,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -100,7 +100,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_ROLE", "event.category": [ "iam" @@ -135,6 +134,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -149,7 +149,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_PRIVILEGE", "event.category": [ "iam" @@ -185,6 +184,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -199,7 +199,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_PRIVILEGE", "event.category": [ "iam" @@ -235,6 +234,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -249,7 +249,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RENAME_ROLE", "event.category": [ "iam" @@ -284,6 +283,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -298,7 +298,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_ROLE", "event.category": [ "iam" @@ -333,6 +332,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -347,7 +347,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNASSIGN_ROLE", "event.category": [ "iam" @@ -384,6 +383,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-docs-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-docs-test.json.log-expected.json index 4fb31027b62..e0f00e25443 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-docs-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-docs-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TRANSFER_DOCUMENT_OWNERSHIP", "event.category": [ "iam" @@ -37,6 +36,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -51,7 +51,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DRIVE_DATA_RESTORE", "event.category": [ "iam" @@ -89,6 +88,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -103,7 +103,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DOCS_SETTING", "event.category": [ "iam" @@ -144,6 +143,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -157,4 +157,4 @@ "forwarded" ] } -] +] \ No newline at end of file diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-domain-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-domain-test.json.log-expected.json index a8d965c7c8d..a349010fdb4 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-domain-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-domain-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_ACCOUNT_AUTO_RENEWAL", "event.category": [ "iam" @@ -35,6 +34,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -49,7 +49,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_APPLICATION", "event.category": [ "iam" @@ -85,6 +84,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -99,7 +99,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_APPLICATION_TO_WHITELIST", "event.category": [ "iam" @@ -134,6 +133,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -148,7 +148,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_ADVERTISEMENT_OPTION", "event.category": [ "iam" @@ -184,6 +183,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -198,7 +198,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_ALERT", "event.category": [ "iam" @@ -232,6 +231,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -246,7 +246,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_ALERT_CRITERIA", "event.category": [ "iam" @@ -280,6 +279,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -294,7 +294,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_ALERT", "event.category": [ "iam" @@ -328,6 +327,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -342,7 +342,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ALERT_RECEIVERS_CHANGED", "event.category": [ "iam" @@ -378,6 +377,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -392,7 +392,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RENAME_ALERT", "event.category": [ "iam" @@ -427,6 +426,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -441,7 +441,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ALERT_STATUS_CHANGED", "event.category": [ "iam" @@ -477,6 +476,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -491,7 +491,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_DOMAIN_ALIAS", "event.category": [ "iam" @@ -526,6 +525,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -540,7 +540,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_DOMAIN_ALIAS", "event.category": [ "iam" @@ -575,6 +574,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -589,7 +589,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "SKIP_DOMAIN_ALIAS_MX", "event.category": [ "iam" @@ -624,6 +623,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -638,7 +638,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "VERIFY_DOMAIN_ALIAS_MX", "event.category": [ "iam" @@ -673,6 +672,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -687,7 +687,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "VERIFY_DOMAIN_ALIAS", "event.category": [ "iam" @@ -723,6 +722,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -737,7 +737,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_OAUTH_ACCESS_TO_ALL_APIS", "event.category": [ "iam" @@ -772,6 +771,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -786,7 +786,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_ALLOW_ADMIN_PASSWORD_RESET", "event.category": [ "iam" @@ -821,6 +820,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -835,7 +835,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ENABLE_API_ACCESS", "event.category": [ "iam" @@ -871,6 +870,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -885,7 +885,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "AUTHORIZE_API_CLIENT_ACCESS", "event.category": [ "iam" @@ -924,6 +923,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -938,7 +938,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_API_CLIENT_ACCESS", "event.category": [ "iam" @@ -973,6 +972,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -987,7 +987,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHROME_LICENSES_REDEEMED", "event.category": [ "iam" @@ -1023,6 +1022,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1037,7 +1037,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_AUTO_ADD_NEW_SERVICE", "event.category": [ "iam" @@ -1072,6 +1071,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1086,7 +1086,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_PRIMARY_DOMAIN", "event.category": [ "iam" @@ -1121,6 +1120,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1135,7 +1135,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_WHITELIST_SETTING", "event.category": [ "iam" @@ -1171,6 +1170,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1185,7 +1185,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "COMMUNICATION_PREFERENCES_SETTING_CHANGE", "event.category": [ "iam" @@ -1222,6 +1221,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1236,7 +1236,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CONFLICT_ACCOUNT_ACTION", "event.category": [ "iam" @@ -1272,6 +1271,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1286,7 +1286,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ENABLE_FEEDBACK_SOLICITATION", "event.category": [ "iam" @@ -1322,6 +1321,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1336,7 +1336,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_CONTACT_SHARING", "event.category": [ "iam" @@ -1371,6 +1370,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1385,7 +1385,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_PLAY_FOR_WORK_TOKEN", "event.category": [ "iam" @@ -1419,6 +1418,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1433,7 +1433,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_USE_CUSTOM_LOGO", "event.category": [ "iam" @@ -1468,6 +1467,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1482,7 +1482,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CUSTOM_LOGO", "event.category": [ "iam" @@ -1516,6 +1515,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1530,7 +1530,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DATA_LOCALIZATION_FOR_RUSSIA", "event.category": [ "iam" @@ -1566,6 +1565,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1580,7 +1580,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DATA_LOCALIZATION_SETTING", "event.category": [ "iam" @@ -1616,6 +1615,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1630,7 +1630,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DATA_PROTECTION_OFFICER_CONTACT_INFO", "event.category": [ "iam" @@ -1666,6 +1665,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1680,7 +1680,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_PLAY_FOR_WORK_TOKEN", "event.category": [ "iam" @@ -1714,6 +1713,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1728,7 +1728,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "VIEW_DNS_LOGIN_DETAILS", "event.category": [ "iam" @@ -1762,6 +1761,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1776,7 +1776,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DOMAIN_DEFAULT_LOCALE", "event.category": [ "iam" @@ -1812,6 +1811,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1826,7 +1826,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DOMAIN_DEFAULT_TIMEZONE", "event.category": [ "iam" @@ -1862,6 +1861,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1876,7 +1876,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DOMAIN_NAME", "event.category": [ "iam" @@ -1911,6 +1910,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1925,7 +1925,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_ENABLE_PRE_RELEASE_FEATURES", "event.category": [ "iam" @@ -1960,6 +1959,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1974,7 +1974,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_DOMAIN_SUPPORT_MESSAGE", "event.category": [ "iam" @@ -2010,6 +2009,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2024,7 +2024,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_TRUSTED_DOMAINS", "event.category": [ "iam" @@ -2058,6 +2057,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2072,7 +2072,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_TRUSTED_DOMAINS", "event.category": [ "iam" @@ -2106,6 +2105,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2120,7 +2120,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_EDU_TYPE", "event.category": [ "iam" @@ -2156,6 +2155,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2170,7 +2170,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_ENABLE_OAUTH_CONSUMER_KEY", "event.category": [ "iam" @@ -2205,6 +2204,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2219,7 +2219,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_SSO_ENABLED", "event.category": [ "iam" @@ -2254,6 +2253,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2268,7 +2268,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_SSL", "event.category": [ "iam" @@ -2303,6 +2302,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2317,7 +2317,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_EU_REPRESENTATIVE_CONTACT_INFO", "event.category": [ "iam" @@ -2353,6 +2352,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2367,7 +2367,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GENERATE_TRANSFER_TOKEN", "event.category": [ "iam" @@ -2400,6 +2399,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2414,7 +2414,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_LOGIN_BACKGROUND_COLOR", "event.category": [ "iam" @@ -2450,6 +2449,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2464,7 +2464,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_LOGIN_BORDER_COLOR", "event.category": [ "iam" @@ -2500,6 +2499,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2514,7 +2514,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_LOGIN_ACTIVITY_TRACE", "event.category": [ "iam" @@ -2550,6 +2549,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2564,7 +2564,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "PLAY_FOR_WORK_ENROLL", "event.category": [ "iam" @@ -2599,6 +2598,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2613,7 +2613,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "PLAY_FOR_WORK_UNENROLL", "event.category": [ "iam" @@ -2647,6 +2646,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2661,7 +2661,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MX_RECORD_VERIFICATION_CLAIM", "event.category": [ "iam" @@ -2697,6 +2696,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2711,7 +2711,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_NEW_APP_FEATURES", "event.category": [ "iam" @@ -2746,6 +2745,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2760,7 +2760,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_USE_NEXT_GEN_CONTROL_PANEL", "event.category": [ "iam" @@ -2795,6 +2794,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2809,7 +2809,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPLOAD_OAUTH_CERTIFICATE", "event.category": [ "iam" @@ -2843,6 +2842,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2857,7 +2857,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REGENERATE_OAUTH_CONSUMER_SECRET", "event.category": [ "iam" @@ -2891,6 +2890,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2905,7 +2905,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_OPEN_ID_ENABLED", "event.category": [ "iam" @@ -2940,6 +2939,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2954,7 +2954,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_ORGANIZATION_NAME", "event.category": [ "iam" @@ -2990,6 +2989,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3004,7 +3004,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_OUTBOUND_RELAY", "event.category": [ "iam" @@ -3041,6 +3040,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3055,7 +3055,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_PASSWORD_MAX_LENGTH", "event.category": [ "iam" @@ -3091,6 +3090,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3105,7 +3105,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_PASSWORD_MIN_LENGTH", "event.category": [ "iam" @@ -3141,6 +3140,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3155,7 +3155,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_DOMAIN_PRIMARY_ADMIN_EMAIL", "event.category": [ "iam" @@ -3191,6 +3190,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3205,7 +3205,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ENABLE_SERVICE_OR_FEATURE_NOTIFICATIONS", "event.category": [ "iam" @@ -3241,6 +3240,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3255,7 +3255,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_APPLICATION", "event.category": [ "iam" @@ -3290,6 +3289,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3304,7 +3304,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_APPLICATION_FROM_WHITELIST", "event.category": [ "iam" @@ -3339,6 +3338,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3353,7 +3353,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_RENEW_DOMAIN_REGISTRATION", "event.category": [ "iam" @@ -3389,6 +3388,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3403,7 +3403,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_RESELLER_ACCESS", "event.category": [ "iam" @@ -3438,6 +3437,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3452,7 +3452,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RULE_ACTIONS_CHANGED", "event.category": [ "iam" @@ -3486,6 +3485,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3500,7 +3500,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_RULE", "event.category": [ "iam" @@ -3534,6 +3533,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3548,7 +3548,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_RULE_CRITERIA", "event.category": [ "iam" @@ -3582,6 +3581,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3596,7 +3596,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_RULE", "event.category": [ "iam" @@ -3630,6 +3629,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3644,7 +3644,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RENAME_RULE", "event.category": [ "iam" @@ -3679,6 +3678,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3693,7 +3693,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RULE_STATUS_CHANGED", "event.category": [ "iam" @@ -3729,6 +3728,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3743,7 +3743,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_SECONDARY_DOMAIN", "event.category": [ "iam" @@ -3778,6 +3777,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3792,7 +3792,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_SECONDARY_DOMAIN", "event.category": [ "iam" @@ -3827,6 +3826,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3841,7 +3841,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "SKIP_SECONDARY_DOMAIN_MX", "event.category": [ "iam" @@ -3876,6 +3875,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3890,7 +3890,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "VERIFY_SECONDARY_DOMAIN_MX", "event.category": [ "iam" @@ -3925,6 +3924,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3939,7 +3939,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "VERIFY_SECONDARY_DOMAIN", "event.category": [ "iam" @@ -3974,6 +3973,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3988,7 +3988,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_DOMAIN_SECONDARY_EMAIL", "event.category": [ "iam" @@ -4024,6 +4023,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -4038,7 +4038,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_SSO_SETTINGS", "event.category": [ "iam" @@ -4072,6 +4071,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -4086,7 +4086,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GENERATE_PIN", "event.category": [ "iam" @@ -4119,6 +4118,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -4133,7 +4133,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_RULE", "event.category": [ "iam" @@ -4167,6 +4166,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-gmail-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-gmail-test.json.log-expected.json index bdb57f64b88..f62dad33200 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-gmail-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-gmail-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DROP_FROM_QUARANTINE", "event.category": [ "iam" @@ -35,6 +34,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -49,7 +49,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "EMAIL_LOG_SEARCH", "event.category": [ "iam" @@ -89,6 +88,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -103,7 +103,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "EMAIL_UNDELETE", "event.category": [ "iam" @@ -141,6 +140,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -155,7 +155,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_EMAIL_SETTING", "event.category": [ "iam" @@ -196,6 +195,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -210,7 +210,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_GMAIL_SETTING", "event.category": [ "iam" @@ -247,6 +246,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -261,7 +261,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_GMAIL_SETTING", "event.category": [ "iam" @@ -298,6 +297,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -312,7 +312,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_GMAIL_SETTING", "event.category": [ "iam" @@ -349,6 +348,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -363,7 +363,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REJECT_FROM_QUARANTINE", "event.category": [ "iam" @@ -398,6 +397,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -412,7 +412,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RELEASE_FROM_QUARANTINE", "event.category": [ "iam" @@ -447,6 +446,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -460,4 +460,4 @@ "forwarded" ] } -] +] \ No newline at end of file diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-groups-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-groups-test.json.log-expected.json index 42a9699094c..ff894cd6c05 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-groups-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-groups-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_GROUP", "event.category": [ "iam" @@ -37,6 +36,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -51,7 +51,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_GROUP", "event.category": [ "iam" @@ -88,6 +87,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -102,7 +102,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_GROUP_DESCRIPTION", "event.category": [ "iam" @@ -139,6 +138,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -153,7 +153,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GROUP_LIST_DOWNLOAD", "event.category": [ "iam" @@ -187,6 +186,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -201,7 +201,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_GROUP_MEMBER", "event.category": [ "iam" @@ -240,6 +239,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -254,7 +254,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_GROUP_MEMBER", "event.category": [ "iam" @@ -293,6 +292,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -307,7 +307,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_GROUP_MEMBER", "event.category": [ "iam" @@ -348,6 +347,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -362,7 +362,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_GROUP_MEMBER_DELIVERY_SETTINGS", "event.category": [ "iam" @@ -403,6 +402,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -417,7 +417,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_GROUP_MEMBER_DELIVERY_SETTINGS_CAN_EMAIL_OVERRIDE", "event.category": [ "iam" @@ -458,6 +457,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -472,7 +472,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GROUP_MEMBER_BULK_UPLOAD", "event.category": [ "iam" @@ -508,6 +507,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -522,7 +522,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GROUP_MEMBERS_DOWNLOAD", "event.category": [ "iam" @@ -556,6 +555,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -570,7 +570,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_GROUP_NAME", "event.category": [ "iam" @@ -608,6 +607,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -622,7 +622,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_GROUP_SETTING", "event.category": [ "iam" @@ -662,6 +661,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -676,7 +676,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "WHITELISTED_GROUPS_UPDATED", "event.category": [ "iam" @@ -715,6 +714,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-licenses-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-licenses-test.json.log-expected.json index d51d602ae7b..1fd3a0da6e2 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-licenses-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-licenses-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ORG_USERS_LICENSE_ASSIGNMENT", "event.category": [ "iam" @@ -36,6 +35,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -50,7 +50,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ORG_ALL_USERS_LICENSE_ASSIGNMENT", "event.category": [ "iam" @@ -86,6 +85,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -100,7 +100,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USER_LICENSE_ASSIGNMENT", "event.category": [ "iam" @@ -137,6 +136,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -151,7 +151,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_LICENSE_AUTO_ASSIGN", "event.category": [ "iam" @@ -187,6 +186,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -201,7 +201,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USER_LICENSE_REASSIGNMENT", "event.category": [ "iam" @@ -239,6 +238,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -253,7 +253,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ORG_LICENSE_REVOKE", "event.category": [ "iam" @@ -289,6 +288,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -303,7 +303,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USER_LICENSE_REVOKE", "event.category": [ "iam" @@ -340,6 +339,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -354,7 +354,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_DYNAMIC_LICENSE", "event.category": [ "iam" @@ -391,6 +390,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-mobile-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-mobile-test.json.log-expected.json index 8e2f2896bdb..99bea4702c3 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-mobile-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-mobile-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ACTION_CANCELLED", "event.category": [ "iam" @@ -40,6 +39,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -54,7 +54,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ACTION_REQUESTED", "event.category": [ "iam" @@ -94,6 +93,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -108,7 +108,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_MOBILE_CERTIFICATE", "event.category": [ "iam" @@ -144,6 +143,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -158,7 +158,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "COMPANY_DEVICES_BULK_CREATION", "event.category": [ "iam" @@ -192,6 +191,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -206,7 +206,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "COMPANY_OWNED_DEVICE_BLOCKED", "event.category": [ "iam" @@ -241,6 +240,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -255,7 +255,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "COMPANY_DEVICE_DELETION", "event.category": [ "iam" @@ -290,6 +289,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -304,7 +304,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "COMPANY_OWNED_DEVICE_UNBLOCKED", "event.category": [ "iam" @@ -339,6 +338,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -353,7 +353,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "COMPANY_OWNED_DEVICE_WIPED", "event.category": [ "iam" @@ -388,6 +387,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -402,7 +402,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_MOBILE_APPLICATION_PERMISSION_GRANT", "event.category": [ "iam" @@ -442,6 +441,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -456,7 +456,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_MOBILE_APPLICATION_PRIORITY_ORDER", "event.category": [ "iam" @@ -491,6 +490,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -505,7 +505,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_MOBILE_APPLICATION_FROM_WHITELIST", "event.category": [ "iam" @@ -542,6 +541,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -556,7 +556,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_MOBILE_APPLICATION_SETTINGS", "event.category": [ "iam" @@ -596,6 +595,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -610,7 +610,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_MOBILE_APPLICATION_TO_WHITELIST", "event.category": [ "iam" @@ -647,6 +646,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -661,7 +661,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOBILE_DEVICE_APPROVE", "event.category": [ "iam" @@ -699,6 +698,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -713,7 +713,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOBILE_DEVICE_BLOCK", "event.category": [ "iam" @@ -751,6 +750,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -765,7 +765,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOBILE_DEVICE_DELETE", "event.category": [ "iam" @@ -803,6 +802,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -817,7 +817,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOBILE_DEVICE_WIPE", "event.category": [ "iam" @@ -855,6 +854,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -869,7 +869,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_MOBILE_SETTING", "event.category": [ "iam" @@ -907,6 +906,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -921,7 +921,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_ADMIN_RESTRICTIONS_PIN", "event.category": [ "iam" @@ -956,6 +955,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -970,7 +970,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_MOBILE_WIRELESS_NETWORK", "event.category": [ "iam" @@ -1006,6 +1005,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1020,7 +1020,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_MOBILE_WIRELESS_NETWORK", "event.category": [ "iam" @@ -1056,6 +1055,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1070,7 +1070,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_MOBILE_WIRELESS_NETWORK", "event.category": [ "iam" @@ -1106,6 +1105,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1120,7 +1120,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_MOBILE_WIRELESS_NETWORK_PASSWORD", "event.category": [ "iam" @@ -1156,6 +1155,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1170,7 +1170,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_MOBILE_CERTIFICATE", "event.category": [ "iam" @@ -1206,6 +1205,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1220,7 +1220,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ENROLL_FOR_GOOGLE_DEVICE_MANAGEMENT", "event.category": [ "iam" @@ -1253,6 +1252,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1267,7 +1267,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USE_GOOGLE_MOBILE_MANAGEMENT", "event.category": [ "iam" @@ -1300,6 +1299,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1314,7 +1314,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USE_GOOGLE_MOBILE_MANAGEMENT_FOR_NON_IOS", "event.category": [ "iam" @@ -1347,6 +1346,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1361,7 +1361,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USE_GOOGLE_MOBILE_MANAGEMENT_FOR_IOS", "event.category": [ "iam" @@ -1394,6 +1393,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1408,7 +1408,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOBILE_ACCOUNT_WIPE", "event.category": [ "iam" @@ -1446,6 +1445,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1460,7 +1460,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOBILE_DEVICE_CANCEL_WIPE_THEN_APPROVE", "event.category": [ "iam" @@ -1498,6 +1497,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1512,7 +1512,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOBILE_DEVICE_CANCEL_WIPE_THEN_BLOCK", "event.category": [ "iam" @@ -1550,6 +1549,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-org-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-org-test.json.log-expected.json index b2a88d67fe8..b4cdd02f0bd 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-org-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-org-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHROME_LICENSES_ENABLED", "event.category": [ "iam" @@ -36,6 +35,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -50,7 +50,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHROME_APPLICATION_LICENSE_RESERVATION_CREATED", "event.category": [ "iam" @@ -87,6 +86,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -101,7 +101,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHROME_APPLICATION_LICENSE_RESERVATION_DELETED", "event.category": [ "iam" @@ -137,6 +136,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -151,7 +151,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHROME_APPLICATION_LICENSE_RESERVATION_UPDATED", "event.category": [ "iam" @@ -189,6 +188,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -203,7 +203,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_DEVICE_ENROLLMENT_TOKEN", "event.category": [ "iam" @@ -237,6 +236,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -251,7 +251,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ASSIGN_CUSTOM_LOGO", "event.category": [ "iam" @@ -285,6 +284,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -299,7 +299,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNASSIGN_CUSTOM_LOGO", "event.category": [ "iam" @@ -333,6 +332,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -347,7 +347,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_ENROLLMENT_TOKEN", "event.category": [ "iam" @@ -381,6 +380,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -395,7 +395,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REVOKE_ENROLLMENT_TOKEN", "event.category": [ "iam" @@ -429,6 +428,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -443,7 +443,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHROME_LICENSES_ALLOWED", "event.category": [ "iam" @@ -479,6 +478,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -493,7 +493,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_ORG_UNIT", "event.category": [ "iam" @@ -527,6 +526,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -541,7 +541,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_ORG_UNIT", "event.category": [ "iam" @@ -575,6 +574,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -589,7 +589,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "EDIT_ORG_UNIT_DESCRIPTION", "event.category": [ "iam" @@ -623,6 +622,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -637,7 +637,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOVE_ORG_UNIT", "event.category": [ "iam" @@ -672,6 +671,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -686,7 +686,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "EDIT_ORG_UNIT_NAME", "event.category": [ "iam" @@ -721,6 +720,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -735,7 +735,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REVOKE_DEVICE_ENROLLMENT_TOKEN", "event.category": [ "iam" @@ -769,6 +768,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -783,7 +783,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_SERVICE_ENABLED", "event.category": [ "iam" @@ -823,6 +822,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-security-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-security-test.json.log-expected.json index 65321e3842a..ccfe0f5b3ed 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-security-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-security-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ALLOW_STRONG_AUTHENTICATION", "event.category": [ "iam" @@ -36,6 +35,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -50,7 +50,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ALLOW_SERVICE_FOR_OAUTH2_ACCESS", "event.category": [ "iam" @@ -85,6 +84,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -99,7 +99,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DISALLOW_SERVICE_FOR_OAUTH2_ACCESS", "event.category": [ "iam" @@ -134,6 +133,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -148,7 +148,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_APP_ACCESS_SETTINGS_COLLECTION_ID", "event.category": [ "iam" @@ -186,6 +185,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -200,7 +200,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_TO_TRUSTED_OAUTH2_APPS", "event.category": [ "iam" @@ -237,6 +236,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -251,7 +251,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_FROM_TRUSTED_OAUTH2_APPS", "event.category": [ "iam" @@ -288,6 +287,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -302,7 +302,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "BLOCK_ON_DEVICE_ACCESS", "event.category": [ "iam" @@ -337,6 +336,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -351,7 +351,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_TWO_STEP_VERIFICATION_ENROLLMENT_PERIOD_DURATION", "event.category": [ "iam" @@ -390,6 +389,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -404,7 +404,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_TWO_STEP_VERIFICATION_FREQUENCY", "event.category": [ "iam" @@ -443,6 +442,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -457,7 +457,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_TWO_STEP_VERIFICATION_GRACE_PERIOD_DURATION", "event.category": [ "iam" @@ -496,6 +495,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -510,7 +510,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_TWO_STEP_VERIFICATION_START_DATE", "event.category": [ "iam" @@ -549,6 +548,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -563,7 +563,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_ALLOWED_TWO_STEP_VERIFICATION_METHODS", "event.category": [ "iam" @@ -601,6 +600,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -615,7 +615,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_CAA_ENABLEMENT", "event.category": [ "iam" @@ -649,6 +648,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -663,7 +663,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CAA_ERROR_MESSAGE", "event.category": [ "iam" @@ -698,6 +697,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -712,7 +712,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_CAA_APP_ASSIGNMENTS", "event.category": [ "iam" @@ -750,6 +749,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -764,7 +764,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNTRUST_DOMAIN_OWNED_OAUTH2_APPS", "event.category": [ "iam" @@ -798,6 +797,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -812,7 +812,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TRUST_DOMAIN_OWNED_OAUTH2_APPS", "event.category": [ "iam" @@ -846,6 +845,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -860,7 +860,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ENABLE_NON_ADMIN_USER_PASSWORD_RECOVERY", "event.category": [ "iam" @@ -899,6 +898,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -913,7 +913,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ENFORCE_STRONG_AUTHENTICATION", "event.category": [ "iam" @@ -954,6 +953,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -968,7 +968,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_ERROR_MSG_FOR_RESTRICTED_OAUTH2_APPS", "event.category": [ "iam" @@ -1004,6 +1003,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1018,7 +1018,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "WEAK_PROGRAMMATIC_LOGIN_SETTINGS_CHANGED", "event.category": [ "iam" @@ -1057,6 +1056,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1071,7 +1071,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "SESSION_CONTROL_SETTINGS_CHANGE", "event.category": [ "iam" @@ -1108,6 +1107,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1122,7 +1122,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_SESSION_LENGTH", "event.category": [ "iam" @@ -1157,6 +1156,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1171,7 +1171,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNBLOCK_ON_DEVICE_ACCESS", "event.category": [ "iam" @@ -1206,6 +1205,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-sites-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-sites-test.json.log-expected.json index b5afcff1ea3..272f4fb77e7 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-sites-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-sites-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_WEB_ADDRESS", "event.category": [ "iam" @@ -37,6 +36,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -53,7 +53,6 @@ "url.path": "/path/in/url" }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_WEB_ADDRESS", "event.category": [ "iam" @@ -90,6 +89,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -106,7 +106,6 @@ "url.path": "/path/in/url" }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_SITES_SETTING", "event.category": [ "iam" @@ -144,6 +143,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -158,7 +158,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_SITES_WEB_ADDRESS_MAPPING_UPDATES", "event.category": [ "iam" @@ -192,6 +191,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -208,7 +208,6 @@ "url.path": "/path/in/url" }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "VIEW_SITE_DETAILS", "event.category": [ "iam" @@ -242,6 +241,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-user-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-user-test.json.log-expected.json index f6220f7fcbd..b3be5557b03 100644 --- a/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-user-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/admin/test/gsuite-admin-user-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_2SV_SCRATCH_CODES", "event.category": [ "iam" @@ -36,6 +35,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -50,7 +50,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GENERATE_2SV_SCRATCH_CODES", "event.category": [ "iam" @@ -86,6 +85,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -100,7 +100,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REVOKE_3LO_DEVICE_TOKENS", "event.category": [ "iam" @@ -138,6 +137,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -152,7 +152,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REVOKE_3LO_TOKEN", "event.category": [ "iam" @@ -189,6 +188,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -203,7 +203,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_RECOVERY_EMAIL", "event.category": [ "iam" @@ -239,6 +238,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -253,7 +253,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_RECOVERY_PHONE", "event.category": [ "iam" @@ -289,6 +288,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -303,7 +303,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GRANT_ADMIN_PRIVILEGE", "event.category": [ "iam" @@ -339,6 +338,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -353,7 +353,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REVOKE_ADMIN_PRIVILEGE", "event.category": [ "iam" @@ -389,6 +388,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -403,7 +403,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REVOKE_ASP", "event.category": [ "iam" @@ -440,6 +439,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -454,7 +454,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TOGGLE_AUTOMATIC_CONTACT_SHARING", "event.category": [ "iam" @@ -491,6 +490,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -505,7 +505,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "BULK_UPLOAD", "event.category": [ "iam" @@ -541,6 +540,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -555,7 +555,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "BULK_UPLOAD_NOTIFICATION_SENT", "event.category": [ "iam" @@ -592,6 +591,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -606,7 +606,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CANCEL_USER_INVITE", "event.category": [ "iam" @@ -643,6 +642,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -657,7 +657,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_CUSTOM_FIELD", "event.category": [ "iam" @@ -696,6 +695,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -710,7 +710,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_EXTERNAL_ID", "event.category": [ "iam" @@ -748,6 +747,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -762,7 +762,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_GENDER", "event.category": [ "iam" @@ -800,6 +799,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -814,7 +814,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_IM", "event.category": [ "iam" @@ -852,6 +851,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -866,7 +866,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ENABLE_USER_IP_WHITELIST", "event.category": [ "iam" @@ -904,6 +903,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -918,7 +918,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_KEYWORD", "event.category": [ "iam" @@ -956,6 +955,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -970,7 +970,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_LANGUAGE", "event.category": [ "iam" @@ -1008,6 +1007,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1022,7 +1022,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_LOCATION", "event.category": [ "iam" @@ -1060,6 +1059,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1074,7 +1074,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_ORGANIZATION", "event.category": [ "iam" @@ -1112,6 +1111,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1126,7 +1126,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_PHONE_NUMBER", "event.category": [ "iam" @@ -1164,6 +1163,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1178,7 +1178,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_RECOVERY_EMAIL", "event.category": [ "iam" @@ -1214,6 +1213,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1228,7 +1228,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_RECOVERY_PHONE", "event.category": [ "iam" @@ -1264,6 +1263,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1278,7 +1278,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_RELATION", "event.category": [ "iam" @@ -1316,6 +1315,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1330,7 +1330,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_USER_ADDRESS", "event.category": [ "iam" @@ -1368,6 +1367,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1382,7 +1382,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_EMAIL_MONITOR", "event.category": [ "iam" @@ -1426,6 +1425,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1440,7 +1440,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_DATA_TRANSFER_REQUEST", "event.category": [ "iam" @@ -1478,6 +1477,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1492,7 +1492,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GRANT_DELEGATED_ADMIN_PRIVILEGES", "event.category": [ "iam" @@ -1529,6 +1528,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1543,7 +1543,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_ACCOUNT_INFO_DUMP", "event.category": [ "iam" @@ -1580,6 +1579,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1594,7 +1594,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_EMAIL_MONITOR", "event.category": [ "iam" @@ -1631,6 +1630,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1645,7 +1645,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_MAILBOX_DUMP", "event.category": [ "iam" @@ -1682,6 +1681,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1696,7 +1696,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_FIRST_NAME", "event.category": [ "iam" @@ -1734,6 +1733,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1748,7 +1748,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "GMAIL_RESET_USER", "event.category": [ "iam" @@ -1785,6 +1784,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1799,7 +1799,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_LAST_NAME", "event.category": [ "iam" @@ -1837,6 +1836,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1851,7 +1851,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MAIL_ROUTING_DESTINATION_ADDED", "event.category": [ "iam" @@ -1888,6 +1887,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1902,7 +1902,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MAIL_ROUTING_DESTINATION_REMOVED", "event.category": [ "iam" @@ -1939,6 +1938,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1953,7 +1953,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ADD_NICKNAME", "event.category": [ "iam" @@ -1990,6 +1989,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2004,7 +2004,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_NICKNAME", "event.category": [ "iam" @@ -2041,6 +2040,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2055,7 +2055,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_PASSWORD", "event.category": [ "iam" @@ -2091,6 +2090,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2105,7 +2105,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CHANGE_PASSWORD_ON_NEXT_LOGIN", "event.category": [ "iam" @@ -2143,6 +2142,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2157,7 +2157,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DOWNLOAD_PENDING_INVITES_LIST", "event.category": [ "iam" @@ -2190,6 +2189,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2204,7 +2204,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_RECOVERY_EMAIL", "event.category": [ "iam" @@ -2240,6 +2239,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2254,7 +2254,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REMOVE_RECOVERY_PHONE", "event.category": [ "iam" @@ -2290,6 +2289,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2304,7 +2304,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REQUEST_ACCOUNT_INFO", "event.category": [ "iam" @@ -2340,6 +2339,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2354,7 +2354,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REQUEST_MAILBOX_DUMP", "event.category": [ "iam" @@ -2396,6 +2395,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2410,7 +2410,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RESEND_USER_INVITE", "event.category": [ "iam" @@ -2447,6 +2446,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2461,7 +2461,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RESET_SIGNIN_COOKIES", "event.category": [ "iam" @@ -2497,6 +2496,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2511,7 +2511,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "SECURITY_KEY_REGISTERED_FOR_USER", "event.category": [ "iam" @@ -2547,6 +2546,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2561,7 +2561,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "REVOKE_SECURITY_KEY", "event.category": [ "iam" @@ -2597,6 +2596,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2611,7 +2611,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USER_INVITE", "event.category": [ "iam" @@ -2648,6 +2647,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2662,7 +2662,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "VIEW_TEMP_PASSWORD", "event.category": [ "iam" @@ -2699,6 +2698,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2713,7 +2713,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "TURN_OFF_2_STEP_VERIFICATION", "event.category": [ "iam" @@ -2749,6 +2748,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2763,7 +2763,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNBLOCK_USER_SESSION", "event.category": [ "iam" @@ -2799,6 +2798,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2813,7 +2813,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNENROLL_USER_FROM_TITANIUM", "event.category": [ "iam" @@ -2849,6 +2848,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2863,7 +2863,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ARCHIVE_USER", "event.category": [ "iam" @@ -2899,6 +2898,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2913,7 +2913,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPDATE_BIRTHDATE", "event.category": [ "iam" @@ -2950,6 +2949,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -2964,7 +2964,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "CREATE_USER", "event.category": [ "iam" @@ -3000,6 +2999,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3014,7 +3014,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DELETE_USER", "event.category": [ "iam" @@ -3050,6 +3049,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3064,7 +3064,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DOWNGRADE_USER_FROM_GPLUS", "event.category": [ "iam" @@ -3100,6 +3099,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3114,7 +3114,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USER_ENROLLED_IN_TWO_STEP_VERIFICATION", "event.category": [ "iam" @@ -3150,6 +3149,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3164,7 +3164,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "DOWNLOAD_USERLIST_CSV", "event.category": [ "iam" @@ -3197,6 +3196,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3211,7 +3211,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "MOVE_USER_TO_ORG_UNIT", "event.category": [ "iam" @@ -3249,6 +3248,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3263,7 +3263,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USER_PUT_IN_TWO_STEP_VERIFICATION_GRACE_PERIOD", "event.category": [ "iam" @@ -3300,6 +3299,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3314,7 +3314,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "RENAME_USER", "event.category": [ "iam" @@ -3351,6 +3350,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3365,7 +3365,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNENROLL_USER_FROM_STRONG_AUTH", "event.category": [ "iam" @@ -3401,6 +3400,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3415,7 +3415,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "SUSPEND_USER", "event.category": [ "iam" @@ -3451,6 +3450,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3465,7 +3465,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNARCHIVE_USER", "event.category": [ "iam" @@ -3501,6 +3500,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3515,7 +3515,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNDELETE_USER", "event.category": [ "iam" @@ -3551,6 +3550,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3565,7 +3565,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UNSUSPEND_USER", "event.category": [ "iam" @@ -3601,6 +3600,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3615,7 +3615,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "UPGRADE_USER_TO_GPLUS", "event.category": [ "iam" @@ -3651,6 +3650,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3665,7 +3665,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USERS_BULK_UPLOAD", "event.category": [ "iam" @@ -3700,6 +3699,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3714,7 +3714,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "USERS_BULK_UPLOAD_NOTIFICATION_SENT", "event.category": [ "iam" @@ -3750,6 +3749,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -3763,4 +3763,4 @@ "forwarded" ] } -] +] \ No newline at end of file diff --git a/x-pack/filebeat/module/gsuite/drive/test/gsuite-drive-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/drive/test/gsuite-drive-test.json.log-expected.json index 3d75fea232d..9ffde6ce107 100644 --- a/x-pack/filebeat/module/gsuite/drive/test/gsuite-drive-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/drive/test/gsuite-drive-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "add_to_folder", "event.category": [ "file" @@ -47,6 +46,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -61,7 +61,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "approval_canceled", "event.category": [ "file", @@ -107,6 +106,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -121,7 +121,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "approval_comment_added", "event.category": [ "file", @@ -167,6 +166,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -181,7 +181,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "approval_requested", "event.category": [ "file", @@ -227,6 +226,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -241,7 +241,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "approval_reviewer_responded", "event.category": [ "file", @@ -287,6 +286,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -301,7 +301,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "create", "event.category": [ "file" @@ -346,6 +345,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -360,7 +360,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "delete", "event.category": [ "file" @@ -405,6 +404,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -419,7 +419,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "download", "event.category": [ "file" @@ -464,6 +463,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -478,7 +478,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "edit", "event.category": [ "file" @@ -523,6 +522,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -537,7 +537,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "add_lock", "event.category": [ "file" @@ -582,6 +581,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -596,7 +596,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "move", "event.category": [ "file" @@ -645,6 +644,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -659,7 +659,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "preview", "event.category": [ "file" @@ -704,6 +703,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -718,7 +718,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "print", "event.category": [ "file" @@ -763,6 +762,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -777,7 +777,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "remove_from_folder", "event.category": [ "file" @@ -824,6 +823,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -838,7 +838,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "rename", "event.category": [ "file" @@ -885,6 +884,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -899,7 +899,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "untrash", "event.category": [ "file" @@ -944,6 +943,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -958,7 +958,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "sheets_import_range", "event.category": [ "file" @@ -1003,6 +1002,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1017,7 +1017,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "trash", "event.category": [ "file" @@ -1062,6 +1061,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1076,7 +1076,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "remove_lock", "event.category": [ "file" @@ -1121,6 +1120,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1135,7 +1135,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "upload", "event.category": [ "file" @@ -1180,6 +1179,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1194,7 +1194,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "view", "event.category": [ "file" @@ -1240,6 +1239,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1254,7 +1254,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_acl_editors", "event.category": [ "file", @@ -1304,6 +1303,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1318,7 +1318,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_document_access_scope", "event.category": [ "file", @@ -1369,6 +1368,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1383,7 +1383,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_document_visibility", "event.category": [ "file", @@ -1434,6 +1433,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1448,7 +1448,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "shared_drive_membership_change", "event.category": [ "file", @@ -1499,6 +1498,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1513,7 +1513,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "shared_drive_settings_change", "event.category": [ "file", @@ -1564,6 +1563,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1578,7 +1578,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "sheets_import_range_access_change", "event.category": [ "file", @@ -1624,6 +1623,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1638,7 +1638,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_user_access", "event.category": [ "file", @@ -1690,6 +1689,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/groups/test/gsuite-groups-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/groups/test/gsuite-groups-test.json.log-expected.json index 8944e12d5e7..f62ef0391c0 100644 --- a/x-pack/filebeat/module/gsuite/groups/test/gsuite-groups-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/groups/test/gsuite-groups-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_acl_permission", "event.category": [ "iam" @@ -45,6 +44,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -59,7 +59,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "accept_invitation", "event.category": [ "iam" @@ -97,6 +96,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -111,7 +111,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "approve_join_request", "event.category": [ "iam" @@ -151,6 +150,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -165,7 +165,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "join", "event.category": [ "iam" @@ -203,6 +202,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -217,7 +217,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "request_to_join", "event.category": [ "iam" @@ -255,6 +254,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -269,7 +269,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_basic_setting", "event.category": [ "iam" @@ -309,6 +308,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -323,7 +323,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "create_group", "event.category": [ "iam" @@ -360,6 +359,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -374,7 +374,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "delete_group", "event.category": [ "iam" @@ -411,6 +410,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -425,7 +425,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_identity_setting", "event.category": [ "iam" @@ -465,6 +464,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -479,7 +479,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "add_info_setting", "event.category": [ "iam" @@ -518,6 +517,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -532,7 +532,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_info_setting", "event.category": [ "iam" @@ -572,6 +571,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -586,7 +586,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "remove_info_setting", "event.category": [ "iam" @@ -625,6 +624,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -639,7 +639,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_new_members_restrictions_setting", "event.category": [ "iam" @@ -679,6 +678,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -693,7 +693,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_post_replies_setting", "event.category": [ "iam" @@ -733,6 +732,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -747,7 +747,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_spam_moderation_setting", "event.category": [ "iam" @@ -787,6 +786,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -801,7 +801,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "change_topic_setting", "event.category": [ "iam" @@ -841,6 +840,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -855,7 +855,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "moderate_message", "event.category": [ "iam" @@ -896,6 +895,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -910,7 +910,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "always_post_from_user", "event.category": [ "iam" @@ -951,6 +950,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -965,7 +965,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "add_user", "event.category": [ "iam" @@ -1006,6 +1005,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1020,7 +1020,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "ban_user_with_moderation", "event.category": [ "iam" @@ -1061,6 +1060,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1075,7 +1075,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "revoke_invitation", "event.category": [ "iam" @@ -1115,6 +1114,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1129,7 +1129,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "invite_user", "event.category": [ "iam" @@ -1169,6 +1168,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1183,7 +1183,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "reject_join_request", "event.category": [ "iam" @@ -1223,6 +1222,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1237,7 +1237,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "reinvite_user", "event.category": [ "iam" @@ -1277,6 +1276,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -1291,7 +1291,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "remove_user", "event.category": [ "iam" @@ -1331,6 +1330,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/login/test/gsuite-login-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/login/test/gsuite-login-test.json.log-expected.json index 00731f235f3..287e6245a25 100644 --- a/x-pack/filebeat/module/gsuite/login/test/gsuite-login-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/login/test/gsuite-login-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "account_disabled_password_leak", "event.category": [ "authentication" @@ -35,6 +34,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -49,7 +49,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "account_disabled_generic", "event.category": [ "authentication" @@ -84,6 +83,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -98,7 +98,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "account_disabled_spamming_through_relay", "event.category": [ "authentication" @@ -133,6 +132,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -147,7 +147,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "account_disabled_spamming", "event.category": [ "authentication" @@ -182,6 +181,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -196,7 +196,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "gov_attack_warning", "event.category": [ "authentication" @@ -229,6 +228,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -243,7 +243,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "login_failure", "event.category": [ "authentication" @@ -280,6 +279,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -294,7 +294,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "login_challenge", "event.category": [ "authentication" @@ -330,6 +329,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -344,7 +344,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "login_verification", "event.category": [ "authentication" @@ -381,6 +380,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -395,7 +395,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "logout", "event.category": [ "authentication" @@ -429,6 +428,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -443,7 +443,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "login_success", "event.category": [ "authentication" @@ -480,6 +479,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/saml/test/gsuite-saml-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/saml/test/gsuite-saml-test.json.log-expected.json index 36dec3bfb61..6dd2d0216b0 100644 --- a/x-pack/filebeat/module/gsuite/saml/test/gsuite-saml-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/saml/test/gsuite-saml-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "login_failure", "event.category": [ "authentication" @@ -40,6 +39,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -54,7 +54,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:01.000Z", "event.action": "login_success", "event.category": [ "authentication" @@ -92,6 +91,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/gsuite/user_accounts/test/gsuite-user_accounts-test.json.log-expected.json b/x-pack/filebeat/module/gsuite/user_accounts/test/gsuite-user_accounts-test.json.log-expected.json index 47aba59e1da..689aad5cde2 100644 --- a/x-pack/filebeat/module/gsuite/user_accounts/test/gsuite-user_accounts-test.json.log-expected.json +++ b/x-pack/filebeat/module/gsuite/user_accounts/test/gsuite-user_accounts-test.json.log-expected.json @@ -1,6 +1,5 @@ [ { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "2sv_disable", "event.category": [ "iam" @@ -34,6 +33,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -48,7 +48,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "2sv_enroll", "event.category": [ "iam" @@ -82,6 +81,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -96,7 +96,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "password_edit", "event.category": [ "iam" @@ -130,6 +129,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -144,7 +144,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "recovery_email_edit", "event.category": [ "iam" @@ -178,6 +177,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -192,7 +192,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "recovery_phone_edit", "event.category": [ "iam" @@ -226,6 +225,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -240,7 +240,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "recovery_secret_qa_edit", "event.category": [ "iam" @@ -274,6 +273,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -288,7 +288,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "titanium_enroll", "event.category": [ "iam" @@ -322,6 +321,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", @@ -336,7 +336,6 @@ ] }, { - "@timestamp": "2020-10-02T15:00:00.000Z", "event.action": "titanium_unenroll", "event.category": [ "iam" @@ -370,6 +369,7 @@ "source.geo.city_name": "State College", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.7957, "source.geo.location.lon": -77.8618, "source.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/imperva/securesphere/test/generated.log-expected.json b/x-pack/filebeat/module/imperva/securesphere/test/generated.log-expected.json index 7894d6ff317..9aee12937a0 100644 --- a/x-pack/filebeat/module/imperva/securesphere/test/generated.log-expected.json +++ b/x-pack/filebeat/module/imperva/securesphere/test/generated.log-expected.json @@ -112,13 +112,13 @@ "ccusan7572.api.home" ], "related.ip": [ - "10.58.116.231", - "10.159.182.171" + "10.159.182.171", + "10.58.116.231" ], "related.user": [ - "temUten", + "qua", "uradi", - "qua" + "temUten" ], "rsa.counters.dclass_c1": 3626, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -174,9 +174,9 @@ "10.18.124.28" ], "related.user": [ - "modocons", + "mquidol", "lapariat", - "mquidol" + "modocons" ], "rsa.counters.dclass_c1": 6564, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -239,8 +239,8 @@ ], "related.user": [ "oluptas", - "occae", - "intoc" + "intoc", + "occae" ], "rsa.counters.event_counter": 7243, "rsa.db.database": "tNequepo", @@ -374,9 +374,9 @@ "10.211.105.204" ], "related.user": [ + "orema", "eveli", - "labor", - "orema" + "labor" ], "rsa.counters.dclass_c1": 6855, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -432,13 +432,13 @@ "pora6854.www5.home" ], "related.ip": [ - "10.214.191.180", - "10.112.250.193" + "10.112.250.193", + "10.214.191.180" ], "related.user": [ - "Exc", + "ipsumdol", "ide", - "ipsumdol" + "Exc" ], "rsa.counters.dclass_c1": 6852, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -493,12 +493,12 @@ "ptasn6599.www.localhost" ], "related.ip": [ - "10.192.34.76", - "10.251.20.13" + "10.251.20.13", + "10.192.34.76" ], "related.user": [ - "iquipe", "tnonpro", + "iquipe", "ovol" ], "rsa.counters.dclass_c1": 3645, @@ -556,8 +556,8 @@ ], "related.user": [ "idunt", - "archite", - "boree" + "boree", + "archite" ], "rsa.counters.dclass_c1": 248, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -617,8 +617,8 @@ "10.168.159.13" ], "related.user": [ - "atemq", "inci", + "atemq", "isnostr" ], "rsa.counters.dclass_c1": 6135, @@ -679,9 +679,9 @@ "10.49.167.57" ], "related.user": [ + "tali", "ccaeca", - "sau", - "tali" + "sau" ], "rsa.counters.dclass_c1": 6818, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -743,17 +743,17 @@ "10.216.125.252" ], "related.user": [ + "lorsita", "dolore", - "llamco", - "lorsita" + "llamco" ], "rsa.counters.event_counter": 4603, "rsa.db.database": "uptate", "rsa.internal.event_desc": "aquae", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "accept", - "quasia" + "quasia", + "accept" ], "rsa.misc.category": "boreetdo", "rsa.misc.disposition": "aturve", @@ -809,8 +809,8 @@ "umdolor4389.api.home" ], "related.ip": [ - "10.52.125.9", - "10.204.128.215" + "10.204.128.215", + "10.52.125.9" ], "related.user": [ "nci", @@ -875,8 +875,8 @@ "rationev6444.localhost" ], "related.ip": [ - "10.34.148.166", - "10.200.68.129" + "10.200.68.129", + "10.34.148.166" ], "related.user": [ "icabo", @@ -938,8 +938,8 @@ ], "related.user": [ "siu", - "conse", - "licabo" + "licabo", + "conse" ], "rsa.counters.dclass_c1": 6356, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -995,13 +995,13 @@ "spernatu5539.domain" ], "related.ip": [ - "10.30.98.10", - "10.126.26.131" + "10.126.26.131", + "10.30.98.10" ], "related.user": [ - "dipisci", + "velite", "olori", - "velite" + "dipisci" ], "rsa.counters.dclass_c1": 7717, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -1061,9 +1061,9 @@ "10.190.10.219" ], "related.user": [ - "item", + "accusant", "quamnih", - "accusant" + "item" ], "rsa.counters.dclass_c1": 3278, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -1147,12 +1147,12 @@ "maliquam2147.internal.home" ], "related.ip": [ - "10.100.98.56", - "10.248.184.200" + "10.248.184.200", + "10.100.98.56" ], "related.user": [ - "ritati", "proident", + "ritati", "boru" ], "rsa.counters.dclass_c1": 5923, @@ -1209,13 +1209,13 @@ "olabor2983.internal.localhost" ], "related.ip": [ - "10.197.6.245", - "10.82.28.220" + "10.82.28.220", + "10.197.6.245" ], "related.user": [ - "oluptat", "dtempo", - "aecatcup" + "aecatcup", + "oluptat" ], "rsa.counters.dclass_c1": 3071, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -1276,8 +1276,8 @@ ], "related.user": [ "redol", - "asnu", - "ationul" + "ationul", + "asnu" ], "rsa.counters.dclass_c1": 6606, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -1339,17 +1339,17 @@ "10.88.45.111" ], "related.user": [ + "undeomni", "lmole", - "iameaque", - "undeomni" + "iameaque" ], "rsa.counters.event_counter": 6344, "rsa.db.database": "nderi", "rsa.internal.event_desc": "iae", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "illu", - "deny" + "deny", + "illu" ], "rsa.misc.category": "quido", "rsa.misc.disposition": "emip", @@ -1407,8 +1407,8 @@ "10.214.3.140" ], "related.user": [ - "edolorin", "scipitl", + "edolorin", "taliqui" ], "rsa.counters.dclass_c1": 5140, @@ -1472,8 +1472,8 @@ ], "related.user": [ "caboNem", - "pta", - "etconsec" + "etconsec", + "pta" ], "rsa.counters.event_counter": 5347, "rsa.db.database": "urExcept", @@ -1535,13 +1535,13 @@ "nder347.www.corp" ], "related.ip": [ - "10.105.190.170", - "10.182.152.242" + "10.182.152.242", + "10.105.190.170" ], "related.user": [ + "doeiu", "litan", - "mquisn", - "doeiu" + "mquisn" ], "rsa.counters.dclass_c1": 3474, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -1604,8 +1604,8 @@ ], "related.user": [ "emUte", - "liquam", - "min" + "min", + "liquam" ], "rsa.counters.event_counter": 7102, "rsa.db.database": "oluptat", @@ -1666,13 +1666,13 @@ "ectob4634.mail.localhost" ], "related.ip": [ - "10.72.75.207", - "10.201.168.116" + "10.201.168.116", + "10.72.75.207" ], "related.user": [ + "urau", "eFini", - "eufug", - "urau" + "eufug" ], "rsa.counters.dclass_c1": 3348, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -1728,13 +1728,13 @@ "snu6436.www.local" ], "related.ip": [ - "10.9.46.123", - "10.58.133.175" + "10.58.133.175", + "10.9.46.123" ], "related.user": [ + "nde", "oco", - "mfu", - "nde" + "mfu" ], "rsa.counters.dclass_c1": 3795, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -1794,8 +1794,8 @@ "10.70.29.203" ], "related.user": [ - "mquisnos", "veniamq", + "mquisnos", "pta" ], "rsa.counters.dclass_c1": 2358, @@ -1856,8 +1856,8 @@ "10.165.182.111" ], "related.user": [ - "ames", "Bonorum", + "ames", "sis" ], "rsa.counters.dclass_c1": 6401, @@ -1944,8 +1944,8 @@ "upt6017.api.localdomain" ], "related.ip": [ - "10.64.184.196", - "10.173.178.109" + "10.173.178.109", + "10.64.184.196" ], "related.user": [ "tam", @@ -1957,8 +1957,8 @@ "rsa.internal.event_desc": "orin", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "block", - "lamco" + "lamco", + "block" ], "rsa.misc.category": "enia", "rsa.misc.disposition": "iavol", @@ -2012,13 +2012,13 @@ "turQuis4046.api.test" ], "related.ip": [ - "10.90.50.149", - "10.168.225.209" + "10.168.225.209", + "10.90.50.149" ], "related.user": [ "aUtenima", - "olupta", - "olu" + "olu", + "olupta" ], "rsa.counters.dclass_c1": 1127, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2079,8 +2079,8 @@ ], "related.user": [ "mtota", - "luptat", - "qua" + "qua", + "luptat" ], "rsa.counters.dclass_c1": 6112, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2163,13 +2163,13 @@ "tatnonp1371.www.invalid" ], "related.ip": [ - "10.151.240.35", - "10.228.229.144" + "10.228.229.144", + "10.151.240.35" ], "related.user": [ + "lam", "ametcons", - "ama", - "lam" + "ama" ], "rsa.counters.dclass_c1": 4325, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2289,17 +2289,17 @@ "10.254.10.98" ], "related.user": [ - "civeli", "eufugia", - "ttenb" + "ttenb", + "civeli" ], "rsa.counters.event_counter": 7365, "rsa.db.database": "utlabore", "rsa.internal.event_desc": "culpaq", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "cancel", - "uptasn" + "uptasn", + "cancel" ], "rsa.misc.category": "quamq", "rsa.misc.disposition": "usan", @@ -2383,13 +2383,13 @@ "ihi7294.www5.localhost" ], "related.ip": [ - "10.169.28.157", - "10.116.1.130" + "10.116.1.130", + "10.169.28.157" ], "related.user": [ - "reseo", + "eturadip", "amco", - "eturadip" + "reseo" ], "rsa.counters.event_counter": 1295, "rsa.db.database": "ons", @@ -2451,13 +2451,13 @@ "caecat4920.api.host" ], "related.ip": [ - "10.29.138.31", - "10.45.69.152" + "10.45.69.152", + "10.29.138.31" ], "related.user": [ - "volupta", "umq", - "tsunt" + "tsunt", + "volupta" ], "rsa.counters.dclass_c1": 744, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2513,13 +2513,13 @@ "setquas6188.internal.local" ], "related.ip": [ - "10.100.113.11", - "10.152.213.228" + "10.152.213.228", + "10.100.113.11" ], "related.user": [ - "ptatev", "itationu", - "velillum" + "velillum", + "ptatev" ], "rsa.counters.dclass_c1": 7245, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2603,13 +2603,13 @@ "nibusBo3674.www5.localhost" ], "related.ip": [ - "10.208.33.55", - "10.248.102.129" + "10.248.102.129", + "10.208.33.55" ], "related.user": [ + "ulapari", "mremaper", - "inimv", - "ulapari" + "inimv" ], "rsa.counters.dclass_c1": 6433, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2669,8 +2669,8 @@ "10.109.230.216" ], "related.user": [ - "mporin", "ectobea", + "mporin", "ibus" ], "rsa.counters.dclass_c1": 547, @@ -2731,9 +2731,9 @@ "10.117.81.75" ], "related.user": [ - "iconsequ", + "dol", "exeac", - "dol" + "iconsequ" ], "rsa.counters.dclass_c1": 484, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2793,8 +2793,8 @@ "10.45.152.205" ], "related.user": [ - "eriti", "utlabo", + "eriti", "imav" ], "rsa.counters.dclass_c1": 922, @@ -2856,17 +2856,17 @@ "10.60.164.100" ], "related.user": [ - "hite", + "adipis", "ugi", - "adipis" + "hite" ], "rsa.counters.event_counter": 508, "rsa.db.database": "abo", "rsa.internal.event_desc": "epteurs", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "taevitae", - "allow" + "allow", + "taevitae" ], "rsa.misc.category": "itse", "rsa.misc.disposition": "rever", @@ -2919,13 +2919,13 @@ "aliquip7229.mail.domain" ], "related.ip": [ - "10.248.244.203", - "10.146.228.234" + "10.146.228.234", + "10.248.244.203" ], "related.user": [ "mquamei", - "eiusm", - "sum" + "sum", + "eiusm" ], "rsa.counters.dclass_c1": 3058, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -2981,8 +2981,8 @@ "10.86.121.152" ], "related.user": [ - "ine", "consecte", + "ine", "nimv" ], "rsa.counters.dclass_c1": 2771, @@ -3039,13 +3039,13 @@ "agnama5013.internal.example" ], "related.ip": [ - "10.201.223.119", - "10.204.223.184" + "10.204.223.184", + "10.201.223.119" ], "related.user": [ + "tuserror", "rcit", - "teni", - "tuserror" + "teni" ], "rsa.counters.dclass_c1": 4113, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3106,8 +3106,8 @@ ], "related.user": [ "magnido", - "Nequepo", - "elitsedd" + "elitsedd", + "Nequepo" ], "rsa.counters.dclass_c1": 3243, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3169,17 +3169,17 @@ "10.65.225.101" ], "related.user": [ - "tuserror", "citation", - "emquel" + "emquel", + "tuserror" ], "rsa.counters.event_counter": 2513, "rsa.db.database": "rspiciat", "rsa.internal.event_desc": "atuse", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "eruntmol", - "cancel" + "cancel", + "eruntmol" ], "rsa.misc.category": "imad", "rsa.misc.disposition": "tura", @@ -3236,9 +3236,9 @@ "10.191.184.105" ], "related.user": [ + "uta", "iin", - "tione", - "uta" + "tione" ], "rsa.counters.dclass_c1": 5836, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3296,8 +3296,8 @@ "10.224.148.48" ], "related.user": [ - "equepor", "niam", + "equepor", "iosamn" ], "rsa.counters.event_counter": 7468, @@ -3360,12 +3360,12 @@ "amcorp7299.api.example" ], "related.ip": [ - "10.21.208.103", - "10.21.61.134" + "10.21.61.134", + "10.21.208.103" ], "related.user": [ - "ostr", "imidest", + "ostr", "mipsa" ], "rsa.counters.dclass_c1": 7766, @@ -3426,8 +3426,8 @@ "10.221.192.116" ], "related.user": [ - "iarchit", "iamquisn", + "iarchit", "tevelite" ], "rsa.counters.dclass_c1": 639, @@ -3486,8 +3486,8 @@ "tionevol3157.mail.invalid" ], "related.ip": [ - "10.191.142.143", - "10.240.62.238" + "10.240.62.238", + "10.191.142.143" ], "related.user": [ "nofde", @@ -3555,21 +3555,21 @@ "mquis319.api.local" ], "related.ip": [ - "10.178.79.217", - "10.111.22.134" + "10.111.22.134", + "10.178.79.217" ], "related.user": [ - "ccusan", + "tqui", "inibusBo", - "tqui" + "ccusan" ], "rsa.counters.event_counter": 3538, "rsa.db.database": "sequun", "rsa.internal.event_desc": "adeseru", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "deny", - "orisnis" + "orisnis", + "deny" ], "rsa.misc.category": "sitas", "rsa.misc.disposition": "eni", @@ -3622,13 +3622,13 @@ "urad5712.api.host" ], "related.ip": [ - "10.161.225.172", - "10.77.86.215" + "10.77.86.215", + "10.161.225.172" ], "related.user": [ - "xerc", + "rcit", "meaqu", - "rcit" + "xerc" ], "rsa.counters.dclass_c1": 7286, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3687,9 +3687,9 @@ "10.211.161.187" ], "related.user": [ - "boriosa", "sci", - "acons" + "acons", + "boriosa" ], "rsa.counters.dclass_c1": 1578, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3740,13 +3740,13 @@ "inBCSed5308.api.corp" ], "related.ip": [ - "10.254.198.47", - "10.160.147.230" + "10.160.147.230", + "10.254.198.47" ], "related.user": [ - "nimvenia", "ndeomnis", - "illoin" + "illoin", + "nimvenia" ], "rsa.counters.dclass_c1": 5988, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3802,9 +3802,9 @@ "10.40.24.93" ], "related.user": [ - "exerci", + "orisnis", "mSecti", - "orisnis" + "exerci" ], "rsa.counters.dclass_c1": 4129, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3860,13 +3860,13 @@ "itte6905.mail.invalid" ], "related.ip": [ - "10.249.13.159", - "10.108.130.106" + "10.108.130.106", + "10.249.13.159" ], "related.user": [ + "colab", "uisautei", - "exeacomm", - "colab" + "exeacomm" ], "rsa.counters.dclass_c1": 1044, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -3924,13 +3924,13 @@ "caboNemo274.www.host" ], "related.ip": [ - "10.39.244.49", - "10.64.94.174" + "10.64.94.174", + "10.39.244.49" ], "related.user": [ + "estiae", "iunt", - "Sedut", - "estiae" + "Sedut" ], "rsa.counters.event_counter": 7128, "rsa.db.database": "eFinibu", @@ -4047,13 +4047,13 @@ "qui5978.api.test" ], "related.ip": [ - "10.115.203.143", - "10.134.135.22" + "10.134.135.22", + "10.115.203.143" ], "related.user": [ + "utoditau", "involu", - "orpori", - "utoditau" + "orpori" ], "rsa.counters.dclass_c1": 7868, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4203,9 +4203,9 @@ "10.20.231.188" ], "related.user": [ - "tesseq", + "mqu", "uatDuisa", - "mqu" + "tesseq" ], "rsa.counters.dclass_c1": 1623, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4289,13 +4289,13 @@ "abor3266.mail.home" ], "related.ip": [ - "10.225.11.197", - "10.231.77.26" + "10.231.77.26", + "10.225.11.197" ], "related.user": [ + "rehe", "ineavol", - "volu", - "rehe" + "volu" ], "rsa.counters.dclass_c1": 3064, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4349,13 +4349,13 @@ "eprehe2455.www.home" ], "related.ip": [ - "10.148.3.197", - "10.106.166.105" + "10.106.166.105", + "10.148.3.197" ], "related.user": [ - "olupt", "usa", - "avolup" + "avolup", + "olupt" ], "rsa.counters.dclass_c1": 2658, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4411,9 +4411,9 @@ "10.172.121.239" ], "related.user": [ - "ipsu", + "ctas", "iuta", - "ctas" + "ipsu" ], "rsa.counters.dclass_c1": 392, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4469,13 +4469,13 @@ "exerc3694.api.home" ], "related.ip": [ - "10.129.234.200", - "10.42.218.103" + "10.42.218.103", + "10.129.234.200" ], "related.user": [ - "tevelit", "tisundeo", - "dquia" + "dquia", + "tevelit" ], "rsa.counters.dclass_c1": 6709, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4535,9 +4535,9 @@ "10.111.132.221" ], "related.user": [ - "oloremi", + "ali", "scive", - "ali" + "oloremi" ], "rsa.counters.dclass_c1": 6155, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4593,13 +4593,13 @@ "boriosa7066.www.corp" ], "related.ip": [ - "10.195.8.141", - "10.17.214.21" + "10.17.214.21", + "10.195.8.141" ], "related.user": [ "dolo", - "ota", - "enimip" + "enimip", + "ota" ], "rsa.counters.dclass_c1": 469, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4659,8 +4659,8 @@ "10.173.13.179" ], "related.user": [ - "apar", "ptasn", + "apar", "isn" ], "rsa.counters.dclass_c1": 758, @@ -4717,13 +4717,13 @@ "iatisund424.mail.localdomain" ], "related.ip": [ - "10.178.190.123", - "10.42.135.34" + "10.42.135.34", + "10.178.190.123" ], "related.user": [ - "tiset", "orsi", - "ore" + "ore", + "tiset" ], "rsa.counters.dclass_c1": 2290, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4872,9 +4872,9 @@ "10.206.221.180" ], "related.user": [ - "oNe", + "nseq", "litesseq", - "nseq" + "oNe" ], "rsa.counters.dclass_c1": 3218, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4930,9 +4930,9 @@ "10.86.180.150" ], "related.user": [ - "mnisis", + "etconsec", "itasper", - "etconsec" + "mnisis" ], "rsa.counters.dclass_c1": 4564, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -4994,8 +4994,8 @@ "10.158.161.5" ], "related.user": [ - "rrors", - "dolo" + "dolo", + "rrors" ], "rsa.counters.event_counter": 4098, "rsa.db.database": "tsed", @@ -5084,12 +5084,12 @@ "nisiutal4437.www.example" ], "related.ip": [ - "10.150.27.144", - "10.248.16.82" + "10.248.16.82", + "10.150.27.144" ], "related.user": [ - "res", "ditautf", + "res", "tuserror" ], "rsa.counters.dclass_c1": 4367, @@ -5211,9 +5211,9 @@ "10.69.5.227" ], "related.user": [ - "rumw", "ntocc", - "doloreme" + "doloreme", + "rumw" ], "rsa.counters.dclass_c1": 5201, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -5269,9 +5269,9 @@ "10.253.175.129" ], "related.user": [ + "epteurs", "nrep", - "ate", - "epteurs" + "ate" ], "rsa.counters.dclass_c1": 6260, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -5333,8 +5333,8 @@ "10.89.26.170" ], "related.user": [ - "atus", "aboris", + "atus", "orumetMa" ], "rsa.counters.event_counter": 5863, @@ -5398,8 +5398,8 @@ "gitse6744.api.local" ], "related.ip": [ - "10.81.108.232", - "10.52.106.68" + "10.52.106.68", + "10.81.108.232" ], "related.user": [ "uaturve", @@ -5411,8 +5411,8 @@ "rsa.internal.event_desc": "pis", "rsa.internal.messageid": "Imperva", "rsa.misc.action": [ - "allow", - "Quisaut" + "Quisaut", + "allow" ], "rsa.misc.category": "idol", "rsa.misc.disposition": "mmodico", @@ -5472,9 +5472,9 @@ "10.223.10.28" ], "related.user": [ - "erit", "untex", - "usmodte" + "usmodte", + "erit" ], "rsa.counters.event_counter": 4029, "rsa.db.database": "ommodi", @@ -5541,8 +5541,8 @@ ], "related.user": [ "sequamn", - "res", - "tasnul" + "tasnul", + "res" ], "rsa.counters.dclass_c1": 4846, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -5600,12 +5600,12 @@ "labo3477.www5.domain" ], "related.ip": [ - "10.226.75.20", - "10.247.108.144" + "10.247.108.144", + "10.226.75.20" ], "related.user": [ - "maccusan", "tema", + "maccusan", "fugia" ], "rsa.counters.event_counter": 3711, @@ -5667,13 +5667,13 @@ "itseddo2209.mail.domain" ], "related.ip": [ - "10.97.22.61", - "10.192.15.65" + "10.192.15.65", + "10.97.22.61" ], "related.user": [ - "illumd", "rExcep", - "nimides" + "nimides", + "illumd" ], "rsa.counters.dclass_c1": 4173, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -5798,9 +5798,9 @@ "10.28.77.79" ], "related.user": [ + "utlab", "rspic", - "upta", - "utlab" + "upta" ], "rsa.counters.dclass_c1": 4810, "rsa.counters.dclass_c1_str": "Affected Rows", @@ -5855,13 +5855,13 @@ "tsunti1164.www.example" ], "related.ip": [ - "10.18.15.43", - "10.248.177.182" + "10.248.177.182", + "10.18.15.43" ], "related.user": [ - "quei", "caecat", - "quaturve" + "quaturve", + "quei" ], "rsa.counters.dclass_c1": 983, "rsa.counters.dclass_c1_str": "Affected Rows", diff --git a/x-pack/filebeat/module/iptables/log/test/geo.log-expected.json b/x-pack/filebeat/module/iptables/log/test/geo.log-expected.json index 40bbac9e3f5..73f2a49fabc 100644 --- a/x-pack/filebeat/module/iptables/log/test/geo.log-expected.json +++ b/x-pack/filebeat/module/iptables/log/test/geo.log-expected.json @@ -55,6 +55,7 @@ "source.as.organization.name": "Consorci de Serveis Universitaris de Catalunya", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.4172, "source.geo.location.lon": -3.684, "source.ip": "158.109.0.1", diff --git a/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json b/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json index a33eb424fdd..fb4fca25df2 100644 --- a/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json +++ b/x-pack/filebeat/module/juniper/netscreen/test/generated.log-expected.json @@ -1353,8 +1353,8 @@ "observer.type": "Firewall", "observer.vendor": "Juniper", "related.ip": [ - "10.142.21.251", - "10.154.16.147" + "10.154.16.147", + "10.142.21.251" ], "rsa.internal.messageid": "00625", "rsa.misc.hardware_id": "ute", @@ -1387,8 +1387,8 @@ "observer.type": "Firewall", "observer.vendor": "Juniper", "related.ip": [ - "10.105.212.51", - "10.119.53.68" + "10.119.53.68", + "10.105.212.51" ], "rsa.db.index": "giatqu", "rsa.internal.messageid": "00042", @@ -1852,8 +1852,8 @@ "observer.type": "Firewall", "observer.vendor": "Juniper", "related.ip": [ - "10.51.161.245", - "10.193.80.21" + "10.193.80.21", + "10.51.161.245" ], "rsa.internal.messageid": "00625", "rsa.misc.hardware_id": "modi", @@ -2318,8 +2318,8 @@ "observer.type": "Firewall", "observer.vendor": "Juniper", "related.ip": [ - "10.185.50.112", - "10.126.150.15" + "10.126.150.15", + "10.185.50.112" ], "rsa.internal.messageid": "00625", "rsa.misc.hardware_id": "tot", @@ -2479,8 +2479,8 @@ "observer.type": "Firewall", "observer.vendor": "Juniper", "related.ip": [ - "10.96.165.147", - "10.96.218.99" + "10.96.218.99", + "10.96.165.147" ], "related.user": [ "utla" diff --git a/x-pack/filebeat/module/misp/threat/test/misp-test.json.log-expected.json b/x-pack/filebeat/module/misp/threat/test/misp-test.json.log-expected.json index a4b6019bc5d..163acbfd544 100644 --- a/x-pack/filebeat/module/misp/threat/test/misp-test.json.log-expected.json +++ b/x-pack/filebeat/module/misp/threat/test/misp-test.json.log-expected.json @@ -4,6 +4,7 @@ "destination.geo.city_name": "State College", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 40.7957, "destination.geo.location.lon": -77.8618, "destination.geo.region_iso_code": "US-PA", diff --git a/x-pack/filebeat/module/netscout/sightline/test/generated.log-expected.json b/x-pack/filebeat/module/netscout/sightline/test/generated.log-expected.json index 530aa6f4cc1..2ac0d3443e7 100644 --- a/x-pack/filebeat/module/netscout/sightline/test/generated.log-expected.json +++ b/x-pack/filebeat/module/netscout/sightline/test/generated.log-expected.json @@ -317,8 +317,8 @@ "observer.type": "DDOS", "observer.vendor": "Netscout", "related.ip": [ - "10.66.171.247", - "10.155.162.162" + "10.155.162.162", + "10.66.171.247" ], "rsa.internal.messageid": "Blocked_Host", "rsa.misc.msgIdPart1": "Blocked", @@ -396,8 +396,8 @@ "observer.type": "DDOS", "observer.vendor": "Netscout", "related.ip": [ - "10.179.26.34", - "10.38.77.13" + "10.38.77.13", + "10.179.26.34" ], "rsa.internal.messageid": "Blocked_Host", "rsa.misc.msgIdPart1": "Blocked", @@ -1101,8 +1101,8 @@ "observer.type": "DDOS", "observer.vendor": "Netscout", "related.ip": [ - "10.97.164.220", - "10.128.31.83" + "10.128.31.83", + "10.97.164.220" ], "rsa.internal.messageid": "anomaly", "rsa.misc.category": "aera", @@ -1816,8 +1816,8 @@ "observer.type": "DDOS", "observer.vendor": "Netscout", "related.ip": [ - "10.98.209.10", - "10.31.177.226" + "10.31.177.226", + "10.98.209.10" ], "rsa.internal.messageid": "Blocked_Host", "rsa.misc.msgIdPart1": "Blocked", @@ -1848,8 +1848,8 @@ "observer.type": "DDOS", "observer.vendor": "Netscout", "related.ip": [ - "10.44.47.27", - "10.179.210.218" + "10.179.210.218", + "10.44.47.27" ], "rsa.internal.messageid": "Blocked_Host", "rsa.misc.msgIdPart1": "Blocked", @@ -2129,8 +2129,8 @@ "observer.type": "DDOS", "observer.vendor": "Netscout", "related.ip": [ - "10.151.129.181", - "10.55.156.64" + "10.55.156.64", + "10.151.129.181" ], "rsa.internal.messageid": "Blocked_Host", "rsa.misc.msgIdPart1": "Blocked", @@ -2236,8 +2236,8 @@ "observer.type": "DDOS", "observer.vendor": "Netscout", "related.ip": [ - "10.166.90.130", - "10.73.89.189" + "10.73.89.189", + "10.166.90.130" ], "rsa.internal.messageid": "Blocked_Host", "rsa.misc.msgIdPart1": "Blocked", diff --git a/x-pack/filebeat/module/o365/audit/test/04-sharepoint.log-expected.json b/x-pack/filebeat/module/o365/audit/test/04-sharepoint.log-expected.json index 56a4f778e7f..12d780947fb 100644 --- a/x-pack/filebeat/module/o365/audit/test/04-sharepoint.log-expected.json +++ b/x-pack/filebeat/module/o365/audit/test/04-sharepoint.log-expected.json @@ -48,6 +48,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -116,6 +117,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -184,6 +186,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -252,6 +255,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", diff --git a/x-pack/filebeat/module/o365/audit/test/06-sharepointfileop.log-expected.json b/x-pack/filebeat/module/o365/audit/test/06-sharepointfileop.log-expected.json index b5c79d506d1..6f54a5ce22f 100644 --- a/x-pack/filebeat/module/o365/audit/test/06-sharepointfileop.log-expected.json +++ b/x-pack/filebeat/module/o365/audit/test/06-sharepointfileop.log-expected.json @@ -55,6 +55,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -131,6 +132,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -207,6 +209,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -283,6 +286,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -360,6 +364,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -436,6 +441,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -512,6 +518,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -589,6 +596,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -665,6 +673,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -741,6 +750,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -817,6 +827,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", diff --git a/x-pack/filebeat/module/o365/audit/test/08-azuread.log-expected.json b/x-pack/filebeat/module/o365/audit/test/08-azuread.log-expected.json index cea77b1153f..78cfca3dbfb 100644 --- a/x-pack/filebeat/module/o365/audit/test/08-azuread.log-expected.json +++ b/x-pack/filebeat/module/o365/audit/test/08-azuread.log-expected.json @@ -130,6 +130,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -273,6 +274,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -416,6 +418,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -570,6 +573,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -724,6 +728,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -885,6 +890,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1046,6 +1052,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1207,6 +1214,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1368,6 +1376,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1529,6 +1538,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1690,6 +1700,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1851,6 +1862,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2012,6 +2024,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2173,6 +2186,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2334,6 +2348,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2495,6 +2510,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2656,6 +2672,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2817,6 +2834,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2960,6 +2978,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3103,6 +3122,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3257,6 +3277,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3400,6 +3421,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3543,6 +3565,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3686,6 +3709,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3840,6 +3864,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4001,6 +4026,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4162,6 +4188,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4323,6 +4350,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4484,6 +4512,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4645,6 +4674,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4806,6 +4836,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4967,6 +4998,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5128,6 +5160,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5290,6 +5323,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5452,6 +5486,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5742,6 +5777,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5903,6 +5939,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6064,6 +6101,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6225,6 +6263,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6386,6 +6425,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6547,6 +6587,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6708,6 +6749,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6869,6 +6911,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -7030,6 +7073,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -7191,6 +7235,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -7352,6 +7397,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -7513,6 +7559,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -7674,6 +7721,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -7835,6 +7883,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -7996,6 +8045,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -8158,6 +8208,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -8320,6 +8371,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -8481,6 +8533,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -8642,6 +8695,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -8803,6 +8857,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -8964,6 +9019,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -9125,6 +9181,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -9286,6 +9343,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -9447,6 +9505,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -9608,6 +9667,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -9769,6 +9829,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -9912,6 +9973,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -10055,6 +10117,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -10198,6 +10261,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -10341,6 +10405,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -10494,6 +10559,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -10648,6 +10714,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -10802,6 +10869,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -10956,6 +11024,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -11110,6 +11179,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -11251,6 +11321,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -11394,6 +11465,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -11537,6 +11609,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -11691,6 +11764,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -11845,6 +11919,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -11999,6 +12074,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -12142,6 +12218,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -12285,6 +12362,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -12428,6 +12506,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -12582,6 +12661,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -12736,6 +12816,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -12890,6 +12971,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -13051,6 +13133,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -13212,6 +13295,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -13373,6 +13457,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -13534,6 +13619,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -13695,6 +13781,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -13856,6 +13943,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -14017,6 +14105,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -14178,6 +14267,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -14339,6 +14429,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -14500,6 +14591,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -14661,6 +14753,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -14823,6 +14916,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -14985,6 +15079,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -15147,6 +15242,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -15306,6 +15402,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -15465,6 +15562,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -15624,6 +15722,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", diff --git a/x-pack/filebeat/module/o365/audit/test/14-sp-sharing-op.log-expected.json b/x-pack/filebeat/module/o365/audit/test/14-sp-sharing-op.log-expected.json index cc096b3acc2..97cb1f5bb01 100644 --- a/x-pack/filebeat/module/o365/audit/test/14-sp-sharing-op.log-expected.json +++ b/x-pack/filebeat/module/o365/audit/test/14-sp-sharing-op.log-expected.json @@ -305,6 +305,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -379,6 +380,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -454,6 +456,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -529,6 +532,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -604,6 +608,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", diff --git a/x-pack/filebeat/module/o365/audit/test/15-azuread-sts-logon.log-expected.json b/x-pack/filebeat/module/o365/audit/test/15-azuread-sts-logon.log-expected.json index 60c77401b35..5470038d6b8 100644 --- a/x-pack/filebeat/module/o365/audit/test/15-azuread-sts-logon.log-expected.json +++ b/x-pack/filebeat/module/o365/audit/test/15-azuread-sts-logon.log-expected.json @@ -77,6 +77,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -174,6 +175,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -271,6 +273,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -368,6 +371,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -465,6 +469,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -562,6 +567,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -659,6 +665,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -756,6 +763,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -853,6 +861,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -950,6 +959,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1047,6 +1057,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1144,6 +1155,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1241,6 +1253,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1338,6 +1351,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1434,6 +1448,7 @@ "source.as.organization.name": "XFERA Moviles S.A.", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.4172, "source.geo.location.lon": -3.684, "source.ip": "37.29.234.179", @@ -1529,6 +1544,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1626,6 +1642,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1722,6 +1739,7 @@ "source.as.organization.name": "XFERA Moviles S.A.", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.4172, "source.geo.location.lon": -3.684, "source.ip": "37.29.234.179", @@ -1817,6 +1835,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -1914,6 +1933,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2011,6 +2031,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2108,6 +2129,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2205,6 +2227,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2302,6 +2325,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2399,6 +2423,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2496,6 +2521,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2593,6 +2619,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2690,6 +2717,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2787,6 +2815,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2883,6 +2912,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -2981,6 +3011,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3067,6 +3098,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3162,6 +3194,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3248,6 +3281,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3344,6 +3378,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3430,6 +3465,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3526,6 +3562,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3623,6 +3660,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3720,6 +3758,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3806,6 +3845,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3902,6 +3942,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -3998,6 +4039,7 @@ "source.as.organization.name": "XFERA Moviles S.A.", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.4172, "source.geo.location.lon": -3.684, "source.ip": "37.29.234.179", @@ -4093,6 +4135,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4190,6 +4233,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4276,6 +4320,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4371,6 +4416,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4468,6 +4514,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4565,6 +4612,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4662,6 +4710,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4759,6 +4808,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4856,6 +4906,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -4953,6 +5004,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5050,6 +5102,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5147,6 +5200,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5244,6 +5298,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5341,6 +5396,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5438,6 +5494,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5535,6 +5592,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5631,6 +5689,7 @@ "source.as.organization.name": "XFERA Moviles S.A.", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 40.4172, "source.geo.location.lon": -3.684, "source.ip": "37.29.234.179", @@ -5726,6 +5785,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5823,6 +5883,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -5920,6 +5981,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6017,6 +6079,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6114,6 +6177,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6211,6 +6275,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6308,6 +6373,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6405,6 +6471,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6502,6 +6569,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", @@ -6599,6 +6667,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", diff --git a/x-pack/filebeat/module/o365/audit/test/22-yammer.log-expected.json b/x-pack/filebeat/module/o365/audit/test/22-yammer.log-expected.json index 4bd20443e07..e6326bf27b1 100644 --- a/x-pack/filebeat/module/o365/audit/test/22-yammer.log-expected.json +++ b/x-pack/filebeat/module/o365/audit/test/22-yammer.log-expected.json @@ -48,6 +48,7 @@ "source.geo.city_name": "Barcelona", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 41.3891, "source.geo.location.lon": 2.1611, "source.geo.region_iso_code": "ES-B", diff --git a/x-pack/filebeat/module/okta/system/test/okta-system-test.json.log-expected.json b/x-pack/filebeat/module/okta/system/test/okta-system-test.json.log-expected.json index 437a7ea5627..39d00244185 100644 --- a/x-pack/filebeat/module/okta/system/test/okta-system-test.json.log-expected.json +++ b/x-pack/filebeat/module/okta/system/test/okta-system-test.json.log-expected.json @@ -55,6 +55,7 @@ "source.geo.city_name": "Dublin", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.7201, "source.geo.location.lon": -121.919, "source.geo.region_iso_code": "US-CA", @@ -130,6 +131,7 @@ "source.geo.city_name": "Dublin", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.7201, "source.geo.location.lon": -121.919, "source.geo.region_iso_code": "US-CA", @@ -220,6 +222,7 @@ "source.geo.city_name": "Dublin", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.7201, "source.geo.location.lon": -121.919, "source.geo.region_iso_code": "US-CA", diff --git a/x-pack/filebeat/module/panw/panos/test/pan_inc_other.log-expected.json b/x-pack/filebeat/module/panw/panos/test/pan_inc_other.log-expected.json index 96530ab70f3..54a45d4465e 100644 --- a/x-pack/filebeat/module/panw/panos/test/pan_inc_other.log-expected.json +++ b/x-pack/filebeat/module/panw/panos/test/pan_inc_other.log-expected.json @@ -739,6 +739,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", diff --git a/x-pack/filebeat/module/panw/panos/test/pan_inc_threat.log-expected.json b/x-pack/filebeat/module/panw/panos/test/pan_inc_threat.log-expected.json index 37735ccfce0..8e5df2e94e4 100644 --- a/x-pack/filebeat/module/panw/panos/test/pan_inc_threat.log-expected.json +++ b/x-pack/filebeat/module/panw/panos/test/pan_inc_threat.log-expected.json @@ -10,6 +10,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -104,6 +105,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -198,6 +200,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -292,6 +295,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -386,6 +390,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -480,6 +485,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -574,6 +580,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -668,6 +675,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -762,6 +770,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -856,6 +865,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -950,6 +960,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1044,6 +1055,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1138,6 +1150,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1232,6 +1245,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1325,6 +1339,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1419,6 +1434,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1512,6 +1528,7 @@ "destination.as.organization.name": "Leaseweb Deutschland GmbH", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 51.2993, "destination.geo.location.lon": 9.491, "destination.geo.name": "Germany", @@ -1603,6 +1620,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1697,6 +1715,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1791,6 +1810,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1885,6 +1905,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -1979,6 +2000,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2073,6 +2095,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2167,6 +2190,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2261,6 +2285,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2355,6 +2380,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2449,6 +2475,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2543,6 +2570,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2637,6 +2665,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2731,6 +2760,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2825,6 +2855,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -2919,6 +2950,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -3013,6 +3045,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -3106,6 +3139,7 @@ "destination.as.organization.name": "Castle Access Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3196,6 +3230,7 @@ "destination.as.organization.name": "INAMES", "destination.geo.continent_name": "Asia", "destination.geo.country_iso_code": "KR", + "destination.geo.country_name": "South Korea", "destination.geo.location.lat": 37.5112, "destination.geo.location.lon": 126.9741, "destination.geo.name": "Korea Republic Of", @@ -3286,6 +3321,7 @@ "destination.as.organization.name": "CJSC Registrar R01", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7386, "destination.geo.location.lon": 37.6068, "destination.geo.name": "Russian Federation", @@ -3377,6 +3413,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -3469,6 +3506,7 @@ "destination.as.organization.name": "Confluence Networks Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3559,6 +3597,7 @@ "destination.as.organization.name": "Confluence Networks Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3650,6 +3689,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -3742,6 +3782,7 @@ "destination.as.organization.name": "Confluence Networks Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3832,6 +3873,7 @@ "destination.as.organization.name": "Domain names registrar REG.RU, Ltd", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7386, "destination.geo.location.lon": 37.6068, "destination.geo.name": "Russian Federation", @@ -3922,6 +3964,7 @@ "destination.as.organization.name": "Domain names registrar REG.RU, Ltd", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7386, "destination.geo.location.lon": 37.6068, "destination.geo.name": "Russian Federation", @@ -4079,6 +4122,7 @@ "source.geo.city_name": "Fort Lauderdale", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 26.1792, "source.geo.location.lon": -80.1749, "source.geo.name": "United States", @@ -4103,6 +4147,7 @@ "destination.geo.city_name": "Kitchener", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "CA", + "destination.geo.country_name": "Canada", "destination.geo.location.lat": 43.4419, "destination.geo.location.lon": -80.4216, "destination.geo.name": "Canada", @@ -4195,6 +4240,7 @@ "destination.as.organization.name": "Castle Access Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -4285,6 +4331,7 @@ "destination.as.organization.name": "Confluence Networks Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "VG", + "destination.geo.country_name": "British Virgin Islands", "destination.geo.location.lat": 18.5, "destination.geo.location.lon": -64.5, "destination.geo.name": "Virgin Islands British", @@ -4375,6 +4422,7 @@ "destination.as.organization.name": "Confluence Networks Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -4466,6 +4514,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -4559,6 +4608,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -4652,6 +4702,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -4745,6 +4796,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -4838,6 +4890,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -5000,6 +5053,7 @@ "source.geo.city_name": "Brea", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 33.9339, "source.geo.location.lon": -117.8854, "source.geo.name": "United States", @@ -5024,6 +5078,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -5186,6 +5241,7 @@ "source.geo.city_name": "Montreal", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "CA", + "source.geo.country_name": "Canada", "source.geo.location.lat": 45.4995, "source.geo.location.lon": -73.5848, "source.geo.name": "European Union", @@ -5278,6 +5334,7 @@ "source.as.organization.name": "No.31,Jin-rong Street", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 30.294, "source.geo.location.lon": 120.1619, "source.geo.name": "China", @@ -5302,6 +5359,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -5463,6 +5521,7 @@ "source.as.organization.name": "NForce Entertainment B.V.", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "NL", + "source.geo.country_name": "Netherlands", "source.geo.location.lat": 52.3824, "source.geo.location.lon": 4.8995, "source.geo.name": "Netherlands", @@ -5554,6 +5613,7 @@ "source.geo.city_name": "Montreal", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "CA", + "source.geo.country_name": "Canada", "source.geo.location.lat": 45.4995, "source.geo.location.lon": -73.5848, "source.geo.name": "European Union", @@ -5577,6 +5637,7 @@ "destination.as.organization.name": "YANDEX LLC", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7386, "destination.geo.location.lon": 37.6068, "destination.geo.name": "Russian Federation", @@ -5667,6 +5728,7 @@ "destination.as.organization.name": "YANDEX LLC", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7386, "destination.geo.location.lon": 37.6068, "destination.geo.name": "Russian Federation", @@ -5757,6 +5819,7 @@ "destination.as.organization.name": "YANDEX LLC", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7386, "destination.geo.location.lon": 37.6068, "destination.geo.name": "Russian Federation", @@ -5917,6 +5980,7 @@ "source.geo.city_name": "Brea", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 33.9339, "source.geo.location.lon": -117.8854, "source.geo.name": "United States", @@ -5941,6 +6005,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.name": "United States", @@ -6034,6 +6099,7 @@ "destination.geo.city_name": "Central", "destination.geo.continent_name": "Asia", "destination.geo.country_iso_code": "HK", + "destination.geo.country_name": "Hong Kong", "destination.geo.location.lat": 22.2909, "destination.geo.location.lon": 114.15, "destination.geo.name": "United States", @@ -6196,6 +6262,7 @@ "source.geo.city_name": "Redmond", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 47.6722, "source.geo.location.lon": -122.1257, "source.geo.name": "United States", @@ -6289,6 +6356,7 @@ "source.geo.city_name": "Redmond", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 47.6722, "source.geo.location.lon": -122.1257, "source.geo.name": "United States", @@ -6313,6 +6381,7 @@ "destination.geo.city_name": "Los Angeles", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 34.0544, "destination.geo.location.lon": -118.244, "destination.geo.name": "United States", @@ -6474,6 +6543,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -6495,6 +6565,7 @@ "destination.as.organization.name": "Pandora Media, Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -6654,6 +6725,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -6745,6 +6817,7 @@ "source.geo.city_name": "Oliva", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "ES", + "source.geo.country_name": "Spain", "source.geo.location.lat": 38.9197, "source.geo.location.lon": -0.1193, "source.geo.name": "Ukraine", @@ -6837,6 +6910,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -6927,6 +7001,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7017,6 +7092,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7107,6 +7183,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7128,6 +7205,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -7287,6 +7365,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7377,6 +7456,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7467,6 +7547,7 @@ "source.as.organization.name": "Wikimedia Foundation Inc.", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7557,6 +7638,7 @@ "source.as.organization.name": "Wikimedia Foundation Inc.", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7648,6 +7730,7 @@ "source.geo.city_name": "Los Angeles", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 34.0544, "source.geo.location.lon": -118.244, "source.geo.name": "United States", @@ -7740,6 +7823,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7830,6 +7914,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -7921,6 +8006,7 @@ "source.geo.city_name": "Liberal", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.0438, "source.geo.location.lon": -100.9286, "source.geo.name": "United States", @@ -8013,6 +8099,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -8103,6 +8190,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -8194,6 +8282,7 @@ "source.geo.city_name": "Albany", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 42.7008, "source.geo.location.lon": -73.8601, "source.geo.name": "United States", @@ -8286,6 +8375,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -8307,6 +8397,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -8466,6 +8557,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -8556,6 +8648,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -8577,6 +8670,7 @@ "destination.as.organization.name": "Pandora Media, Inc", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -8736,6 +8830,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -8826,6 +8921,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -8916,6 +9012,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -9006,6 +9103,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -9096,6 +9194,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", @@ -9186,6 +9285,7 @@ "source.as.organization.name": "Google LLC", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.geo.name": "United States", diff --git a/x-pack/filebeat/module/panw/panos/test/pan_inc_traffic.log-expected.json b/x-pack/filebeat/module/panw/panos/test/pan_inc_traffic.log-expected.json index 587b481636f..44f7a7790ab 100644 --- a/x-pack/filebeat/module/panw/panos/test/pan_inc_traffic.log-expected.json +++ b/x-pack/filebeat/module/panw/panos/test/pan_inc_traffic.log-expected.json @@ -13,6 +13,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -113,6 +114,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -211,6 +213,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -310,6 +313,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -411,6 +415,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -511,6 +516,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -609,6 +615,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -708,6 +715,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -809,6 +817,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -910,6 +919,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1011,6 +1021,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1112,6 +1123,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1213,6 +1225,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1314,6 +1327,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1415,6 +1429,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1516,6 +1531,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1617,6 +1633,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1718,6 +1735,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1819,6 +1837,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -1919,6 +1938,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -2017,6 +2037,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -2116,6 +2137,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -2216,6 +2238,7 @@ "destination.bytes": 98, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -2315,6 +2338,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -2416,6 +2440,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -2517,6 +2542,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -2617,6 +2643,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -2715,6 +2742,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -2814,6 +2842,7 @@ "destination.geo.city_name": "Westminster", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 33.7518, "destination.geo.location.lon": -117.9932, "destination.geo.region_iso_code": "US-CA", @@ -2915,6 +2944,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -3015,6 +3045,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -3114,6 +3145,7 @@ "destination.geo.city_name": "Assago", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 45.4087, "destination.geo.location.lon": 9.1225, "destination.geo.region_iso_code": "IT-MI", @@ -3215,6 +3247,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -3315,6 +3348,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -3413,6 +3447,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -3512,6 +3547,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -3613,6 +3649,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -3713,6 +3750,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -3811,6 +3849,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -3908,6 +3947,7 @@ "destination.bytes": 111, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -4000,6 +4040,7 @@ "destination.bytes": 906, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 43.1479, "destination.geo.location.lon": 12.1097, "destination.ip": "62.211.68.12", @@ -4098,6 +4139,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -4193,6 +4235,7 @@ "destination.geo.city_name": "Washington", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.7095, "destination.geo.location.lon": -78.1539, "destination.geo.region_iso_code": "US-VA", @@ -4294,6 +4337,7 @@ "destination.geo.city_name": "Washington", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.7095, "destination.geo.location.lon": -78.1539, "destination.geo.region_iso_code": "US-VA", @@ -4393,6 +4437,7 @@ "destination.bytes": 141, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -4486,6 +4531,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -4586,6 +4632,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -4685,6 +4732,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -4785,6 +4833,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -4883,6 +4932,7 @@ "destination.bytes": 316, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -4981,6 +5031,7 @@ "destination.bytes": 121, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -5079,6 +5130,7 @@ "destination.bytes": 169, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -5177,6 +5229,7 @@ "destination.bytes": 954, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 43.1479, "destination.geo.location.lon": 12.1097, "destination.ip": "62.211.68.12", @@ -5276,6 +5329,7 @@ "destination.geo.city_name": "Assago", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 45.4087, "destination.geo.location.lon": 9.1225, "destination.geo.region_iso_code": "IT-MI", @@ -5377,6 +5431,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -5477,6 +5532,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -5576,6 +5632,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -5676,6 +5733,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -5774,6 +5832,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -5873,6 +5932,7 @@ "destination.geo.city_name": "Washington", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.7095, "destination.geo.location.lon": -78.1539, "destination.geo.region_iso_code": "US-VA", @@ -5974,6 +6034,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -6074,6 +6135,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -6172,6 +6234,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -6270,6 +6333,7 @@ "destination.bytes": 906, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 43.1479, "destination.geo.location.lon": 12.1097, "destination.ip": "62.211.68.12", @@ -6368,6 +6432,7 @@ "destination.bytes": 163, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -6466,6 +6531,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -6564,6 +6630,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -6663,6 +6730,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -6763,6 +6831,7 @@ "destination.bytes": 922, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 43.1479, "destination.geo.location.lon": 12.1097, "destination.ip": "62.211.68.12", @@ -6862,6 +6931,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -6962,6 +7032,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -7060,6 +7131,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -7159,6 +7231,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -7259,6 +7332,7 @@ "destination.bytes": 26786, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.5.1.1", @@ -7357,6 +7431,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -7455,6 +7530,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -7554,6 +7630,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -7747,6 +7824,7 @@ "destination.geo.city_name": "Assago", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 45.4087, "destination.geo.location.lon": 9.1225, "destination.geo.region_iso_code": "IT-MI", @@ -7848,6 +7926,7 @@ "destination.geo.city_name": "Assago", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 45.4087, "destination.geo.location.lon": 9.1225, "destination.geo.region_iso_code": "IT-MI", @@ -8133,6 +8212,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -8233,6 +8313,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -8331,6 +8412,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -8430,6 +8512,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -8530,6 +8613,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -8720,6 +8804,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -8819,6 +8904,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -8919,6 +9005,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -9017,6 +9104,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "205.171.2.25", @@ -9115,6 +9203,7 @@ "destination.bytes": 906, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IT", + "destination.geo.country_name": "Italy", "destination.geo.location.lat": 43.1479, "destination.geo.location.lon": 12.1097, "destination.ip": "62.211.68.12", @@ -9214,6 +9303,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -9315,6 +9405,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -9416,6 +9507,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -9609,6 +9701,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -9710,6 +9803,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", @@ -9811,6 +9905,7 @@ "destination.geo.city_name": "Fort Lauderdale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 26.1792, "destination.geo.location.lon": -80.1749, "destination.geo.region_iso_code": "US-FL", diff --git a/x-pack/filebeat/module/panw/panos/test/threat.log-expected.json b/x-pack/filebeat/module/panw/panos/test/threat.log-expected.json index 93fe08f75d9..de6c83a2fa1 100644 --- a/x-pack/filebeat/module/panw/panos/test/threat.log-expected.json +++ b/x-pack/filebeat/module/panw/panos/test/threat.log-expected.json @@ -10,6 +10,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -111,6 +112,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -212,6 +214,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -313,6 +316,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -414,6 +418,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -515,6 +520,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -616,6 +622,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -717,6 +724,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -818,6 +826,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -919,6 +928,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1020,6 +1030,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1121,6 +1132,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1222,6 +1234,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1323,6 +1336,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1424,6 +1438,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1525,6 +1540,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1626,6 +1642,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1727,6 +1744,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1828,6 +1846,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -1929,6 +1948,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2030,6 +2050,7 @@ "destination.as.organization.name": "Akamai International B.V.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2131,6 +2152,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2232,6 +2254,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2333,6 +2356,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2434,6 +2458,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2535,6 +2560,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2636,6 +2662,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2737,6 +2764,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2838,6 +2866,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -2939,6 +2968,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3040,6 +3070,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3141,6 +3172,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3242,6 +3274,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3343,6 +3376,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3444,6 +3478,7 @@ "destination.as.organization.name": "MCI Communications Services, Inc. d/b/a Verizon Business", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3545,6 +3580,7 @@ "destination.as.organization.name": "Fastly", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -3647,6 +3683,7 @@ "destination.geo.city_name": "Seattle", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 47.6109, "destination.geo.location.lon": -122.3303, "destination.geo.name": "United States", @@ -3751,6 +3788,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -3855,6 +3893,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -3959,6 +3998,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4063,6 +4103,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4167,6 +4208,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4271,6 +4313,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4375,6 +4418,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4479,6 +4523,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4583,6 +4628,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4687,6 +4733,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4791,6 +4838,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4895,6 +4943,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -4999,6 +5048,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.3861, "destination.geo.location.lon": -122.0839, "destination.geo.name": "United States", @@ -5102,6 +5152,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5203,6 +5254,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5304,6 +5356,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5405,6 +5458,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5506,6 +5560,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5607,6 +5662,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5708,6 +5764,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5809,6 +5866,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -5910,6 +5968,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -6011,6 +6070,7 @@ "destination.as.organization.name": "Akamai Technologies, Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.geo.name": "United States", @@ -6113,6 +6173,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6217,6 +6278,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6321,6 +6383,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6425,6 +6488,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6529,6 +6593,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6633,6 +6698,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6737,6 +6803,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6841,6 +6908,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -6945,6 +7013,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -7049,6 +7118,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -7153,6 +7223,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -7257,6 +7328,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -7361,6 +7433,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -7465,6 +7538,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -7569,6 +7643,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", @@ -7673,6 +7748,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.name": "United States", diff --git a/x-pack/filebeat/module/panw/panos/test/traffic.log-expected.json b/x-pack/filebeat/module/panw/panos/test/traffic.log-expected.json index 5f979092c4b..200e02370d3 100644 --- a/x-pack/filebeat/module/panw/panos/test/traffic.log-expected.json +++ b/x-pack/filebeat/module/panw/panos/test/traffic.log-expected.json @@ -13,6 +13,7 @@ "destination.bytes": 5976, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "184.51.253.152", @@ -122,6 +123,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -232,6 +234,7 @@ "destination.geo.city_name": "Dallas", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 32.7787, "destination.geo.location.lon": -96.8217, "destination.geo.region_iso_code": "US-TX", @@ -343,6 +346,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -453,6 +457,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.3861, "destination.geo.location.lon": -122.0839, "destination.geo.region_iso_code": "US-CA", @@ -564,6 +569,7 @@ "destination.bytes": 21111, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "209.234.224.22", @@ -673,6 +679,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -782,6 +789,7 @@ "destination.bytes": 3732, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.2.238", @@ -891,6 +899,7 @@ "destination.bytes": 221, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1000,6 +1009,7 @@ "destination.bytes": 221, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1109,6 +1119,7 @@ "destination.bytes": 5469, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "17.249.60.78", @@ -1218,6 +1229,7 @@ "destination.bytes": 224, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1327,6 +1339,7 @@ "destination.bytes": 117, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1436,6 +1449,7 @@ "destination.bytes": 307, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1545,6 +1559,7 @@ "destination.bytes": 365, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1654,6 +1669,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1763,6 +1779,7 @@ "destination.bytes": 161, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1872,6 +1889,7 @@ "destination.bytes": 7805, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "98.138.49.44", @@ -1981,6 +1999,7 @@ "destination.bytes": 6106, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "72.30.3.43", @@ -2090,6 +2109,7 @@ "destination.bytes": 196, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -2199,6 +2219,7 @@ "destination.bytes": 3245, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.9.142", @@ -2308,6 +2329,7 @@ "destination.bytes": 179, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -2418,6 +2440,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -2528,6 +2551,7 @@ "destination.geo.city_name": "Sunnyvale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.386, "destination.geo.location.lon": -122.0144, "destination.geo.region_iso_code": "US-CA", @@ -2639,6 +2663,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -2748,6 +2773,7 @@ "destination.bytes": 130, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -2853,6 +2879,7 @@ "destination.bytes": 1991, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "172.217.9.142", @@ -2959,6 +2986,7 @@ "destination.bytes": 523, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "151.101.2.2", @@ -3069,6 +3097,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.3861, "destination.geo.location.lon": -122.0839, "destination.geo.region_iso_code": "US-CA", @@ -3180,6 +3209,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -3289,6 +3319,7 @@ "destination.bytes": 196, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -3398,6 +3429,7 @@ "destination.bytes": 5003, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "184.51.253.193", @@ -3507,6 +3539,7 @@ "destination.bytes": 171, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -3615,6 +3648,7 @@ "destination.geo.city_name": "Sunnyvale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.386, "destination.geo.location.lon": -122.0144, "destination.geo.region_iso_code": "US-CA", @@ -3727,6 +3761,7 @@ "destination.geo.city_name": "Sunnyvale", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.386, "destination.geo.location.lon": -122.0144, "destination.geo.region_iso_code": "US-CA", @@ -3839,6 +3874,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -3950,6 +3986,7 @@ "destination.bytes": 244, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -4059,6 +4096,7 @@ "destination.bytes": 205, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -4169,6 +4207,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.4043, "destination.geo.location.lon": -122.0748, "destination.geo.region_iso_code": "US-CA", @@ -4389,6 +4428,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -4500,6 +4540,7 @@ "destination.bytes": 661, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "184.51.252.247", @@ -4610,6 +4651,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.4043, "destination.geo.location.lon": -122.0748, "destination.geo.region_iso_code": "US-CA", @@ -4722,6 +4764,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.4043, "destination.geo.location.lon": -122.0748, "destination.geo.region_iso_code": "US-CA", @@ -4833,6 +4876,7 @@ "destination.bytes": 182, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -4942,6 +4986,7 @@ "destination.bytes": 90, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -5052,6 +5097,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -5163,6 +5209,7 @@ "destination.bytes": 661, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "184.51.252.247", @@ -5380,6 +5427,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -5485,6 +5533,7 @@ "destination.bytes": 144, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -5594,6 +5643,7 @@ "destination.bytes": 206, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -5703,6 +5753,7 @@ "destination.bytes": 206, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -5812,6 +5863,7 @@ "destination.bytes": 169, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -5921,6 +5973,7 @@ "destination.bytes": 132, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6030,6 +6083,7 @@ "destination.bytes": 127, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6139,6 +6193,7 @@ "destination.bytes": 105, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6248,6 +6303,7 @@ "destination.bytes": 172, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6357,6 +6413,7 @@ "destination.bytes": 134, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6466,6 +6523,7 @@ "destination.bytes": 179, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6575,6 +6633,7 @@ "destination.bytes": 218, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6684,6 +6743,7 @@ "destination.bytes": 172, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6793,6 +6853,7 @@ "destination.bytes": 305, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -6903,6 +6964,7 @@ "destination.geo.city_name": "Lanham", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9705, "destination.geo.location.lon": -76.8388, "destination.geo.region_iso_code": "US-MD", @@ -7014,6 +7076,7 @@ "destination.bytes": 153, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -7123,6 +7186,7 @@ "destination.bytes": 169, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -7232,6 +7296,7 @@ "destination.bytes": 128, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -7341,6 +7406,7 @@ "destination.bytes": 181, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -7450,6 +7516,7 @@ "destination.bytes": 121, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -7560,6 +7627,7 @@ "destination.geo.city_name": "San Antonio", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 29.4551, "destination.geo.location.lon": -98.6498, "destination.geo.region_iso_code": "US-TX", @@ -7671,6 +7739,7 @@ "destination.bytes": 315, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -7780,6 +7849,7 @@ "destination.bytes": 130, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -7890,6 +7960,7 @@ "destination.geo.city_name": "Seattle", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 47.54, "destination.geo.location.lon": -122.3032, "destination.geo.region_iso_code": "US-WA", @@ -8001,6 +8072,7 @@ "destination.bytes": 149, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -8110,6 +8182,7 @@ "destination.bytes": 202, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -8219,6 +8292,7 @@ "destination.bytes": 195, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -8328,6 +8402,7 @@ "destination.bytes": 90, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "208.83.246.20", @@ -8437,6 +8512,7 @@ "destination.bytes": 192, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -8545,6 +8621,7 @@ "destination.bytes": 208, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -8653,6 +8730,7 @@ "destination.bytes": 100, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -8761,6 +8839,7 @@ "destination.bytes": 7237, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.6583, "destination.geo.location.lon": -77.2481, "destination.geo.region_iso_code": "US-VA", @@ -8871,6 +8950,7 @@ "destination.bytes": 109, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -8980,6 +9060,7 @@ "destination.bytes": 116, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -9089,6 +9170,7 @@ "destination.bytes": 96, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -9199,6 +9281,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -9311,6 +9394,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -9423,6 +9507,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -9534,6 +9619,7 @@ "destination.bytes": 7820, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "104.254.150.9", @@ -9644,6 +9730,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -9756,6 +9843,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -9868,6 +9956,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -9980,6 +10069,7 @@ "destination.geo.city_name": "Ashburn", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 39.0481, "destination.geo.location.lon": -77.4728, "destination.geo.region_iso_code": "US-VA", @@ -10092,6 +10182,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.4043, "destination.geo.location.lon": -122.0748, "destination.geo.region_iso_code": "US-CA", @@ -10203,6 +10294,7 @@ "destination.bytes": 172, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -10312,6 +10404,7 @@ "destination.bytes": 588, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -10421,6 +10514,7 @@ "destination.bytes": 94, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -10530,6 +10624,7 @@ "destination.bytes": 170, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -10639,6 +10734,7 @@ "destination.bytes": 94, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -10748,6 +10844,7 @@ "destination.bytes": 94, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -10857,6 +10954,7 @@ "destination.bytes": 166, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", diff --git a/x-pack/filebeat/module/snort/log/test/generated.log-expected.json b/x-pack/filebeat/module/snort/log/test/generated.log-expected.json index f0150dcb87f..d1a9aa8535f 100644 --- a/x-pack/filebeat/module/snort/log/test/generated.log-expected.json +++ b/x-pack/filebeat/module/snort/log/test/generated.log-expected.json @@ -61,8 +61,8 @@ "uptatev4292.www.invalid" ], "related.ip": [ - "10.212.11.114", - "10.38.77.13" + "10.38.77.13", + "10.212.11.114" ], "rsa.internal.messageid": "NGIPS_events", "rsa.internal.msg_id": "uam", @@ -826,8 +826,8 @@ "apari5002.api.test" ], "related.ip": [ - "10.9.200.197", - "10.182.213.195" + "10.182.213.195", + "10.9.200.197" ], "rsa.crypto.sig_type": "fugiatnu", "rsa.internal.messageid": "27813", @@ -1006,8 +1006,8 @@ "unturmag6190.api.lan" ], "related.ip": [ - "10.52.190.18", - "10.238.223.171" + "10.238.223.171", + "10.52.190.18" ], "rsa.crypto.sig_type": "Finibus", "rsa.internal.messageid": "16539", @@ -1209,8 +1209,8 @@ "iqu4858.mail.invalid" ], "related.ip": [ - "10.213.100.153", - "10.116.175.84" + "10.116.175.84", + "10.213.100.153" ], "rsa.crypto.sig_type": "exercit", "rsa.internal.messageid": "11634", @@ -1643,8 +1643,8 @@ "urau1660.www.lan" ], "related.ip": [ - "10.201.132.114", - "10.140.209.249" + "10.140.209.249", + "10.201.132.114" ], "rsa.internal.messageid": "NGIPS_events", "rsa.internal.msg_id": "lor", @@ -1731,8 +1731,8 @@ "nofde7732.internal.test" ], "related.ip": [ - "10.198.44.231", - "10.36.122.169" + "10.36.122.169", + "10.198.44.231" ], "rsa.crypto.sig_type": "umquam", "rsa.internal.messageid": "13228", @@ -2113,8 +2113,8 @@ "uovol2459.www5.invalid" ], "related.ip": [ - "10.60.137.215", - "10.28.105.106" + "10.28.105.106", + "10.60.137.215" ], "rsa.crypto.sig_type": "tionu", "rsa.internal.messageid": "5155", @@ -2229,10 +2229,10 @@ "Loremips5368.www5.corp" ], "related.ip": [ + "10.20.167.114", "10.49.190.163", - "10.166.40.137", "10.65.144.119", - "10.20.167.114" + "10.166.40.137" ], "rsa.internal.event_desc": "Offloaded TCP Flow for connection", "rsa.internal.messageid": "FTD_events", @@ -2361,8 +2361,8 @@ "magn3657.api.invalid" ], "related.ip": [ - "10.180.28.156", - "10.234.234.205" + "10.234.234.205", + "10.180.28.156" ], "rsa.crypto.sig_type": "mnihil", "rsa.internal.messageid": "5315", @@ -2578,8 +2578,8 @@ "laparia5374.api.domain" ], "related.ip": [ - "10.147.155.100", - "10.232.67.182" + "10.232.67.182", + "10.147.155.100" ], "rsa.crypto.sig_type": "eufugi", "rsa.internal.messageid": "26152", @@ -2828,8 +2828,8 @@ "borios1685.www.localhost" ], "related.ip": [ - "10.231.10.63", - "10.38.22.60" + "10.38.22.60", + "10.231.10.63" ], "rsa.crypto.sig_type": "taliquip", "rsa.internal.messageid": "10329", @@ -2886,8 +2886,8 @@ "Bonoru5658.mail.invalid" ], "related.ip": [ - "10.29.231.11", - "10.46.57.181" + "10.46.57.181", + "10.29.231.11" ], "rsa.internal.messageid": "NGIPS_events", "rsa.internal.msg_id": "remape", @@ -3160,8 +3160,8 @@ "onsecte5119.www.invalid" ], "related.ip": [ - "10.198.207.31", - "10.5.88.183" + "10.5.88.183", + "10.198.207.31" ], "rsa.internal.event_desc": "Failed to locate egress interface", "rsa.internal.messageid": "FTD_events", @@ -3836,9 +3836,9 @@ "erunt3957.internal.lan" ], "related.ip": [ - "10.118.103.185", "10.32.195.34", "10.240.77.10", + "10.118.103.185", "10.125.130.61" ], "rsa.internal.event_desc": "TCP Flow is no longer offloaded for connection", diff --git a/x-pack/filebeat/module/sonicwall/firewall/test/general.log-expected.json b/x-pack/filebeat/module/sonicwall/firewall/test/general.log-expected.json index 9f972c2e6fc..37d6d4325b7 100644 --- a/x-pack/filebeat/module/sonicwall/firewall/test/general.log-expected.json +++ b/x-pack/filebeat/module/sonicwall/firewall/test/general.log-expected.json @@ -28,6 +28,7 @@ "source.as.organization.name": "Orange", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "FR", + "source.geo.country_name": "France", "source.geo.location.lat": 48.8582, "source.geo.location.lon": 2.3387, "source.ip": [ @@ -95,6 +96,7 @@ "source.as.organization.name": "Orange", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "FR", + "source.geo.country_name": "France", "source.geo.location.lat": 48.8582, "source.geo.location.lon": 2.3387, "source.ip": [ @@ -243,6 +245,7 @@ "source.as.organization.name": "Orange", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "FR", + "source.geo.country_name": "France", "source.geo.location.lat": 48.8582, "source.geo.location.lon": 2.3387, "source.ip": [ @@ -310,6 +313,7 @@ "source.as.organization.name": "Orange", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "FR", + "source.geo.country_name": "France", "source.geo.location.lat": 48.8582, "source.geo.location.lon": 2.3387, "source.ip": [ @@ -347,6 +351,7 @@ "service.type": "sonicwall", "source.geo.continent_name": "Oceania", "source.geo.country_iso_code": "NZ", + "source.geo.country_name": "New Zealand", "source.geo.location.lat": -41.0, "source.geo.location.lon": 174.0, "source.ip": [ @@ -436,6 +441,7 @@ "source.as.organization.name": "Cloudflare, Inc.", "source.geo.continent_name": "Oceania", "source.geo.country_iso_code": "AU", + "source.geo.country_name": "Australia", "source.geo.location.lat": -33.494, "source.geo.location.lon": 143.2104, "source.ip": [ diff --git a/x-pack/filebeat/module/sonicwall/firewall/test/generated.log-expected.json b/x-pack/filebeat/module/sonicwall/firewall/test/generated.log-expected.json index 5b84648b930..bd92a3aa08a 100644 --- a/x-pack/filebeat/module/sonicwall/firewall/test/generated.log-expected.json +++ b/x-pack/filebeat/module/sonicwall/firewall/test/generated.log-expected.json @@ -23,8 +23,8 @@ "oreetdol1714.internal.corp" ], "related.ip": [ - "10.49.111.67", - "10.92.136.230" + "10.92.136.230", + "10.49.111.67" ], "rsa.internal.messageid": "914", "rsa.internal.msg": "lupt", @@ -86,8 +86,8 @@ "observer.vendor": "Sonicwall", "related.ip": [ "10.227.15.1", - "10.149.203.46", - "10.150.156.22" + "10.150.156.22", + "10.149.203.46" ], "rsa.internal.event_desc": "ctetur", "rsa.internal.messageid": "1369", @@ -171,8 +171,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.13.70.213", - "10.95.245.65" + "10.95.245.65", + "10.13.70.213" ], "rsa.internal.messageid": "372", "rsa.internal.msg": "llu", @@ -478,8 +478,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.78.151.178", - "10.157.161.103" + "10.157.161.103", + "10.78.151.178" ], "rsa.internal.event_desc": "taut", "rsa.internal.messageid": "24", @@ -551,9 +551,9 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.34.161.166", "10.245.200.97", - "10.219.116.137" + "10.219.116.137", + "10.34.161.166" ], "rsa.internal.event_desc": "rehend", "rsa.internal.messageid": "428", @@ -599,8 +599,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.118.80.140", - "10.252.122.195" + "10.252.122.195", + "10.118.80.140" ], "rsa.internal.messageid": "401", "rsa.internal.msg": "inesci", @@ -845,8 +845,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.248.101.25", - "10.60.129.15" + "10.60.129.15", + "10.248.101.25" ], "rsa.internal.messageid": "372", "rsa.internal.msg": "ommodico", @@ -1006,8 +1006,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.101.74.44", - "10.251.20.13" + "10.251.20.13", + "10.101.74.44" ], "related.user": [ "rsitv" @@ -1219,8 +1219,8 @@ "ise5905.www.local" ], "related.ip": [ - "10.97.124.211", - "10.53.113.23" + "10.53.113.23", + "10.97.124.211" ], "rsa.identity.user_sid_dst": "iumdol", "rsa.internal.messageid": "1154", @@ -1279,8 +1279,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.187.201.250", - "10.64.229.79" + "10.64.229.79", + "10.187.201.250" ], "rsa.db.index": "rumwrit", "rsa.internal.messageid": "83", @@ -1389,8 +1389,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.31.190.145", - "10.147.88.219" + "10.147.88.219", + "10.31.190.145" ], "related.user": [ "corpori" @@ -1431,9 +1431,9 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.108.84.24", "10.251.248.228", - "10.113.100.237" + "10.113.100.237", + "10.108.84.24" ], "rsa.internal.event_desc": "volupt", "rsa.internal.messageid": "606", @@ -1777,8 +1777,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.165.48.224", - "10.191.242.168" + "10.191.242.168", + "10.165.48.224" ], "rsa.internal.event_desc": "equep", "rsa.internal.messageid": "995", @@ -1831,8 +1831,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.185.37.32", - "10.116.173.79" + "10.116.173.79", + "10.185.37.32" ], "rsa.internal.messageid": "178", "rsa.internal.msg": "ende", @@ -1863,8 +1863,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.57.85.98", - "10.219.42.212" + "10.219.42.212", + "10.57.85.98" ], "rsa.internal.event_desc": "mquisno", "rsa.internal.messageid": "995", @@ -1917,8 +1917,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.135.70.159", - "10.195.223.82" + "10.195.223.82", + "10.135.70.159" ], "rsa.internal.messageid": "351", "rsa.internal.msg": "CSe", @@ -2068,8 +2068,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.56.10.84", - "10.12.54.142" + "10.12.54.142", + "10.56.10.84" ], "rsa.internal.messageid": "658", "rsa.internal.msg": "osquirat", @@ -2105,8 +2105,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.117.63.181", - "10.222.169.140" + "10.222.169.140", + "10.117.63.181" ], "rsa.internal.messageid": "195", "rsa.internal.msg": "magnaal", @@ -2247,8 +2247,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.129.101.147", - "10.206.229.61" + "10.206.229.61", + "10.129.101.147" ], "rsa.internal.messageid": "413", "rsa.internal.msg": "upta", @@ -2383,8 +2383,8 @@ "observer.type": "Firewall", "observer.vendor": "Sonicwall", "related.ip": [ - "10.29.120.226", - "10.203.146.137" + "10.203.146.137", + "10.29.120.226" ], "rsa.internal.messageid": "712", "rsa.misc.action": [ diff --git a/x-pack/filebeat/module/sophos/utm/test/generated.log-expected.json b/x-pack/filebeat/module/sophos/utm/test/generated.log-expected.json index b57ab7067ab..392ac679e44 100644 --- a/x-pack/filebeat/module/sophos/utm/test/generated.log-expected.json +++ b/x-pack/filebeat/module/sophos/utm/test/generated.log-expected.json @@ -59,9 +59,9 @@ "10.57.170.140" ], "related.user": [ - "sunt", + "dexeac", "icistatuscode=giatquov", - "dexeac" + "sunt" ], "rsa.db.index": "run", "rsa.identity.logon_type": "nofdeF", @@ -70,8 +70,8 @@ "rsa.investigations.event_cat": 1901000000, "rsa.investigations.event_cat_name": "Other.Default", "rsa.misc.action": [ - "block", - "ugiatnu" + "ugiatnu", + "block" ], "rsa.misc.comments": "colabo", "rsa.misc.content_type": "sedd", @@ -163,8 +163,8 @@ "10.106.239.55" ], "related.user": [ - "itquiin", - "eaq" + "eaq", + "itquiin" ], "rsa.identity.logon_type": "stquidol", "rsa.internal.event_desc": "bor", @@ -638,8 +638,8 @@ "10.54.169.175" ], "related.user": [ - "taspe", - "scipit" + "scipit", + "taspe" ], "rsa.identity.logon_type": "olores", "rsa.internal.event_desc": "secil", @@ -974,8 +974,8 @@ "10.232.108.32" ], "related.user": [ - "rsp", - "llum" + "llum", + "rsp" ], "rsa.identity.logon_type": "ntut", "rsa.internal.event_desc": "ittenb", @@ -1033,13 +1033,13 @@ "Duis583.api.local" ], "related.ip": [ - "10.17.51.153", - "10.89.41.97" + "10.89.41.97", + "10.17.51.153" ], "related.user": [ - "tcustatuscode=eumiu", "tio", - "pteurs" + "pteurs", + "tcustatuscode=eumiu" ], "rsa.db.index": "eavolupt", "rsa.identity.logon_type": "ursintoc", @@ -1610,8 +1610,8 @@ "10.244.96.61" ], "related.user": [ - "itsedqui", - "iumt" + "iumt", + "itsedqui" ], "rsa.identity.logon_type": "psamvolu", "rsa.internal.event_desc": "orroqui", @@ -1851,13 +1851,13 @@ "tenbyCi4371.www5.localdomain" ], "related.ip": [ - "10.98.126.206", - "10.214.167.164" + "10.214.167.164", + "10.98.126.206" ], "related.user": [ - "hen", + "amremapstatuscode=dolorsit", "isnostru", - "amremapstatuscode=dolorsit" + "hen" ], "rsa.db.index": "spernatu", "rsa.identity.logon_type": "untutl", @@ -1866,8 +1866,8 @@ "rsa.investigations.event_cat": 1901000000, "rsa.investigations.event_cat_name": "Other.Default", "rsa.misc.action": [ - "nsectetu", - "block" + "block", + "nsectetu" ], "rsa.misc.comments": "uaer", "rsa.misc.content_type": "eaqu", @@ -1924,8 +1924,8 @@ "observer.vendor": "Sophos", "process.pid": 6722, "related.ip": [ - "10.32.236.117", - "10.203.157.250" + "10.203.157.250", + "10.32.236.117" ], "rsa.internal.event_desc": "Packet", "rsa.internal.messageid": "ulogd", @@ -2033,10 +2033,10 @@ "10.92.93.236" ], "related.user": [ - "ulpaq", + "ntoccae", "Sedutper", "dolorsistatuscode=acc", - "ntoccae" + "ulpaq" ], "rsa.db.index": "snisiut", "rsa.identity.logon_type": "umdol", @@ -2045,8 +2045,8 @@ "rsa.investigations.event_cat": 1901000000, "rsa.investigations.event_cat_name": "Other.Default", "rsa.misc.action": [ - "icons", - "block" + "block", + "icons" ], "rsa.misc.comments": "porincid", "rsa.misc.content_type": "temvele", @@ -2124,9 +2124,9 @@ "10.202.65.2" ], "related.user": [ - "atatno", "iscivelistatuscode=urve", - "tasu" + "tasu", + "atatno" ], "rsa.db.index": "amrem", "rsa.identity.logon_type": "nulamcol", @@ -2314,13 +2314,13 @@ "obea2960.mail.corp" ], "related.ip": [ - "10.33.138.154", - "10.45.12.53" + "10.45.12.53", + "10.33.138.154" ], "related.user": [ - "eturadip", + "porincid", "umqustatuscode=ntexpli", - "porincid" + "eturadip" ], "rsa.db.index": "dolor", "rsa.identity.logon_type": "eturadi", @@ -2481,8 +2481,8 @@ "10.32.85.21" ], "related.user": [ - "antium", - "etconsec" + "etconsec", + "antium" ], "rsa.identity.logon_type": "umiurere", "rsa.internal.event_desc": "serro", @@ -2628,14 +2628,14 @@ "nisiuta4810.api.test" ], "related.ip": [ - "10.85.200.58", - "10.210.175.52" + "10.210.175.52", + "10.85.200.58" ], "related.user": [ - "Loremi", - "rExce", "reetd", - "inimastatuscode=emipsum" + "inimastatuscode=emipsum", + "Loremi", + "rExce" ], "rsa.db.index": "apa", "rsa.identity.logon_type": "sedquia", @@ -2644,8 +2644,8 @@ "rsa.investigations.event_cat": 1901000000, "rsa.investigations.event_cat_name": "Other.Default", "rsa.misc.action": [ - "cancel", - "odte" + "odte", + "cancel" ], "rsa.misc.comments": "emquia", "rsa.misc.content_type": "sauteir", @@ -3619,8 +3619,8 @@ "10.96.200.83" ], "related.user": [ - "lapariat", - "acommod" + "acommod", + "lapariat" ], "rsa.identity.logon_type": "remeumf", "rsa.internal.event_desc": "dol", diff --git a/x-pack/filebeat/module/sophos/xg/test/anti-spam.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/anti-spam.log-expected.json index 90a40d0b095..a78e3c1ccb0 100644 --- a/x-pack/filebeat/module/sophos/xg/test/anti-spam.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/anti-spam.log-expected.json @@ -70,6 +70,7 @@ "destination.geo.city_name": "Saint-Prex", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "CH", + "destination.geo.country_name": "Switzerland", "destination.geo.location.lat": 46.4796, "destination.geo.location.lon": 6.4599, "destination.geo.region_iso_code": "CH-VD", @@ -131,6 +132,7 @@ "source.geo.city_name": "Miami", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 25.7806, "source.geo.location.lon": -80.1826, "source.geo.region_iso_code": "US-FL", @@ -154,6 +156,7 @@ "destination.geo.city_name": "Saint-Prex", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "CH", + "destination.geo.country_name": "Switzerland", "destination.geo.location.lat": 46.4796, "destination.geo.location.lon": 6.4599, "destination.geo.region_iso_code": "CH-VD", @@ -217,6 +220,7 @@ "source.geo.city_name": "Cabreuva", "source.geo.continent_name": "South America", "source.geo.country_iso_code": "BR", + "source.geo.country_name": "Brazil", "source.geo.location.lat": -23.3149, "source.geo.location.lon": -47.0763, "source.geo.region_iso_code": "BR-SP", @@ -240,6 +244,7 @@ "destination.geo.city_name": "Saint-Prex", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "CH", + "destination.geo.country_name": "Switzerland", "destination.geo.location.lat": 46.4796, "destination.geo.location.lon": 6.4599, "destination.geo.region_iso_code": "CH-VD", @@ -302,6 +307,7 @@ "source.domain": "ELTOBGI.COM", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "GB", + "source.geo.country_name": "United Kingdom", "source.geo.location.lat": 51.4964, "source.geo.location.lon": -0.1224, "source.ip": "77.72.3.56", diff --git a/x-pack/filebeat/module/sophos/xg/test/anti-virus.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/anti-virus.log-expected.json index a78e27fa46e..42590edbb33 100644 --- a/x-pack/filebeat/module/sophos/xg/test/anti-virus.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/anti-virus.log-expected.json @@ -10,6 +10,7 @@ "destination.geo.city_name": "Seattle", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 47.6348, "destination.geo.location.lon": -122.3451, "destination.geo.region_iso_code": "US-WA", @@ -87,6 +88,7 @@ "destination.geo.city_name": "Seattle", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 47.6348, "destination.geo.location.lon": -122.3451, "destination.geo.region_iso_code": "US-WA", @@ -163,6 +165,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "South America", "destination.geo.country_iso_code": "UY", + "destination.geo.country_name": "Uruguay", "destination.geo.location.lat": -33.0, "destination.geo.location.lon": -56.0, "destination.ip": "186.8.209.194", @@ -225,6 +228,7 @@ "source.bytes": 0, "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 51.2993, "source.geo.location.lon": 9.491, "source.ip": "82.165.194.211", @@ -246,6 +250,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 51.2993, "destination.geo.location.lon": 9.491, "destination.ip": "185.7.209.194", @@ -309,6 +314,7 @@ "source.geo.city_name": "Seattle", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 47.4902, "source.geo.location.lon": -122.3004, "source.geo.region_iso_code": "US-WA", diff --git a/x-pack/filebeat/module/sophos/xg/test/atp.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/atp.log-expected.json index 7dbb6289456..38c2694478e 100644 --- a/x-pack/filebeat/module/sophos/xg/test/atp.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/atp.log-expected.json @@ -7,6 +7,7 @@ "destination.as.organization.name": "Petersburg Internet Network ltd.", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "RU", + "destination.geo.country_name": "Russia", "destination.geo.location.lat": 55.7386, "destination.geo.location.lon": 37.6068, "destination.ip": "46.161.30.47", @@ -76,6 +77,7 @@ "destination.geo.city_name": "Seattle", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 47.6348, "destination.geo.location.lon": -122.3451, "destination.geo.region_iso_code": "US-WA", @@ -143,6 +145,7 @@ "destination.geo.city_name": "Seattle", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 47.6348, "destination.geo.location.lon": -122.3451, "destination.geo.region_iso_code": "US-WA", @@ -209,6 +212,7 @@ "destination.as.organization.name": "Accelerated IT Services & Consulting GmbH", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 51.2993, "destination.geo.location.lon": 9.491, "destination.ip": "82.211.30.202", diff --git a/x-pack/filebeat/module/sophos/xg/test/cfilter.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/cfilter.log-expected.json index a82d4550f57..84dc15e1aeb 100644 --- a/x-pack/filebeat/module/sophos/xg/test/cfilter.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/cfilter.log-expected.json @@ -7,6 +7,7 @@ "destination.as.organization.name": "BHARTI Airtel Ltd.", "destination.geo.continent_name": "Asia", "destination.geo.country_iso_code": "IN", + "destination.geo.country_name": "India", "destination.geo.location.lat": 20.0, "destination.geo.location.lon": 77.0, "destination.ip": "182.79.221.19", @@ -78,6 +79,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.4043, "destination.geo.location.lon": -122.0748, "destination.geo.region_iso_code": "US-CA", @@ -134,6 +136,7 @@ "source.as.organization.name": "Telefonica Germany", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 51.2993, "source.geo.location.lon": 9.491, "source.ip": "5.5.5.15", @@ -153,6 +156,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "74.125.130.188", @@ -213,6 +217,7 @@ "source.as.organization.name": "Telefonica Germany", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 51.2993, "source.geo.location.lon": 9.491, "source.ip": "5.5.5.15", @@ -231,6 +236,7 @@ "destination.geo.city_name": "Dublin", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "IE", + "destination.geo.country_name": "Ireland", "destination.geo.location.lat": 53.3338, "destination.geo.location.lon": -6.2488, "destination.geo.region_iso_code": "IE-L", @@ -302,6 +308,7 @@ "destination.geo.city_name": "Washington", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.7095, "destination.geo.location.lon": -78.1539, "destination.geo.region_iso_code": "US-VA", @@ -375,6 +382,7 @@ "destination.geo.city_name": "Bratislava", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "SK", + "destination.geo.country_name": "Slovakia", "destination.geo.location.lat": 48.15, "destination.geo.location.lon": 17.1078, "destination.geo.region_iso_code": "SK-BL", @@ -498,6 +506,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "64.233.189.147", @@ -569,6 +578,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "64.233.188.94", diff --git a/x-pack/filebeat/module/sophos/xg/test/event.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/event.log-expected.json index d14c2bb9924..89d6878ec6f 100644 --- a/x-pack/filebeat/module/sophos/xg/test/event.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/event.log-expected.json @@ -59,6 +59,7 @@ "destination.as.organization.name": "DoD Network Information Center", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "214.167.51.66", @@ -105,6 +106,7 @@ "source.geo.city_name": "Elblag", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PL", + "source.geo.country_name": "Poland", "source.geo.location.lat": 54.172, "source.geo.location.lon": 19.4195, "source.geo.region_iso_code": "PL-28", @@ -199,6 +201,7 @@ "source.geo.city_name": "August\u00f3w", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PL", + "source.geo.country_name": "Poland", "source.geo.location.lat": 53.845, "source.geo.location.lon": 22.985, "source.geo.region_iso_code": "PL-20", @@ -336,6 +339,7 @@ "source.geo.city_name": "Schleidweiler", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.8808, "source.geo.location.lon": 6.6593, "source.geo.region_iso_code": "DE-RP", @@ -438,6 +442,7 @@ "source.geo.city_name": "Fell", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "DE", + "source.geo.country_name": "Germany", "source.geo.location.lat": 49.7667, "source.geo.location.lon": 6.7833, "source.geo.region_iso_code": "DE-RP", @@ -522,6 +527,7 @@ "sophos.xg.status": "Failed", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "172.66.35.15", diff --git a/x-pack/filebeat/module/sophos/xg/test/firewall.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/firewall.log-expected.json index d392790d795..7f1e5d9190b 100644 --- a/x-pack/filebeat/module/sophos/xg/test/firewall.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/firewall.log-expected.json @@ -13,6 +13,7 @@ "destination.geo.city_name": "Bratislava", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "SK", + "destination.geo.country_name": "Slovakia", "destination.geo.location.lat": 48.15, "destination.geo.location.lon": 17.1078, "destination.geo.region_iso_code": "SK-BL", @@ -98,6 +99,7 @@ "source.bytes": 459, "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RU", + "source.geo.country_name": "Russia", "source.geo.location.lat": 55.7386, "source.geo.location.lon": 37.6068, "source.ip": "172.17.34.15", @@ -125,6 +127,7 @@ "destination.geo.city_name": "Bratislava", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "SK", + "destination.geo.country_name": "Slovakia", "destination.geo.location.lat": 48.15, "destination.geo.location.lon": 17.1078, "destination.geo.region_iso_code": "SK-BL", @@ -211,6 +214,7 @@ "source.geo.city_name": "Saint-Prex", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "CH", + "source.geo.country_name": "Switzerland", "source.geo.location.lat": 46.4796, "source.geo.location.lon": 6.4599, "source.geo.region_iso_code": "CH-VD", @@ -410,6 +414,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 51.2993, "destination.geo.location.lon": 9.491, "destination.ip": "185.7.209.207", @@ -481,6 +486,7 @@ "source.geo.city_name": "Warsaw", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PL", + "source.geo.country_name": "Poland", "source.geo.location.lat": 52.25, "source.geo.location.lon": 21.0, "source.geo.region_iso_code": "PL-14", @@ -1030,6 +1036,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1437,6 +1444,7 @@ "destination.bytes": 0, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -1687,6 +1695,7 @@ "destination.geo.city_name": "Richardson", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 32.9473, "destination.geo.location.lon": -96.7028, "destination.geo.region_iso_code": "US-TX", diff --git a/x-pack/filebeat/module/sophos/xg/test/idp.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/idp.log-expected.json index 7caee4d72eb..d92a2b2e7e4 100644 --- a/x-pack/filebeat/module/sophos/xg/test/idp.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/idp.log-expected.json @@ -61,6 +61,7 @@ "source.as.organization.name": "Bestnet Service SRL", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RO", + "source.geo.country_name": "Romania", "source.geo.location.lat": 46.0, "source.geo.location.lon": 25.0, "source.ip": "89.40.182.58", @@ -132,6 +133,7 @@ "source.as.organization.name": "China Unicom Beijing Province Network", "source.geo.continent_name": "Asia", "source.geo.country_iso_code": "CN", + "source.geo.country_name": "China", "source.geo.location.lat": 31.0449, "source.geo.location.lon": 121.4012, "source.geo.region_iso_code": "CN-SH", @@ -205,6 +207,7 @@ "source.as.organization.name": "KPN B.V.", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "NL", + "source.geo.country_name": "Netherlands", "source.geo.location.lat": 52.3824, "source.geo.location.lon": 4.8995, "source.ip": "77.61.185.101", diff --git a/x-pack/filebeat/module/sophos/xg/test/waf.log-expected.json b/x-pack/filebeat/module/sophos/xg/test/waf.log-expected.json index fe6af644611..ceed76baef1 100644 --- a/x-pack/filebeat/module/sophos/xg/test/waf.log-expected.json +++ b/x-pack/filebeat/module/sophos/xg/test/waf.log-expected.json @@ -9,6 +9,7 @@ "destination.geo.city_name": "Saint-Prex", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "CH", + "destination.geo.country_name": "Switzerland", "destination.geo.location.lat": 46.4796, "destination.geo.location.lon": 6.4599, "destination.geo.region_iso_code": "CH-VD", @@ -66,6 +67,7 @@ "source.geo.city_name": "Gdynia", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PL", + "source.geo.country_name": "Poland", "source.geo.location.lat": 54.5055, "source.geo.location.lon": 18.5403, "source.geo.region_iso_code": "PL-22", @@ -88,6 +90,7 @@ "destination.geo.city_name": "Saint-Prex", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "CH", + "destination.geo.country_name": "Switzerland", "destination.geo.location.lat": 46.4796, "destination.geo.location.lon": 6.4599, "destination.geo.region_iso_code": "CH-VD", @@ -146,6 +149,7 @@ "source.geo.city_name": "Gdynia", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "PL", + "source.geo.country_name": "Poland", "source.geo.location.lat": 54.5055, "source.geo.location.lon": 18.5403, "source.geo.region_iso_code": "PL-22", @@ -303,6 +307,7 @@ "destination.bytes": 403, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "216.167.51.72", @@ -359,6 +364,7 @@ "source.geo.city_name": "Bucharest", "source.geo.continent_name": "Europe", "source.geo.country_iso_code": "RO", + "source.geo.country_name": "Romania", "source.geo.location.lat": 44.4176, "source.geo.location.lon": 26.1708, "source.geo.region_iso_code": "RO-B", diff --git a/x-pack/filebeat/module/squid/log/test/access1.log-expected.json b/x-pack/filebeat/module/squid/log/test/access1.log-expected.json index 26b891ba4f1..e9284eed554 100644 --- a/x-pack/filebeat/module/squid/log/test/access1.log-expected.json +++ b/x-pack/filebeat/module/squid/log/test/access1.log-expected.json @@ -5,6 +5,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -36,8 +37,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "CONNECT", - "TCP_MISS" + "TCP_MISS", + "CONNECT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "200", @@ -67,6 +68,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -89,8 +91,8 @@ "www.goonernews.com" ], "related.ip": [ - "10.105.21.199", - "207.58.145.61" + "207.58.145.61", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -101,8 +103,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "200", @@ -132,6 +134,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -155,8 +158,8 @@ "www.goonernews.com" ], "related.ip": [ - "10.105.21.199", - "207.58.145.61" + "207.58.145.61", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -167,8 +170,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_REFRESH_HIT", - "GET" + "GET", + "TCP_REFRESH_HIT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -220,8 +223,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_HIT" + "TCP_HIT", + "GET" ], "rsa.misc.content_type": "text/css", "rsa.misc.result_code": "200", @@ -273,8 +276,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_HIT", - "GET" + "GET", + "TCP_HIT" ], "rsa.misc.content_type": "text/javascript", "rsa.misc.result_code": "200", @@ -304,6 +307,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -338,8 +342,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "200", @@ -368,6 +372,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -389,8 +394,8 @@ "www.google-analytics.com" ], "related.ip": [ - "10.105.21.199", - "66.102.9.147" + "66.102.9.147", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -401,8 +406,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "200", @@ -432,6 +437,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -455,8 +461,8 @@ "www.goonernews.com" ], "related.ip": [ - "207.58.145.61", - "10.105.21.199" + "10.105.21.199", + "207.58.145.61" ], "related.user": [ "badeyek" @@ -467,8 +473,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_REFRESH_HIT", - "GET" + "GET", + "TCP_REFRESH_HIT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -498,6 +504,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -521,8 +528,8 @@ "www.goonernews.com" ], "related.ip": [ - "10.105.21.199", - "207.58.145.61" + "207.58.145.61", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -533,8 +540,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_REFRESH_HIT", - "GET" + "GET", + "TCP_REFRESH_HIT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -564,6 +571,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -652,8 +660,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_HIT", - "GET" + "GET", + "TCP_HIT" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "200", @@ -683,6 +691,7 @@ "destination.geo.city_name": "Dallas", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 32.9379, "destination.geo.location.lon": -96.8384, "destination.geo.region_iso_code": "US-TX", @@ -706,8 +715,8 @@ "as.casalemedia.com" ], "related.ip": [ - "10.105.21.199", - "209.85.16.38" + "209.85.16.38", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -746,6 +755,7 @@ "@timestamp": "2006-09-08T04:22:06.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -766,8 +776,8 @@ "us.bc.yahoo.com" ], "related.ip": [ - "10.105.21.199", - "68.142.213.132" + "68.142.213.132", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -777,8 +787,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "CONNECT", - "TCP_MISS" + "TCP_MISS", + "CONNECT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "200", @@ -807,6 +817,7 @@ "destination.as.organization.name": "Telia Company AB", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "SE", + "destination.geo.country_name": "Sweden", "destination.geo.location.lat": 59.3247, "destination.geo.location.lon": 18.056, "destination.ip": [ @@ -840,8 +851,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "302", @@ -871,6 +882,7 @@ "destination.geo.city_name": "Los Angeles", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 34.0675, "destination.geo.location.lon": -118.3521, "destination.geo.region_iso_code": "US-CA", @@ -894,8 +906,8 @@ "4.adbrite.com" ], "related.ip": [ - "10.105.21.199", - "206.169.136.22" + "206.169.136.22", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -959,8 +971,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_HIT" + "TCP_HIT", + "GET" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "200", @@ -990,6 +1002,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -1013,8 +1026,8 @@ "www.goonernews.com" ], "related.ip": [ - "207.58.145.61", - "10.105.21.199" + "10.105.21.199", + "207.58.145.61" ], "related.user": [ "badeyek" @@ -1025,8 +1038,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_REFRESH_HIT" + "TCP_REFRESH_HIT", + "GET" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -1056,6 +1069,7 @@ "destination.geo.city_name": "Falls Church", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.9307, "destination.geo.location.lon": -77.1673, "destination.geo.region_iso_code": "US-VA", @@ -1079,8 +1093,8 @@ "www.goonernews.com" ], "related.ip": [ - "207.58.145.61", - "10.105.21.199" + "10.105.21.199", + "207.58.145.61" ], "related.user": [ "badeyek" @@ -1119,6 +1133,7 @@ "@timestamp": "2006-09-08T04:22:10.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -1140,8 +1155,8 @@ "4.adbrite.com" ], "related.ip": [ - "10.105.21.199", - "64.127.126.178" + "64.127.126.178", + "10.105.21.199" ], "related.user": [ "badeyek" @@ -1152,8 +1167,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "200", @@ -1183,6 +1198,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -1206,8 +1222,8 @@ "ff.connextra.com" ], "related.ip": [ - "213.160.98.161", - "10.105.21.199" + "10.105.21.199", + "213.160.98.161" ], "related.user": [ "badeyek" @@ -1218,8 +1234,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "302", @@ -1249,6 +1265,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -1284,8 +1301,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "200", @@ -1336,8 +1353,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_DENIED" + "TCP_DENIED", + "GET" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -1366,6 +1383,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -1397,8 +1415,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "CONNECT" + "CONNECT", + "TCP_MISS" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "200", @@ -1480,6 +1498,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -1542,6 +1561,7 @@ "destination.geo.city_name": "Victoria", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "CA", + "destination.geo.country_name": "Canada", "destination.geo.location.lat": 48.4267, "destination.geo.location.lon": -123.3655, "destination.geo.region_iso_code": "CA-BC", @@ -1607,6 +1627,7 @@ "destination.geo.city_name": "Victoria", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "CA", + "destination.geo.country_name": "Canada", "destination.geo.location.lat": 48.4267, "destination.geo.location.lon": -123.3655, "destination.geo.region_iso_code": "CA-BC", @@ -1630,8 +1651,8 @@ "hi5.com" ], "related.ip": [ - "10.105.47.218", - "204.13.51.238" + "204.13.51.238", + "10.105.47.218" ], "related.user": [ "nazsoau" @@ -1672,6 +1693,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -1692,8 +1714,8 @@ "shttp.msg.yahoo.com" ], "related.ip": [ - "10.105.33.214", - "216.155.194.239" + "216.155.194.239", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -1809,8 +1831,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_IMS_HIT" + "TCP_IMS_HIT", + "GET" ], "rsa.misc.content_type": "text/css", "rsa.misc.result_code": "304", @@ -1862,8 +1884,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_IMS_HIT", - "GET" + "GET", + "TCP_IMS_HIT" ], "rsa.misc.content_type": "text/css", "rsa.misc.result_code": "304", @@ -1893,6 +1915,7 @@ "destination.geo.city_name": "Victoria", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "CA", + "destination.geo.country_name": "Canada", "destination.geo.location.lat": 48.4267, "destination.geo.location.lon": -123.3655, "destination.geo.region_iso_code": "CA-BC", @@ -1915,8 +1938,8 @@ "hi5.com" ], "related.ip": [ - "204.13.51.238", - "10.105.47.218" + "10.105.47.218", + "204.13.51.238" ], "related.user": [ "nazsoau" @@ -1958,6 +1981,7 @@ "destination.geo.city_name": "Victoria", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "CA", + "destination.geo.country_name": "Canada", "destination.geo.location.lat": 48.4267, "destination.geo.location.lon": -123.3655, "destination.geo.region_iso_code": "CA-BC", @@ -1993,8 +2017,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "text/css", "rsa.misc.result_code": "200", @@ -2023,6 +2047,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2054,8 +2079,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "POST", - "TCP_MISS" + "TCP_MISS", + "POST" ], "rsa.misc.content_type": "text/plain", "rsa.misc.result_code": "200", @@ -2082,6 +2107,7 @@ "@timestamp": "2006-09-08T04:22:33.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2102,8 +2128,8 @@ "insider.msg.yahoo.com" ], "related.ip": [ - "10.105.33.214", - "68.142.194.14" + "68.142.194.14", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -2114,8 +2140,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "200", @@ -2144,6 +2170,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2165,8 +2192,8 @@ "radio.launch.yahoo.com" ], "related.ip": [ - "10.105.33.214", - "68.142.219.132" + "68.142.219.132", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -2177,8 +2204,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "200", @@ -2207,6 +2234,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2266,6 +2294,7 @@ "@timestamp": "2006-09-08T04:22:35.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2330,6 +2359,7 @@ "destination.geo.city_name": "Sacramento", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 38.6415, "destination.geo.location.lon": -121.5114, "destination.geo.region_iso_code": "US-CA", @@ -2395,6 +2425,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2455,6 +2486,7 @@ "@timestamp": "2006-09-08T04:22:37.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2487,8 +2519,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "text/xml", "rsa.misc.result_code": "200", @@ -2538,8 +2570,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_DENIED", - "CONNECT" + "CONNECT", + "TCP_DENIED" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -2642,8 +2674,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_DENIED", - "POST" + "POST", + "TCP_DENIED" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -2723,6 +2755,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2837,6 +2870,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2900,6 +2934,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2920,8 +2955,8 @@ "shttp.msg.yahoo.com" ], "related.ip": [ - "10.105.33.214", - "216.155.194.239" + "216.155.194.239", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -2961,6 +2996,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -2994,8 +3030,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_REFRESH_HIT", - "GET" + "GET", + "TCP_REFRESH_HIT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -3024,6 +3060,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3057,8 +3094,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_REFRESH_HIT", - "GET" + "GET", + "TCP_REFRESH_HIT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -3109,8 +3146,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_DENIED", - "POST" + "POST", + "TCP_DENIED" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -3161,8 +3198,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "POST", - "TCP_DENIED" + "TCP_DENIED", + "POST" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -3191,6 +3228,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3224,8 +3262,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_REFRESH_HIT", - "GET" + "GET", + "TCP_REFRESH_HIT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -3254,6 +3292,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3287,8 +3326,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_REFRESH_HIT" + "TCP_REFRESH_HIT", + "GET" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -3317,6 +3356,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3338,8 +3378,8 @@ "radio.launch.yahoo.com" ], "related.ip": [ - "68.142.219.132", - "10.105.33.214" + "10.105.33.214", + "68.142.219.132" ], "related.user": [ "adeolaegbedokun" @@ -3350,8 +3390,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_REFRESH_HIT", - "GET" + "GET", + "TCP_REFRESH_HIT" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -3380,6 +3420,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3401,8 +3442,8 @@ "radio.launch.yahoo.com" ], "related.ip": [ - "68.142.219.132", - "10.105.33.214" + "10.105.33.214", + "68.142.219.132" ], "related.user": [ "adeolaegbedokun" @@ -3413,8 +3454,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_REFRESH_HIT" + "TCP_REFRESH_HIT", + "GET" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "304", @@ -3466,8 +3507,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_IMS_HIT" + "TCP_IMS_HIT", + "GET" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "304", @@ -3519,8 +3560,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_IMS_HIT", - "GET" + "GET", + "TCP_IMS_HIT" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "304", @@ -3572,8 +3613,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_HIT" + "TCP_HIT", + "GET" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "200", @@ -3602,6 +3643,7 @@ "destination.as.organization.name": "BBC", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.4964, "destination.geo.location.lon": -0.1224, "destination.ip": [ @@ -3623,8 +3665,8 @@ "newsrss.bbc.co.uk" ], "related.ip": [ - "212.58.226.33", - "10.105.21.199" + "10.105.21.199", + "212.58.226.33" ], "related.user": [ "badeyek" @@ -3665,6 +3707,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3834,6 +3877,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3855,8 +3899,8 @@ "radio.launch.yahoo.com" ], "related.ip": [ - "68.142.219.132", - "10.105.33.214" + "10.105.33.214", + "68.142.219.132" ], "related.user": [ "adeolaegbedokun" @@ -3866,8 +3910,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "POST", - "TCP_MISS" + "TCP_MISS", + "POST" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "302", @@ -3897,6 +3941,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -3962,6 +4007,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -3983,8 +4029,8 @@ "radio.music.yahoo.com" ], "related.ip": [ - "68.142.219.132", - "10.105.33.214" + "10.105.33.214", + "68.142.219.132" ], "related.user": [ "adeolaegbedokun" @@ -3995,8 +4041,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "text/xml", "rsa.misc.result_code": "200", @@ -4025,6 +4071,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4046,8 +4093,8 @@ "radio.music.yahoo.com" ], "related.ip": [ - "10.105.33.214", - "68.142.219.132" + "68.142.219.132", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -4058,8 +4105,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "text/xml", "rsa.misc.result_code": "200", @@ -4088,6 +4135,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4121,8 +4169,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "200", @@ -4227,8 +4275,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_DENIED", - "GET" + "GET", + "TCP_DENIED" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -4258,6 +4306,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -4281,8 +4330,8 @@ "us.news1.yimg.com" ], "related.ip": [ - "10.105.33.214", - "213.160.98.159" + "213.160.98.159", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -4293,8 +4342,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "image/jpeg", "rsa.misc.result_code": "200", @@ -4323,6 +4372,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4344,8 +4394,8 @@ "radio.launch.yahoo.com" ], "related.ip": [ - "68.142.219.132", - "10.105.33.214" + "10.105.33.214", + "68.142.219.132" ], "related.user": [ "adeolaegbedokun" @@ -4386,6 +4436,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4450,6 +4501,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -4473,8 +4525,8 @@ "us.a2.yimg.com" ], "related.ip": [ - "10.105.33.214", - "213.160.98.152" + "213.160.98.152", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -4515,6 +4567,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4536,8 +4589,8 @@ "radio.launch.yahoo.com" ], "related.ip": [ - "10.105.33.214", - "68.142.219.132" + "68.142.219.132", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -4576,6 +4629,7 @@ "@timestamp": "2006-09-08T04:22:54.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4597,8 +4651,8 @@ "us.bc.yahoo.com" ], "related.ip": [ - "10.105.33.214", - "68.142.213.132" + "68.142.213.132", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -4637,6 +4691,7 @@ "@timestamp": "2006-09-08T04:22:56.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4698,6 +4753,7 @@ "@timestamp": "2006-09-08T04:22:57.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4782,8 +4838,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_IMS_HIT" + "TCP_IMS_HIT", + "GET" ], "rsa.misc.content_type": "application/x-javascript", "rsa.misc.result_code": "304", @@ -4813,6 +4869,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -4836,8 +4893,8 @@ "a1568.g.akamai.net" ], "related.ip": [ - "10.105.33.214", - "213.160.98.159" + "213.160.98.159", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -4879,6 +4936,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -4914,8 +4972,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "304", @@ -4944,6 +5002,7 @@ "destination.as.organization.name": "Oath Holdings Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -4964,8 +5023,8 @@ "login.yahoo.com" ], "related.ip": [ - "209.73.177.115", - "10.105.21.199" + "10.105.21.199", + "209.73.177.115" ], "related.user": [ "badeyek" @@ -4975,8 +5034,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "CONNECT" + "CONNECT", + "TCP_MISS" ], "rsa.misc.content_type": "-", "rsa.misc.result_code": "200", @@ -5006,6 +5065,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -5072,6 +5132,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -5095,8 +5156,8 @@ "a1568.g.akamai.net" ], "related.ip": [ - "213.160.98.159", - "10.105.33.214" + "10.105.33.214", + "213.160.98.159" ], "related.user": [ "adeolaegbedokun" @@ -5191,6 +5252,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -5257,6 +5319,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -5323,6 +5386,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -5346,8 +5410,8 @@ "a1568.g.akamai.net" ], "related.ip": [ - "10.105.33.214", - "213.160.98.167" + "213.160.98.167", + "10.105.33.214" ], "related.user": [ "adeolaegbedokun" @@ -5358,8 +5422,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "GET", - "TCP_MISS" + "TCP_MISS", + "GET" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "304", @@ -5411,8 +5475,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_DENIED", - "GET" + "GET", + "TCP_DENIED" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -5492,6 +5556,7 @@ "@timestamp": "2006-09-08T04:23:01.000Z", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": [ @@ -5513,8 +5578,8 @@ "launch.adserver.yahoo.com" ], "related.ip": [ - "216.109.125.112", - "10.105.33.214" + "10.105.33.214", + "216.109.125.112" ], "related.user": [ "adeolaegbedokun" @@ -5525,8 +5590,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_MISS", - "GET" + "GET", + "TCP_MISS" ], "rsa.misc.content_type": "image/gif", "rsa.misc.result_code": "200", @@ -5555,6 +5620,7 @@ "destination.as.organization.name": "Yahoo! UK Services Limited", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.4964, "destination.geo.location.lon": -0.1224, "destination.ip": [ @@ -5576,8 +5642,8 @@ "uk.f250.mail.yahoo.com" ], "related.ip": [ - "217.12.10.96", - "10.105.21.199" + "10.105.21.199", + "217.12.10.96" ], "related.user": [ "badeyek" @@ -5639,8 +5705,8 @@ "rsa.investigations.ec_subject": "NetworkComm", "rsa.investigations.ec_theme": "ALM", "rsa.misc.action": [ - "TCP_DENIED", - "CONNECT" + "CONNECT", + "TCP_DENIED" ], "rsa.misc.content_type": "text/html", "rsa.misc.result_code": "407", @@ -5670,6 +5736,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", @@ -5693,8 +5760,8 @@ "us.js2.yimg.com" ], "related.ip": [ - "213.160.98.169", - "10.105.21.199" + "10.105.21.199", + "213.160.98.169" ], "related.user": [ "badeyek" @@ -5789,6 +5856,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5064, "destination.geo.location.lon": -0.02, "destination.geo.region_iso_code": "GB-ENG", diff --git a/x-pack/filebeat/module/suricata/eve/test/eve-alerts.log-expected.json b/x-pack/filebeat/module/suricata/eve/test/eve-alerts.log-expected.json index 68412b504dc..a63e2fd592a 100644 --- a/x-pack/filebeat/module/suricata/eve/test/eve-alerts.log-expected.json +++ b/x-pack/filebeat/module/suricata/eve/test/eve-alerts.log-expected.json @@ -9,6 +9,7 @@ "destination.geo.city_name": "Norwell", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.1596, "destination.geo.location.lon": -70.8217, "destination.geo.region_iso_code": "US-MA", @@ -89,6 +90,7 @@ "destination.geo.city_name": "Norwell", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.1596, "destination.geo.location.lon": -70.8217, "destination.geo.region_iso_code": "US-MA", @@ -169,6 +171,7 @@ "destination.geo.city_name": "Norwell", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.1596, "destination.geo.location.lon": -70.8217, "destination.geo.region_iso_code": "US-MA", @@ -249,6 +252,7 @@ "destination.geo.city_name": "Norwell", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.1596, "destination.geo.location.lon": -70.8217, "destination.geo.region_iso_code": "US-MA", @@ -329,6 +333,7 @@ "destination.geo.city_name": "Norwell", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.1596, "destination.geo.location.lon": -70.8217, "destination.geo.region_iso_code": "US-MA", @@ -409,6 +414,7 @@ "destination.geo.city_name": "Norwell", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.1596, "destination.geo.location.lon": -70.8217, "destination.geo.region_iso_code": "US-MA", @@ -489,6 +495,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5132, "destination.geo.location.lon": -0.0961, "destination.geo.region_iso_code": "GB-ENG", @@ -569,6 +576,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -649,6 +657,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -729,6 +738,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5132, "destination.geo.location.lon": -0.0961, "destination.geo.region_iso_code": "GB-ENG", @@ -809,6 +819,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5132, "destination.geo.location.lon": -0.0961, "destination.geo.region_iso_code": "GB-ENG", @@ -889,6 +900,7 @@ "destination.geo.city_name": "London", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "GB", + "destination.geo.country_name": "United Kingdom", "destination.geo.location.lat": 51.5132, "destination.geo.location.lon": -0.0961, "destination.geo.region_iso_code": "GB-ENG", @@ -969,6 +981,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -1049,6 +1062,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -1129,6 +1143,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -1209,6 +1224,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -1289,6 +1305,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -1369,6 +1386,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -1449,6 +1467,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", @@ -1528,6 +1547,7 @@ "destination.geo.city_name": "Boston", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 42.3562, "destination.geo.location.lon": -71.0631, "destination.geo.region_iso_code": "US-MA", diff --git a/x-pack/filebeat/module/suricata/eve/test/eve-small.log-expected.json b/x-pack/filebeat/module/suricata/eve/test/eve-small.log-expected.json index 5d113c8d370..4851f2db826 100644 --- a/x-pack/filebeat/module/suricata/eve/test/eve-small.log-expected.json +++ b/x-pack/filebeat/module/suricata/eve/test/eve-small.log-expected.json @@ -415,6 +415,7 @@ "destination.domain": "p33-btmmdns.icloud.com", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "17.142.164.13", diff --git a/x-pack/filebeat/module/symantec/endpointprotection/test/generated.log-expected.json b/x-pack/filebeat/module/symantec/endpointprotection/test/generated.log-expected.json index 9b9183fe35a..0c6eccf2dcc 100644 --- a/x-pack/filebeat/module/symantec/endpointprotection/test/generated.log-expected.json +++ b/x-pack/filebeat/module/symantec/endpointprotection/test/generated.log-expected.json @@ -704,8 +704,8 @@ "bore5546.www.local" ], "related.ip": [ - "10.7.164.113", "10.175.83.138", + "10.7.164.113", "10.207.125.114" ], "related.user": [ @@ -2263,8 +2263,8 @@ "edi6108.internal.domain" ], "related.ip": [ - "10.72.200.11", - "10.132.171.142" + "10.132.171.142", + "10.72.200.11" ], "related.user": [ "ero" @@ -2579,8 +2579,8 @@ "dita2048.www5.home" ], "related.ip": [ - "10.171.13.85", - "10.40.133.90" + "10.40.133.90", + "10.171.13.85" ], "related.user": [ "bor" @@ -2795,8 +2795,8 @@ "urExcep6087.www5.localhost" ], "related.ip": [ - "10.155.163.6", - "10.31.231.57" + "10.31.231.57", + "10.155.163.6" ], "related.user": [ "norumetM" diff --git a/x-pack/filebeat/module/zeek/connection/test/connection-json.log-expected.json b/x-pack/filebeat/module/zeek/connection/test/connection-json.log-expected.json index ccb28ef2f92..b7c0e0bc8cb 100644 --- a/x-pack/filebeat/module/zeek/connection/test/connection-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/connection/test/connection-json.log-expected.json @@ -59,6 +59,7 @@ "destination.bytes": 206, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -116,6 +117,7 @@ "destination.bytes": 206, "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", @@ -154,6 +156,7 @@ "source.bytes": 103, "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "4.4.2.2", diff --git a/x-pack/filebeat/module/zeek/http/test/http-json.log-expected.json b/x-pack/filebeat/module/zeek/http/test/http-json.log-expected.json index c4364d77426..200950e922a 100644 --- a/x-pack/filebeat/module/zeek/http/test/http-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/http/test/http-json.log-expected.json @@ -7,6 +7,7 @@ "destination.geo.city_name": "San Jose", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.3388, "destination.geo.location.lon": -121.8914, "destination.geo.region_iso_code": "US-CA", diff --git a/x-pack/filebeat/module/zeek/irc/test/irc-json.log-expected.json b/x-pack/filebeat/module/zeek/irc/test/irc-json.log-expected.json index 245d1154e86..06d833b6a42 100644 --- a/x-pack/filebeat/module/zeek/irc/test/irc-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/irc/test/irc-json.log-expected.json @@ -6,6 +6,7 @@ "destination.as.organization.name": "Team Cymru Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "38.229.70.20", @@ -52,6 +53,7 @@ "destination.as.organization.name": "Team Cymru Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "38.229.70.20", @@ -103,6 +105,7 @@ "destination.as.organization.name": "Team Cymru Inc.", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "38.229.70.20", diff --git a/x-pack/filebeat/module/zeek/notice/test/notice-json.log-expected.json b/x-pack/filebeat/module/zeek/notice/test/notice-json.log-expected.json index a5838e9f3f1..90bb5e3145e 100644 --- a/x-pack/filebeat/module/zeek/notice/test/notice-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/notice/test/notice-json.log-expected.json @@ -40,6 +40,7 @@ "destination.geo.city_name": "Frankfurt am Main", "destination.geo.continent_name": "Europe", "destination.geo.country_iso_code": "DE", + "destination.geo.country_name": "Germany", "destination.geo.location.lat": 50.1188, "destination.geo.location.lon": 8.6843, "destination.geo.region_iso_code": "DE-HE", @@ -71,6 +72,7 @@ "source.geo.city_name": "Longmont", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 40.1559, "source.geo.location.lon": -105.1624, "source.geo.region_iso_code": "US-CO", diff --git a/x-pack/filebeat/module/zeek/sip/test/sip-json.log-expected.json b/x-pack/filebeat/module/zeek/sip/test/sip-json.log-expected.json index 79b38a0717d..71061cd293b 100644 --- a/x-pack/filebeat/module/zeek/sip/test/sip-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/sip/test/sip-json.log-expected.json @@ -6,6 +6,7 @@ "destination.as.organization.name": "Internap Corporation", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "74.63.41.218", @@ -72,6 +73,7 @@ "destination.geo.city_name": "Mexico City", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "MX", + "destination.geo.country_name": "Mexico", "destination.geo.location.lat": 19.4357, "destination.geo.location.lon": -99.1438, "destination.geo.region_iso_code": "MX-CMX", @@ -108,6 +110,7 @@ "source.geo.city_name": "Mexico City", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "MX", + "source.geo.country_name": "Mexico", "source.geo.location.lat": 19.4357, "source.geo.location.lon": -99.1438, "source.geo.region_iso_code": "MX-CMX", @@ -151,6 +154,7 @@ "destination.geo.city_name": "Mexico City", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "MX", + "destination.geo.country_name": "Mexico", "destination.geo.location.lat": 19.4357, "destination.geo.location.lon": -99.1438, "destination.geo.region_iso_code": "MX-CMX", @@ -187,6 +191,7 @@ "source.geo.city_name": "Mexico City", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "MX", + "source.geo.country_name": "Mexico", "source.geo.location.lat": 19.4357, "source.geo.location.lon": -99.1438, "source.geo.region_iso_code": "MX-CMX", diff --git a/x-pack/filebeat/module/zeek/ssl/test/ssl-json.log-expected.json b/x-pack/filebeat/module/zeek/ssl/test/ssl-json.log-expected.json index 805d20d2a54..67817ff0a42 100644 --- a/x-pack/filebeat/module/zeek/ssl/test/ssl-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/ssl/test/ssl-json.log-expected.json @@ -8,6 +8,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.4043, "destination.geo.location.lon": -122.0748, "destination.geo.region_iso_code": "US-CA", @@ -88,6 +89,7 @@ "destination.geo.city_name": "Mountain View", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.4043, "destination.geo.location.lon": -122.0748, "destination.geo.region_iso_code": "US-CA", diff --git a/x-pack/filebeat/module/zeek/traceroute/test/traceroute-json.log-expected.json b/x-pack/filebeat/module/zeek/traceroute/test/traceroute-json.log-expected.json index 8fdfd983c94..34d600174ac 100644 --- a/x-pack/filebeat/module/zeek/traceroute/test/traceroute-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/traceroute/test/traceroute-json.log-expected.json @@ -6,6 +6,7 @@ "destination.as.organization.name": "Google LLC", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "8.8.8.8", diff --git a/x-pack/filebeat/module/zeek/tunnel/test/tunnel-json.log-expected.json b/x-pack/filebeat/module/zeek/tunnel/test/tunnel-json.log-expected.json index 1e00e616e36..3ef709508a3 100644 --- a/x-pack/filebeat/module/zeek/tunnel/test/tunnel-json.log-expected.json +++ b/x-pack/filebeat/module/zeek/tunnel/test/tunnel-json.log-expected.json @@ -6,6 +6,7 @@ "destination.as.organization.name": "Air Force Systems Networking", "destination.geo.continent_name": "North America", "destination.geo.country_iso_code": "US", + "destination.geo.country_name": "United States", "destination.geo.location.lat": 37.751, "destination.geo.location.lon": -97.822, "destination.ip": "132.16.110.133", @@ -33,6 +34,7 @@ "source.as.organization.name": "Air Force Systems Networking", "source.geo.continent_name": "North America", "source.geo.country_iso_code": "US", + "source.geo.country_name": "United States", "source.geo.location.lat": 37.751, "source.geo.location.lon": -97.822, "source.ip": "132.16.146.79", diff --git a/x-pack/filebeat/module/zscaler/zia/test/generated.log-expected.json b/x-pack/filebeat/module/zscaler/zia/test/generated.log-expected.json index b7bd436496b..1fbe44131f5 100644 --- a/x-pack/filebeat/module/zscaler/zia/test/generated.log-expected.json +++ b/x-pack/filebeat/module/zscaler/zia/test/generated.log-expected.json @@ -26,8 +26,8 @@ "rci737.www5.example" ], "related.ip": [ - "10.176.10.114", - "10.206.191.17" + "10.206.191.17", + "10.176.10.114" ], "related.user": [ "sumdo" @@ -115,8 +115,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "luptat", "rsa.misc.action": [ - "Allowed", - "tur" + "tur", + "Allowed" ], "rsa.misc.category": "eius", "rsa.misc.filter": "ameaqu", @@ -176,8 +176,8 @@ "orsitame3262.domain" ], "related.ip": [ - "10.254.146.57", - "10.204.86.149" + "10.204.86.149", + "10.254.146.57" ], "related.user": [ "tenima" @@ -191,8 +191,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "uptassi", "rsa.misc.action": [ - "giatq", - "Blocked" + "Blocked", + "giatq" ], "rsa.misc.category": "llu", "rsa.misc.filter": "tconsec", @@ -252,8 +252,8 @@ "tempor4496.www.localdomain" ], "related.ip": [ - "10.252.125.53", - "10.103.246.190" + "10.103.246.190", + "10.252.125.53" ], "related.user": [ "equun" @@ -267,8 +267,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ima", "rsa.misc.action": [ - "llam", - "Allowed" + "Allowed", + "llam" ], "rsa.misc.category": "aboris", "rsa.misc.filter": "atatnonp", @@ -328,8 +328,8 @@ "ore2933.www.test" ], "related.ip": [ - "10.61.78.108", - "10.136.153.149" + "10.136.153.149", + "10.61.78.108" ], "related.user": [ "ercit" @@ -343,8 +343,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "inim", "rsa.misc.action": [ - "reetdolo", - "Blocked" + "Blocked", + "reetdolo" ], "rsa.misc.category": "osquir", "rsa.misc.filter": "ipit", @@ -480,8 +480,8 @@ "cup1793.local" ], "related.ip": [ - "10.243.224.205", - "10.123.104.59" + "10.123.104.59", + "10.243.224.205" ], "related.user": [ "xercitat" @@ -495,8 +495,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "lupt", "rsa.misc.action": [ - "Blocked", - "dun" + "dun", + "Blocked" ], "rsa.misc.category": "rsitamet", "rsa.misc.filter": "usmod", @@ -632,8 +632,8 @@ "aperia4409.www5.invalid" ], "related.ip": [ - "10.78.151.178", - "10.25.192.202" + "10.25.192.202", + "10.78.151.178" ], "related.user": [ "quip" @@ -647,8 +647,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "atquovo", "rsa.misc.action": [ - "amvolup", - "Allowed" + "Allowed", + "amvolup" ], "rsa.misc.category": "hil", "rsa.misc.filter": "deFinibu", @@ -723,8 +723,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ihilm", "rsa.misc.action": [ - "Allowed", - "psaquae" + "psaquae", + "Allowed" ], "rsa.misc.category": "eFinib", "rsa.misc.filter": "inesci", @@ -784,8 +784,8 @@ "ite2026.www.invalid" ], "related.ip": [ - "10.19.145.131", - "10.223.247.86" + "10.223.247.86", + "10.19.145.131" ], "related.user": [ "tNequepo" @@ -860,8 +860,8 @@ "radipisc7020.home" ], "related.ip": [ - "10.2.53.125", - "10.181.80.139" + "10.181.80.139", + "10.2.53.125" ], "related.user": [ "ihilmo" @@ -936,8 +936,8 @@ "uamei2493.www.test" ], "related.ip": [ - "10.31.240.6", - "10.167.98.76" + "10.167.98.76", + "10.31.240.6" ], "related.user": [ "ratvolu" @@ -951,8 +951,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "catc", "rsa.misc.action": [ - "Allowed", - "veni" + "veni", + "Allowed" ], "rsa.misc.category": "sBono", "rsa.misc.filter": "isnisiu", @@ -1027,8 +1027,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "iurer", "rsa.misc.action": [ - "ionevo", - "Allowed" + "Allowed", + "ionevo" ], "rsa.misc.category": "tinvolu", "rsa.misc.filter": "idex", @@ -1088,8 +1088,8 @@ "spi3544.www.host" ], "related.ip": [ - "10.63.250.128", - "10.111.187.12" + "10.111.187.12", + "10.63.250.128" ], "related.user": [ "saute" @@ -1164,8 +1164,8 @@ "tlab5981.www.host" ], "related.ip": [ - "10.5.126.127", - "10.252.124.150" + "10.252.124.150", + "10.5.126.127" ], "related.user": [ "inibusB" @@ -1179,8 +1179,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "mod", "rsa.misc.action": [ - "Allowed", - "xeacomm" + "xeacomm", + "Allowed" ], "rsa.misc.category": "sauteiru", "rsa.misc.filter": "antiu", @@ -1331,8 +1331,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "quid", "rsa.misc.action": [ - "itecto", - "Allowed" + "Allowed", + "itecto" ], "rsa.misc.category": "quam", "rsa.misc.filter": "adeser", @@ -1392,8 +1392,8 @@ "uamei2389.internal.example" ], "related.ip": [ - "10.215.205.216", - "10.31.198.58" + "10.31.198.58", + "10.215.205.216" ], "related.user": [ "aturve" @@ -1468,8 +1468,8 @@ "eacommod1930.internal.lan" ], "related.ip": [ - "10.229.83.165", - "10.29.155.171" + "10.29.155.171", + "10.229.83.165" ], "related.user": [ "ulapar" @@ -1483,8 +1483,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "vitaedi", "rsa.misc.action": [ - "llitanim", - "Allowed" + "Allowed", + "llitanim" ], "rsa.misc.category": "apariat", "rsa.misc.filter": "tasnulap", @@ -1544,8 +1544,8 @@ "tem6984.www5.domain" ], "related.ip": [ - "10.161.148.64", - "10.129.192.145" + "10.129.192.145", + "10.161.148.64" ], "related.user": [ "lor" @@ -1620,8 +1620,8 @@ "lapariat7287.internal.host" ], "related.ip": [ - "10.203.65.161", - "10.7.200.140" + "10.7.200.140", + "10.203.65.161" ], "related.user": [ "snost" @@ -1711,8 +1711,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "iutali", "rsa.misc.action": [ - "atcupi", - "Blocked" + "Blocked", + "atcupi" ], "rsa.misc.category": "isetq", "rsa.misc.filter": "equinesc", @@ -1772,8 +1772,8 @@ "stenatu4844.www.invalid" ], "related.ip": [ - "10.39.31.115", - "10.24.111.229" + "10.24.111.229", + "10.39.31.115" ], "related.user": [ "fugi" @@ -1848,8 +1848,8 @@ "sitam5077.internal.host" ], "related.ip": [ - "10.32.39.220", - "10.179.210.218" + "10.179.210.218", + "10.32.39.220" ], "related.user": [ "boreetdo" @@ -2000,8 +2000,8 @@ "lloin4019.www.localhost" ], "related.ip": [ - "10.130.241.232", - "10.238.224.49" + "10.238.224.49", + "10.130.241.232" ], "related.user": [ "onse" @@ -2015,8 +2015,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "mnisiut", "rsa.misc.action": [ - "mod", - "Allowed" + "Allowed", + "mod" ], "rsa.misc.category": "uiinea", "rsa.misc.filter": "aturQu", @@ -2076,8 +2076,8 @@ "tamet6317.www.host" ], "related.ip": [ - "10.2.67.127", - "10.115.53.31" + "10.115.53.31", + "10.2.67.127" ], "related.user": [ "Cic" @@ -2091,8 +2091,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "quatD", "rsa.misc.action": [ - "tatem", - "Allowed" + "Allowed", + "tatem" ], "rsa.misc.category": "aincidun", "rsa.misc.filter": "uela", @@ -2167,8 +2167,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tasun", "rsa.misc.action": [ - "quasiarc", - "Allowed" + "Allowed", + "quasiarc" ], "rsa.misc.category": "autfugi", "rsa.misc.filter": "ritqu", @@ -2228,8 +2228,8 @@ "utaliqu4248.www.localhost" ], "related.ip": [ - "10.18.226.72", - "10.101.85.169" + "10.101.85.169", + "10.18.226.72" ], "related.user": [ "rroqu" @@ -2319,8 +2319,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "mag", "rsa.misc.action": [ - "tali", - "Allowed" + "Allowed", + "tali" ], "rsa.misc.category": "oconse", "rsa.misc.filter": "npr", @@ -2380,8 +2380,8 @@ "tatio6513.www.invalid" ], "related.ip": [ - "10.80.57.247", - "10.229.242.223" + "10.229.242.223", + "10.80.57.247" ], "related.user": [ "itasp" @@ -2471,8 +2471,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "uteir", "rsa.misc.action": [ - "Allowed", - "Section" + "Section", + "Allowed" ], "rsa.misc.category": "cididu", "rsa.misc.filter": "Utenima", @@ -2532,8 +2532,8 @@ "aquioff3853.www.localdomain" ], "related.ip": [ - "10.54.159.1", - "10.236.230.136" + "10.236.230.136", + "10.54.159.1" ], "related.user": [ "mUteni" @@ -2547,8 +2547,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tec", "rsa.misc.action": [ - "tatema", - "Allowed" + "Allowed", + "tatema" ], "rsa.misc.category": "emullamc", "rsa.misc.filter": "emveleum", @@ -2623,8 +2623,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tvolup", "rsa.misc.action": [ - "utemvel", - "Allowed" + "Allowed", + "utemvel" ], "rsa.misc.category": "untutlab", "rsa.misc.filter": "dol", @@ -2684,8 +2684,8 @@ "iamea478.www5.host" ], "related.ip": [ - "10.142.120.198", - "10.166.10.42" + "10.166.10.42", + "10.142.120.198" ], "related.user": [ "olori" @@ -2699,8 +2699,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ende", "rsa.misc.action": [ - "doconse", - "Blocked" + "Blocked", + "doconse" ], "rsa.misc.category": "uovolupt", "rsa.misc.filter": "litesse", @@ -2775,8 +2775,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "issu", "rsa.misc.action": [ - "Allowed", - "sed" + "sed", + "Allowed" ], "rsa.misc.category": "atur", "rsa.misc.filter": "iciadese", @@ -2851,8 +2851,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ese", "rsa.misc.action": [ - "Allowed", - "litanim" + "litanim", + "Allowed" ], "rsa.misc.category": "idata", "rsa.misc.filter": "urerepre", @@ -2927,8 +2927,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "idolores", "rsa.misc.action": [ - "Blocked", - "lestia" + "lestia", + "Blocked" ], "rsa.misc.category": "risni", "rsa.misc.filter": "emacc", @@ -2988,8 +2988,8 @@ "pariatur7238.www5.invalid" ], "related.ip": [ - "10.202.224.79", - "10.33.144.10" + "10.33.144.10", + "10.202.224.79" ], "related.user": [ "rios" @@ -3079,8 +3079,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "Loremip", "rsa.misc.action": [ - "quid", - "Allowed" + "Allowed", + "quid" ], "rsa.misc.category": "mini", "rsa.misc.filter": "uisnos", @@ -3140,8 +3140,8 @@ "mquisnos7453.home" ], "related.ip": [ - "10.134.128.27", - "10.118.177.136" + "10.118.177.136", + "10.134.128.27" ], "related.user": [ "Utenima" @@ -3155,8 +3155,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "voluptas", "rsa.misc.action": [ - "Allowed", - "olor" + "olor", + "Allowed" ], "rsa.misc.category": "ataevita", "rsa.misc.filter": "nderi", @@ -3307,8 +3307,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "etdol", "rsa.misc.action": [ - "mwrit", - "Blocked" + "Blocked", + "mwrit" ], "rsa.misc.category": "inim", "rsa.misc.filter": "aturQu", @@ -3368,8 +3368,8 @@ "etdolore4227.internal.corp" ], "related.ip": [ - "10.30.87.51", - "10.156.177.53" + "10.156.177.53", + "10.30.87.51" ], "related.user": [ "psaquaea" @@ -3383,8 +3383,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tatno", "rsa.misc.action": [ - "ptatev", - "Blocked" + "Blocked", + "ptatev" ], "rsa.misc.category": "udexerc", "rsa.misc.filter": "ptatemse", @@ -3444,8 +3444,8 @@ "rors1935.api.domain" ], "related.ip": [ - "10.83.138.34", - "10.111.249.184" + "10.111.249.184", + "10.83.138.34" ], "related.user": [ "dentsunt" @@ -3459,8 +3459,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tatemse", "rsa.misc.action": [ - "Blocked", - "upta" + "upta", + "Blocked" ], "rsa.misc.category": "tlabo", "rsa.misc.filter": "aliqui", @@ -3520,8 +3520,8 @@ "idexeac1655.internal.test" ], "related.ip": [ - "10.141.195.13", - "10.180.150.47" + "10.180.150.47", + "10.141.195.13" ], "related.user": [ "taliq" @@ -3535,8 +3535,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "itesse", "rsa.misc.action": [ - "Allowed", - "uip" + "uip", + "Allowed" ], "rsa.misc.category": "teturad", "rsa.misc.filter": "roquisqu", @@ -3670,8 +3670,8 @@ "tecto708.www5.example" ], "related.ip": [ - "10.22.122.43", - "10.100.143.226" + "10.100.143.226", + "10.22.122.43" ], "related.user": [ "ute" @@ -3685,8 +3685,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ento", "rsa.misc.action": [ - "Bonoru", - "Blocked" + "Blocked", + "Bonoru" ], "rsa.misc.category": "luptasnu", "rsa.misc.filter": "quamni", @@ -3746,8 +3746,8 @@ "ine3181.www.invalid" ], "related.ip": [ - "10.119.53.68", - "10.121.9.5" + "10.121.9.5", + "10.119.53.68" ], "related.user": [ "ssec" @@ -3822,8 +3822,8 @@ "tsunt3403.www5.test" ], "related.ip": [ - "10.31.153.177", - "10.237.0.173" + "10.237.0.173", + "10.31.153.177" ], "related.user": [ "sci" @@ -3837,8 +3837,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "eritqui", "rsa.misc.action": [ - "dolor", - "Blocked" + "Blocked", + "dolor" ], "rsa.misc.category": "taspe", "rsa.misc.filter": "oremipsu", @@ -3911,8 +3911,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "epor", "rsa.misc.action": [ - "etquasia", - "Allowed" + "Allowed", + "etquasia" ], "rsa.misc.category": "iaturE", "rsa.misc.filter": "rep", @@ -3983,8 +3983,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "adipisc", "rsa.misc.action": [ - "exer", - "Blocked" + "Blocked", + "exer" ], "rsa.misc.category": "remagna", "rsa.misc.filter": "emvel", @@ -4044,8 +4044,8 @@ "tamr1693.api.home" ], "related.ip": [ - "10.53.191.49", - "10.133.102.57" + "10.133.102.57", + "10.53.191.49" ], "related.user": [ "onsec" @@ -4059,8 +4059,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ecillum", "rsa.misc.action": [ - "Blocked", - "emp" + "emp", + "Blocked" ], "rsa.misc.category": "ciati", "rsa.misc.filter": "elit", @@ -4135,8 +4135,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "iuntN", "rsa.misc.action": [ - "nim", - "Allowed" + "Allowed", + "nim" ], "rsa.misc.category": "etco", "rsa.misc.filter": "autodita", @@ -4272,8 +4272,8 @@ "pici1525.www5.corp" ], "related.ip": [ - "10.155.252.123", - "10.178.148.188" + "10.178.148.188", + "10.155.252.123" ], "related.user": [ "inrepreh" @@ -4348,8 +4348,8 @@ "dolo6418.internal.host" ], "related.ip": [ - "10.190.42.245", - "10.220.1.249" + "10.220.1.249", + "10.190.42.245" ], "related.user": [ "olup" @@ -4363,8 +4363,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "uamquaer", "rsa.misc.action": [ - "Blocked", - "aerat" + "aerat", + "Blocked" ], "rsa.misc.category": "quela", "rsa.misc.filter": "qui", @@ -4422,8 +4422,8 @@ "imveni193.www5.host" ], "related.ip": [ - "10.55.38.153", - "10.112.190.154" + "10.112.190.154", + "10.55.38.153" ], "related.user": [ "oremeu" @@ -4498,8 +4498,8 @@ "ionu3320.api.localhost" ], "related.ip": [ - "10.250.48.82", - "10.195.153.42" + "10.195.153.42", + "10.250.48.82" ], "related.user": [ "tsedquia" @@ -4574,8 +4574,8 @@ "remips1499.www.local" ], "related.ip": [ - "10.252.164.230", - "10.60.52.219" + "10.60.52.219", + "10.252.164.230" ], "related.user": [ "gnamali" @@ -4589,8 +4589,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "rroq", "rsa.misc.action": [ - "fdeFin", - "Blocked" + "Blocked", + "fdeFin" ], "rsa.misc.category": "diduntut", "rsa.misc.filter": "ano", @@ -4646,8 +4646,8 @@ "mdoloree96.domain" ], "related.ip": [ - "10.187.16.73", - "10.122.102.156" + "10.122.102.156", + "10.187.16.73" ], "related.user": [ "emoen" @@ -4796,8 +4796,8 @@ "sBonoru1929.example" ], "related.ip": [ - "10.51.161.245", - "10.15.254.181" + "10.15.254.181", + "10.51.161.245" ], "related.user": [ "abo" @@ -4872,8 +4872,8 @@ "onorumet4871.lan" ], "related.ip": [ - "10.7.152.238", - "10.129.66.196" + "10.129.66.196", + "10.7.152.238" ], "related.user": [ "equamn" @@ -4887,8 +4887,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "vento", "rsa.misc.action": [ - "Blocked", - "reh" + "reh", + "Blocked" ], "rsa.misc.category": "atev", "rsa.misc.filter": "umq", @@ -4948,8 +4948,8 @@ "onproi4354.www5.invalid" ], "related.ip": [ - "10.185.107.27", - "10.29.162.157" + "10.29.162.157", + "10.185.107.27" ], "related.user": [ "evelite" @@ -4963,8 +4963,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "orinrep", "rsa.misc.action": [ - "Blocked", - "squirat" + "squirat", + "Blocked" ], "rsa.misc.category": "sequa", "rsa.misc.filter": "orainci", @@ -5024,8 +5024,8 @@ "beataevi7552.api.test" ], "related.ip": [ - "10.215.63.248", - "10.138.0.214" + "10.138.0.214", + "10.215.63.248" ], "related.user": [ "eavolupt" @@ -5039,8 +5039,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "odita", "rsa.misc.action": [ - "dqu", - "Blocked" + "Blocked", + "dqu" ], "rsa.misc.category": "ipex", "rsa.misc.filter": "ine", @@ -5115,8 +5115,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tNequepo", "rsa.misc.action": [ - "Allowed", - "rmagnido" + "rmagnido", + "Allowed" ], "rsa.misc.category": "luptatem", "rsa.misc.filter": "deritq", @@ -5191,8 +5191,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "plicab", "rsa.misc.action": [ - "Blocked", - "umq" + "umq", + "Blocked" ], "rsa.misc.category": "eruntmol", "rsa.misc.filter": "labore", @@ -5267,8 +5267,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "omnisi", "rsa.misc.action": [ - "Allowed", - "userro" + "userro", + "Allowed" ], "rsa.misc.category": "etd", "rsa.misc.filter": "loremeum", @@ -5328,8 +5328,8 @@ "olo7317.www5.localhost" ], "related.ip": [ - "10.249.1.143", - "10.124.177.226" + "10.124.177.226", + "10.249.1.143" ], "related.user": [ "isciveli" @@ -5343,8 +5343,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "Utenim", "rsa.misc.action": [ - "onevo", - "Allowed" + "Allowed", + "onevo" ], "rsa.misc.category": "tdolore", "rsa.misc.filter": "ptasn", @@ -5419,8 +5419,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ect", "rsa.misc.action": [ - "Blocked", - "maccu" + "maccu", + "Blocked" ], "rsa.misc.category": "iaecon", "rsa.misc.filter": "eni", @@ -5480,8 +5480,8 @@ "agna5654.www.corp" ], "related.ip": [ - "10.203.47.23", - "10.200.74.101" + "10.200.74.101", + "10.203.47.23" ], "related.user": [ "litesse" @@ -5495,8 +5495,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "nde", "rsa.misc.action": [ - "Allowed", - "iqu" + "iqu", + "Allowed" ], "rsa.misc.category": "ametco", "rsa.misc.filter": "ntincul", @@ -5556,8 +5556,8 @@ "ites5711.internal.host" ], "related.ip": [ - "10.162.78.48", - "10.24.23.209" + "10.24.23.209", + "10.162.78.48" ], "related.user": [ "ntore" @@ -5571,8 +5571,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ereprehe", "rsa.misc.action": [ - "Blocked", - "tutl" + "tutl", + "Blocked" ], "rsa.misc.category": "mip", "rsa.misc.filter": "umSecti", @@ -5632,8 +5632,8 @@ "oluptat2848.api.home" ], "related.ip": [ - "10.211.66.68", - "10.55.151.53" + "10.55.151.53", + "10.211.66.68" ], "related.user": [ "squir" @@ -5647,8 +5647,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "diconseq", "rsa.misc.action": [ - "Allowed", - "umet" + "umet", + "Allowed" ], "rsa.misc.category": "ciad", "rsa.misc.filter": "oeiusmod", @@ -5708,8 +5708,8 @@ "ngelitse7535.internal.lan" ], "related.ip": [ - "10.110.16.169", - "10.209.203.156" + "10.209.203.156", + "10.110.16.169" ], "related.user": [ "mes" @@ -5723,8 +5723,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "iamquisn", "rsa.misc.action": [ - "Blocked", - "lupta" + "lupta", + "Blocked" ], "rsa.misc.category": "uasiarch", "rsa.misc.filter": "usBonor", @@ -5784,8 +5784,8 @@ "tiumtot3611.internal.localdomain" ], "related.ip": [ - "10.107.68.114", - "10.84.9.150" + "10.84.9.150", + "10.107.68.114" ], "related.user": [ "sequatDu" @@ -5799,8 +5799,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "omnis", "rsa.misc.action": [ - "uianonnu", - "Allowed" + "Allowed", + "uianonnu" ], "rsa.misc.category": "Excepteu", "rsa.misc.filter": "enimadmi", @@ -5875,8 +5875,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "lloin", "rsa.misc.action": [ - "ici", - "Blocked" + "Blocked", + "ici" ], "rsa.misc.category": "quidolor", "rsa.misc.filter": "nonproi", @@ -5936,8 +5936,8 @@ "psaqu6066.www5.localhost" ], "related.ip": [ - "10.164.190.2", - "10.223.11.164" + "10.223.11.164", + "10.164.190.2" ], "related.user": [ "ten" @@ -6012,8 +6012,8 @@ "iavol5202.api.example" ], "related.ip": [ - "10.121.181.243", - "10.14.37.8" + "10.14.37.8", + "10.121.181.243" ], "related.user": [ "umwr" @@ -6027,8 +6027,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "vitaedic", "rsa.misc.action": [ - "Blocked", - "rinc" + "rinc", + "Blocked" ], "rsa.misc.category": "prehende", "rsa.misc.filter": "rume", @@ -6103,8 +6103,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tat", "rsa.misc.action": [ - "nia", - "Blocked" + "Blocked", + "nia" ], "rsa.misc.category": "turQuis", "rsa.misc.filter": "nonp", @@ -6164,8 +6164,8 @@ "rsitame4049.internal.corp" ], "related.ip": [ - "10.77.102.206", - "10.34.98.144" + "10.34.98.144", + "10.77.102.206" ], "related.user": [ "tectobe" @@ -6179,8 +6179,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "Exce", "rsa.misc.action": [ - "Allowed", - "ulapa" + "ulapa", + "Allowed" ], "rsa.misc.category": "reprehen", "rsa.misc.filter": "itsedqui", @@ -6240,8 +6240,8 @@ "elit912.www5.test" ], "related.ip": [ - "10.176.233.249", - "10.75.144.118" + "10.75.144.118", + "10.176.233.249" ], "related.user": [ "isnos" @@ -6255,8 +6255,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "essequa", "rsa.misc.action": [ - "Blocked", - "odic" + "odic", + "Blocked" ], "rsa.misc.category": "cto", "rsa.misc.filter": "odite", @@ -6331,8 +6331,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "uis", "rsa.misc.action": [ - "Allowed", - "mvele" + "mvele", + "Allowed" ], "rsa.misc.category": "vitaedi", "rsa.misc.filter": "ndeomni", @@ -6620,8 +6620,8 @@ "archite4407.mail.invalid" ], "related.ip": [ - "10.247.255.107", - "10.234.34.40" + "10.234.34.40", + "10.247.255.107" ], "related.user": [ "aeabillo" @@ -6696,8 +6696,8 @@ "aria1424.mail.home" ], "related.ip": [ - "10.250.102.42", - "10.124.81.20" + "10.124.81.20", + "10.250.102.42" ], "related.user": [ "tNequ" @@ -6711,8 +6711,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "ilmoles", "rsa.misc.action": [ - "tatisetq", - "Blocked" + "Blocked", + "tatisetq" ], "rsa.misc.category": "ametco", "rsa.misc.filter": "liquide", @@ -6772,8 +6772,8 @@ "Bonoru7444.www5.example" ], "related.ip": [ - "10.166.205.159", - "10.154.188.132" + "10.154.188.132", + "10.166.205.159" ], "related.user": [ "uptat" @@ -6787,8 +6787,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "proid", "rsa.misc.action": [ - "Allowed", - "onevolu" + "onevolu", + "Allowed" ], "rsa.misc.category": "iratio", "rsa.misc.filter": "odita", @@ -6916,8 +6916,8 @@ "oloremeu5047.www5.invalid" ], "related.ip": [ - "10.172.159.251", - "10.254.119.31" + "10.254.119.31", + "10.172.159.251" ], "related.user": [ "usm" @@ -6931,8 +6931,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "imadmi", "rsa.misc.action": [ - "tatemacc", - "Blocked" + "Blocked", + "tatemacc" ], "rsa.misc.category": "tutlabor", "rsa.misc.filter": "eturad", @@ -6992,8 +6992,8 @@ "edutpe1255.internal.lan" ], "related.ip": [ - "10.195.62.230", - "10.98.126.206" + "10.98.126.206", + "10.195.62.230" ], "related.user": [ "ptassit" @@ -7007,8 +7007,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "isnost", "rsa.misc.action": [ - "Allowed", - "oriosa" + "oriosa", + "Allowed" ], "rsa.misc.category": "uis", "rsa.misc.filter": "nemul", @@ -7068,8 +7068,8 @@ "nderit1171.www5.domain" ], "related.ip": [ - "10.144.93.186", - "10.84.140.5" + "10.84.140.5", + "10.144.93.186" ], "related.user": [ "eroi" @@ -7220,8 +7220,8 @@ "oremeum4231.internal.host" ], "related.ip": [ - "10.139.90.218", - "10.131.81.172" + "10.131.81.172", + "10.139.90.218" ], "related.user": [ "hende" @@ -7235,8 +7235,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "rrorsi", "rsa.misc.action": [ - "Allowed", - "exe" + "exe", + "Allowed" ], "rsa.misc.category": "mnihi", "rsa.misc.filter": "consequa", @@ -7296,8 +7296,8 @@ "ueip6097.api.host" ], "related.ip": [ - "10.152.217.174", - "10.128.43.71" + "10.128.43.71", + "10.152.217.174" ], "related.user": [ "mquiado" @@ -7387,8 +7387,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "tionemu", "rsa.misc.action": [ - "Blocked", - "rehe" + "rehe", + "Blocked" ], "rsa.misc.category": "aecons", "rsa.misc.filter": "aturve", @@ -7448,8 +7448,8 @@ "onsequ3168.www.corp" ], "related.ip": [ - "10.172.17.6", - "10.109.192.53" + "10.109.192.53", + "10.172.17.6" ], "related.user": [ "eprehen" @@ -7463,8 +7463,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "temUte", "rsa.misc.action": [ - "Blocked", - "tassit" + "tassit", + "Blocked" ], "rsa.misc.category": "ita", "rsa.misc.filter": "scive", @@ -7524,8 +7524,8 @@ "oremquel3120.internal.localhost" ], "related.ip": [ - "10.135.38.213", - "10.119.106.108" + "10.119.106.108", + "10.135.38.213" ], "related.user": [ "ore" @@ -7539,8 +7539,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "exeacomm", "rsa.misc.action": [ - "Blocked", - "volup" + "volup", + "Blocked" ], "rsa.misc.category": "ten", "rsa.misc.filter": "ssecil", diff --git a/x-pack/filebeat/module/zscaler/zia/test/test.log-expected.json b/x-pack/filebeat/module/zscaler/zia/test/test.log-expected.json index bdf9957b55d..d2e89ea6140 100644 --- a/x-pack/filebeat/module/zscaler/zia/test/test.log-expected.json +++ b/x-pack/filebeat/module/zscaler/zia/test/test.log-expected.json @@ -31,8 +31,8 @@ "rsa.investigations.ec_theme": "Communication", "rsa.investigations.event_vcat": "", "rsa.misc.action": [ - "", - "" + "", + "" ], "rsa.misc.category": "", "rsa.misc.filter": "", From 48c60f8ae024057a3e9ac49382978345a2893f93 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Fri, 2 Oct 2020 10:03:33 +0200 Subject: [PATCH 044/156] [Ingest Manager] Split index restrictions into type,dataset, namespace parts (#21406) [Ingest Manager] Split index restrictions into type,dataset, namespace parts (#21406) --- .../application/filters/stream_checker.go | 91 ++++++++++--------- .../filters/stream_checker_test.go | 79 ++++++---------- 2 files changed, 77 insertions(+), 93 deletions(-) diff --git a/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker.go b/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker.go index 3a6a7843b72..4f9e753ba94 100644 --- a/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker.go +++ b/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker.go @@ -5,7 +5,6 @@ package filters import ( - "fmt" "strings" "github.com/elastic/beats/v7/x-pack/elastic-agent/pkg/agent/errors" @@ -47,11 +46,7 @@ func StreamChecker(log *logger.Logger, ast *transpiler.AST) error { if nsNode, found := inputNode.Find("data_stream.namespace"); found { nsKey, ok := nsNode.(*transpiler.Key) if ok { - newNamespace := nsKey.Value().(transpiler.Node).String() - if !isValid(newNamespace) { - return ErrInvalidNamespace - } - namespace = newNamespace + namespace = nsKey.Value().(transpiler.Node).String() } } else { dsNode, found := inputNode.Find("data_stream") @@ -63,17 +58,17 @@ func StreamChecker(log *logger.Logger, ast *transpiler.AST) error { if found { nsKey, ok := nsNode.(*transpiler.Key) if ok { - newNamespace := nsKey.Value().(transpiler.Node).String() - if !isValid(newNamespace) { - return ErrInvalidNamespace - } - namespace = newNamespace + namespace = nsKey.Value().(transpiler.Node).String() } } } } } + if !matchesNamespaceContraints(namespace) { + return ErrInvalidNamespace + } + // get the type, longest type for now is metrics datasetType := "metrics" if nsNode, found := inputNode.Find("data_stream.type"); found { @@ -100,6 +95,10 @@ func StreamChecker(log *logger.Logger, ast *transpiler.AST) error { } } + if !matchesTypeConstraints(datasetType) { + return ErrInvalidIndex + } + streamsNode, ok := inputNode.Find("streams") if ok { streamsList, ok := streamsNode.Value().(*transpiler.List) @@ -119,11 +118,8 @@ func StreamChecker(log *logger.Logger, ast *transpiler.AST) error { if dsNameNode, found := streamMap.Find("data_stream.dataset"); found { dsKey, ok := dsNameNode.(*transpiler.Key) if ok { - newDataset := dsKey.Value().(transpiler.Node).String() - if !isValid(newDataset) { - return ErrInvalidDataset - } - datasetName = newDataset + datasetName = dsKey.Value().(transpiler.Node).String() + break } } else { datasetNode, found := streamMap.Find("data_stream") @@ -137,11 +133,8 @@ func StreamChecker(log *logger.Logger, ast *transpiler.AST) error { if found { dsKey, ok := dsNameNode.(*transpiler.Key) if ok { - newDataset := dsKey.Value().(transpiler.Node).String() - if !isValid(newDataset) { - return ErrInvalidDataset - } - datasetName = newDataset + datasetName = dsKey.Value().(transpiler.Node).String() + break } } } @@ -149,49 +142,65 @@ func StreamChecker(log *logger.Logger, ast *transpiler.AST) error { } } } - - if indexName := fmt.Sprintf("%s-%s-%s", datasetType, datasetName, namespace); !matchesIndexContraints(indexName) { - return ErrInvalidIndex + if !matchesDatasetConstraints(datasetName) { + return ErrInvalidDataset } } return nil } -// The only two requirement are that it has only characters allowed in an Elasticsearch index name -// and does NOT contain a `-`. -func isValid(namespace string) bool { - return matchesIndexContraints(namespace) && !strings.Contains(namespace, "-") -} - // The only two requirement are that it has only characters allowed in an Elasticsearch index name // Index names must meet the following criteria: +// Not longer than 100 bytes // Lowercase only // Cannot include \, /, *, ?, ", <, >, |, ` ` (space character), ,, # +func matchesNamespaceContraints(namespace string) bool { + // length restriction is in bytes, not characters + if len(namespace) <= 0 || len(namespace) > 100 { + return false + } + + return isCharactersetValid(namespace) +} + +// matchesTypeConstraints fails for following rules. As type is first element of resulting index prefix restrictions need to be applied. +// Not longer than 20 bytes +// Lowercase only // Cannot start with -, _, + -// Cannot be . or .. -func matchesIndexContraints(namespace string) bool { - // Cannot be . or .. - if namespace == "." || namespace == ".." { +// Cannot include \, /, *, ?, ", <, >, |, ` ` (space character), ,, # +func matchesTypeConstraints(dsType string) bool { + // length restriction is in bytes, not characters + if len(dsType) <= 0 || len(dsType) > 20 { return false } - if len(namespace) <= 0 || len(namespace) > 255 { + if strings.HasPrefix(dsType, "-") || strings.HasPrefix(dsType, "_") || strings.HasPrefix(dsType, "+") { return false } - // Lowercase only - if strings.ToLower(namespace) != namespace { + return isCharactersetValid(dsType) +} + +// matchesDatasetConstraints fails for following rules +// Not longer than 100 bytes +// Lowercase only +// Cannot include \, /, *, ?, ", <, >, |, ` ` (space character), ,, # +func matchesDatasetConstraints(dataset string) bool { + // length restriction is in bytes, not characters + if len(dataset) <= 0 || len(dataset) > 100 { return false } - // Cannot include \, /, *, ?, ", <, >, |, ` ` (space character), ,, # - if strings.ContainsAny(namespace, "\\/*?\"<>| ,#") { + return isCharactersetValid(dataset) +} + +func isCharactersetValid(input string) bool { + if strings.ToLower(input) != input { return false } - // Cannot start with -, _, + - if strings.HasPrefix(namespace, "-") || strings.HasPrefix(namespace, "_") || strings.HasPrefix(namespace, "+") { + if strings.ContainsAny(input, "\\/*?\"<>| ,#:") { return false } diff --git a/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker_test.go b/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker_test.go index 1daa14a1ad6..5750734c477 100644 --- a/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker_test.go +++ b/x-pack/elastic-agent/pkg/agent/application/filters/stream_checker_test.go @@ -93,25 +93,6 @@ func TestStreamCheck(t *testing.T) { }, result: ErrInvalidDataset, }, - - { - name: "dataset invalid dot - compact", - configMap: map[string]interface{}{ - "inputs": []map[string]interface{}{ - {"streams": []map[string]interface{}{{"data_stream.dataset": "."}}}, - }, - }, - result: ErrInvalidDataset, - }, - { - name: "dataset invalid dotdot- compact", - configMap: map[string]interface{}{ - "inputs": []map[string]interface{}{ - {"streams": []map[string]interface{}{{"data_stream.dataset": ".."}}}, - }, - }, - result: ErrInvalidDataset, - }, { name: "dataset invalid uppercase - compact", configMap: map[string]interface{}{ @@ -139,16 +120,6 @@ func TestStreamCheck(t *testing.T) { }, result: ErrInvalidDataset, }, - { - name: "dataset invalid invalid prefix- compact", - configMap: map[string]interface{}{ - "inputs": []map[string]interface{}{ - {"streams": []map[string]interface{}{{"data_stream.dataset": "_isthisvalid"}}}, - }, - }, - result: ErrInvalidDataset, - }, - { name: "namespace invalid - compact", configMap: map[string]interface{}{ @@ -156,22 +127,6 @@ func TestStreamCheck(t *testing.T) { }, result: ErrInvalidNamespace, }, - { - name: "namespace invalid name 1 - compact", - configMap: map[string]interface{}{ - "inputs": []map[string]interface{}{ - {"data_stream.namespace": "."}, - }, - }, - result: ErrInvalidNamespace, - }, - { - name: "namespace invalid name 2 - compact", - configMap: map[string]interface{}{ - "inputs": []map[string]interface{}{{"data_stream.namespace": ".."}}, - }, - result: ErrInvalidNamespace, - }, { name: "namespace invalid name uppercase - compact", configMap: map[string]interface{}{ @@ -193,13 +148,6 @@ func TestStreamCheck(t *testing.T) { }, result: ErrInvalidNamespace, }, - { - name: "namespace invalid name invalid prefix - compact", - configMap: map[string]interface{}{ - "inputs": []map[string]interface{}{{"data_stream.namespace": "+isitok"}}, - }, - result: ErrInvalidNamespace, - }, { name: "namespace invalid - long", configMap: map[string]interface{}{ @@ -274,6 +222,33 @@ func TestStreamCheck(t *testing.T) { }, result: nil, }, + { + name: "type invalid prefix _", + configMap: map[string]interface{}{ + "inputs": []map[string]interface{}{ + {"data_stream.type": "_type"}, + }, + }, + result: ErrInvalidIndex, + }, + { + name: "type invalid prefix -", + configMap: map[string]interface{}{ + "inputs": []map[string]interface{}{ + {"data_stream.type": "-type"}, + }, + }, + result: ErrInvalidIndex, + }, + { + name: "type invalid prefix +", + configMap: map[string]interface{}{ + "inputs": []map[string]interface{}{ + {"data_stream.type": "+type"}, + }, + }, + result: ErrInvalidIndex, + }, } log, err := logger.New("") From a119083d71136cc18eed23128a02ad836a22d66b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Fri, 2 Oct 2020 12:33:32 +0200 Subject: [PATCH 045/156] Add implementation of FSWatcher and FSScanner for filestream (#21444) ## What does this PR do? This PR adds the implementation for `FSWatcher` and `FSScanner` for the `filestream` input. The implementation of `FSScanner` is called `fileScanner`. It is responsible for * resolves recursive globs on creation * normalizes glob patterns on creation * finds files which match the configured paths and returns `FileInfo` for those This is the refactored version of the `log` input's scanner, globber functions. The implementation of `FSWatcher` is called `fileWatcher`. It checks the file list returned by `fileScanner` and creates events based on the result. ## Why is it important? It is required for the `filestream` input. ## Related issues Related #20243 --- filebeat/input/filestream/fswatch.go | 375 ++++++++++++++++++ filebeat/input/filestream/fswatch_test.go | 300 ++++++++++++++ .../input/filestream/testdata/excluded_file | 0 .../input/filestream/testdata/included_file | 0 .../testdata/symlink_to_included_file | 1 + 5 files changed, 676 insertions(+) create mode 100644 filebeat/input/filestream/fswatch.go create mode 100644 filebeat/input/filestream/fswatch_test.go create mode 100644 filebeat/input/filestream/testdata/excluded_file create mode 100644 filebeat/input/filestream/testdata/included_file create mode 120000 filebeat/input/filestream/testdata/symlink_to_included_file diff --git a/filebeat/input/filestream/fswatch.go b/filebeat/input/filestream/fswatch.go new file mode 100644 index 00000000000..d4bc1b5ea08 --- /dev/null +++ b/filebeat/input/filestream/fswatch.go @@ -0,0 +1,375 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package filestream + +import ( + "fmt" + "os" + "path/filepath" + "time" + + "github.com/elastic/beats/v7/filebeat/input/file" + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/go-concert/unison" +) + +const ( + recursiveGlobDepth = 8 + scannerName = "scanner" + watcherDebugKey = "file_watcher" +) + +var ( + watcherFactories = map[string]watcherFactory{ + scannerName: newScannerWatcher, + } +) + +type watcherFactory func(paths []string, cfg *common.Config) (loginp.FSWatcher, error) + +// fileScanner looks for files which match the patterns in paths. +// It is able to exclude files and symlinks. +type fileScanner struct { + paths []string + excludedFiles []match.Matcher + symlinks bool + + log *logp.Logger +} + +type fileWatcherConfig struct { + // Interval is the time between two scans. + Interval time.Duration + // Scanner is the configuration of the scanner. + Scanner fileScannerConfig +} + +// fileWatcher gets the list of files from a FSWatcher and creates events by +// comparing the files between its last two runs. +type fileWatcher struct { + interval time.Duration + prev map[string]os.FileInfo + scanner loginp.FSScanner + log *logp.Logger + events chan loginp.FSEvent +} + +func newFileWatcher(paths []string, ns *common.ConfigNamespace) (loginp.FSWatcher, error) { + if ns == nil { + return newScannerWatcher(paths, nil) + } + + watcherType := ns.Name() + f, ok := watcherFactories[watcherType] + if !ok { + return nil, fmt.Errorf("no such file watcher: %s", watcherType) + } + + return f(paths, ns.Config()) +} + +func newScannerWatcher(paths []string, c *common.Config) (loginp.FSWatcher, error) { + config := defaultFileWatcherConfig() + err := c.Unpack(&config) + if err != nil { + return nil, err + } + scanner, err := newFileScanner(paths, config.Scanner) + if err != nil { + return nil, err + } + return &fileWatcher{ + log: logp.NewLogger(watcherDebugKey), + interval: config.Interval, + prev: make(map[string]os.FileInfo, 0), + scanner: scanner, + events: make(chan loginp.FSEvent), + }, nil +} + +func defaultFileWatcherConfig() fileWatcherConfig { + return fileWatcherConfig{ + Interval: 10 * time.Second, + Scanner: defaultFileScannerConfig(), + } +} + +func (w *fileWatcher) Run(ctx unison.Canceler) { + defer close(w.events) + + ticker := time.NewTicker(w.interval) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + w.watch(ctx) + } + } +} + +func (w *fileWatcher) watch(ctx unison.Canceler) { + w.log.Info("Start next scan") + + paths := w.scanner.GetFiles() + + newFiles := make(map[string]os.FileInfo) + + for path, info := range paths { + + prevInfo, ok := w.prev[path] + if !ok { + newFiles[path] = paths[path] + continue + } + + if prevInfo.ModTime() != info.ModTime() { + select { + case <-ctx.Done(): + return + case w.events <- writeEvent(path, info): + } + } + + // delete from previous state, as we have more up to date info + delete(w.prev, path) + } + + // remaining files are in the prev map are the ones that are missing + // either because they have been deleted or renamed + for removedPath, removedInfo := range w.prev { + for newPath, newInfo := range newFiles { + if os.SameFile(removedInfo, newInfo) { + select { + case <-ctx.Done(): + return + case w.events <- renamedEvent(removedPath, newPath, newInfo): + delete(newFiles, newPath) + goto CHECK_NEXT_REMOVED + } + } + } + + select { + case <-ctx.Done(): + return + case w.events <- deleteEvent(removedPath, removedInfo): + } + CHECK_NEXT_REMOVED: + } + + // remaining files in newFiles are new + for path, info := range newFiles { + select { + case <-ctx.Done(): + return + case w.events <- createEvent(path, info): + } + + } + + w.log.Debugf("Found %d paths", len(paths)) + w.prev = paths +} + +func createEvent(path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: path, Info: fi} +} + +func writeEvent(path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpWrite, OldPath: path, NewPath: path, Info: fi} +} + +func renamedEvent(oldPath, path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpRename, OldPath: oldPath, NewPath: path, Info: fi} +} + +func deleteEvent(path string, fi os.FileInfo) loginp.FSEvent { + return loginp.FSEvent{Op: loginp.OpDelete, OldPath: path, NewPath: "", Info: fi} +} + +func (w *fileWatcher) Event() loginp.FSEvent { + return <-w.events +} + +type fileScannerConfig struct { + Paths []string + ExcludedFiles []match.Matcher + Symlinks bool + RecursiveGlob bool +} + +func defaultFileScannerConfig() fileScannerConfig { + return fileScannerConfig{ + Symlinks: false, + RecursiveGlob: true, + } +} + +func newFileScanner(paths []string, cfg fileScannerConfig) (loginp.FSScanner, error) { + fs := fileScanner{ + paths: paths, + excludedFiles: cfg.ExcludedFiles, + symlinks: cfg.Symlinks, + log: logp.NewLogger(scannerName), + } + err := fs.resolveRecursiveGlobs(cfg) + if err != nil { + return nil, err + } + err = fs.normalizeGlobPatterns() + if err != nil { + return nil, err + } + + return &fs, nil +} + +// resolveRecursiveGlobs expands `**` from the globs in multiple patterns +func (s *fileScanner) resolveRecursiveGlobs(c fileScannerConfig) error { + if !c.RecursiveGlob { + s.log.Debug("recursive glob disabled") + return nil + } + + s.log.Debug("recursive glob enabled") + var paths []string + for _, path := range s.paths { + patterns, err := file.GlobPatterns(path, recursiveGlobDepth) + if err != nil { + return err + } + if len(patterns) > 1 { + s.log.Debugf("%q expanded to %#v", path, patterns) + } + paths = append(paths, patterns...) + } + s.paths = paths + return nil +} + +// normalizeGlobPatterns calls `filepath.Abs` on all the globs from config +func (s *fileScanner) normalizeGlobPatterns() error { + var paths []string + for _, path := range s.paths { + pathAbs, err := filepath.Abs(path) + if err != nil { + return fmt.Errorf("failed to get the absolute path for %s: %v", path, err) + } + paths = append(paths, pathAbs) + } + s.paths = paths + return nil +} + +// GetFiles returns a map of files and fileinfos which +// match the configured paths. +func (s *fileScanner) GetFiles() map[string]os.FileInfo { + pathInfo := map[string]os.FileInfo{} + + for _, path := range s.paths { + matches, err := filepath.Glob(path) + if err != nil { + s.log.Errorf("glob(%s) failed: %v", path, err) + continue + } + + for _, file := range matches { + if s.shouldSkipFile(file) { + continue + } + + // If symlink is enabled, it is checked that original is not part of same input + // If original is harvested by other input, states will potentially overwrite each other + if s.isOriginalAndSymlinkConfigured(file, pathInfo) { + continue + } + + fileInfo, err := os.Stat(file) + if err != nil { + s.log.Debug("stat(%s) failed: %s", file, err) + continue + } + pathInfo[file] = fileInfo + } + } + + return pathInfo +} + +func (s *fileScanner) shouldSkipFile(file string) bool { + if s.isFileExcluded(file) { + s.log.Debugf("Exclude file: %s", file) + return true + } + + fileInfo, err := os.Lstat(file) + if err != nil { + s.log.Debugf("lstat(%s) failed: %s", file, err) + return true + } + + if fileInfo.IsDir() { + s.log.Debugf("Skipping directory: %s", file) + return true + } + + isSymlink := fileInfo.Mode()&os.ModeSymlink > 0 + if isSymlink && !s.symlinks { + s.log.Debugf("File %s skipped as it is a symlink", file) + return true + } + + return false +} + +func (s *fileScanner) isOriginalAndSymlinkConfigured(file string, paths map[string]os.FileInfo) bool { + if s.symlinks { + fileInfo, err := os.Stat(file) + if err != nil { + s.log.Debugf("stat(%s) failed: %s", file, err) + return false + } + + for _, finfo := range paths { + if os.SameFile(finfo, fileInfo) { + s.log.Info("Same file found as symlink and original. Skipping file: %s (as it same as %s)", file, finfo.Name()) + return true + } + } + } + return false +} + +func (s *fileScanner) isFileExcluded(file string) bool { + return len(s.excludedFiles) > 0 && s.matchAny(s.excludedFiles, file) +} + +// matchAny checks if the text matches any of the regular expressions +func (s *fileScanner) matchAny(matchers []match.Matcher, text string) bool { + for _, m := range matchers { + if m.MatchString(text) { + return true + } + } + return false +} diff --git a/filebeat/input/filestream/fswatch_test.go b/filebeat/input/filestream/fswatch_test.go new file mode 100644 index 00000000000..5e63987c868 --- /dev/null +++ b/filebeat/input/filestream/fswatch_test.go @@ -0,0 +1,300 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package filestream + +import ( + "context" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + loginp "github.com/elastic/beats/v7/filebeat/input/filestream/internal/input-logfile" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/logp" +) + +func TestFileScanner(t *testing.T) { + testCases := map[string]struct { + paths []string + excludedFiles []match.Matcher + symlinks bool + expectedFiles []string + }{ + "select all files": { + paths: []string{ + filepath.Join("testdata", "excluded_file"), + filepath.Join("testdata", "included_file"), + }, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "excluded_file")), + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "skip excluded files": { + paths: []string{ + filepath.Join("testdata", "excluded_file"), + filepath.Join("testdata", "included_file"), + }, + excludedFiles: []match.Matcher{ + match.MustCompile(filepath.Join("testdata", "excluded_file")), + }, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + // covers test_input.py/test_skip_symlinks + "skip symlinks": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: false, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "return a file once if symlinks are enabled": { + paths: []string{ + filepath.Join("testdata", "symlink_to_included_file"), + filepath.Join("testdata", "included_file"), + }, + symlinks: true, + expectedFiles: []string{ + mustAbsPath(filepath.Join("testdata", "included_file")), + }, + }, + "skip directories": { + paths: []string{ + filepath.Join("testdata", "unharvestable_dir"), + }, + expectedFiles: []string{}, + }, + } + + for name, test := range testCases { + test := test + + t.Run(name, func(t *testing.T) { + cfg := fileScannerConfig{ + ExcludedFiles: test.excludedFiles, + Symlinks: test.symlinks, + RecursiveGlob: false, + } + fs, err := newFileScanner(test.paths, cfg) + if err != nil { + t.Fatal(err) + } + files := fs.GetFiles() + paths := make([]string, 0) + for p, _ := range files { + paths = append(paths, p) + } + assert.Equal(t, test.expectedFiles, paths) + }) + } +} + +func TestFileWatchNewDeleteModified(t *testing.T) { + oldTs := time.Now() + newTs := oldTs.Add(5 * time.Second) + testCases := map[string]struct { + prevFiles map[string]os.FileInfo + nextFiles map[string]os.FileInfo + expectedEvents []loginp.FSEvent + }{ + "one new file": { + prevFiles: map[string]os.FileInfo{}, + nextFiles: map[string]os.FileInfo{ + "new_path": testFileInfo{"new_path", 5, oldTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: "new_path", Info: testFileInfo{"new_path", 5, oldTs}}, + }, + }, + "one deleted file": { + prevFiles: map[string]os.FileInfo{ + "old_path": testFileInfo{"old_path", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{}, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpDelete, OldPath: "old_path", NewPath: "", Info: testFileInfo{"old_path", 5, oldTs}}, + }, + }, + "one modified file": { + prevFiles: map[string]os.FileInfo{ + "path": testFileInfo{"path", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path": testFileInfo{"path", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path", NewPath: "path", Info: testFileInfo{"path", 10, newTs}}, + }, + }, + "two modified files": { + prevFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 5, oldTs}, + "path2": testFileInfo{"path2", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 10, newTs}, + "path2": testFileInfo{"path2", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path1", NewPath: "path1", Info: testFileInfo{"path1", 10, newTs}}, + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path2", NewPath: "path2", Info: testFileInfo{"path2", 10, newTs}}, + }, + }, + "one modified file, one new file": { + prevFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path1": testFileInfo{"path1", 10, newTs}, + "path2": testFileInfo{"path2", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpWrite, OldPath: "path1", NewPath: "path1", Info: testFileInfo{"path1", 10, newTs}}, + loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: "path2", Info: testFileInfo{"path2", 10, newTs}}, + }, + }, + "one new file, one deleted file": { + prevFiles: map[string]os.FileInfo{ + "path_deleted": testFileInfo{"path_deleted", 5, oldTs}, + }, + nextFiles: map[string]os.FileInfo{ + "path_new": testFileInfo{"path_new", 10, newTs}, + }, + expectedEvents: []loginp.FSEvent{ + loginp.FSEvent{Op: loginp.OpDelete, OldPath: "path_deleted", NewPath: "", Info: testFileInfo{"path_deleted", 5, oldTs}}, + loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: "path_new", Info: testFileInfo{"path_new", 10, newTs}}, + }, + }, + } + + for name, test := range testCases { + test := test + + t.Run(name, func(t *testing.T) { + w := fileWatcher{ + log: logp.L(), + prev: test.prevFiles, + scanner: &mockScanner{test.nextFiles}, + events: make(chan loginp.FSEvent), + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go w.watch(ctx) + + for _, expectedEvent := range test.expectedEvents { + evt := w.Event() + assert.Equal(t, expectedEvent, evt) + } + }) + } +} + +func TestFileWatcherRenamedFile(t *testing.T) { + testPath := mustAbsPath(filepath.Join("testdata", "first_name")) + renamedPath := mustAbsPath(filepath.Join("testdata", "renamed")) + + f, err := os.Create(testPath) + if err != nil { + t.Fatal(err) + } + f.Close() + fi, err := os.Stat(testPath) + if err != nil { + t.Fatal(err) + } + + cfg := fileScannerConfig{ + ExcludedFiles: nil, + Symlinks: false, + RecursiveGlob: false, + } + scanner, err := newFileScanner([]string{testPath, renamedPath}, cfg) + if err != nil { + t.Fatal(err) + } + w := fileWatcher{ + log: logp.L(), + scanner: scanner, + events: make(chan loginp.FSEvent), + } + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + go w.watch(ctx) + assert.Equal(t, loginp.FSEvent{Op: loginp.OpCreate, OldPath: "", NewPath: testPath, Info: fi}, w.Event()) + + err = os.Rename(testPath, renamedPath) + if err != nil { + t.Fatal(err) + } + defer os.Remove(renamedPath) + fi, err = os.Stat(renamedPath) + if err != nil { + t.Fatal(err) + } + + go w.watch(ctx) + assert.Equal(t, loginp.FSEvent{Op: loginp.OpRename, OldPath: testPath, NewPath: renamedPath, Info: fi}, w.Event()) +} + +type mockScanner struct { + files map[string]os.FileInfo +} + +func (m *mockScanner) GetFiles() map[string]os.FileInfo { + return m.files +} + +type testFileInfo struct { + path string + size int64 + time time.Time +} + +func (t testFileInfo) Name() string { return t.path } +func (t testFileInfo) Size() int64 { return t.size } +func (t testFileInfo) Mode() os.FileMode { return 0 } +func (t testFileInfo) ModTime() time.Time { return t.time } +func (t testFileInfo) IsDir() bool { return false } +func (t testFileInfo) Sys() interface{} { return nil } + +func mustAbsPath(path string) string { + p, err := filepath.Abs(path) + if err != nil { + panic(err) + } + return p +} + +func mustDuration(durStr string) time.Duration { + dur, err := time.ParseDuration(durStr) + if err != nil { + panic(err) + } + return dur +} diff --git a/filebeat/input/filestream/testdata/excluded_file b/filebeat/input/filestream/testdata/excluded_file new file mode 100644 index 00000000000..e69de29bb2d diff --git a/filebeat/input/filestream/testdata/included_file b/filebeat/input/filestream/testdata/included_file new file mode 100644 index 00000000000..e69de29bb2d diff --git a/filebeat/input/filestream/testdata/symlink_to_included_file b/filebeat/input/filestream/testdata/symlink_to_included_file new file mode 120000 index 00000000000..40824f3f7d3 --- /dev/null +++ b/filebeat/input/filestream/testdata/symlink_to_included_file @@ -0,0 +1 @@ +filebeat/input/filestream/testdata/included_file \ No newline at end of file From b8fd5fc333d3bffc83a6590f15d7109ac83acdc8 Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Fri, 2 Oct 2020 13:03:56 +0200 Subject: [PATCH 046/156] Remove duplicated sources url in dependencies report (#21462) It was added by mistake as part of the license URL. --- dev-tools/dependencies-report | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-tools/dependencies-report b/dev-tools/dependencies-report index a2662a4ab9a..928de5367ca 100755 --- a/dev-tools/dependencies-report +++ b/dev-tools/dependencies-report @@ -48,7 +48,7 @@ go list -m -json all $@ | go run go.elastic.co/go-licence-detector \ # name,url,version,revision,license ubi8url='https://catalog.redhat.com/software/containers/ubi8/ubi-minimal/5c359a62bed8bd75a2c3fba8' ubi8source='https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz' -ubilicense='Custom;https://www.redhat.com/licenses/EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf,https://oss-dependencies.elastic.co/redhat/ubi/ubi-minimal-8-source.tar.gz' +ubilicense='Custom;https://www.redhat.com/licenses/EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf' cat <> $outfile Red Hat Universal Base Image,$ubi8url,8,,$ubilicense,$ubi8source EOF From 79ddbbfb642eda785f5ef76206e65c5a1690f0e9 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 12:12:52 +0100 Subject: [PATCH 047/156] [CI] Send slack message with build status (#21428) --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 119cea9b3ab..317a5c781e3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -24,6 +24,7 @@ pipeline { PIPELINE_LOG_LEVEL = 'INFO' PYTEST_ADDOPTS = "${params.PYTEST_ADDOPTS}" RUNBLD_DISABLE_NOTIFICATIONS = 'true' + SLACK_CHANNEL = "#beats-ci-builds" TERRAFORM_VERSION = "0.12.24" XPACK_MODULE_PATTERN = '^x-pack\\/[a-z0-9]+beat\\/module\\/([^\\/]+)\\/.*' } @@ -121,7 +122,7 @@ pipeline { runbld(stashedTestReports: stashedTestReports, project: env.REPO) } cleanup { - notifyBuildResult(prComment: true) + notifyBuildResult(prComment: true, slackComment: true) } } } From 19453734455cc831422d236cdadc67e71ed5caba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Fri, 2 Oct 2020 13:13:31 +0200 Subject: [PATCH 048/156] Add new log file reader for filestream input (#21450) ## What does this PR do? This PR adds the new refactored version of the previous `Log` reader of the `log` input called `logFile`. The differences between the two readers are the following: * `logFile` calls `Stat` only once to avoid too many system calls (`Log` calls `Stat` 3 times after every read) * `logFile` starts separate go routines to check if `close.after_interval` or `close.inactive` has elapsed. `Log` checks `close_inactive` after every `Read`. Thus, if the output is blocked, it cannot stop the reader. * `logFile` does not check if the file has been removed or renamed if `close_removed` or `close_renamed` are enabled. Instead it is checked separately in the prospector, so if the output blocks, the reader can be closed. This prevents Filebeat keeping too many open files if the output is blocked. (The code mentioned is not yet included in any PR.) ## Why is it important? This is the improved version of the previous `log` reader. --- filebeat/input/filestream/config.go | 147 ++++++++++++++++ filebeat/input/filestream/filestream.go | 225 ++++++++++++++++++++++++ 2 files changed, 372 insertions(+) create mode 100644 filebeat/input/filestream/config.go create mode 100644 filebeat/input/filestream/filestream.go diff --git a/filebeat/input/filestream/config.go b/filebeat/input/filestream/config.go new file mode 100644 index 00000000000..93b23232594 --- /dev/null +++ b/filebeat/input/filestream/config.go @@ -0,0 +1,147 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package filestream + +import ( + "fmt" + "time" + + "github.com/dustin/go-humanize" + + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/match" + "github.com/elastic/beats/v7/libbeat/reader/readfile" +) + +// Config stores the options of a file stream. +type config struct { + Paths []string `config:"paths"` + Close closerConfig `config:"close"` + FileWatcher *common.ConfigNamespace `config:"file_watcher"` + Reader readerConfig `config:"readers"` + FileIdentity *common.ConfigNamespace `config:"file_identity"` + CleanInactive time.Duration `config:"clean_inactive" validate:"min=0"` + CleanRemoved bool `config:"clean_removed"` + HarvesterLimit uint32 `config:"harvester_limit" validate:"min=0"` + IgnoreOlder time.Duration `config:"ignore_older"` +} + +type closerConfig struct { + OnStateChange stateChangeCloserConfig `config:"on_state_change"` + Reader readerCloserConfig `config:"reader"` +} + +type readerCloserConfig struct { + AfterInterval time.Duration + Inactive time.Duration + OnEOF bool +} + +type stateChangeCloserConfig struct { + CheckInterval time.Duration + Removed bool + Renamed bool +} + +// TODO should this be inline? +type readerConfig struct { + Backoff backoffConfig `config:"backoff"` + BufferSize int `config:"buffer_size"` + Encoding string `config:"encoding"` + ExcludeLines []match.Matcher `config:"exclude_lines"` + IncludeLines []match.Matcher `config:"include_lines"` + LineTerminator readfile.LineTerminator `config:"line_terminator"` + MaxBytes int `config:"message_max_bytes" validate:"min=0,nonzero"` + Tail bool `config:"seek_to_tail"` + + Parsers []*common.ConfigNamespace `config:"parsers"` // TODO multiline, json, syslog? +} + +type backoffConfig struct { + Init time.Duration `config:"init" validate:"nonzero"` + Max time.Duration `config:"max" validate:"nonzero"` +} + +func defaultConfig() config { + return config{ + Paths: []string{}, + Close: defaultCloserConfig(), + Reader: defaultReaderConfig(), + CleanInactive: 0, + CleanRemoved: true, + HarvesterLimit: 0, + IgnoreOlder: 0, + } +} + +func defaultCloserConfig() closerConfig { + return closerConfig{ + OnStateChange: stateChangeCloserConfig{ + CheckInterval: 5 * time.Second, + Removed: true, // TODO check clean_removed option + Renamed: false, + }, + Reader: readerCloserConfig{ + OnEOF: false, + Inactive: 0 * time.Second, + AfterInterval: 0 * time.Second, + }, + } +} + +func defaultReaderConfig() readerConfig { + return readerConfig{ + Backoff: backoffConfig{ + Init: 1 * time.Second, + Max: 10 * time.Second, + }, + BufferSize: 16 * humanize.KiByte, + LineTerminator: readfile.AutoLineTerminator, + MaxBytes: 10 * humanize.MiByte, + Tail: false, + Parsers: nil, + } +} + +func (c *config) Validate() error { + if len(c.Paths) == 0 { + return fmt.Errorf("no path is configured") + } + // TODO + //if c.CleanInactive != 0 && c.IgnoreOlder == 0 { + // return fmt.Errorf("ignore_older must be enabled when clean_inactive is used") + //} + + // TODO + //if c.CleanInactive != 0 && c.CleanInactive <= c.IgnoreOlder+c.ScanFrequency { + // return fmt.Errorf("clean_inactive must be > ignore_older + scan_frequency to make sure only files which are not monitored anymore are removed") + //} + + // TODO + //if c.JSON != nil && len(c.JSON.MessageKey) == 0 && + // c.Multiline != nil { + // return fmt.Errorf("When using the JSON decoder and multiline together, you need to specify a message_key value") + //} + + //if c.JSON != nil && len(c.JSON.MessageKey) == 0 && + // (len(c.IncludeLines) > 0 || len(c.ExcludeLines) > 0) { + // return fmt.Errorf("When using the JSON decoder and line filtering together, you need to specify a message_key value") + //} + + return nil +} diff --git a/filebeat/input/filestream/filestream.go b/filebeat/input/filestream/filestream.go new file mode 100644 index 00000000000..59f26ccca1b --- /dev/null +++ b/filebeat/input/filestream/filestream.go @@ -0,0 +1,225 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package filestream + +import ( + "context" + "errors" + "io" + "os" + "time" + + input "github.com/elastic/beats/v7/filebeat/input/v2" + "github.com/elastic/beats/v7/libbeat/common/backoff" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/go-concert/ctxtool" + "github.com/elastic/go-concert/unison" +) + +var ( + ErrFileTruncate = errors.New("detected file being truncated") + ErrClosed = errors.New("reader closed") +) + +// logFile contains all log related data +type logFile struct { + file *os.File + log *logp.Logger + ctx context.Context + cancelReading context.CancelFunc + + closeInactive time.Duration + closeAfterInterval time.Duration + closeOnEOF bool + + offset int64 + lastTimeRead time.Time + backoff backoff.Backoff + tg unison.TaskGroup +} + +// newFileReader creates a new log instance to read log sources +func newFileReader( + log *logp.Logger, + canceler input.Canceler, + f *os.File, + config readerConfig, + closerConfig readerCloserConfig, +) (*logFile, error) { + offset, err := f.Seek(0, os.SEEK_CUR) + if err != nil { + return nil, err + } + + l := &logFile{ + file: f, + log: log, + closeInactive: closerConfig.Inactive, + closeAfterInterval: closerConfig.AfterInterval, + closeOnEOF: closerConfig.OnEOF, + offset: offset, + lastTimeRead: time.Now(), + backoff: backoff.NewExpBackoff(canceler.Done(), config.Backoff.Init, config.Backoff.Max), + tg: unison.TaskGroup{}, + } + + l.ctx, l.cancelReading = ctxtool.WithFunc(ctxtool.FromCanceller(canceler), func() { + err := l.tg.Stop() + if err != nil { + l.log.Errorf("Error while stopping filestream logFile reader: %v", err) + } + }) + + l.startFileMonitoringIfNeeded() + + return l, nil +} + +// Read reads from the reader and updates the offset +// The total number of bytes read is returned. +func (f *logFile) Read(buf []byte) (int, error) { + totalN := 0 + + for f.ctx.Err() == nil { + n, err := f.file.Read(buf) + if n > 0 { + f.offset += int64(n) + f.lastTimeRead = time.Now() + } + totalN += n + + // Read from source completed without error + // Either end reached or buffer full + if err == nil { + // reset backoff for next read + f.backoff.Reset() + return totalN, nil + } + + // Move buffer forward for next read + buf = buf[n:] + + // Checks if an error happened or buffer is full + // If buffer is full, cannot continue reading. + // Can happen if n == bufferSize + io.EOF error + err = f.errorChecks(err) + if err != nil || len(buf) == 0 { + return totalN, err + } + + f.log.Debugf("End of file reached: %s; Backoff now.", f.file.Name()) + f.backoff.Wait() + } + + return 0, ErrClosed +} + +func (f *logFile) startFileMonitoringIfNeeded() { + if f.closeInactive == 0 && f.closeAfterInterval == 0 { + return + } + + if f.closeInactive > 0 { + f.tg.Go(func(ctx unison.Canceler) error { + f.closeIfTimeout(ctx) + return nil + }) + } + + if f.closeAfterInterval > 0 { + f.tg.Go(func(ctx unison.Canceler) error { + f.closeIfInactive(ctx) + return nil + }) + } +} + +func (f *logFile) closeIfTimeout(ctx unison.Canceler) { + timer := time.NewTimer(f.closeAfterInterval) + defer timer.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-timer.C: + f.cancelReading() + return + } + } +} + +func (f *logFile) closeIfInactive(ctx unison.Canceler) { + // This can be made configureble if users need a more flexible + // cheking for inactive files. + ticker := time.NewTicker(5 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + age := time.Since(f.lastTimeRead) + if age > f.closeInactive { + f.cancelReading() + return + } + } + } +} + +// errorChecks determines the cause for EOF errors, and how the EOF event should be handled +// based on the config options. +func (f *logFile) errorChecks(err error) error { + if err != io.EOF { + f.log.Error("Unexpected state reading from %s; error: %s", f.file.Name(), err) + return err + } + + return f.handleEOF() +} + +func (f *logFile) handleEOF() error { + if f.closeOnEOF { + return io.EOF + } + + // Refetch fileinfo to check if the file was truncated. + // Errors if the file was removed/rotated after reading and before + // calling the stat function + info, statErr := f.file.Stat() + if statErr != nil { + f.log.Error("Unexpected error reading from %s; error: %s", f.file.Name(), statErr) + return statErr + } + + // check if file was truncated + if info.Size() < f.offset { + f.log.Debugf("File was truncated as offset (%d) > size (%d): %s", f.offset, info.Size(), f.file.Name()) + return ErrFileTruncate + } + + return nil +} + +// Close +func (f *logFile) Close() error { + f.cancelReading() + return f.file.Close() +} From 01dfa5e16eaccb2d650b89ddc5e724884f3e6c7f Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 14:15:28 +0100 Subject: [PATCH 049/156] [CI] changeset from #20603 was not added to CI2.0 (#21464) --- Jenkinsfile.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile.yml b/Jenkinsfile.yml index 2f720bf055b..2278ea93735 100644 --- a/Jenkinsfile.yml +++ b/Jenkinsfile.yml @@ -28,11 +28,13 @@ changeset: - "^\\.ci/scripts/.*" oss: - "^go.mod" + - "^pytest.ini" - "^dev-tools/.*" - "^libbeat/.*" - "^testing/.*" xpack: - "^go.mod" + - "^pytest.ini" - "^dev-tools/.*" - "^libbeat/.*" - "^testing/.*" From 35a76dfe2c3caa19969fde4484792355077b58e2 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 14:16:06 +0100 Subject: [PATCH 050/156] [CI] Change x-pack/auditbeat build events (comments, labels) (#21463) --- x-pack/auditbeat/Jenkinsfile.yml | 8 ++++---- x-pack/packetbeat/Jenkinsfile.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/x-pack/auditbeat/Jenkinsfile.yml b/x-pack/auditbeat/Jenkinsfile.yml index fd73c10a1c5..3bb96fbbc64 100644 --- a/x-pack/auditbeat/Jenkinsfile.yml +++ b/x-pack/auditbeat/Jenkinsfile.yml @@ -5,11 +5,11 @@ when: - "@ci" ## special token regarding the changeset for the ci - "@xpack" ## special token regarding the changeset for the xpack comments: ## when PR comment contains any of those entries - - "/test auditbeat" + - "/test x-pack/auditbeat" labels: ## when PR labels matches any of those entries - - "auditbeat" + - "x-pack-auditbeat" parameters: ## when parameter was selected in the UI. - - "auditbeat" + - "x-pack-auditbeat" tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: @@ -22,7 +22,7 @@ stages: - "macosx" when: ## Override the top-level when. comments: - - "/test auditbeat for macos" + - "/test x-pack/auditbeat for macos" labels: - "macOS" parameters: diff --git a/x-pack/packetbeat/Jenkinsfile.yml b/x-pack/packetbeat/Jenkinsfile.yml index 8496265e0ac..41257081e1f 100644 --- a/x-pack/packetbeat/Jenkinsfile.yml +++ b/x-pack/packetbeat/Jenkinsfile.yml @@ -1,15 +1,15 @@ when: branches: true ## for all the branches changeset: ## when PR contains any of those entries in the changeset - - "^x-pack/winlogbeat/.*" + - "^x-pack/packetbeat/.*" - "@ci" ## special token regarding the changeset for the ci - "@xpack" ## special token regarding the changeset for the xpack comments: ## when PR comment contains any of those entries - - "/test x-pack/winlogbeat" + - "/test x-pack/packetbeat" labels: ## when PR labels matches any of those entries - - "x-pack-winlogbeat" + - "x-pack-packetbeat" parameters: ## when parameter was selected in the UI. - - "x-pack-winlogbeat" + - "x-pack-packetbeat" tags: true ## for all the tags platform: "linux && ubuntu-18" ## default label for all the stages stages: From 39e144dd05fab2310e1c5f3a63c9cfe68e6bf2cf Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Fri, 2 Oct 2020 19:20:53 +0200 Subject: [PATCH 051/156] Fix format of debug messages in tlscommon (#21482) --- libbeat/common/transport/tlscommon/tls.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libbeat/common/transport/tlscommon/tls.go b/libbeat/common/transport/tlscommon/tls.go index 3616a9f07e4..ba44310727c 100644 --- a/libbeat/common/transport/tlscommon/tls.go +++ b/libbeat/common/transport/tlscommon/tls.go @@ -66,7 +66,7 @@ func LoadCertificate(config *CertificateConfig) (*tls.Certificate, error) { return nil, err } - log.Debugf("tls", "loading certificate: %v and key %v", certificate, key) + log.Debugf("Loading certificate: %v and key %v", certificate, key) return &cert, nil } @@ -169,7 +169,7 @@ func LoadCertificateAuthorities(CAs []string) (*x509.CertPool, []error) { errors = append(errors, fmt.Errorf("%v adding %v to the list of known CAs", ErrNotACertificate, r)) continue } - log.Debugf("tls", "successfully loaded CA certificate: %v", r) + log.Debugf("Successfully loaded CA certificate: %v", r) } return roots, errors From bcb8da063f4dfe68c6ce413a7e7494a7a429ab8e Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Fri, 2 Oct 2020 18:29:22 +0100 Subject: [PATCH 052/156] Revert "Revert "[JJBB] Set shallow cloning to 10 (#21409)" (#21447)" (#21467) This reverts commit 514809a13cd078be71c0bccac03dccc0cc81f0e9. --- .ci/jobs/apm-beats-update.yml | 2 +- .ci/jobs/beats-tester.yml | 2 +- .ci/jobs/beats-windows-mbp.yml | 2 +- .ci/jobs/beats.yml | 2 +- .ci/jobs/golang-crossbuild-mbp.yml | 2 +- .ci/jobs/packaging.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.ci/jobs/apm-beats-update.yml b/.ci/jobs/apm-beats-update.yml index 8bdc322f65a..2ae688ffab7 100644 --- a/.ci/jobs/apm-beats-update.yml +++ b/.ci/jobs/apm-beats-update.yml @@ -48,7 +48,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-tester.yml b/.ci/jobs/beats-tester.yml index 522abfa5e5c..808123a225e 100644 --- a/.ci/jobs/beats-tester.yml +++ b/.ci/jobs/beats-tester.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats-windows-mbp.yml b/.ci/jobs/beats-windows-mbp.yml index 64efa009979..7ea26c9ba18 100644 --- a/.ci/jobs/beats-windows-mbp.yml +++ b/.ci/jobs/beats-windows-mbp.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 4 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/beats.yml b/.ci/jobs/beats.yml index b075d8bbdf2..6f59a9bcdf8 100644 --- a/.ci/jobs/beats.yml +++ b/.ci/jobs/beats.yml @@ -46,7 +46,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/golang-crossbuild-mbp.yml b/.ci/jobs/golang-crossbuild-mbp.yml index 46303790610..45175d169f6 100644 --- a/.ci/jobs/golang-crossbuild-mbp.yml +++ b/.ci/jobs/golang-crossbuild-mbp.yml @@ -31,7 +31,7 @@ before: true prune: true shallow-clone: true - depth: 4 + depth: 10 do-not-fetch-tags: true submodule: disable: false diff --git a/.ci/jobs/packaging.yml b/.ci/jobs/packaging.yml index 0dce4d4672b..fd6fb9f90c6 100644 --- a/.ci/jobs/packaging.yml +++ b/.ci/jobs/packaging.yml @@ -44,7 +44,7 @@ before: true prune: true shallow-clone: true - depth: 3 + depth: 10 do-not-fetch-tags: true submodule: disable: false From b0236ee8afacb87e47a98ab075b2b189e5911ff1 Mon Sep 17 00:00:00 2001 From: Fae Charlton Date: Fri, 2 Oct 2020 16:30:06 -0400 Subject: [PATCH 053/156] [libbeat] Add configurable exponential backoff for disk queue write errors (#21493) --- libbeat/publisher/queue/diskqueue/config.go | 52 +++++++++++++++++-- .../publisher/queue/diskqueue/deleter_loop.go | 9 +++- libbeat/publisher/queue/diskqueue/segments.go | 9 +++- libbeat/publisher/queue/diskqueue/util.go | 22 ++++++-- .../publisher/queue/diskqueue/writer_loop.go | 28 ++++++++-- 5 files changed, 104 insertions(+), 16 deletions(-) diff --git a/libbeat/publisher/queue/diskqueue/config.go b/libbeat/publisher/queue/diskqueue/config.go index 6a165a665db..b8ef456d03d 100644 --- a/libbeat/publisher/queue/diskqueue/config.go +++ b/libbeat/publisher/queue/diskqueue/config.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "path/filepath" + "time" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/common/cfgtype" @@ -61,16 +62,26 @@ type Settings struct { // A listener that should be sent ACKs when an event is successfully // written to disk. WriteToDiskListener queue.ACKListener + + // RetryInterval specifies how long to wait before retrying a fatal error + // writing to disk. If MaxRetryInterval is nonzero, subsequent retries will + // use exponential backoff up to the specified limit. + RetryInterval time.Duration + MaxRetryInterval time.Duration } // userConfig holds the parameters for a disk queue that are configurable // by the end user in the beats yml file. type userConfig struct { - Path string `config:"path"` - MaxSize cfgtype.ByteSize `config:"max_size" validate:"required"` - SegmentSize *cfgtype.ByteSize `config:"segment_size"` - ReadAheadLimit *int `config:"read_ahead"` - WriteAheadLimit *int `config:"write_ahead"` + Path string `config:"path"` + MaxSize cfgtype.ByteSize `config:"max_size" validate:"required"` + SegmentSize *cfgtype.ByteSize `config:"segment_size"` + + ReadAheadLimit *int `config:"read_ahead"` + WriteAheadLimit *int `config:"write_ahead"` + + RetryInterval *time.Duration `config:"retry_interval" validate:"positive"` + MaxRetryInterval *time.Duration `config:"max_retry_interval" validate:"positive"` } func (c *userConfig) Validate() error { @@ -96,6 +107,13 @@ func (c *userConfig) Validate() error { "Disk queue segment_size (%d) cannot be less than 1MB", *c.SegmentSize) } + if c.RetryInterval != nil && c.MaxRetryInterval != nil && + *c.MaxRetryInterval < *c.RetryInterval { + return fmt.Errorf( + "Disk queue max_retry_interval (%v) can't be less than retry_interval (%v)", + *c.MaxRetryInterval, *c.RetryInterval) + } + return nil } @@ -108,6 +126,9 @@ func DefaultSettings() Settings { ReadAheadLimit: 512, WriteAheadLimit: 2048, + + RetryInterval: 1 * time.Second, + MaxRetryInterval: 30 * time.Second, } } @@ -137,6 +158,13 @@ func SettingsForUserConfig(config *common.Config) (Settings, error) { settings.WriteAheadLimit = *userConfig.WriteAheadLimit } + if userConfig.RetryInterval != nil { + settings.RetryInterval = *userConfig.RetryInterval + } + if userConfig.MaxRetryInterval != nil { + settings.MaxRetryInterval = *userConfig.RetryInterval + } + return settings, nil } @@ -164,3 +192,17 @@ func (settings Settings) segmentPath(segmentID segmentID) string { func (settings Settings) maxSegmentOffset() segmentOffset { return segmentOffset(settings.MaxSegmentSize - segmentHeaderSize) } + +// Given a retry interval, nextRetryInterval returns the next higher level +// of backoff. +func (settings Settings) nextRetryInterval( + currentInterval time.Duration, +) time.Duration { + if settings.MaxRetryInterval > 0 { + currentInterval *= 2 + if currentInterval > settings.MaxRetryInterval { + currentInterval = settings.MaxRetryInterval + } + } + return currentInterval +} diff --git a/libbeat/publisher/queue/diskqueue/deleter_loop.go b/libbeat/publisher/queue/diskqueue/deleter_loop.go index 4e685285948..3948d200cbc 100644 --- a/libbeat/publisher/queue/diskqueue/deleter_loop.go +++ b/libbeat/publisher/queue/diskqueue/deleter_loop.go @@ -57,6 +57,7 @@ func newDeleterLoop(settings Settings) *deleterLoop { } func (dl *deleterLoop) run() { + currentRetryInterval := dl.settings.RetryInterval for { request, ok := <-dl.requestChan if !ok { @@ -87,10 +88,14 @@ func (dl *deleterLoop) run() { // The delay can be interrupted if the request channel is closed, // indicating queue shutdown. select { - // TODO: make the retry interval configurable. - case <-time.After(time.Second): + case <-time.After(currentRetryInterval): case <-dl.requestChan: } + currentRetryInterval = + dl.settings.nextRetryInterval(currentRetryInterval) + } else { + // If we made progress, reset the retry interval. + currentRetryInterval = dl.settings.RetryInterval } dl.responseChan <- deleterLoopResponse{ results: results, diff --git a/libbeat/publisher/queue/diskqueue/segments.go b/libbeat/publisher/queue/diskqueue/segments.go index 5ce0dc49962..617b089110e 100644 --- a/libbeat/publisher/queue/diskqueue/segments.go +++ b/libbeat/publisher/queue/diskqueue/segments.go @@ -207,10 +207,15 @@ func (segment *queueSegment) getWriter( // retry callback returns true. This is used for timed retries when // creating a queue segment from the writer loop. func (segment *queueSegment) getWriterWithRetry( - queueSettings Settings, retry func(error) bool, + queueSettings Settings, retry func(err error, firstTime bool) bool, ) (*os.File, error) { + firstTime := true file, err := segment.getWriter(queueSettings) - for err != nil && retry(err) { + for err != nil && retry(err, firstTime) { + // Set firstTime to false so the retry callback can perform backoff + // etc if needed. + firstTime = false + // Try again file, err = segment.getWriter(queueSettings) } diff --git a/libbeat/publisher/queue/diskqueue/util.go b/libbeat/publisher/queue/diskqueue/util.go index 60c529a9992..c54a26154e8 100644 --- a/libbeat/publisher/queue/diskqueue/util.go +++ b/libbeat/publisher/queue/diskqueue/util.go @@ -69,16 +69,32 @@ func writeErrorIsRetriable(err error) bool { // "wrapped" field in-place as long as it isn't captured by the callback. type callbackRetryWriter struct { wrapped io.Writer - retry func(error) bool + + // The retry callback is called with the error that was produced and whether + // this is the first (subsequent) error arising from this particular + // write call. + retry func(err error, firstTime bool) bool } func (w callbackRetryWriter) Write(p []byte) (int, error) { + // firstTime tracks whether the current error is the first subsequent error + // being passed to the retry callback. This is so that the callback can + // reset its internal counters in case it is using exponential backoff or + // a retry limit. + firstTime := true bytesWritten := 0 writer := w.wrapped n, err := writer.Write(p) for n < len(p) { - if err != nil && !w.retry(err) { - return bytesWritten + n, err + if err != nil { + shouldRetry := w.retry(err, firstTime) + firstTime = false + if !shouldRetry { + return bytesWritten + n, err + } + } else { + // If we made progress without an error, reset firstTime. + firstTime = true } // Advance p and try again. bytesWritten += n diff --git a/libbeat/publisher/queue/diskqueue/writer_loop.go b/libbeat/publisher/queue/diskqueue/writer_loop.go index b42e4573cab..ff1ff97616a 100644 --- a/libbeat/publisher/queue/diskqueue/writer_loop.go +++ b/libbeat/publisher/queue/diskqueue/writer_loop.go @@ -82,6 +82,8 @@ type writerLoop struct { // The file handle corresponding to currentSegment. When currentSegment // changes, this handle is closed and a new one is created. outputFile *os.File + + currentRetryInterval time.Duration } func newWriterLoop(logger *logp.Logger, settings Settings) *writerLoop { @@ -91,6 +93,8 @@ func newWriterLoop(logger *logp.Logger, settings Settings) *writerLoop { requestChan: make(chan writerLoopRequest, 1), responseChan: make(chan writerLoopResponse), + + currentRetryInterval: settings.RetryInterval, } } @@ -215,14 +219,31 @@ outerLoop: return append(bytesWritten, curBytesWritten) } -// retryCallback is called (by way of retryCallbackWriter) when there is +func (wl *writerLoop) applyRetryBackoff() { + wl.currentRetryInterval = + wl.settings.nextRetryInterval(wl.currentRetryInterval) +} + +func (wl *writerLoop) resetRetryBackoff() { + wl.currentRetryInterval = wl.settings.RetryInterval +} + +// retryCallback is called (by way of callbackRetryWriter) when there is // an error writing to a segment file. It pauses for a configurable // interval and returns true if the operation should be retried (which // it always should, unless the queue is being closed). -func (wl *writerLoop) retryCallback(err error) bool { +func (wl *writerLoop) retryCallback(err error, firstTime bool) bool { + if firstTime { + // Reset any exponential backoff in the retry interval. + wl.resetRetryBackoff() + } if writeErrorIsRetriable(err) { return true } + // If this error isn't immediately retriable, increase the exponential + // backoff afterwards. + defer wl.applyRetryBackoff() + // If the error is not immediately retriable, log the error // and wait for the retry interval before trying again, but // abort if the queue is closed (indicated by the request channel @@ -230,8 +251,7 @@ func (wl *writerLoop) retryCallback(err error) bool { wl.logger.Errorf("Writing to segment %v: %v", wl.currentSegment.id, err) select { - case <-time.After(time.Second): - // TODO: use a configurable interval here + case <-time.After(wl.currentRetryInterval): return true case <-wl.requestChan: return false From 7e36f5c6b7507b4d124db561771d886dc0994b38 Mon Sep 17 00:00:00 2001 From: kaiyan-sheng Date: Fri, 2 Oct 2020 15:08:30 -0600 Subject: [PATCH 054/156] Migrate S3 Input to Filebeat Input V2 (#20005) *moving s3 input to v2 input API Co-authored-by: urso --- CHANGELOG.next.asciidoc | 1 + .../filebeat/input/default-inputs/inputs.go | 2 + x-pack/filebeat/input/s3/collector.go | 635 +++++++++++++++ .../s3/{input_test.go => collector_test.go} | 12 +- x-pack/filebeat/input/s3/config.go | 17 +- x-pack/filebeat/input/s3/input.go | 766 ++---------------- .../filebeat/input/s3/s3_integration_test.go | 302 ++----- 7 files changed, 797 insertions(+), 938 deletions(-) create mode 100644 x-pack/filebeat/input/s3/collector.go rename x-pack/filebeat/input/s3/{input_test.go => collector_test.go} (97%) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index a96a23db9d8..fb1fae91eb0 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -603,6 +603,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Always attempt community_id processor on zeek module {pull}21155[21155] - Add related.hosts ecs field to all modules {pull}21160[21160] - Keep cursor state between httpjson input restarts {pull}20751[20751] +- Convert aws s3 to v2 input {pull}20005[20005] *Heartbeat* diff --git a/x-pack/filebeat/input/default-inputs/inputs.go b/x-pack/filebeat/input/default-inputs/inputs.go index cd8562560da..4779b452f1d 100644 --- a/x-pack/filebeat/input/default-inputs/inputs.go +++ b/x-pack/filebeat/input/default-inputs/inputs.go @@ -14,6 +14,7 @@ import ( "github.com/elastic/beats/v7/x-pack/filebeat/input/http_endpoint" "github.com/elastic/beats/v7/x-pack/filebeat/input/httpjson" "github.com/elastic/beats/v7/x-pack/filebeat/input/o365audit" + "github.com/elastic/beats/v7/x-pack/filebeat/input/s3" ) func Init(info beat.Info, log *logp.Logger, store beater.StateStore) []v2.Plugin { @@ -29,5 +30,6 @@ func xpackInputs(info beat.Info, log *logp.Logger, store beater.StateStore) []v2 http_endpoint.Plugin(), httpjson.Plugin(log, store), o365audit.Plugin(log, store), + s3.Plugin(), } } diff --git a/x-pack/filebeat/input/s3/collector.go b/x-pack/filebeat/input/s3/collector.go new file mode 100644 index 00000000000..2976dd52a5b --- /dev/null +++ b/x-pack/filebeat/input/s3/collector.go @@ -0,0 +1,635 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package s3 + +import ( + "bufio" + "compress/gzip" + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "sync" + "time" + + awssdk "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws/awserr" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/s3iface" + "github.com/aws/aws-sdk-go-v2/service/sqs" + "github.com/aws/aws-sdk-go-v2/service/sqs/sqsiface" + + "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/go-concert/unison" +) + +type s3Collector struct { + cancellation context.Context + logger *logp.Logger + + config *config + visibilityTimeout int64 + + sqs sqsiface.ClientAPI + s3 s3iface.ClientAPI + publisher beat.Client +} + +type s3Info struct { + name string + key string + region string + arn string + expandEventListFromField string +} + +type bucket struct { + Name string `json:"name"` + Arn string `json:"arn"` +} + +type object struct { + Key string `json:"key"` +} + +type s3BucketObject struct { + bucket `json:"bucket"` + object `json:"object"` +} + +type sqsMessage struct { + Records []struct { + EventSource string `json:"eventSource"` + AwsRegion string `json:"awsRegion"` + EventName string `json:"eventName"` + S3 s3BucketObject `json:"s3"` + } `json:"Records"` +} + +type s3Context struct { + mux sync.Mutex + refs int + err error // first error witnessed or multi error + errC chan error +} + +var ( + // The maximum number of messages to return. Amazon SQS never returns more messages + // than this value (however, fewer messages might be returned). + maxNumberOfMessage uint8 = 10 + + // The duration (in seconds) for which the call waits for a message to arrive + // in the queue before returning. If a message is available, the call returns + // sooner than WaitTimeSeconds. If no messages are available and the wait time + // expires, the call returns successfully with an empty list of messages. + waitTimeSecond uint8 = 10 +) + +func (c *s3Collector) run() { + defer c.logger.Info("s3 input worker has stopped.") + c.logger.Info("s3 input worker has started.") + for c.cancellation.Err() == nil { + // receive messages from sqs + output, err := c.receiveMessage(c.sqs, c.visibilityTimeout) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { + continue + } + c.logger.Error("SQS ReceiveMessageRequest failed: ", err) + continue + } + + if output == nil || len(output.Messages) == 0 { + c.logger.Debug("no message received from SQS") + continue + } + + // process messages received from sqs, get logs from s3 and create events + c.processor(c.config.QueueURL, output.Messages, c.visibilityTimeout, c.s3, c.sqs) + } +} + +func (c *s3Collector) processor(queueURL string, messages []sqs.Message, visibilityTimeout int64, svcS3 s3iface.ClientAPI, svcSQS sqsiface.ClientAPI) { + var grp unison.MultiErrGroup + numMessages := len(messages) + c.logger.Debugf("Processing %v messages", numMessages) + + // process messages received from sqs + for i := range messages { + i := i + errC := make(chan error) + grp.Go(func() (err error) { + return c.processMessage(svcS3, messages[i], errC) + }) + grp.Go(func() (err error) { + return c.processorKeepAlive(svcSQS, messages[i], queueURL, visibilityTimeout, errC) + }) + } + grp.Wait() +} + +func (c *s3Collector) processMessage(svcS3 s3iface.ClientAPI, message sqs.Message, errC chan error) error { + s3Infos, err := c.handleSQSMessage(message) + if err != nil { + c.logger.Error(fmt.Errorf("handleSQSMessage failed: %w", err)) + return err + } + c.logger.Debugf("handleSQSMessage succeed and returned %v sets of S3 log info", len(s3Infos)) + + // read from s3 object and create event for each log line + err = c.handleS3Objects(svcS3, s3Infos, errC) + if err != nil { + err = fmt.Errorf("handleS3Objects failed: %w", err) + c.logger.Error(err) + return err + } + c.logger.Debugf("handleS3Objects succeed") + return nil +} + +func (c *s3Collector) processorKeepAlive(svcSQS sqsiface.ClientAPI, message sqs.Message, queueURL string, visibilityTimeout int64, errC chan error) error { + for { + select { + case <-c.cancellation.Done(): + return nil + case err := <-errC: + if err != nil { + c.logger.Warn("Processing message failed, updating visibility timeout") + err := c.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) + if err != nil { + c.logger.Error(fmt.Errorf("SQS ChangeMessageVisibilityRequest failed: %w", err)) + } + c.logger.Infof("Message visibility timeout updated to %v", visibilityTimeout) + } else { + // When ACK done, message will be deleted. Or when message is + // not s3 ObjectCreated event related(handleSQSMessage function + // failed), it will be removed as well. + c.logger.Debug("Deleting message from SQS: ", *message.MessageId) + // only delete sqs message when errC is closed with no error + err := c.deleteMessage(queueURL, *message.ReceiptHandle, svcSQS) + if err != nil { + c.logger.Error(fmt.Errorf("deleteMessages failed: %w", err)) + } + } + return err + case <-time.After(time.Duration(visibilityTimeout/2) * time.Second): + c.logger.Warn("Half of the set visibilityTimeout passed, visibility timeout needs to be updated") + // If half of the set visibilityTimeout passed and this is + // still ongoing, then change visibility timeout. + err := c.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) + if err != nil { + c.logger.Error(fmt.Errorf("SQS ChangeMessageVisibilityRequest failed: %w", err)) + } + c.logger.Infof("Message visibility timeout updated to %v seconds", visibilityTimeout) + return err + } + } +} + +func (c *s3Collector) receiveMessage(svcSQS sqsiface.ClientAPI, visibilityTimeout int64) (*sqs.ReceiveMessageResponse, error) { + // receive messages from sqs + req := svcSQS.ReceiveMessageRequest( + &sqs.ReceiveMessageInput{ + QueueUrl: &c.config.QueueURL, + MessageAttributeNames: []string{"All"}, + MaxNumberOfMessages: awssdk.Int64(int64(maxNumberOfMessage)), + VisibilityTimeout: &visibilityTimeout, + WaitTimeSeconds: awssdk.Int64(int64(waitTimeSecond)), + }) + + // The Context will interrupt the request if the timeout expires. + sendCtx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + return req.Send(sendCtx) +} + +func (c *s3Collector) changeVisibilityTimeout(queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI, receiptHandle *string) error { + req := svcSQS.ChangeMessageVisibilityRequest(&sqs.ChangeMessageVisibilityInput{ + QueueUrl: &queueURL, + VisibilityTimeout: &visibilityTimeout, + ReceiptHandle: receiptHandle, + }) + + // The Context will interrupt the request if the timeout expires. + sendCtx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + _, err := req.Send(sendCtx) + return err +} + +func getRegionFromQueueURL(queueURL string) (string, error) { + // get region from queueURL + // Example: https://sqs.us-east-1.amazonaws.com/627959692251/test-s3-logs + queueURLSplit := strings.Split(queueURL, ".") + if queueURLSplit[0] == "https://sqs" && queueURLSplit[2] == "amazonaws" { + return queueURLSplit[1], nil + } + return "", fmt.Errorf("queueURL is not in format: https://sqs.{REGION_ENDPOINT}.amazonaws.com/{ACCOUNT_NUMBER}/{QUEUE_NAME}") +} + +// handle message +func (c *s3Collector) handleSQSMessage(m sqs.Message) ([]s3Info, error) { + msg := sqsMessage{} + err := json.Unmarshal([]byte(*m.Body), &msg) + if err != nil { + return nil, fmt.Errorf("json unmarshal sqs message body failed: %w", err) + } + + var s3Infos []s3Info + for _, record := range msg.Records { + if record.EventSource != "aws:s3" || !strings.HasPrefix(record.EventName, "ObjectCreated:") { + return nil, fmt.Errorf("this SQS queue should be dedicated to s3 ObjectCreated event notifications") + } + // Unescape substrings from s3 log name. For example, convert "%3D" back to "=" + filename, err := url.QueryUnescape(record.S3.object.Key) + if err != nil { + return nil, fmt.Errorf("url.QueryUnescape failed for '%s': %w", record.S3.object.Key, err) + } + + if len(c.config.FileSelectors) == 0 { + s3Infos = append(s3Infos, s3Info{ + region: record.AwsRegion, + name: record.S3.bucket.Name, + key: filename, + arn: record.S3.bucket.Arn, + expandEventListFromField: c.config.ExpandEventListFromField, + }) + continue + } + + for _, fs := range c.config.FileSelectors { + if fs.Regex == nil { + continue + } + if fs.Regex.MatchString(filename) { + s3Infos = append(s3Infos, s3Info{ + region: record.AwsRegion, + name: record.S3.bucket.Name, + key: filename, + arn: record.S3.bucket.Arn, + expandEventListFromField: fs.ExpandEventListFromField, + }) + break + } + } + } + return s3Infos, nil +} + +func (c *s3Collector) handleS3Objects(svc s3iface.ClientAPI, s3Infos []s3Info, errC chan error) error { + s3Ctx := &s3Context{ + refs: 1, + errC: errC, + } + defer s3Ctx.done() + + for _, info := range s3Infos { + c.logger.Debugf("Processing file from s3 bucket \"%s\" with name \"%s\"", info.name, info.key) + err := c.createEventsFromS3Info(svc, info, s3Ctx) + if err != nil { + err = fmt.Errorf("createEventsFromS3Info failed processing file from s3 bucket \"%s\" with name \"%s\": %w", info.name, info.key, err) + c.logger.Error(err) + s3Ctx.setError(err) + } + } + return nil +} + +func (c *s3Collector) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, s3Ctx *s3Context) error { + objectHash := s3ObjectHash(info) + + // Download the S3 object using GetObjectRequest. + s3GetObjectInput := &s3.GetObjectInput{ + Bucket: awssdk.String(info.name), + Key: awssdk.String(info.key), + } + req := svc.GetObjectRequest(s3GetObjectInput) + + // The Context will interrupt the request if the timeout expires. + ctx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + resp, err := req.Send(ctx) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok { + // If the SDK can determine the request or retry delay was canceled + // by a context the ErrCodeRequestCanceled error will be returned. + if awsErr.Code() == awssdk.ErrCodeRequestCanceled { + err = fmt.Errorf("s3 GetObjectRequest canceled for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + c.logger.Error(err) + return err + } + + if awsErr.Code() == "NoSuchKey" { + c.logger.Warnf("Cannot find s3 file '%s' from S3 bucket '%s'", info.key, info.name) + return nil + } + } + return fmt.Errorf("s3 GetObjectRequest failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + } + + defer resp.Body.Close() + + reader := bufio.NewReader(resp.Body) + + isS3ObjGzipped, err := isStreamGzipped(reader) + if err != nil { + err = fmt.Errorf("could not determine if S3 object is gzipped: %w", err) + c.logger.Error(err) + return err + } + + if isS3ObjGzipped { + gzipReader, err := gzip.NewReader(reader) + if err != nil { + err = fmt.Errorf("gzip.NewReader failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + c.logger.Error(err) + return err + } + reader = bufio.NewReader(gzipReader) + gzipReader.Close() + } + + // Decode JSON documents when content-type is "application/json" or expand_event_list_from_field is given in config + if resp.ContentType != nil && *resp.ContentType == "application/json" || info.expandEventListFromField != "" { + decoder := json.NewDecoder(reader) + err := c.decodeJSON(decoder, objectHash, info, s3Ctx) + if err != nil { + err = fmt.Errorf("decodeJSONWithKey failed for '%s' from S3 bucket '%s': %w", info.key, info.name, err) + c.logger.Error(err) + return err + } + return nil + } + + // handle s3 objects that are not json content-type + offset := 0 + for { + log, err := readStringAndTrimDelimiter(reader) + if err == io.EOF { + // create event for last line + offset += len([]byte(log)) + event := createEvent(log, offset, info, objectHash, s3Ctx) + err = c.forwardEvent(event) + if err != nil { + err = fmt.Errorf("forwardEvent failed: %w", err) + c.logger.Error(err) + return err + } + return nil + } else if err != nil { + err = fmt.Errorf("readStringAndTrimDelimiter failed: %w", err) + c.logger.Error(err) + return err + } + + if log == "" { + break + } + + // create event per log line + offset += len([]byte(log)) + event := createEvent(log, offset, info, objectHash, s3Ctx) + err = c.forwardEvent(event) + if err != nil { + err = fmt.Errorf("forwardEvent failed: %w", err) + c.logger.Error(err) + return err + } + } + return nil +} + +func (c *s3Collector) decodeJSON(decoder *json.Decoder, objectHash string, s3Info s3Info, s3Ctx *s3Context) error { + offset := 0 + for { + var jsonFields interface{} + err := decoder.Decode(&jsonFields) + if jsonFields == nil { + return nil + } + + if err == io.EOF { + offsetNew, err := c.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) + if err != nil { + return err + } + offset = offsetNew + } else if err != nil { + // decode json failed, skip this log file + err = fmt.Errorf("decode json failed for '%s' from S3 bucket '%s', skipping this file: %w", s3Info.key, s3Info.name, err) + c.logger.Warn(err) + return nil + } + + offset, err = c.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) + if err != nil { + return err + } + } +} + +func (c *s3Collector) jsonFieldsType(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { + switch f := jsonFields.(type) { + case map[string][]interface{}: + if s3Info.expandEventListFromField != "" { + textValues, ok := f[s3Info.expandEventListFromField] + if !ok { + err := fmt.Errorf("key '%s' not found", s3Info.expandEventListFromField) + c.logger.Error(err) + return offset, err + } + for _, v := range textValues { + offset, err := c.convertJSONToEvent(v, offset, objectHash, s3Info, s3Ctx) + if err != nil { + err = fmt.Errorf("convertJSONToEvent failed for '%s' from S3 bucket '%s': %w", s3Info.key, s3Info.name, err) + c.logger.Error(err) + return offset, err + } + } + return offset, nil + } + case map[string]interface{}: + if s3Info.expandEventListFromField != "" { + textValues, ok := f[s3Info.expandEventListFromField] + if !ok { + err := fmt.Errorf("key '%s' not found", s3Info.expandEventListFromField) + c.logger.Error(err) + return offset, err + } + + valuesConverted := textValues.([]interface{}) + for _, textValue := range valuesConverted { + offsetNew, err := c.convertJSONToEvent(textValue, offset, objectHash, s3Info, s3Ctx) + if err != nil { + err = fmt.Errorf("convertJSONToEvent failed for '%s' from S3 bucket '%s': %w", s3Info.key, s3Info.name, err) + c.logger.Error(err) + return offset, err + } + offset = offsetNew + } + return offset, nil + } + + offset, err := c.convertJSONToEvent(f, offset, objectHash, s3Info, s3Ctx) + if err != nil { + err = fmt.Errorf("convertJSONToEvent failed for '%s' from S3 bucket '%s': %w", s3Info.key, s3Info.name, err) + c.logger.Error(err) + return offset, err + } + return offset, nil + } + return offset, nil +} + +func (c *s3Collector) convertJSONToEvent(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { + vJSON, _ := json.Marshal(jsonFields) + logOriginal := string(vJSON) + log := trimLogDelimiter(logOriginal) + offset += len([]byte(log)) + event := createEvent(log, offset, s3Info, objectHash, s3Ctx) + + err := c.forwardEvent(event) + if err != nil { + err = fmt.Errorf("forwardEvent failed: %w", err) + c.logger.Error(err) + return offset, err + } + return offset, nil +} + +func (c *s3Collector) forwardEvent(event beat.Event) error { + c.publisher.Publish(event) + return c.cancellation.Err() +} + +func (c *s3Collector) deleteMessage(queueURL string, messagesReceiptHandle string, svcSQS sqsiface.ClientAPI) error { + deleteMessageInput := &sqs.DeleteMessageInput{ + QueueUrl: awssdk.String(queueURL), + ReceiptHandle: awssdk.String(messagesReceiptHandle), + } + + req := svcSQS.DeleteMessageRequest(deleteMessageInput) + + // The Context will interrupt the request if the timeout expires. + ctx, cancelFn := context.WithTimeout(c.cancellation, c.config.APITimeout) + defer cancelFn() + + _, err := req.Send(ctx) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { + return nil + } + return fmt.Errorf("SQS DeleteMessageRequest failed: %w", err) + } + return nil +} + +func trimLogDelimiter(log string) string { + return strings.TrimSuffix(log, "\n") +} + +func readStringAndTrimDelimiter(reader *bufio.Reader) (string, error) { + logOriginal, err := reader.ReadString('\n') + if err != nil { + return logOriginal, err + } + return trimLogDelimiter(logOriginal), nil +} + +func createEvent(log string, offset int, info s3Info, objectHash string, s3Ctx *s3Context) beat.Event { + s3Ctx.Inc() + + event := beat.Event{ + Timestamp: time.Now().UTC(), + Fields: common.MapStr{ + "message": log, + "log": common.MapStr{ + "offset": int64(offset), + "file.path": constructObjectURL(info), + }, + "aws": common.MapStr{ + "s3": common.MapStr{ + "bucket": common.MapStr{ + "name": info.name, + "arn": info.arn}, + "object.key": info.key, + }, + }, + "cloud": common.MapStr{ + "provider": "aws", + "region": info.region, + }, + }, + Private: s3Ctx, + } + event.SetID(objectHash + "-" + fmt.Sprintf("%012d", offset)) + + return event +} + +func constructObjectURL(info s3Info) string { + return "https://" + info.name + ".s3-" + info.region + ".amazonaws.com/" + info.key +} + +// s3ObjectHash returns a short sha256 hash of the bucket arn + object key name. +func s3ObjectHash(s3Info s3Info) string { + h := sha256.New() + h.Write([]byte(s3Info.arn + s3Info.key)) + prefix := hex.EncodeToString(h.Sum(nil)) + return prefix[:10] +} + +func (c *s3Context) setError(err error) { + // only care about the last error for now + // TODO: add "Typed" error to error for context + c.mux.Lock() + defer c.mux.Unlock() + c.err = err +} + +func (c *s3Context) done() { + c.mux.Lock() + defer c.mux.Unlock() + c.refs-- + if c.refs == 0 { + c.errC <- c.err + close(c.errC) + } +} + +func (c *s3Context) Inc() { + c.mux.Lock() + defer c.mux.Unlock() + c.refs++ +} + +// isStreamGzipped determines whether the given stream of bytes (encapsulated in a buffered reader) +// represents gzipped content or not. A buffered reader is used so the function can peek into the byte +// stream without consuming it. This makes it convenient for code executed after this function call +// to consume the stream if it wants. +func isStreamGzipped(r *bufio.Reader) (bool, error) { + // Why 512? See https://godoc.org/net/http#DetectContentType + buf, err := r.Peek(512) + if err != nil && err != io.EOF { + return false, err + } + + switch http.DetectContentType(buf) { + case "application/x-gzip", "application/zip": + return true, nil + default: + return false, nil + } +} diff --git a/x-pack/filebeat/input/s3/input_test.go b/x-pack/filebeat/input/s3/collector_test.go similarity index 97% rename from x-pack/filebeat/input/s3/input_test.go rename to x-pack/filebeat/input/s3/collector_test.go index d1fab05cb3c..510f94d40d5 100644 --- a/x-pack/filebeat/input/s3/input_test.go +++ b/x-pack/filebeat/input/s3/collector_test.go @@ -120,7 +120,7 @@ func TestHandleMessage(t *testing.T) { }, } - p := &s3Input{context: &channelContext{}} + p := &s3Collector{config: &config{}} for _, c := range casesPositive { t.Run(c.title, func(t *testing.T) { s3Info, err := p.handleSQSMessage(c.message) @@ -165,7 +165,8 @@ func TestHandleMessage(t *testing.T) { } func TestNewS3BucketReader(t *testing.T) { - p := &s3Input{context: &channelContext{}} + config := defaultConfig() + p := &s3Collector{cancellation: context.TODO(), config: &config} s3GetObjectInput := &s3.GetObjectInput{ Bucket: awssdk.String(info.name), Key: awssdk.String(info.key), @@ -174,7 +175,7 @@ func TestNewS3BucketReader(t *testing.T) { // The Context will interrupt the request if the timeout expires. var cancelFn func() - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) + ctx, cancelFn := context.WithTimeout(p.cancellation, p.config.APITimeout) defer cancelFn() resp, err := req.Send(ctx) @@ -201,7 +202,8 @@ func TestNewS3BucketReader(t *testing.T) { } func TestCreateEvent(t *testing.T) { - p := &s3Input{context: &channelContext{}} + config := defaultConfig() + p := &s3Collector{cancellation: context.TODO(), config: &config} errC := make(chan error) s3Context := &s3Context{ refs: 1, @@ -225,7 +227,7 @@ func TestCreateEvent(t *testing.T) { // The Context will interrupt the request if the timeout expires. var cancelFn func() - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) + ctx, cancelFn := context.WithTimeout(p.cancellation, p.config.APITimeout) defer cancelFn() resp, err := req.Send(ctx) diff --git a/x-pack/filebeat/input/s3/config.go b/x-pack/filebeat/input/s3/config.go index f9780d82277..5f37a436d12 100644 --- a/x-pack/filebeat/input/s3/config.go +++ b/x-pack/filebeat/input/s3/config.go @@ -9,18 +9,16 @@ import ( "regexp" "time" - "github.com/elastic/beats/v7/filebeat/harvester" awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" ) type config struct { - harvester.ForwarderConfig `config:",inline"` - QueueURL string `config:"queue_url" validate:"nonzero,required"` - VisibilityTimeout time.Duration `config:"visibility_timeout"` - AwsConfig awscommon.ConfigAWS `config:",inline"` - ExpandEventListFromField string `config:"expand_event_list_from_field"` - APITimeout time.Duration `config:"api_timeout"` - FileSelectors []FileSelectorCfg `config:"file_selectors"` + QueueURL string `config:"queue_url" validate:"nonzero,required"` + VisibilityTimeout time.Duration `config:"visibility_timeout"` + AwsConfig awscommon.ConfigAWS `config:",inline"` + ExpandEventListFromField string `config:"expand_event_list_from_field"` + APITimeout time.Duration `config:"api_timeout"` + FileSelectors []FileSelectorCfg `config:"file_selectors"` } // FileSelectorCfg defines type and configuration of FileSelectors @@ -32,9 +30,6 @@ type FileSelectorCfg struct { func defaultConfig() config { return config{ - ForwarderConfig: harvester.ForwarderConfig{ - Type: "s3", - }, VisibilityTimeout: 300 * time.Second, APITimeout: 120 * time.Second, } diff --git a/x-pack/filebeat/input/s3/input.go b/x-pack/filebeat/input/s3/input.go index 83dc48428ee..a6b56d03970 100644 --- a/x-pack/filebeat/input/s3/input.go +++ b/x-pack/filebeat/input/s3/input.go @@ -5,748 +5,120 @@ package s3 import ( - "bufio" - "compress/gzip" - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" "fmt" - "io" - "net/http" - "net/url" - "strings" - "sync" - "time" - awssdk "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/aws/awserr" "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go-v2/service/s3/s3iface" "github.com/aws/aws-sdk-go-v2/service/sqs" - "github.com/aws/aws-sdk-go-v2/service/sqs/sqsiface" - "github.com/pkg/errors" - "github.com/elastic/beats/v7/filebeat/channel" - "github.com/elastic/beats/v7/filebeat/input" + v2 "github.com/elastic/beats/v7/filebeat/input/v2" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/common/acker" - "github.com/elastic/beats/v7/libbeat/common/cfgwarn" - "github.com/elastic/beats/v7/libbeat/logp" + "github.com/elastic/beats/v7/libbeat/feature" awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" + "github.com/elastic/go-concert/ctxtool" ) const inputName = "s3" -var ( - // The maximum number of messages to return. Amazon SQS never returns more messages - // than this value (however, fewer messages might be returned). - maxNumberOfMessage int64 = 10 - - // The duration (in seconds) for which the call waits for a message to arrive - // in the queue before returning. If a message is available, the call returns - // sooner than WaitTimeSeconds. If no messages are available and the wait time - // expires, the call returns successfully with an empty list of messages. - waitTimeSecond int64 = 10 - - errOutletClosed = errors.New("input outlet closed") -) - -func init() { - err := input.Register(inputName, NewInput) - if err != nil { - panic(err) +func Plugin() v2.Plugin { + return v2.Plugin{ + Name: inputName, + Stability: feature.Beta, + Deprecated: false, + Info: "Collect logs from s3", + Manager: v2.ConfigureWith(configure), } } -// s3Input is a input for s3 -type s3Input struct { - outlet channel.Outleter // Output of received s3 logs. - config config - awsConfig awssdk.Config - logger *logp.Logger - close chan struct{} - workerOnce sync.Once // Guarantees that the worker goroutine is only started once. - context *channelContext - workerWg sync.WaitGroup // Waits on s3 worker goroutine. - stopOnce sync.Once -} - -type s3Info struct { - name string - key string - region string - arn string - expandEventListFromField string -} - -type bucket struct { - Name string `json:"name"` - Arn string `json:"arn"` -} - -type object struct { - Key string `json:"key"` -} - -type s3BucketObject struct { - bucket `json:"bucket"` - object `json:"object"` -} - -type sqsMessage struct { - Records []struct { - EventSource string `json:"eventSource"` - AwsRegion string `json:"awsRegion"` - EventName string `json:"eventName"` - S3 s3BucketObject `json:"s3"` - } `json:"Records"` -} - -type s3Context struct { - mux sync.Mutex - refs int - err error // first error witnessed or multi error - errC chan error -} - -// channelContext implements context.Context by wrapping a channel -type channelContext struct { - done <-chan struct{} -} - -func (c *channelContext) Deadline() (time.Time, bool) { return time.Time{}, false } -func (c *channelContext) Done() <-chan struct{} { return c.done } -func (c *channelContext) Err() error { - select { - case <-c.done: - return context.Canceled - default: - return nil - } -} -func (c *channelContext) Value(key interface{}) interface{} { return nil } - -// NewInput creates a new s3 input -func NewInput(cfg *common.Config, connector channel.Connector, context input.Context) (input.Input, error) { - cfgwarn.Beta("s3 input type is used") - logger := logp.NewLogger(inputName) - +func configure(cfg *common.Config) (v2.Input, error) { config := defaultConfig() if err := cfg.Unpack(&config); err != nil { - return nil, errors.Wrap(err, "failed unpacking config") - } - - out, err := connector.ConnectWith(cfg, beat.ClientConfig{ - ACKHandler: acker.ConnectionOnly( - acker.EventPrivateReporter(func(_ int, privates []interface{}) { - for _, private := range privates { - if s3Context, ok := private.(*s3Context); ok { - s3Context.done() - } - } - }), - ), - }) - if err != nil { return nil, err } - awsConfig, err := awscommon.GetAWSCredentials(config.AwsConfig) - if err != nil { - return nil, errors.Wrap(err, "getAWSCredentials failed") - } - - closeChannel := make(chan struct{}) - p := &s3Input{ - outlet: out, - config: config, - awsConfig: awsConfig, - logger: logger, - close: closeChannel, - context: &channelContext{closeChannel}, - } - return p, nil -} - -// Run runs the input -func (p *s3Input) Run() { - p.workerOnce.Do(func() { - visibilityTimeout := int64(p.config.VisibilityTimeout.Seconds()) - p.logger.Infof("visibility timeout is set to %v seconds", visibilityTimeout) - p.logger.Infof("aws api timeout is set to %v", p.config.APITimeout) - - regionName, err := getRegionFromQueueURL(p.config.QueueURL) - if err != nil { - p.logger.Errorf("failed to get region name from queueURL: %v", p.config.QueueURL) - } - - awsConfig := p.awsConfig.Copy() - awsConfig.Region = regionName - - svcSQS := sqs.New(awscommon.EnrichAWSConfigWithEndpoint(p.config.AwsConfig.Endpoint, "sqs", regionName, awsConfig)) - svcS3 := s3.New(awscommon.EnrichAWSConfigWithEndpoint(p.config.AwsConfig.Endpoint, "s3", regionName, awsConfig)) - - p.workerWg.Add(1) - go p.run(svcSQS, svcS3, visibilityTimeout) - }) -} - -func (p *s3Input) run(svcSQS sqsiface.ClientAPI, svcS3 s3iface.ClientAPI, visibilityTimeout int64) { - defer p.workerWg.Done() - defer p.logger.Infof("s3 input worker for '%v' has stopped.", p.config.QueueURL) - - p.logger.Infof("s3 input worker has started. with queueURL: %v", p.config.QueueURL) - for p.context.Err() == nil { - // receive messages from sqs - output, err := p.receiveMessage(svcSQS, visibilityTimeout) - if err != nil { - if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { - continue - } - p.logger.Error("SQS ReceiveMessageRequest failed: ", err) - time.Sleep(time.Duration(waitTimeSecond) * time.Second) - continue - } - - if output == nil || len(output.Messages) == 0 { - p.logger.Debug("no message received from SQS:", p.config.QueueURL) - continue - } - - // process messages received from sqs, get logs from s3 and create events - p.processor(p.config.QueueURL, output.Messages, visibilityTimeout, svcS3, svcSQS) - } -} - -// Stop stops the s3 input -func (p *s3Input) Stop() { - p.stopOnce.Do(func() { - defer p.outlet.Close() - close(p.close) - p.logger.Info("Stopping s3 input") - }) -} - -// Wait stops the s3 input. -func (p *s3Input) Wait() { - p.Stop() - p.workerWg.Wait() -} - -func (p *s3Input) processor(queueURL string, messages []sqs.Message, visibilityTimeout int64, svcS3 s3iface.ClientAPI, svcSQS sqsiface.ClientAPI) { - var wg sync.WaitGroup - numMessages := len(messages) - p.logger.Debugf("Processing %v messages", numMessages) - wg.Add(numMessages * 2) - - // process messages received from sqs - for i := range messages { - errC := make(chan error) - go p.processMessage(svcS3, messages[i], &wg, errC) - go p.processorKeepAlive(svcSQS, messages[i], queueURL, visibilityTimeout, &wg, errC) - } - wg.Wait() + return newInput(config) } -func (p *s3Input) processMessage(svcS3 s3iface.ClientAPI, message sqs.Message, wg *sync.WaitGroup, errC chan error) { - defer wg.Done() - - s3Infos, err := p.handleSQSMessage(message) - if err != nil { - p.logger.Error(errors.Wrap(err, "handleSQSMessage failed")) - return - } - p.logger.Debugf("handleSQSMessage succeed and returned %v sets of S3 log info", len(s3Infos)) - - // read from s3 object and create event for each log line - err = p.handleS3Objects(svcS3, s3Infos, errC) - if err != nil { - err = errors.Wrap(err, "handleS3Objects failed") - p.logger.Error(err) - return - } - p.logger.Debugf("handleS3Objects succeed") -} - -func (p *s3Input) processorKeepAlive(svcSQS sqsiface.ClientAPI, message sqs.Message, queueURL string, visibilityTimeout int64, wg *sync.WaitGroup, errC chan error) { - defer wg.Done() - for { - select { - case <-p.close: - return - case err := <-errC: - if err != nil { - p.logger.Warn("Processing message failed, updating visibility timeout") - err := p.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) - if err != nil { - p.logger.Error(errors.Wrap(err, "SQS ChangeMessageVisibilityRequest failed")) - } - p.logger.Infof("Message visibility timeout updated to %v", visibilityTimeout) - } else { - // When ACK done, message will be deleted. Or when message is - // not s3 ObjectCreated event related(handleSQSMessage function - // failed), it will be removed as well. - p.logger.Debug("Deleting message from SQS: ", *message.MessageId) - // only delete sqs message when errC is closed with no error - err := p.deleteMessage(queueURL, *message.ReceiptHandle, svcSQS) - if err != nil { - p.logger.Error(errors.Wrap(err, "deleteMessages failed")) - } - } - return - case <-time.After(time.Duration(visibilityTimeout/2) * time.Second): - p.logger.Warn("Half of the set visibilityTimeout passed, visibility timeout needs to be updated") - // If half of the set visibilityTimeout passed and this is - // still ongoing, then change visibility timeout. - err := p.changeVisibilityTimeout(queueURL, visibilityTimeout, svcSQS, message.ReceiptHandle) - if err != nil { - p.logger.Error(errors.Wrap(err, "SQS ChangeMessageVisibilityRequest failed")) - } - p.logger.Infof("Message visibility timeout updated to %v seconds", visibilityTimeout) - } - } -} - -func (p *s3Input) receiveMessage(svcSQS sqsiface.ClientAPI, visibilityTimeout int64) (*sqs.ReceiveMessageResponse, error) { - // receive messages from sqs - req := svcSQS.ReceiveMessageRequest( - &sqs.ReceiveMessageInput{ - QueueUrl: &p.config.QueueURL, - MessageAttributeNames: []string{"All"}, - MaxNumberOfMessages: &maxNumberOfMessage, - VisibilityTimeout: &visibilityTimeout, - WaitTimeSeconds: &waitTimeSecond, - }) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - return req.Send(ctx) +// s3Input is a input for s3 +type s3Input struct { + config config } -func (p *s3Input) changeVisibilityTimeout(queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI, receiptHandle *string) error { - req := svcSQS.ChangeMessageVisibilityRequest(&sqs.ChangeMessageVisibilityInput{ - QueueUrl: &queueURL, - VisibilityTimeout: &visibilityTimeout, - ReceiptHandle: receiptHandle, - }) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - _, err := req.Send(ctx) - return err +func newInput(config config) (*s3Input, error) { + return &s3Input{config: config}, nil } -func getRegionFromQueueURL(queueURL string) (string, error) { - // get region from queueURL - // Example: https://sqs.us-east-1.amazonaws.com/627959692251/test-s3-logs - queueURLSplit := strings.Split(queueURL, ".") - if queueURLSplit[0] == "https://sqs" && queueURLSplit[2] == "amazonaws" { - return queueURLSplit[1], nil - } - return "", errors.New("queueURL is not in format: https://sqs.{REGION_ENDPOINT}.amazonaws.com/{ACCOUNT_NUMBER}/{QUEUE_NAME}") -} +func (in *s3Input) Name() string { return inputName } -// handle message -func (p *s3Input) handleSQSMessage(m sqs.Message) ([]s3Info, error) { - msg := sqsMessage{} - err := json.Unmarshal([]byte(*m.Body), &msg) +func (in *s3Input) Test(ctx v2.TestContext) error { + _, err := awscommon.GetAWSCredentials(in.config.AwsConfig) if err != nil { - return nil, errors.Wrap(err, "json unmarshal sqs message body failed") - } - - var s3Infos []s3Info - for _, record := range msg.Records { - if record.EventSource != "aws:s3" || !strings.HasPrefix(record.EventName, "ObjectCreated:") { - return nil, errors.New("this SQS queue should be dedicated to s3 ObjectCreated event notifications") - } - // Unescape substrings from s3 log name. For example, convert "%3D" back to "=" - filename, err := url.QueryUnescape(record.S3.object.Key) - if err != nil { - return nil, errors.Wrapf(err, "url.QueryUnescape failed for '%s'", record.S3.object.Key) - } - - if len(p.config.FileSelectors) == 0 { - s3Infos = append(s3Infos, s3Info{ - region: record.AwsRegion, - name: record.S3.bucket.Name, - key: filename, - arn: record.S3.bucket.Arn, - expandEventListFromField: p.config.ExpandEventListFromField, - }) - continue - } - - for _, fs := range p.config.FileSelectors { - if fs.Regex == nil { - continue - } - if fs.Regex.MatchString(filename) { - s3Infos = append(s3Infos, s3Info{ - region: record.AwsRegion, - name: record.S3.bucket.Name, - key: filename, - arn: record.S3.bucket.Arn, - expandEventListFromField: fs.ExpandEventListFromField, - }) - break - } - } - } - return s3Infos, nil -} - -func (p *s3Input) handleS3Objects(svc s3iface.ClientAPI, s3Infos []s3Info, errC chan error) error { - s3Ctx := &s3Context{ - refs: 1, - errC: errC, - } - defer s3Ctx.done() - - for _, info := range s3Infos { - p.logger.Debugf("Processing file from s3 bucket \"%s\" with name \"%s\"", info.name, info.key) - err := p.createEventsFromS3Info(svc, info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "createEventsFromS3Info failed processing file from s3 bucket \"%s\" with name \"%s\"", info.name, info.key) - p.logger.Error(err) - s3Ctx.setError(err) - } + return fmt.Errorf("getAWSCredentials failed: %w", err) } return nil } -func (p *s3Input) createEventsFromS3Info(svc s3iface.ClientAPI, info s3Info, s3Ctx *s3Context) error { - objectHash := s3ObjectHash(info) - - // Download the S3 object using GetObjectRequest. - s3GetObjectInput := &s3.GetObjectInput{ - Bucket: awssdk.String(info.name), - Key: awssdk.String(info.key), - } - req := svc.GetObjectRequest(s3GetObjectInput) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - resp, err := req.Send(ctx) +func (in *s3Input) Run(ctx v2.Context, pipeline beat.Pipeline) error { + collector, err := in.createCollector(ctx, pipeline) if err != nil { - if awsErr, ok := err.(awserr.Error); ok { - // If the SDK can determine the request or retry delay was canceled - // by a context the ErrCodeRequestCanceled error will be returned. - if awsErr.Code() == awssdk.ErrCodeRequestCanceled { - err = errors.Wrapf(err, "S3 GetObjectRequest canceled for '%s' from S3 bucket '%s'", info.key, info.name) - p.logger.Error(err) - return err - } - - if awsErr.Code() == "NoSuchKey" { - p.logger.Warnf("Cannot find s3 file '%s' from S3 bucket '%s'", info.key, info.name) - return nil - } - } - return errors.Wrapf(err, "S3 GetObjectRequest failed for '%s' from S3 bucket '%s'", info.key, info.name) - } - - defer resp.Body.Close() - - reader := bufio.NewReader(resp.Body) - - isS3ObjGzipped, err := isStreamGzipped(reader) - if err != nil { - err = errors.Wrap(err, "could not determine if S3 object is gzipped") - p.logger.Error(err) return err } - if isS3ObjGzipped { - gzipReader, err := gzip.NewReader(reader) - if err != nil { - err = errors.Wrapf(err, "gzip.NewReader failed for '%s' from S3 bucket '%s'", info.key, info.name) - p.logger.Error(err) - return err - } - reader = bufio.NewReader(gzipReader) - gzipReader.Close() - } - - // Decode JSON documents when content-type is "application/json" or expand_event_list_from_field is given in config - if resp.ContentType != nil && *resp.ContentType == "application/json" || info.expandEventListFromField != "" { - decoder := json.NewDecoder(reader) - err := p.decodeJSON(decoder, objectHash, info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "decodeJSONWithKey failed for '%s' from S3 bucket '%s'", info.key, info.name) - p.logger.Error(err) - return err - } - return nil - } - - // handle s3 objects that are not json content-type - offset := 0 - for { - log, err := readStringAndTrimDelimiter(reader) - if err == io.EOF { - // create event for last line - offset += len([]byte(log)) - event := createEvent(log, offset, info, objectHash, s3Ctx) - err = p.forwardEvent(event) - if err != nil { - err = errors.Wrap(err, "forwardEvent failed") - p.logger.Error(err) - return err - } - return nil - } else if err != nil { - err = errors.Wrap(err, "readStringAndTrimDelimiter failed") - p.logger.Error(err) - return err - } - - if log == "" { - break - } - - // create event per log line - offset += len([]byte(log)) - event := createEvent(log, offset, info, objectHash, s3Ctx) - err = p.forwardEvent(event) - if err != nil { - err = errors.Wrap(err, "forwardEvent failed") - p.logger.Error(err) - return err - } - } - return nil -} - -func (p *s3Input) decodeJSON(decoder *json.Decoder, objectHash string, s3Info s3Info, s3Ctx *s3Context) error { - offset := 0 - for { - var jsonFields interface{} - err := decoder.Decode(&jsonFields) - if jsonFields == nil { - return nil - } - - if err == io.EOF { - offset, err = p.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) - if err != nil { - return err - } - } else if err != nil { - // decode json failed, skip this log file - err = errors.Wrapf(err, "decode json failed for '%s' from S3 bucket '%s', skipping this file", s3Info.key, s3Info.name) - p.logger.Warn(err) - return nil - } - - offsetNew, err := p.jsonFieldsType(jsonFields, offset, objectHash, s3Info, s3Ctx) - if err != nil { - return err - } - offset = offsetNew - } -} - -func (p *s3Input) jsonFieldsType(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { - switch f := jsonFields.(type) { - case map[string][]interface{}: - if s3Info.expandEventListFromField != "" { - textValues, ok := f[s3Info.expandEventListFromField] - if !ok { - err := errors.Errorf("key '%s' not found", s3Info.expandEventListFromField) - p.logger.Error(err) - return offset, err - } - for _, v := range textValues { - offset, err := p.convertJSONToEvent(v, offset, objectHash, s3Info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "convertJSONToEvent failed for '%s' from S3 bucket '%s'", s3Info.key, s3Info.name) - p.logger.Error(err) - return offset, err - } - } - return offset, nil - } - case map[string]interface{}: - if s3Info.expandEventListFromField != "" { - textValues, ok := f[s3Info.expandEventListFromField] - if !ok { - err := errors.Errorf("key '%s' not found", s3Info.expandEventListFromField) - p.logger.Error(err) - return offset, err - } - - valuesConverted := textValues.([]interface{}) - for _, textValue := range valuesConverted { - offsetNew, err := p.convertJSONToEvent(textValue, offset, objectHash, s3Info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "convertJSONToEvent failed for '%s' from S3 bucket '%s'", s3Info.key, s3Info.name) - p.logger.Error(err) - return offset, err - } - offset = offsetNew - } - return offset, nil - } - - offset, err := p.convertJSONToEvent(f, offset, objectHash, s3Info, s3Ctx) - if err != nil { - err = errors.Wrapf(err, "convertJSONToEvent failed for '%s' from S3 bucket '%s'", s3Info.key, s3Info.name) - p.logger.Error(err) - return offset, err - } - return offset, nil - } - return offset, nil + defer collector.publisher.Close() + collector.run() + return ctx.Cancelation.Err() } -func (p *s3Input) convertJSONToEvent(jsonFields interface{}, offset int, objectHash string, s3Info s3Info, s3Ctx *s3Context) (int, error) { - vJSON, err := json.Marshal(jsonFields) - logOriginal := string(vJSON) - log := trimLogDelimiter(logOriginal) - offset += len([]byte(log)) - event := createEvent(log, offset, s3Info, objectHash, s3Ctx) +func (in *s3Input) createCollector(ctx v2.Context, pipeline beat.Pipeline) (*s3Collector, error) { + log := ctx.Logger.With("queue_url", in.config.QueueURL) - err = p.forwardEvent(event) + client, err := pipeline.ConnectWith(beat.ClientConfig{ + CloseRef: ctx.Cancelation, + ACKHandler: newACKHandler(), + }) if err != nil { - err = errors.Wrap(err, "forwardEvent failed") - p.logger.Error(err) - return offset, err - } - return offset, nil -} - -func (p *s3Input) forwardEvent(event beat.Event) error { - ok := p.outlet.OnEvent(event) - if !ok { - return errOutletClosed - } - return nil -} - -func (p *s3Input) deleteMessage(queueURL string, messagesReceiptHandle string, svcSQS sqsiface.ClientAPI) error { - deleteMessageInput := &sqs.DeleteMessageInput{ - QueueUrl: awssdk.String(queueURL), - ReceiptHandle: awssdk.String(messagesReceiptHandle), + return nil, err } - req := svcSQS.DeleteMessageRequest(deleteMessageInput) - - // The Context will interrupt the request if the timeout expires. - ctx, cancelFn := context.WithTimeout(p.context, p.config.APITimeout) - defer cancelFn() - - _, err := req.Send(ctx) + regionName, err := getRegionFromQueueURL(in.config.QueueURL) if err != nil { - if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == awssdk.ErrCodeRequestCanceled { - return nil - } - return errors.Wrapf(err, "SQS DeleteMessageRequest failed in queue %s", queueURL) + err := fmt.Errorf("getRegionFromQueueURL failed: %w", err) + log.Error(err) + return nil, err + } else { + log = log.With("region", regionName) } - return nil -} -func trimLogDelimiter(log string) string { - return strings.TrimSuffix(log, "\n") -} - -func readStringAndTrimDelimiter(reader *bufio.Reader) (string, error) { - logOriginal, err := reader.ReadString('\n') + awsConfig, err := awscommon.GetAWSCredentials(in.config.AwsConfig) if err != nil { - return logOriginal, err - } - return trimLogDelimiter(logOriginal), nil -} - -func createEvent(log string, offset int, info s3Info, objectHash string, s3Ctx *s3Context) beat.Event { - s3Ctx.Inc() - - event := beat.Event{ - Timestamp: time.Now().UTC(), - Fields: common.MapStr{ - "message": log, - "log": common.MapStr{ - "offset": int64(offset), - "file.path": constructObjectURL(info), - }, - "aws": common.MapStr{ - "s3": common.MapStr{ - "bucket": common.MapStr{ - "name": info.name, - "arn": info.arn}, - "object.key": info.key, - }, - }, - "cloud": common.MapStr{ - "provider": "aws", - "region": info.region, - }, - }, - Private: s3Ctx, - } - event.SetID(objectHash + "-" + fmt.Sprintf("%012d", offset)) - - return event -} - -func constructObjectURL(info s3Info) string { - return "https://" + info.name + ".s3-" + info.region + ".amazonaws.com/" + info.key -} - -// s3ObjectHash returns a short sha256 hash of the bucket arn + object key name. -func s3ObjectHash(s3Info s3Info) string { - h := sha256.New() - h.Write([]byte(s3Info.arn + s3Info.key)) - prefix := hex.EncodeToString(h.Sum(nil)) - return prefix[:10] -} - -func (c *s3Context) setError(err error) { - // only care about the last error for now - // TODO: add "Typed" error to error for context - c.mux.Lock() - defer c.mux.Unlock() - c.err = err -} - -func (c *s3Context) done() { - c.mux.Lock() - defer c.mux.Unlock() - c.refs-- - if c.refs == 0 { - c.errC <- c.err - close(c.errC) - } -} - -func (c *s3Context) Inc() { - c.mux.Lock() - defer c.mux.Unlock() - c.refs++ -} - -// isStreamGzipped determines whether the given stream of bytes (encapsulated in a buffered reader) -// represents gzipped content or not. A buffered reader is used so the function can peek into the byte -// stream without consuming it. This makes it convenient for code executed after this function call -// to consume the stream if it wants. -func isStreamGzipped(r *bufio.Reader) (bool, error) { - // Why 512? See https://godoc.org/net/http#DetectContentType - buf, err := r.Peek(512) - if err != nil && err != io.EOF { - return false, err - } - - switch http.DetectContentType(buf) { - case "application/x-gzip", "application/zip": - return true, nil - default: - return false, nil - } + return nil, fmt.Errorf("getAWSCredentials failed: %w", err) + } + awsConfig.Region = regionName + + visibilityTimeout := int64(in.config.VisibilityTimeout.Seconds()) + log.Infof("visibility timeout is set to %v seconds", visibilityTimeout) + log.Infof("aws api timeout is set to %v", in.config.APITimeout) + + return &s3Collector{ + cancellation: ctxtool.FromCanceller(ctx.Cancelation), + logger: log, + config: &in.config, + publisher: client, + visibilityTimeout: visibilityTimeout, + sqs: sqs.New(awscommon.EnrichAWSConfigWithEndpoint(in.config.AwsConfig.Endpoint, "sqs", regionName, awsConfig)), + s3: s3.New(awscommon.EnrichAWSConfigWithEndpoint(in.config.AwsConfig.Endpoint, "s3", regionName, awsConfig)), + }, nil +} + +func newACKHandler() beat.ACKer { + return acker.ConnectionOnly( + acker.EventPrivateReporter(func(_ int, privates []interface{}) { + for _, private := range privates { + if s3Context, ok := private.(*s3Context); ok { + s3Context.done() + } + } + }), + ) } diff --git a/x-pack/filebeat/input/s3/s3_integration_test.go b/x-pack/filebeat/input/s3/s3_integration_test.go index 1d6a400a7f1..cadb5da035b 100644 --- a/x-pack/filebeat/input/s3/s3_integration_test.go +++ b/x-pack/filebeat/input/s3/s3_integration_test.go @@ -16,21 +16,20 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" - - "github.com/aws/aws-sdk-go-v2/aws" awssdk "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/s3" - "github.com/aws/aws-sdk-go-v2/service/s3/s3iface" "github.com/aws/aws-sdk-go-v2/service/sqs" "github.com/aws/aws-sdk-go-v2/service/sqs/sqsiface" + "github.com/stretchr/testify/assert" - "github.com/elastic/beats/v7/filebeat/channel" - "github.com/elastic/beats/v7/filebeat/input" + v2 "github.com/elastic/beats/v7/filebeat/input/v2" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/logp" + pubtest "github.com/elastic/beats/v7/libbeat/publisher/testing" "github.com/elastic/beats/v7/libbeat/tests/resources" awscommon "github.com/elastic/beats/v7/x-pack/libbeat/common/aws" + "github.com/elastic/go-concert/unison" ) const ( @@ -77,228 +76,99 @@ func getConfigForTest(t *testing.T) config { return config } -func uploadSampleLogFile(t *testing.T, bucketName string, svcS3 s3iface.ClientAPI) { - t.Helper() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - file, err := os.Open(filePath) - if err != nil { - t.Fatalf("Failed to open file %v", filePath) - } - defer file.Close() - - s3PutObjectInput := s3.PutObjectInput{ - Bucket: aws.String(bucketName), - Key: aws.String(filepath.Base(filePath)), - Body: file, - } - req := svcS3.PutObjectRequest(&s3PutObjectInput) - output, err := req.Send(ctx) - if err != nil { - t.Fatalf("failed to put object into s3 bucket: %v", output) - } -} - -func collectOldMessages(t *testing.T, queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI) []string { - t.Helper() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // receive messages from sqs - req := svcSQS.ReceiveMessageRequest( - &sqs.ReceiveMessageInput{ - QueueUrl: &queueURL, - MessageAttributeNames: []string{"All"}, - MaxNumberOfMessages: &maxNumberOfMessage, - VisibilityTimeout: &visibilityTimeout, - WaitTimeSeconds: &waitTimeSecond, - }) - - output, err := req.Send(ctx) - if err != nil { - t.Fatalf("failed to receive message from SQS: %v", output) - } - - var oldMessageHandles []string - for _, message := range output.Messages { - oldMessageHandles = append(oldMessageHandles, *message.ReceiptHandle) - } - - return oldMessageHandles -} - -func (input *s3Input) deleteAllMessages(t *testing.T, awsConfig awssdk.Config, queueURL string, visibilityTimeout int64, svcSQS sqsiface.ClientAPI) error { - var messageReceiptHandles []string - init := true - for init || len(messageReceiptHandles) > 0 { - init = false - messageReceiptHandles = collectOldMessages(t, queueURL, visibilityTimeout, svcSQS) - for _, receiptHandle := range messageReceiptHandles { - err := input.deleteMessage(queueURL, receiptHandle, svcSQS) - if err != nil { - return err - } - } - } - return nil -} - func defaultTestConfig() *common.Config { return common.MustNewConfigFrom(map[string]interface{}{ "queue_url": os.Getenv("QUEUE_URL"), }) } -func runTest(t *testing.T, cfg *common.Config, run func(t *testing.T, input *s3Input, out *stubOutleter)) { - // Simulate input.Context from Filebeat input runner. - inputCtx := newInputContext() - defer close(inputCtx.Done) - - // Stub outlet for receiving events generated by the input. - eventOutlet := newStubOutlet() - defer eventOutlet.Close() - - connector := channel.ConnectorFunc(func(_ *common.Config, _ beat.ClientConfig) (channel.Outleter, error) { - return eventOutlet, nil - }) +func newV2Context() (v2.Context, func()) { + ctx, cancel := context.WithCancel(context.Background()) + return v2.Context{ + Logger: logp.NewLogger("s3_test"), + ID: "test_id", + Cancelation: ctx, + }, cancel +} - in, err := NewInput(cfg, connector, inputCtx) +func setupInput(t *testing.T, cfg *common.Config) (*s3Collector, chan beat.Event) { + inp, err := Plugin().Manager.Create(cfg) if err != nil { t.Fatal(err) } - s3Input := in.(*s3Input) - defer s3Input.Stop() - run(t, s3Input, eventOutlet) -} + ctx, cancel := newV2Context() + t.Cleanup(cancel) -func newInputContext() input.Context { - return input.Context{ - Done: make(chan struct{}), + client := pubtest.NewChanClient(0) + pipeline := pubtest.ConstClient(client) + collector, err := inp.(*s3Input).createCollector(ctx, pipeline) + if err != nil { + t.Fatal(err) } + return collector, client.Channel } -type stubOutleter struct { - sync.Mutex - cond *sync.Cond - done bool - Events []beat.Event -} - -func newStubOutlet() *stubOutleter { - o := &stubOutleter{} - o.cond = sync.NewCond(o) - return o -} - -func (o *stubOutleter) waitForEvents(numEvents int) ([]beat.Event, bool) { - o.Lock() - defer o.Unlock() - - for len(o.Events) < numEvents && !o.done { - o.cond.Wait() +func setupCollector(t *testing.T, cfg *common.Config, mock bool) (*s3Collector, chan beat.Event) { + collector, receiver := setupInput(t, cfg) + if mock { + svcS3 := &MockS3Client{} + svcSQS := &MockSQSClient{} + collector.sqs = svcSQS + collector.s3 = svcS3 + return collector, receiver } - size := numEvents - if size >= len(o.Events) { - size = len(o.Events) + config := getConfigForTest(t) + awsConfig, err := awscommon.GetAWSCredentials(config.AwsConfig) + if err != nil { + t.Fatal("failed GetAWSCredentials with AWS Config: ", err) } - out := make([]beat.Event, size) - copy(out, o.Events) - return out, len(out) == numEvents + s3BucketRegion := os.Getenv("S3_BUCKET_REGION") + if s3BucketRegion == "" { + t.Log("S3_BUCKET_REGION is not set, default to us-west-1") + s3BucketRegion = "us-west-1" + } + awsConfig.Region = s3BucketRegion + awsConfig = awsConfig.Copy() + collector.sqs = sqs.New(awsConfig) + collector.s3 = s3.New(awsConfig) + return collector, receiver } -func (o *stubOutleter) Close() error { - o.Lock() - defer o.Unlock() - o.done = true - return nil -} - -func (o *stubOutleter) Done() <-chan struct{} { return nil } - -func (o *stubOutleter) OnEvent(event beat.Event) bool { - o.Lock() - defer o.Unlock() - o.Events = append(o.Events, event) - o.cond.Broadcast() - return !o.done +func runTest(t *testing.T, cfg *common.Config, mock bool, run func(t *testing.T, collector *s3Collector, receiver chan beat.Event)) { + collector, receiver := setupCollector(t, cfg, mock) + run(t, collector, receiver) } func TestS3Input(t *testing.T) { - inputConfig := defaultTestConfig() - config := getConfigForTest(t) - - runTest(t, inputConfig, func(t *testing.T, input *s3Input, out *stubOutleter) { - awsConfig, err := awscommon.GetAWSCredentials(config.AwsConfig) - if err != nil { - - } - s3BucketRegion := os.Getenv("S3_BUCKET_REGION") - if s3BucketRegion == "" { - t.Log("S3_BUCKET_REGION is not set, default to us-west-1") - s3BucketRegion = "us-west-1" - } - awsConfig.Region = s3BucketRegion - input.awsConfig = awsConfig.Copy() - svcSQS := sqs.New(awsConfig) - - // remove old messages from SQS - err = input.deleteAllMessages(t, awsConfig, config.QueueURL, int64(config.VisibilityTimeout.Seconds()), svcSQS) - if err != nil { - t.Fatalf("failed to delete message: %v", err.Error()) - } - + runTest(t, defaultTestConfig(), false, func(t *testing.T, collector *s3Collector, receiver chan beat.Event) { // upload a sample log file for testing s3BucketNameEnv := os.Getenv("S3_BUCKET_NAME") if s3BucketNameEnv == "" { t.Fatal("failed to get S3_BUCKET_NAME") } - svcS3 := s3.New(awsConfig) - uploadSampleLogFile(t, s3BucketNameEnv, svcS3) - time.Sleep(30 * time.Second) - wg := sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() - input.run(svcSQS, svcS3, 300) + collector.run() }() - events, ok := out.waitForEvents(2) - if !ok { - t.Fatalf("Expected 2 events, but got %d.", len(events)) - } - input.Stop() - - // check events - for i, event := range events { - bucketName, err := event.GetValue("aws.s3.bucket.name") - assert.NoError(t, err) - assert.Equal(t, s3BucketNameEnv, bucketName) - - objectKey, err := event.GetValue("aws.s3.object.key") - assert.NoError(t, err) - assert.Equal(t, fileName, objectKey) - - message, err := event.GetValue("message") - assert.NoError(t, err) - switch i { - case 0: - assert.Equal(t, "logline1\n", message) - case 1: - assert.Equal(t, "logline2\n", message) - } - } + event := <-receiver + bucketName, err := event.GetValue("aws.s3.bucket.name") + assert.NoError(t, err) + assert.Equal(t, s3BucketNameEnv, bucketName) - // delete messages from the queue - err = input.deleteAllMessages(t, awsConfig, config.QueueURL, int64(config.VisibilityTimeout.Seconds()), svcSQS) - if err != nil { - t.Fatalf("failed to delete message: %v", err.Error()) - } + objectKey, err := event.GetValue("aws.s3.object.key") + assert.NoError(t, err) + assert.Equal(t, fileName, objectKey) + + message, err := event.GetValue("message") + assert.NoError(t, err) + assert.Equal(t, "logline1\n", message) }) } @@ -354,41 +224,23 @@ func TestMockS3Input(t *testing.T) { "queue_url": "https://sqs.ap-southeast-1.amazonaws.com/123456/test", }) - runTest(t, cfg, func(t *testing.T, input *s3Input, out *stubOutleter) { - svcS3 := &MockS3Client{} - svcSQS := &MockSQSClient{} + runTest(t, cfg, true, func(t *testing.T, collector *s3Collector, receiver chan beat.Event) { + defer collector.cancellation.Done() + defer collector.publisher.Close() - wg := sync.WaitGroup{} - wg.Add(1) - go func() { - defer wg.Done() - input.run(svcSQS, svcS3, 300) - }() + output, err := collector.receiveMessage(collector.sqs, collector.visibilityTimeout) + assert.NoError(t, err) - events, ok := out.waitForEvents(2) - if !ok { - t.Fatalf("Expected 2 events, but got %d.", len(events)) - } - input.Wait() - - // check events - for i, event := range events { - bucketName, err := event.GetValue("aws.s3.bucket.name") - assert.NoError(t, err) - assert.Equal(t, "test-s3-ks-2", bucketName) - - objectKey, err := event.GetValue("aws.s3.object.key") - assert.NoError(t, err) - assert.Equal(t, "server-access-logging2019-06-21-16-16-54", objectKey) - - message, err := event.GetValue("message") - assert.NoError(t, err) - switch i { - case 0: - assert.Equal(t, s3LogString1, message) - case 1: - assert.Equal(t, s3LogString2, message) - } - } + var grp unison.MultiErrGroup + errC := make(chan error) + defer close(errC) + grp.Go(func() (err error) { + return collector.processMessage(collector.s3, output.Messages[0], errC) + }) + + event := <-receiver + bucketName, err := event.GetValue("aws.s3.bucket.name") + assert.NoError(t, err) + assert.Equal(t, "test-s3-ks-2", bucketName) }) } From 30a141519911c933372624c9aaf4b7fc9d0ce8d5 Mon Sep 17 00:00:00 2001 From: Adrian Serrano Date: Fri, 2 Oct 2020 23:12:59 +0200 Subject: [PATCH 055/156] Increase index pattern size check to 10MiB (#21487) --- libbeat/tests/system/beat/common_tests.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libbeat/tests/system/beat/common_tests.py b/libbeat/tests/system/beat/common_tests.py index c9cdbc52cc0..920ee35e72e 100644 --- a/libbeat/tests/system/beat/common_tests.py +++ b/libbeat/tests/system/beat/common_tests.py @@ -4,6 +4,12 @@ from beat.beat import INTEGRATION_TESTS +# Fail if the exported index pattern is larger than 10MiB +# This is to avoid problems with Kibana when the payload +# of the request to install the index pattern exceeds the +# default limit. +index_pattern_size_limit = 10 * 1024 * 1024 + class TestExportsMixin: @@ -56,7 +62,7 @@ def test_export_index_pattern(self): js = json.loads(output) assert "objects" in js size = len(output.encode('utf-8')) - assert size < 1024 * 1024, "Kibana index pattern must be less than 1MiB " \ + assert size < index_pattern_size_limit, "Kibana index pattern must be less than 10MiB " \ "to keep the Beat setup request size below " \ "Kibana's server.maxPayloadBytes." @@ -68,7 +74,7 @@ def test_export_index_pattern_migration(self): js = json.loads(output) assert "objects" in js size = len(output.encode('utf-8')) - assert size < 1024 * 1024, "Kibana index pattern must be less than 1MiB " \ + assert size < index_pattern_size_limit, "Kibana index pattern must be less than 10MiB " \ "to keep the Beat setup request size below " \ "Kibana's server.maxPayloadBytes." From e50c9b3929fdab157000e01adcd07a9d92b05b37 Mon Sep 17 00:00:00 2001 From: Pius Date: Fri, 2 Oct 2020 19:40:29 -0700 Subject: [PATCH 056/156] Clarify input type configuration options (#19284) Clarify that all input type configuration options must be specified within the external configuration file: https://github.com/elastic/beats/issues/19148 --- filebeat/docs/reload-configuration.asciidoc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/filebeat/docs/reload-configuration.asciidoc b/filebeat/docs/reload-configuration.asciidoc index 10a706d4020..14c4826b6d8 100644 --- a/filebeat/docs/reload-configuration.asciidoc +++ b/filebeat/docs/reload-configuration.asciidoc @@ -33,9 +33,11 @@ definitions. TIP: The first line of each external configuration file must be an input definition that starts with `- type`. Make sure you omit the line -+{beatname_lc}.config.inputs+ from this file. - -For example: ++{beatname_lc}.config.inputs+ from this file. All <> +must be specified within each external configuration file. Specifying these +configuration options at the global `filebeat.config.inputs` level is not supported. + +Example external configuration file: [source,yaml] ------------------------------------------------------------------------------ From e9cb70f8805fe84889f27391314281f2a39514cc Mon Sep 17 00:00:00 2001 From: Andrew Kroh Date: Sun, 4 Oct 2020 09:43:06 -0400 Subject: [PATCH 057/156] Bump version to ECS 1.6 in modules without ECS updates (#21455) For the Filebeat modules that required no changes to move to ECS 1.6 this updates the ecs.version field from 1.5.0 to 1.6.0. And update the ecs.version for Auditbeat, Packetbeat, and Winlogbeat. Relates #19472 --- auditbeat/cmd/root.go | 2 +- filebeat/module/apache/access/config/access.yml | 2 +- filebeat/module/apache/error/config/error.yml | 2 +- filebeat/module/auditd/log/config/log.yml | 2 +- filebeat/module/elasticsearch/audit/config/audit.yml | 2 +- filebeat/module/elasticsearch/deprecation/config/log.yml | 2 +- filebeat/module/elasticsearch/gc/config/gc.yml | 2 +- filebeat/module/elasticsearch/server/config/log.yml | 2 +- filebeat/module/elasticsearch/slowlog/config/slowlog.yml | 2 +- filebeat/module/haproxy/log/config/file.yml | 2 +- filebeat/module/haproxy/log/config/syslog.yml | 2 +- filebeat/module/icinga/debug/config/debug.yml | 2 +- filebeat/module/icinga/main/config/main.yml | 2 +- filebeat/module/icinga/startup/config/startup.yml | 2 +- filebeat/module/iis/access/config/iis-access.yml | 2 +- filebeat/module/iis/error/config/iis-error.yml | 2 +- filebeat/module/kafka/log/config/log.yml | 2 +- filebeat/module/kibana/log/config/log.yml | 2 +- filebeat/module/logstash/log/config/log.yml | 2 +- filebeat/module/logstash/slowlog/config/slowlog.yml | 2 +- filebeat/module/mongodb/log/config/log.yml | 2 +- filebeat/module/mysql/error/config/error.yml | 2 +- filebeat/module/mysql/slowlog/config/slowlog.yml | 2 +- filebeat/module/nats/log/config/log.yml | 2 +- filebeat/module/nginx/access/config/nginx-access.yml | 2 +- filebeat/module/nginx/error/config/nginx-error.yml | 2 +- .../nginx/ingress_controller/config/ingress_controller.yml | 2 +- filebeat/module/postgresql/log/config/log.yml | 2 +- filebeat/module/redis/log/config/log.yml | 2 +- filebeat/module/traefik/access/config/traefik-access.yml | 2 +- packetbeat/cmd/root.go | 2 +- winlogbeat/cmd/root.go | 2 +- x-pack/filebeat/module/activemq/audit/config/audit.yml | 2 +- x-pack/filebeat/module/activemq/log/config/log.yml | 2 +- x-pack/filebeat/module/aws/cloudtrail/config/file.yml | 2 +- x-pack/filebeat/module/aws/cloudtrail/config/s3.yml | 2 +- x-pack/filebeat/module/aws/cloudwatch/config/file.yml | 2 +- x-pack/filebeat/module/aws/cloudwatch/config/s3.yml | 2 +- x-pack/filebeat/module/aws/ec2/config/file.yml | 2 +- x-pack/filebeat/module/aws/ec2/config/s3.yml | 2 +- x-pack/filebeat/module/aws/elb/config/file.yml | 2 +- x-pack/filebeat/module/aws/elb/config/s3.yml | 2 +- x-pack/filebeat/module/aws/s3access/config/file.yml | 2 +- x-pack/filebeat/module/aws/s3access/config/s3.yml | 2 +- x-pack/filebeat/module/aws/vpcflow/config/input.yml | 2 +- .../module/azure/activitylogs/config/azure-eventhub.yml | 2 +- x-pack/filebeat/module/azure/activitylogs/config/file.yml | 2 +- .../filebeat/module/azure/auditlogs/config/azure-eventhub.yml | 2 +- x-pack/filebeat/module/azure/auditlogs/config/file.yml | 2 +- .../filebeat/module/azure/signinlogs/config/azure-eventhub.yml | 2 +- x-pack/filebeat/module/azure/signinlogs/config/file.yml | 2 +- x-pack/filebeat/module/cef/log/config/input.yml | 2 +- x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml | 2 +- x-pack/filebeat/module/coredns/log/config/coredns.yml | 2 +- x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml | 2 +- x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml | 2 +- x-pack/filebeat/module/googlecloud/audit/config/input.yml | 2 +- x-pack/filebeat/module/googlecloud/firewall/config/input.yml | 2 +- x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml | 2 +- x-pack/filebeat/module/gsuite/admin/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/drive/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/groups/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/login/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/saml/config/config.yml | 2 +- x-pack/filebeat/module/gsuite/user_accounts/config/config.yml | 2 +- x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml | 2 +- x-pack/filebeat/module/iptables/log/config/input.yml | 2 +- x-pack/filebeat/module/misp/threat/config/input.yml | 2 +- x-pack/filebeat/module/mssql/log/config/config.yml | 2 +- x-pack/filebeat/module/netflow/log/config/netflow.yml | 2 +- x-pack/filebeat/module/o365/audit/config/input.yml | 2 +- x-pack/filebeat/module/okta/system/config/input.yml | 2 +- x-pack/filebeat/module/rabbitmq/log/config/log.yml | 2 +- x-pack/filebeat/module/sophos/xg/config/config.yml | 2 +- .../filebeat/module/zeek/capture_loss/config/capture_loss.yml | 2 +- x-pack/filebeat/module/zeek/connection/config/connection.yml | 2 +- x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml | 2 +- x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml | 2 +- x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml | 2 +- x-pack/filebeat/module/zeek/dns/config/dns.yml | 2 +- x-pack/filebeat/module/zeek/dpd/config/dpd.yml | 2 +- x-pack/filebeat/module/zeek/files/config/files.yml | 2 +- x-pack/filebeat/module/zeek/ftp/config/ftp.yml | 2 +- x-pack/filebeat/module/zeek/http/config/http.yml | 2 +- x-pack/filebeat/module/zeek/intel/config/intel.yml | 2 +- x-pack/filebeat/module/zeek/irc/config/irc.yml | 2 +- x-pack/filebeat/module/zeek/modbus/config/modbus.yml | 2 +- x-pack/filebeat/module/zeek/mysql/config/mysql.yml | 2 +- x-pack/filebeat/module/zeek/notice/config/notice.yml | 2 +- x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml | 2 +- x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml | 2 +- x-pack/filebeat/module/zeek/pe/config/pe.yml | 2 +- x-pack/filebeat/module/zeek/radius/config/radius.yml | 2 +- x-pack/filebeat/module/zeek/rdp/config/rdp.yml | 2 +- x-pack/filebeat/module/zeek/rfb/config/rfb.yml | 2 +- x-pack/filebeat/module/zeek/sip/config/sip.yml | 2 +- x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml | 2 +- x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml | 2 +- x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml | 2 +- x-pack/filebeat/module/zeek/smtp/config/smtp.yml | 2 +- x-pack/filebeat/module/zeek/snmp/config/snmp.yml | 2 +- x-pack/filebeat/module/zeek/socks/config/socks.yml | 2 +- x-pack/filebeat/module/zeek/ssh/config/ssh.yml | 2 +- x-pack/filebeat/module/zeek/stats/config/stats.yml | 2 +- x-pack/filebeat/module/zeek/syslog/config/syslog.yml | 2 +- x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml | 2 +- x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml | 2 +- x-pack/filebeat/module/zeek/weird/config/weird.yml | 2 +- x-pack/filebeat/module/zoom/webhook/config/webhook.yml | 2 +- 109 files changed, 109 insertions(+), 109 deletions(-) diff --git a/auditbeat/cmd/root.go b/auditbeat/cmd/root.go index 89d0bfd20ca..bf3167e7106 100644 --- a/auditbeat/cmd/root.go +++ b/auditbeat/cmd/root.go @@ -35,7 +35,7 @@ const ( Name = "auditbeat" // ecsVersion specifies the version of ECS that Auditbeat is implementing. - ecsVersion = "1.5.0" + ecsVersion = "1.6.0" ) // RootCmd for running auditbeat. diff --git a/filebeat/module/apache/access/config/access.yml b/filebeat/module/apache/access/config/access.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/apache/access/config/access.yml +++ b/filebeat/module/apache/access/config/access.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/apache/error/config/error.yml b/filebeat/module/apache/error/config/error.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/apache/error/config/error.yml +++ b/filebeat/module/apache/error/config/error.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/auditd/log/config/log.yml b/filebeat/module/auditd/log/config/log.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/auditd/log/config/log.yml +++ b/filebeat/module/auditd/log/config/log.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/audit/config/audit.yml b/filebeat/module/elasticsearch/audit/config/audit.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/elasticsearch/audit/config/audit.yml +++ b/filebeat/module/elasticsearch/audit/config/audit.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/deprecation/config/log.yml b/filebeat/module/elasticsearch/deprecation/config/log.yml index f6c37b9e426..aa6f7d220f0 100644 --- a/filebeat/module/elasticsearch/deprecation/config/log.yml +++ b/filebeat/module/elasticsearch/deprecation/config/log.yml @@ -15,4 +15,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/gc/config/gc.yml b/filebeat/module/elasticsearch/gc/config/gc.yml index 5f62e00c54c..12b9a0f874d 100644 --- a/filebeat/module/elasticsearch/gc/config/gc.yml +++ b/filebeat/module/elasticsearch/gc/config/gc.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/server/config/log.yml b/filebeat/module/elasticsearch/server/config/log.yml index b0b9e3f55d0..45a7f84018d 100644 --- a/filebeat/module/elasticsearch/server/config/log.yml +++ b/filebeat/module/elasticsearch/server/config/log.yml @@ -15,4 +15,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/elasticsearch/slowlog/config/slowlog.yml b/filebeat/module/elasticsearch/slowlog/config/slowlog.yml index 2d98286de6d..4c861ea7dc7 100644 --- a/filebeat/module/elasticsearch/slowlog/config/slowlog.yml +++ b/filebeat/module/elasticsearch/slowlog/config/slowlog.yml @@ -16,4 +16,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/haproxy/log/config/file.yml b/filebeat/module/haproxy/log/config/file.yml index c3e104f56d4..ac3846087c3 100644 --- a/filebeat/module/haproxy/log/config/file.yml +++ b/filebeat/module/haproxy/log/config/file.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/haproxy/log/config/syslog.yml b/filebeat/module/haproxy/log/config/syslog.yml index 6fa56f8fe3c..e919d732e74 100644 --- a/filebeat/module/haproxy/log/config/syslog.yml +++ b/filebeat/module/haproxy/log/config/syslog.yml @@ -6,4 +6,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/icinga/debug/config/debug.yml b/filebeat/module/icinga/debug/config/debug.yml index 33c47850878..8b5c2ae7422 100644 --- a/filebeat/module/icinga/debug/config/debug.yml +++ b/filebeat/module/icinga/debug/config/debug.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/icinga/main/config/main.yml b/filebeat/module/icinga/main/config/main.yml index 33c47850878..8b5c2ae7422 100644 --- a/filebeat/module/icinga/main/config/main.yml +++ b/filebeat/module/icinga/main/config/main.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/icinga/startup/config/startup.yml b/filebeat/module/icinga/startup/config/startup.yml index a69343bd796..acc8bd2b782 100644 --- a/filebeat/module/icinga/startup/config/startup.yml +++ b/filebeat/module/icinga/startup/config/startup.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/iis/access/config/iis-access.yml b/filebeat/module/iis/access/config/iis-access.yml index b4797039397..2c845646a4e 100644 --- a/filebeat/module/iis/access/config/iis-access.yml +++ b/filebeat/module/iis/access/config/iis-access.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/iis/error/config/iis-error.yml b/filebeat/module/iis/error/config/iis-error.yml index b4797039397..2c845646a4e 100644 --- a/filebeat/module/iis/error/config/iis-error.yml +++ b/filebeat/module/iis/error/config/iis-error.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/kafka/log/config/log.yml b/filebeat/module/kafka/log/config/log.yml index a745c79562c..f3cfc687526 100644 --- a/filebeat/module/kafka/log/config/log.yml +++ b/filebeat/module/kafka/log/config/log.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/kibana/log/config/log.yml b/filebeat/module/kibana/log/config/log.yml index 1ad204c62fe..93daa116791 100644 --- a/filebeat/module/kibana/log/config/log.yml +++ b/filebeat/module/kibana/log/config/log.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/logstash/log/config/log.yml b/filebeat/module/logstash/log/config/log.yml index af0e4c33735..407078dc115 100644 --- a/filebeat/module/logstash/log/config/log.yml +++ b/filebeat/module/logstash/log/config/log.yml @@ -16,4 +16,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/logstash/slowlog/config/slowlog.yml b/filebeat/module/logstash/slowlog/config/slowlog.yml index 080a2c4310d..4c6abc278c6 100644 --- a/filebeat/module/logstash/slowlog/config/slowlog.yml +++ b/filebeat/module/logstash/slowlog/config/slowlog.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/mongodb/log/config/log.yml b/filebeat/module/mongodb/log/config/log.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/mongodb/log/config/log.yml +++ b/filebeat/module/mongodb/log/config/log.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/mysql/error/config/error.yml b/filebeat/module/mysql/error/config/error.yml index 818cbab297d..8ceba377810 100644 --- a/filebeat/module/mysql/error/config/error.yml +++ b/filebeat/module/mysql/error/config/error.yml @@ -16,4 +16,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/mysql/slowlog/config/slowlog.yml b/filebeat/module/mysql/slowlog/config/slowlog.yml index 7b1a3bc28fd..6893491d869 100644 --- a/filebeat/module/mysql/slowlog/config/slowlog.yml +++ b/filebeat/module/mysql/slowlog/config/slowlog.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nats/log/config/log.yml b/filebeat/module/nats/log/config/log.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/nats/log/config/log.yml +++ b/filebeat/module/nats/log/config/log.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nginx/access/config/nginx-access.yml b/filebeat/module/nginx/access/config/nginx-access.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/nginx/access/config/nginx-access.yml +++ b/filebeat/module/nginx/access/config/nginx-access.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nginx/error/config/nginx-error.yml b/filebeat/module/nginx/error/config/nginx-error.yml index 797c45f6c38..173a43c5a1e 100644 --- a/filebeat/module/nginx/error/config/nginx-error.yml +++ b/filebeat/module/nginx/error/config/nginx-error.yml @@ -14,4 +14,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml b/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml index 7aa0cdb7cf8..b8aa75eef7c 100644 --- a/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml +++ b/filebeat/module/nginx/ingress_controller/config/ingress_controller.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/postgresql/log/config/log.yml b/filebeat/module/postgresql/log/config/log.yml index f69d3e4d387..eeac43780bf 100644 --- a/filebeat/module/postgresql/log/config/log.yml +++ b/filebeat/module/postgresql/log/config/log.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/redis/log/config/log.yml b/filebeat/module/redis/log/config/log.yml index 9d6cae46b38..1c6b6d6c084 100644 --- a/filebeat/module/redis/log/config/log.yml +++ b/filebeat/module/redis/log/config/log.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/filebeat/module/traefik/access/config/traefik-access.yml b/filebeat/module/traefik/access/config/traefik-access.yml index 183de629867..b39221031f3 100644 --- a/filebeat/module/traefik/access/config/traefik-access.yml +++ b/filebeat/module/traefik/access/config/traefik-access.yml @@ -8,4 +8,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/packetbeat/cmd/root.go b/packetbeat/cmd/root.go index 82ab41da374..0a22e98a1a0 100644 --- a/packetbeat/cmd/root.go +++ b/packetbeat/cmd/root.go @@ -37,7 +37,7 @@ const ( Name = "packetbeat" // ecsVersion specifies the version of ECS that Packetbeat is implementing. - ecsVersion = "1.5.0" + ecsVersion = "1.6.0" ) // withECSVersion is a modifier that adds ecs.version to events. diff --git a/winlogbeat/cmd/root.go b/winlogbeat/cmd/root.go index 2cd26a9fe8e..988ac6f9f6c 100644 --- a/winlogbeat/cmd/root.go +++ b/winlogbeat/cmd/root.go @@ -37,7 +37,7 @@ const ( Name = "winlogbeat" // ecsVersion specifies the version of ECS that Winlogbeat is implementing. - ecsVersion = "1.5.0" + ecsVersion = "1.6.0" ) // withECSVersion is a modifier that adds ecs.version to events. diff --git a/x-pack/filebeat/module/activemq/audit/config/audit.yml b/x-pack/filebeat/module/activemq/audit/config/audit.yml index 3e0ec415541..f40bf16116f 100644 --- a/x-pack/filebeat/module/activemq/audit/config/audit.yml +++ b/x-pack/filebeat/module/activemq/audit/config/audit.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/activemq/log/config/log.yml b/x-pack/filebeat/module/activemq/log/config/log.yml index 17f6bd869f2..55449d359f1 100644 --- a/x-pack/filebeat/module/activemq/log/config/log.yml +++ b/x-pack/filebeat/module/activemq/log/config/log.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudtrail/config/file.yml b/x-pack/filebeat/module/aws/cloudtrail/config/file.yml index 5a56f210c79..c4436629e21 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/config/file.yml +++ b/x-pack/filebeat/module/aws/cloudtrail/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml b/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml index 2094f77c712..7c455f64f26 100644 --- a/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml +++ b/x-pack/filebeat/module/aws/cloudtrail/config/s3.yml @@ -58,4 +58,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudwatch/config/file.yml b/x-pack/filebeat/module/aws/cloudwatch/config/file.yml index 5a56f210c79..c4436629e21 100644 --- a/x-pack/filebeat/module/aws/cloudwatch/config/file.yml +++ b/x-pack/filebeat/module/aws/cloudwatch/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml b/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml +++ b/x-pack/filebeat/module/aws/cloudwatch/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/ec2/config/file.yml b/x-pack/filebeat/module/aws/ec2/config/file.yml index 5a56f210c79..c4436629e21 100644 --- a/x-pack/filebeat/module/aws/ec2/config/file.yml +++ b/x-pack/filebeat/module/aws/ec2/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/ec2/config/s3.yml b/x-pack/filebeat/module/aws/ec2/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/ec2/config/s3.yml +++ b/x-pack/filebeat/module/aws/ec2/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/elb/config/file.yml b/x-pack/filebeat/module/aws/elb/config/file.yml index 498a7906457..e9470671e07 100644 --- a/x-pack/filebeat/module/aws/elb/config/file.yml +++ b/x-pack/filebeat/module/aws/elb/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/elb/config/s3.yml b/x-pack/filebeat/module/aws/elb/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/elb/config/s3.yml +++ b/x-pack/filebeat/module/aws/elb/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/s3access/config/file.yml b/x-pack/filebeat/module/aws/s3access/config/file.yml index 498a7906457..e9470671e07 100644 --- a/x-pack/filebeat/module/aws/s3access/config/file.yml +++ b/x-pack/filebeat/module/aws/s3access/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/s3access/config/s3.yml b/x-pack/filebeat/module/aws/s3access/config/s3.yml index 073eca58ab2..5d2d75dc5d8 100644 --- a/x-pack/filebeat/module/aws/s3access/config/s3.yml +++ b/x-pack/filebeat/module/aws/s3access/config/s3.yml @@ -44,4 +44,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/aws/vpcflow/config/input.yml b/x-pack/filebeat/module/aws/vpcflow/config/input.yml index c9e88b6a743..d0c18047ca4 100644 --- a/x-pack/filebeat/module/aws/vpcflow/config/input.yml +++ b/x-pack/filebeat/module/aws/vpcflow/config/input.yml @@ -173,4 +173,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml b/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml index a4567959194..77c7ea3f5d0 100644 --- a/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml +++ b/x-pack/filebeat/module/azure/activitylogs/config/azure-eventhub.yml @@ -13,4 +13,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/activitylogs/config/file.yml b/x-pack/filebeat/module/azure/activitylogs/config/file.yml index 498a7906457..e9470671e07 100644 --- a/x-pack/filebeat/module/azure/activitylogs/config/file.yml +++ b/x-pack/filebeat/module/azure/activitylogs/config/file.yml @@ -11,4 +11,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml b/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml index 3633cc4e5de..43a051f8dd3 100644 --- a/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml +++ b/x-pack/filebeat/module/azure/auditlogs/config/azure-eventhub.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/auditlogs/config/file.yml b/x-pack/filebeat/module/azure/auditlogs/config/file.yml index 937446eb523..8e77b860e99 100644 --- a/x-pack/filebeat/module/azure/auditlogs/config/file.yml +++ b/x-pack/filebeat/module/azure/auditlogs/config/file.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml b/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml index dd8e1473a68..b971be2783c 100644 --- a/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml +++ b/x-pack/filebeat/module/azure/signinlogs/config/azure-eventhub.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/azure/signinlogs/config/file.yml b/x-pack/filebeat/module/azure/signinlogs/config/file.yml index 937446eb523..8e77b860e99 100644 --- a/x-pack/filebeat/module/azure/signinlogs/config/file.yml +++ b/x-pack/filebeat/module/azure/signinlogs/config/file.yml @@ -10,4 +10,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/cef/log/config/input.yml b/x-pack/filebeat/module/cef/log/config/input.yml index 49a2b1829be..cc911a8611f 100644 --- a/x-pack/filebeat/module/cef/log/config/input.yml +++ b/x-pack/filebeat/module/cef/log/config/input.yml @@ -28,4 +28,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml b/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml index 12440f8fffe..f447d2aacdf 100644 --- a/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml +++ b/x-pack/filebeat/module/checkpoint/firewall/config/firewall.yml @@ -23,4 +23,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/coredns/log/config/coredns.yml b/x-pack/filebeat/module/coredns/log/config/coredns.yml index be7f27f551f..4f9992ae2d4 100644 --- a/x-pack/filebeat/module/coredns/log/config/coredns.yml +++ b/x-pack/filebeat/module/coredns/log/config/coredns.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml b/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml index 689bd725530..2af0eeca092 100644 --- a/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml +++ b/x-pack/filebeat/module/crowdstrike/falcon/config/falcon.yml @@ -23,4 +23,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml b/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml index be7f27f551f..4f9992ae2d4 100644 --- a/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml +++ b/x-pack/filebeat/module/envoyproxy/log/config/envoyproxy.yml @@ -9,4 +9,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/googlecloud/audit/config/input.yml b/x-pack/filebeat/module/googlecloud/audit/config/input.yml index 4c30e23b5e3..b5e392ee0b6 100644 --- a/x-pack/filebeat/module/googlecloud/audit/config/input.yml +++ b/x-pack/filebeat/module/googlecloud/audit/config/input.yml @@ -34,4 +34,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/googlecloud/firewall/config/input.yml b/x-pack/filebeat/module/googlecloud/firewall/config/input.yml index d6579aa9f47..39648636c59 100644 --- a/x-pack/filebeat/module/googlecloud/firewall/config/input.yml +++ b/x-pack/filebeat/module/googlecloud/firewall/config/input.yml @@ -35,4 +35,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml b/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml index cf89526bbe5..f1976195687 100644 --- a/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml +++ b/x-pack/filebeat/module/googlecloud/vpcflow/config/input.yml @@ -34,4 +34,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/gsuite/admin/config/config.yml b/x-pack/filebeat/module/gsuite/admin/config/config.yml index b5c62d3657f..9ec19a83615 100644 --- a/x-pack/filebeat/module/gsuite/admin/config/config.yml +++ b/x-pack/filebeat/module/gsuite/admin/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/drive/config/config.yml b/x-pack/filebeat/module/gsuite/drive/config/config.yml index 5f1bd6ecbf3..92e464164b0 100644 --- a/x-pack/filebeat/module/gsuite/drive/config/config.yml +++ b/x-pack/filebeat/module/gsuite/drive/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/groups/config/config.yml b/x-pack/filebeat/module/gsuite/groups/config/config.yml index 46a3ed338d9..ba6890c80e4 100644 --- a/x-pack/filebeat/module/gsuite/groups/config/config.yml +++ b/x-pack/filebeat/module/gsuite/groups/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/login/config/config.yml b/x-pack/filebeat/module/gsuite/login/config/config.yml index b501012b3d2..95ccc04ed2c 100644 --- a/x-pack/filebeat/module/gsuite/login/config/config.yml +++ b/x-pack/filebeat/module/gsuite/login/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/saml/config/config.yml b/x-pack/filebeat/module/gsuite/saml/config/config.yml index 1e703737e0d..8d1c7645fda 100644 --- a/x-pack/filebeat/module/gsuite/saml/config/config.yml +++ b/x-pack/filebeat/module/gsuite/saml/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml b/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml index 773ab620173..dc9e3d353e6 100644 --- a/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml +++ b/x-pack/filebeat/module/gsuite/user_accounts/config/config.yml @@ -39,7 +39,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - script: lang: javascript id: gsuite-common diff --git a/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml b/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml index 2130bb419d2..bca14ecccaa 100644 --- a/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml +++ b/x-pack/filebeat/module/ibmmq/errorlog/config/errorlog.yml @@ -12,4 +12,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/iptables/log/config/input.yml b/x-pack/filebeat/module/iptables/log/config/input.yml index 6183661122a..bcfde17c3c5 100644 --- a/x-pack/filebeat/module/iptables/log/config/input.yml +++ b/x-pack/filebeat/module/iptables/log/config/input.yml @@ -55,4 +55,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/misp/threat/config/input.yml b/x-pack/filebeat/module/misp/threat/config/input.yml index 3ff985b07f3..26010fc478a 100644 --- a/x-pack/filebeat/module/misp/threat/config/input.yml +++ b/x-pack/filebeat/module/misp/threat/config/input.yml @@ -37,4 +37,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/mssql/log/config/config.yml b/x-pack/filebeat/module/mssql/log/config/config.yml index 31990fb32c3..0ac3d9da2c2 100644 --- a/x-pack/filebeat/module/mssql/log/config/config.yml +++ b/x-pack/filebeat/module/mssql/log/config/config.yml @@ -14,4 +14,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/netflow/log/config/netflow.yml b/x-pack/filebeat/module/netflow/log/config/netflow.yml index b34160bd6b9..f56ffeed226 100644 --- a/x-pack/filebeat/module/netflow/log/config/netflow.yml +++ b/x-pack/filebeat/module/netflow/log/config/netflow.yml @@ -31,4 +31,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/o365/audit/config/input.yml b/x-pack/filebeat/module/o365/audit/config/input.yml index d41a5bb9aab..ec30daef127 100644 --- a/x-pack/filebeat/module/o365/audit/config/input.yml +++ b/x-pack/filebeat/module/o365/audit/config/input.yml @@ -62,4 +62,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/okta/system/config/input.yml b/x-pack/filebeat/module/okta/system/config/input.yml index a544ab8dc65..487dfdf165e 100644 --- a/x-pack/filebeat/module/okta/system/config/input.yml +++ b/x-pack/filebeat/module/okta/system/config/input.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/rabbitmq/log/config/log.yml b/x-pack/filebeat/module/rabbitmq/log/config/log.yml index bc46f2458c8..1f32bbf71cf 100644 --- a/x-pack/filebeat/module/rabbitmq/log/config/log.yml +++ b/x-pack/filebeat/module/rabbitmq/log/config/log.yml @@ -18,4 +18,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/sophos/xg/config/config.yml b/x-pack/filebeat/module/sophos/xg/config/config.yml index 86c12e9ec08..8585ff4a19c 100644 --- a/x-pack/filebeat/module/sophos/xg/config/config.yml +++ b/x-pack/filebeat/module/sophos/xg/config/config.yml @@ -27,7 +27,7 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 - add_fields: target: '_conf' fields: diff --git a/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml b/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml index 6b6fcf216f2..5794bd0ca6f 100644 --- a/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml +++ b/x-pack/filebeat/module/zeek/capture_loss/config/capture_loss.yml @@ -22,4 +22,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/connection/config/connection.yml b/x-pack/filebeat/module/zeek/connection/config/connection.yml index 8a79295724f..f6caa143689 100644 --- a/x-pack/filebeat/module/zeek/connection/config/connection.yml +++ b/x-pack/filebeat/module/zeek/connection/config/connection.yml @@ -102,4 +102,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml b/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml index 45010e08973..7d7f0c87353 100644 --- a/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml +++ b/x-pack/filebeat/module/zeek/dce_rpc/config/dce_rpc.yml @@ -58,4 +58,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml b/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml index f1a2f0ced3a..b049d571c14 100644 --- a/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml +++ b/x-pack/filebeat/module/zeek/dhcp/config/dhcp.yml @@ -120,4 +120,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml b/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml index 7730d2b6d85..67033a42cf2 100644 --- a/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml +++ b/x-pack/filebeat/module/zeek/dnp3/config/dnp3.yml @@ -68,4 +68,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dns/config/dns.yml b/x-pack/filebeat/module/zeek/dns/config/dns.yml index 86a2022d695..9e0f7e952e2 100644 --- a/x-pack/filebeat/module/zeek/dns/config/dns.yml +++ b/x-pack/filebeat/module/zeek/dns/config/dns.yml @@ -203,4 +203,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/dpd/config/dpd.yml b/x-pack/filebeat/module/zeek/dpd/config/dpd.yml index acc6defd4df..67565ef21ab 100644 --- a/x-pack/filebeat/module/zeek/dpd/config/dpd.yml +++ b/x-pack/filebeat/module/zeek/dpd/config/dpd.yml @@ -57,4 +57,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/files/config/files.yml b/x-pack/filebeat/module/zeek/files/config/files.yml index 65c067609c9..0e0ce22e2bf 100644 --- a/x-pack/filebeat/module/zeek/files/config/files.yml +++ b/x-pack/filebeat/module/zeek/files/config/files.yml @@ -42,4 +42,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ftp/config/ftp.yml b/x-pack/filebeat/module/zeek/ftp/config/ftp.yml index 51a3c053576..671a1162c66 100644 --- a/x-pack/filebeat/module/zeek/ftp/config/ftp.yml +++ b/x-pack/filebeat/module/zeek/ftp/config/ftp.yml @@ -86,4 +86,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/http/config/http.yml b/x-pack/filebeat/module/zeek/http/config/http.yml index 4c7c812d0cc..8a43f07f0dd 100644 --- a/x-pack/filebeat/module/zeek/http/config/http.yml +++ b/x-pack/filebeat/module/zeek/http/config/http.yml @@ -93,4 +93,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/intel/config/intel.yml b/x-pack/filebeat/module/zeek/intel/config/intel.yml index 5b73833ea35..80d565745f1 100644 --- a/x-pack/filebeat/module/zeek/intel/config/intel.yml +++ b/x-pack/filebeat/module/zeek/intel/config/intel.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/irc/config/irc.yml b/x-pack/filebeat/module/zeek/irc/config/irc.yml index 54aaa9d4f4b..7e09f9fe376 100644 --- a/x-pack/filebeat/module/zeek/irc/config/irc.yml +++ b/x-pack/filebeat/module/zeek/irc/config/irc.yml @@ -72,4 +72,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/modbus/config/modbus.yml b/x-pack/filebeat/module/zeek/modbus/config/modbus.yml index d656ad0ab6a..a65bb88c0d0 100644 --- a/x-pack/filebeat/module/zeek/modbus/config/modbus.yml +++ b/x-pack/filebeat/module/zeek/modbus/config/modbus.yml @@ -73,4 +73,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/mysql/config/mysql.yml b/x-pack/filebeat/module/zeek/mysql/config/mysql.yml index 4c6e70d9f1c..963c8469fe1 100644 --- a/x-pack/filebeat/module/zeek/mysql/config/mysql.yml +++ b/x-pack/filebeat/module/zeek/mysql/config/mysql.yml @@ -72,4 +72,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/notice/config/notice.yml b/x-pack/filebeat/module/zeek/notice/config/notice.yml index 649d3f3ba97..07ccbfb76b4 100644 --- a/x-pack/filebeat/module/zeek/notice/config/notice.yml +++ b/x-pack/filebeat/module/zeek/notice/config/notice.yml @@ -104,4 +104,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml b/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml index c67f66b54b9..135086e19f9 100644 --- a/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml +++ b/x-pack/filebeat/module/zeek/ntlm/config/ntlm.yml @@ -86,4 +86,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml b/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml index 874a0fde6d9..933f829b747 100644 --- a/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml +++ b/x-pack/filebeat/module/zeek/ocsp/config/ocsp.yml @@ -64,4 +64,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/pe/config/pe.yml b/x-pack/filebeat/module/zeek/pe/config/pe.yml index 3df430d7dc9..cfb8ea8c4b0 100644 --- a/x-pack/filebeat/module/zeek/pe/config/pe.yml +++ b/x-pack/filebeat/module/zeek/pe/config/pe.yml @@ -33,4 +33,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/radius/config/radius.yml b/x-pack/filebeat/module/zeek/radius/config/radius.yml index 66fccaa3f5c..471275d5ece 100644 --- a/x-pack/filebeat/module/zeek/radius/config/radius.yml +++ b/x-pack/filebeat/module/zeek/radius/config/radius.yml @@ -58,4 +58,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/rdp/config/rdp.yml b/x-pack/filebeat/module/zeek/rdp/config/rdp.yml index de71448fb1b..071cc59fab9 100644 --- a/x-pack/filebeat/module/zeek/rdp/config/rdp.yml +++ b/x-pack/filebeat/module/zeek/rdp/config/rdp.yml @@ -88,4 +88,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/rfb/config/rfb.yml b/x-pack/filebeat/module/zeek/rfb/config/rfb.yml index 3adb14c55bf..417e9ab4dcd 100644 --- a/x-pack/filebeat/module/zeek/rfb/config/rfb.yml +++ b/x-pack/filebeat/module/zeek/rfb/config/rfb.yml @@ -73,4 +73,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/sip/config/sip.yml b/x-pack/filebeat/module/zeek/sip/config/sip.yml index 7aa30034de2..97885a1e2dc 100644 --- a/x-pack/filebeat/module/zeek/sip/config/sip.yml +++ b/x-pack/filebeat/module/zeek/sip/config/sip.yml @@ -95,4 +95,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml b/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml index 763379a7d88..885669e4c9c 100644 --- a/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml +++ b/x-pack/filebeat/module/zeek/smb_cmd/config/smb_cmd.yml @@ -101,4 +101,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml b/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml index c5f7c2e53e7..a3f02a7558f 100644 --- a/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml +++ b/x-pack/filebeat/module/zeek/smb_files/config/smb_files.yml @@ -61,4 +61,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml b/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml index 624454ed171..59a68e2054b 100644 --- a/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml +++ b/x-pack/filebeat/module/zeek/smb_mapping/config/smb_mapping.yml @@ -57,4 +57,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/smtp/config/smtp.yml b/x-pack/filebeat/module/zeek/smtp/config/smtp.yml index 5b2f6595df2..0af383a7187 100644 --- a/x-pack/filebeat/module/zeek/smtp/config/smtp.yml +++ b/x-pack/filebeat/module/zeek/smtp/config/smtp.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/snmp/config/snmp.yml b/x-pack/filebeat/module/zeek/snmp/config/snmp.yml index 0c7e05ce6db..1fa024742be 100644 --- a/x-pack/filebeat/module/zeek/snmp/config/snmp.yml +++ b/x-pack/filebeat/module/zeek/snmp/config/snmp.yml @@ -69,4 +69,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/socks/config/socks.yml b/x-pack/filebeat/module/zeek/socks/config/socks.yml index f834e5d1bcc..99613e4bfe3 100644 --- a/x-pack/filebeat/module/zeek/socks/config/socks.yml +++ b/x-pack/filebeat/module/zeek/socks/config/socks.yml @@ -67,4 +67,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/ssh/config/ssh.yml b/x-pack/filebeat/module/zeek/ssh/config/ssh.yml index c855d49dff2..45f160cd99d 100644 --- a/x-pack/filebeat/module/zeek/ssh/config/ssh.yml +++ b/x-pack/filebeat/module/zeek/ssh/config/ssh.yml @@ -76,4 +76,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/stats/config/stats.yml b/x-pack/filebeat/module/zeek/stats/config/stats.yml index cdf243f7a45..45c22b6b3d2 100644 --- a/x-pack/filebeat/module/zeek/stats/config/stats.yml +++ b/x-pack/filebeat/module/zeek/stats/config/stats.yml @@ -97,4 +97,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/syslog/config/syslog.yml b/x-pack/filebeat/module/zeek/syslog/config/syslog.yml index a89601cb717..0d1b8fc05e5 100644 --- a/x-pack/filebeat/module/zeek/syslog/config/syslog.yml +++ b/x-pack/filebeat/module/zeek/syslog/config/syslog.yml @@ -57,4 +57,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml b/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml index 13a2a37cc69..741a0d7e454 100644 --- a/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml +++ b/x-pack/filebeat/module/zeek/traceroute/config/traceroute.yml @@ -45,4 +45,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml b/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml index ac636e9e7c0..243f83de760 100644 --- a/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml +++ b/x-pack/filebeat/module/zeek/tunnel/config/tunnel.yml @@ -56,4 +56,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zeek/weird/config/weird.yml b/x-pack/filebeat/module/zeek/weird/config/weird.yml index 5807f95927b..4a4bab4dc33 100644 --- a/x-pack/filebeat/module/zeek/weird/config/weird.yml +++ b/x-pack/filebeat/module/zeek/weird/config/weird.yml @@ -56,4 +56,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 diff --git a/x-pack/filebeat/module/zoom/webhook/config/webhook.yml b/x-pack/filebeat/module/zoom/webhook/config/webhook.yml index 207da5447e1..ac04136779c 100644 --- a/x-pack/filebeat/module/zoom/webhook/config/webhook.yml +++ b/x-pack/filebeat/module/zoom/webhook/config/webhook.yml @@ -33,4 +33,4 @@ processors: - add_fields: target: '' fields: - ecs.version: 1.5.0 + ecs.version: 1.6.0 From 92b34600fcb54985bb4b9ee35aa96c07086645ea Mon Sep 17 00:00:00 2001 From: Chris Mark Date: Mon, 5 Oct 2020 10:33:06 +0300 Subject: [PATCH 058/156] Fix leftover delpoyment example (#21474) Signed-off-by: chrismark --- metricbeat/docs/running-on-kubernetes.asciidoc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/metricbeat/docs/running-on-kubernetes.asciidoc b/metricbeat/docs/running-on-kubernetes.asciidoc index 786977cb294..f852c153e5e 100644 --- a/metricbeat/docs/running-on-kubernetes.asciidoc +++ b/metricbeat/docs/running-on-kubernetes.asciidoc @@ -192,11 +192,6 @@ $ kubectl --namespace=kube-system get ds/metricbeat NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE-SELECTOR AGE metricbeat 32 32 0 32 0 1m - -$ kubectl --namespace=kube-system get deploy/metricbeat - -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -metricbeat 1 1 1 1 1m ------------------------------------------------ Metrics should start flowing to Elasticsearch. From b9569ff7e7c4d6901e19bcdaf08bde084908de01 Mon Sep 17 00:00:00 2001 From: Michal Pristas Date: Mon, 5 Oct 2020 09:38:22 +0200 Subject: [PATCH 059/156] Prompt only when agent is already enrolled (#21473) Prompt only when agent is already enrolled (#21473) --- x-pack/elastic-agent/pkg/agent/cmd/enroll.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go index 6a604554136..a92766b9c07 100644 --- a/x-pack/elastic-agent/pkg/agent/cmd/enroll.go +++ b/x-pack/elastic-agent/pkg/agent/cmd/enroll.go @@ -119,7 +119,9 @@ func enroll(streams *cli.IOStreams, cmd *cobra.Command, flags *globalFlags, args if fromInstall { force = true } - if !force { + + // prompt only when it is not forced and is already enrolled + if !force && (cfg.Fleet != nil && cfg.Fleet.Enabled == true) { confirm, err := c.Confirm("This will replace your current settings. Do you want to continue?", true) if err != nil { return errors.New(err, "problem reading prompt response") From 3d8e7dd6fe114905610500ffdd0d8921ced759df Mon Sep 17 00:00:00 2001 From: Jaime Soriano Pastor Date: Mon, 5 Oct 2020 10:51:51 +0200 Subject: [PATCH 060/156] Include original error when metricbeat fails to connect with Kafka (#21484) --- metricbeat/module/kafka/broker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metricbeat/module/kafka/broker.go b/metricbeat/module/kafka/broker.go index b9e78c7dacc..2e558d7944a 100644 --- a/metricbeat/module/kafka/broker.go +++ b/metricbeat/module/kafka/broker.go @@ -119,7 +119,7 @@ func (b *Broker) Connect() error { c, err := getClusterWideClient(b.Addr(), b.cfg) if err != nil { closeBroker(b.broker) - return fmt.Errorf("Could not get cluster client for advertised broker with address %v", b.Addr()) + return fmt.Errorf("getting cluster client for advertised broker with address %v: %w", b.Addr(), err) } b.client = c From 67a2d38203dbf04fc1ae8a186253a1e61917eb28 Mon Sep 17 00:00:00 2001 From: Mariana Dima Date: Mon, 5 Oct 2020 10:52:49 +0200 Subject: [PATCH 061/156] Add support for app_state metricset (#20639) * mofidy doc * add metricset * chnagelog * config * work on app_state * remove extra * fix changelog * mage fmt update * work on mapping fields * work on tests * fix vis name * no default * fix tests * add headers --- CHANGELOG.next.asciidoc | 1 + metricbeat/docs/fields.asciidoc | 223 ++- .../metricbeat-azure-app-state-overview.png | Bin 0 -> 453884 bytes metricbeat/docs/modules/azure.asciidoc | 20 + .../docs/modules/azure/app_state.asciidoc | 24 + metricbeat/docs/modules_list.asciidoc | 3 +- x-pack/metricbeat/metricbeat.reference.yml | 8 + .../module/azure/_meta/config.reference.yml | 8 + .../metricbeat/module/azure/_meta/config.yml | 8 + .../module/azure/_meta/docs.asciidoc | 8 + .../metricbeat/module/azure/_meta/fields.yml | 4 + .../Metricbeat-azure-app-state-overview.json | 1509 +++++++++++++++++ .../module/azure/app_insights/_meta/data.json | 21 +- .../azure/app_insights/_meta/fields.yml | 4 - .../module/azure/app_insights/app_insights.go | 3 +- .../app_insights_integration_test.go | 10 + .../module/azure/app_insights/client.go | 3 - .../module/azure/app_insights/data.go | 229 ++- .../module/azure/app_insights/data_test.go | 20 +- .../module/azure/app_state/_meta/data.json | 32 + .../azure/app_state/_meta/docs.asciidoc | 12 + .../module/azure/app_state/_meta/fields.yml | 86 + .../app_state/app_state_integration_test.go | 38 + .../module/azure/app_state/app_state_test.go | 17 + .../module/azure/app_state/manifest.yml | 29 + x-pack/metricbeat/module/azure/data.go | 6 +- x-pack/metricbeat/module/azure/data_test.go | 4 +- x-pack/metricbeat/module/azure/fields.go | 2 +- x-pack/metricbeat/module/azure/module.yml | 1 + .../module/azure/test/integration.go | 20 + .../metricbeat/modules.d/azure.yml.disabled | 8 + 31 files changed, 2275 insertions(+), 86 deletions(-) create mode 100644 metricbeat/docs/images/metricbeat-azure-app-state-overview.png create mode 100644 metricbeat/docs/modules/azure/app_state.asciidoc create mode 100644 x-pack/metricbeat/module/azure/_meta/kibana/7/dashboard/Metricbeat-azure-app-state-overview.json create mode 100644 x-pack/metricbeat/module/azure/app_state/_meta/data.json create mode 100644 x-pack/metricbeat/module/azure/app_state/_meta/docs.asciidoc create mode 100644 x-pack/metricbeat/module/azure/app_state/_meta/fields.yml create mode 100644 x-pack/metricbeat/module/azure/app_state/app_state_integration_test.go create mode 100644 x-pack/metricbeat/module/azure/app_state/app_state_test.go create mode 100644 x-pack/metricbeat/module/azure/app_state/manifest.yml diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index fb1fae91eb0..68b77a46037 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -349,6 +349,7 @@ https://github.com/elastic/beats/compare/v7.0.0-alpha2...master[Check the HEAD d - Add missing info about the rest of the azure metricsets in the documentation. {pull}19601[19601] - Fix k8s scheduler compatibility issue. {pull}19699[19699] - Fix SQL module mapping NULL values as string {pull}18955[18955] {issue}18898[18898 +- Add support for azure light metricset app_stats. {pull}20639[20639] - Fix ec2 disk and network metrics to use Sum statistic method. {pull}20680[20680] - Fill cloud.account.name with accountID if account alias doesn't exist. {pull}20736[20736] - The Kibana collector applies backoff when errored at getting usage stats {pull}20772[20772] diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index ae34419db2e..26e83c19050 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -4665,6 +4665,16 @@ type: keyword The subscription ID +type: keyword + +-- + +*`azure.application_id`*:: ++ +-- +The application ID + + type: keyword -- @@ -4696,17 +4706,44 @@ application insights -*`azure.app_insights.application_id`*:: +*`azure.app_insights.start_date`*:: + -- -The application ID +The start date -type: keyword +type: date -- -*`azure.app_insights.start_date`*:: +*`azure.app_insights.end_date`*:: ++ +-- +The end date + + +type: date + +-- + +*`azure.app_insights.metrics.*.*`*:: ++ +-- +The metrics + + +type: object + +-- + +[float] +=== app_state + +application state + + + +*`azure.app_state.start_date`*:: + -- The start date @@ -4716,7 +4753,7 @@ type: date -- -*`azure.app_insights.end_date`*:: +*`azure.app_state.end_date`*:: + -- The end date @@ -4726,13 +4763,183 @@ type: date -- -*`azure.app_insights.metrics.*.*`*:: +*`azure.app_state.requests_count.sum`*:: + -- -The metrics +Request count -type: object +type: float + +-- + +*`azure.app_state.requests_failed.sum`*:: ++ +-- +Request failed count + + +type: float + +-- + +*`azure.app_state.users_count.unique`*:: ++ +-- +User count + + +type: float + +-- + +*`azure.app_state.sessions_count.unique`*:: ++ +-- +Session count + + +type: float + +-- + +*`azure.app_state.users_authenticated.unique`*:: ++ +-- +Authenticated users count + + +type: float + +-- + +*`azure.app_state.browser_timings_network_duration.avg`*:: ++ +-- +Browser timings network duration + + +type: float + +-- + +*`azure.app_state.browser_timings_send_duration.avg`*:: ++ +-- +Browser timings send duration + + +type: float + +-- + +*`azure.app_state.browser_timings_receive_uration.avg`*:: ++ +-- +Browser timings receive duration + + +type: float + +-- + +*`azure.app_state.browser_timings_processing_duration.avg`*:: ++ +-- +Browser timings processing duration + + +type: float + +-- + +*`azure.app_state.browser_timings_total_duration.avg`*:: ++ +-- +Browser timings total duration + + +type: float + +-- + +*`azure.app_state.exceptions_count.sum`*:: ++ +-- +Exception count + + +type: float + +-- + +*`azure.app_state.exceptions_browser.sum`*:: ++ +-- +Exception count at browser level + + +type: float + +-- + +*`azure.app_state.exceptions_server.sum`*:: ++ +-- +Exception count at server level + + +type: float + +-- + +*`azure.app_state.performance_counters_memory_available_bytes.avg`*:: ++ +-- +Performance counters memory available bytes + + +type: float + +-- + +*`azure.app_state.performance_counters_process_private_bytes.avg`*:: ++ +-- +Performance counters process private bytes + + +type: float + +-- + +*`azure.app_state.performance_counters_process_cpu_percentage_total.avg`*:: ++ +-- +Performance counters process cpu percentage total + + +type: float + +-- + +*`azure.app_state.performance_counters_process_cpu_percentage.avg`*:: ++ +-- +Performance counters process cpu percentage + + +type: float + +-- + +*`azure.app_state.performance_counters_processiobytes_per_second.avg`*:: ++ +-- +Performance counters process IO bytes per second + + +type: float -- diff --git a/metricbeat/docs/images/metricbeat-azure-app-state-overview.png b/metricbeat/docs/images/metricbeat-azure-app-state-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..cffc6e4ef038e0e7132b0bc87b68b27df29b80b0 GIT binary patch literal 453884 zcmdqIc~p{X`!?);ddhY=H0(x0nypMNO-*pvW@Tw`g}sqvMRln2(X0j?An{^9}r`X%g&^(iHM*Dfyb;h%n% z7cG^Ps#4akc&-LM|9b13OPG?bmN)klUA5fv>dv7GN}_PhN0>r#C4 zqDne(;&}kx_G7uL>B{ojjsI&^^@dhNxYca6XM zBV2TzV%47uJ6}xW750nI@Cf6b17xIhxsOn)F}4d4lJwy3N2&2|My1%8h05UXRW)o_ zS=q!=X6RDn&5f}2?PEzlQolD5J@Zixj@Hvm^x%xo;+>#JT*2Ggs}_F$}~Adz4}E6c4BPT05JrIAPGQA3luKO^!ASoV2XumZ_T9S ztf|ondkMU5WqlbIJ6{)0h+q7!+&b9UX&N6Zo|e=_V9LvN+a1u$0b|Hnd1FeW?GKoP zgSKsUMaE~a0)FI3SFBruk(p#1gW@)}Mp+hWLaqRYb>3#=#v2HzakxSFq9cxDw!_r> z-BPw|e@IK#^75LHl<9QyUPTFI^Ama*zY^?%dWF)wm)|g2%IhC@ z2&bnPr3ruSAct^QyUz2J@Mr~(u*A*=|PaG@|yiN)c&BD-09a+9`c8(xUS?X zOAmCYKdes?Kbenq8{pd&>a(D(&Fg_^8l>5;3jHoVccv_+x~osVTZ2M9Nbj_05k1oO zy(RJY%yl_n9Jt%KP}2Y>ZQIW6EwO*AU{v&Q=-Y~DU!KhH{~0c-47Rd*-8j!am3tED zmRgq2Hl}AIICOCo%ViLPFjBS z1npyk9rea{rj4k_xZ2p*kaY^O&6>Ah{BrhKqvGkBRBHn zn~yBMJCLrH&8sY9m*5Y@_Bzc!KV%v{z}!T&b#&Ap%iTCJ+xxv^8WME_vA$J}&kGBu zQCE6~37LpEL6Cr?rWvlh9XTLtElJ$5TsuULO{veGhYm#-E-dwMDs;GfM@0SdGM#bT zx|f6Ei2M(X^Ck}I>`s0d#9%0dn4f!sxPZkckhwc_2uD^;f9 zyN!$Qp|_UlEF=$Ck-VKH81zAuT%Ouc9sH%F$8R{Shoe|hJTpgY9z_|UK=Ec64MQBZ zsY;GVP=lT7L59JP0@+#oAVCxv=`0!G&R-eHiOReNGVl99tW$Y3bg#+r!xXQ`ICS91 z)Gon>9JWvqHFf^5jMCBY<^T|Vx#mG;3jDhfxET(cf^hTDf&`XYRoJV84pZfV*P*z@ zKO)ad+9+GocJ$Y-8jeAS4>V$vo{8!fj6}zE^awL`kFGj-JhM=b^+-(FE@<3yOF2+L zL*g)<&V$YSwh(ksjazkHuX`xl_GH_p*ZULkZyTU!!V)n~Ox(7QGt8_Z=z&5Ro)Wgx zfY4t?f-2;@|2n$QWtYF~zh@@xxKs`|gi)Q`>ZWJJH_q1&whMR-%e9*O9E(DoVYGHO zwbfyh-n(+ER=M=`|3p%lI$yJ#q-j{nmr(sk30EO^G$1(|Z>fY9di&f8&mfdD+*D1# zb-7c?$kxhfg_t(|0*{tz5J=in@hg@K;tebxXPESR5_rFtXictZ5Z=A)Htc?ozkgPK z#Yl^W0XrLZkh(97gFZR}f_jQ;x#oj;k!}2t&g0U!>V@^hDb+iJo~#u!WuM-yk(h@L ze(i09{_|E|?YoOW{boqgRbO&_%Px-W?SVOz3$fnXR?8l99C$aqekHkH{K~3}KZA?Q zfH}QOkDME3o@ORp*BL#z6jxZ)?>L7R8GW+}ub zTFx2t;*Q=LYw)^kp)u5&Ua~I*s}{>!hg*&tTHuqVYR~z6^W|N_fm96_m#bi}hMnd3 z_xU&Ij?nN@2^?Xtyq#CQEMHg_i|;LnPbm1Gdf{AXNrkV`k+nX~lDP5JKNFKrTzFSw@*Y2(=x7)_ z62A8K;GA9u{~XN$tfvSYrK#PeMTb~oInLmHsNTzNZhpxXv~+XCa^n)%$}CAhX+8~Z zmnpC7oL#6wMStW^AhCoI3)3Y|%P8)1EGx-JnLYB{9Ll3G7iPP|hBIpD`H~D{-yD=| z)z=s@QCMQaF*MPC|9sN)V|-VrQHVWn@dG0}YZCc}P`~ZVg$K*1B3k`4A0b%$^w41< zzdrD$?29uLP3c*AY-BJJtv6S*P2BK70d=5?F*TI3It$n`bTsrEO+_KRSIH=%eCe@( zduqa1e(aU|S1#XXyBAZj_ax`Fk1TghQRABq&ZG1#B3oCYUvX*K@_dvCSzLeruXACk zG^_lj6Wr2?bMXX-LU;6OT7wLVxCWEZ7nYAW7R5NjdUvcXc)eZB=uVv%moUTCY$PVJ z;{5tdPu3sEh1Qs$5QoVZ_#*6d+u(_%?@UGH;vGD4EXDVdq>N_YYSHL^ZDmn}3gul% zkF*UECaUt|MUmWjMMD#Lm}+)9a%Vr?t`M?M?_!Kw@>Wa+mVs|gD?+s8%!ag;cLWZS zId^t^q6?ANU^UVUFw3TfF0LiRR~!Xy0Z zx}3YlMF{@754ILkh(9KTf=tSvGPxKt3Xhf~e6HSSj7SDqY$59DQRcEtlHC2!AiF|w z*NTxU-=iF#-V@eZ(UH?piD#G41N!r}=p)Zu1_kzQIgUK!s9ZL6D^uYN87OVKPCD{q zbX8K$OFhuFzHl_Ct;f<8deme_-M&3NL9w@&T^K}Rcv`{_FZ?(li65X_Asal*`K;)< z62C%2?4>Vmt52|jEOwAGI|03{o#r30+5t4(`@w|80OEuX;bNihnw=tdQB~Aps#XVa zveM&~v?3*&4FeVLIv$G4$jGRRQJV@{6!JsBEA|G9rA@@=Y&=^Jbs_vDZTdB599-N> zKr+8lO||B?t#nRF2@;u&Ibz9iOyrMoL)rD3FAq$;9w986Ho4=Q?n9oGau$~}>N~+= zB(h4eXBFVg327t@TbWFdTbvZ!d8x*8iP-I&wA%2eM=Lvt8Sa5csACa{V;7!3_r}_^s%bNZ}RZSo7s5Zh%7w3=CrxbG*E*N*HaBCA8WL=!Ig>$?UIYX`h%bp5Ss?Z_ zd;AG6US5MbKc7T`v(&!xO#Yb!4f^o?D(Ywgwshz<1t<&FhH%v}|HK0r)FSpRf_EG4<}@T#|)+P(?WOXQ{SYIl2MBLWNh4ym^&u?xM)J42HbHPSgCK z@g~6Dh>Nv5K4lt&B&iFwreu^a2lyJop``)bnc&z4&n8j~>ldIjwvulk1HP-#Uz>oF zs{NLWLcVuYjtU~p;nXU5O1O!Ukz!`VmMLRx&QSX{^fGZrVlDSb11YoueiugLEM*s; zO}t~svJiyWj=xUH&a>RZg25W;bhJPzt4-V40i)WLMnn%WXm5>`j}dD`Es`5ScBfhZH6YO)tOxpy?x`EAMp~{=s~(>a7>xvw zs2=tqug#iBJSKd#@12Xv$AXmAG#>@_TIws7`2H_qa?whcl?TILTuka;7#?MXpyDVU z&Y;>D|C!sp%o%mXO)+KY`z13yau);Jf7avivZ#pLr zDXd0y^GB|G`plE$9~jS{yUr)QRr6$`1gP5P$C;q_eVA3Ke9>}D{ifXtM&LMZU=YBI0;fT{6L2FIZe%tNZJ znj?-e;t9?4E$@+QhbZw=63@Z!z6x3nN>j$13iAdV$965(gdmKUW1{@TrqPoY@@s1{ zYggYy8*qv^C0yb}Alp~dfec=j{*JK!-0UV->0{C{K4!*d#cG{A{%3qBjtX9o{DC@} z7Sos?c430HS!Z$Qp1*bxURRNSsUxhlmb;D!+4t-atC{*7uhVX@i41C`T5v?7{J_J(GFe!|v#1y$#->E&k?=wx$idiOFI^so|&jN-DozVVg5 z{%-G@=3YmC8FyB;sxqeWClp*xTr*FuxF-D25>FZ;sErpw1Zoz8_`bfgPGhS5!^1~2 zx9R4-M36^(-?c%t%<3#azZaSbLwW|blb_cVHYnUTBgednCk(CCg`eBh67E-7IY5pD zDA%p5P8zwF;4_=(B-nrnX0#)B+bY)tik(Sq-VP4wJASC(yZn=y?pPdAZ1Y;mrw+~XZ<{xIHY zff@scU!-HqwH|8v$xK|Rdzg*v@YN111kBDnZmhK4x;=V;xxQFpi9kSdxaf+Z<|f6k zmXxGkO!yoHJW<_L5TE}$B2pX+{pOF}nr5a>rg>WUJxnHWXIBUWZx3s+PvHhof0eJxU&nK5rw+uqy(cY>oE28 zw0LYpwqKTpc!_=IA+>~kp!bYSqF`x&en-GJ%Wc*kw6H%Bi`XnP-~Trjt9BfxVNqbM zs?ksH_r|Am;CPHG8~O$8R)EqQGR0vdk8HVe*&2hpZ%wG%*@yCkrRSH0WF@Vi2kder zDB487WZ}(Kco0yJW}tkKbE6E&eKlUWTZy&$)w&`LBV5CekRA?ImcEdCLN_M%!L$)j zi@qC0BrOcq<9_KiuP#u1+bj3XCXnfo7C3Pnc0yG&LzV`hFEBwL>Q6poj0Rx?lAO zNfjAQt;36>AAdGKNIJ3dE*tS!C7#!oqli!lUnLWyJRdRfX(p;sS$&7@O|Y(!_6dG@ z{c=uX#dfSk2w2ah-@o>%&eUvmN(HER!6L#4ei7Nz>g2LB-^+B0pqJx$ zp6rhCLrn?zo#vWyj`<)1b&M>iyz8B(mSFxfO}wXDx_2txO@3YUQY>Y-h+J&Nrq|8t zTpLFN;80cVsYb#4B()HgJQcQeCAShVXa>DG zM4Yd_mqs=hLcHBCf0svh4-6b?&q8~~I|)#IFa21Elp^jk0$U6E7T?qyvDSF-|FO^n zMb4_fCi*W&9(A;;0I1hf-VqK8yaFs=^qWUEE(j%j%5x7`N@_Xjx-$$4lnEON!6rCn z0dF!LSu9pwDtWS8Y6%B@qGyIDB#`1Q*j1L4a#JmWU-o@9uB*C^$u#QUL#qFB<)Eg%+(rl9q^gKdggj%3#^Bpsqx?L}9 z2}0s+LTr1}6|{9Tx2N|g{v)78y$Az!iTI35! zo|%Bh8{wwyY3DHpiU5--5h$+f9w%@;w6K`b%{i;wB~?spj0Q-iPE!-@#djR7HDktem{0v(HV$(JHYQr;G03@D! zeNvkrY;yZ^LuMW006_3Br1Wq)ANFuq^>1h$Wj&nl%5P|j1$4UkW<&?CPod_dYo~-PHc*~M%v(8<`J5bd8yw5j-rO9Dwkp;3KMFABMMS$Q@b z<2_wZ{We-GaZFk($}uvVXy5FSeSq8EDT(n|j#^Y^`}_NM?k-mA;jYVxICh&`ojK7M z7&8d88FD>MK{(ym_ibDun`A-eeop-Cr1R>uWa#6iVl?6({{6 zGiCKuFTcVicA@4B$kpW(>4W z)y1SD(LrESCa&En9%hbe#juoXntM0{=)55xPGl~{Dg4Ye=yrmk36)mTc)Y1G8Bus_ zaLNmz(OQ_q<~XN#0wyo^V^B2HP$2HN8oAd$NUs)Nr>H064hF)8L5oQxuRWxmgPaQl zuNvl*&B$|hBuWJc+NOSasHfcH3#Ovkub5bc$>fHr!jW#T&-&3krtgL!Mbsoxrp@Yo&nqN$UGSedij7kCW@ zP_IY?IXRxy{n8n&!asOU>oxN0tJha9mlqxl0*XPG5lGeI{hSM;5(2c+hLce!wOBKO75ee|X0sWjD$3Xf-5K%wk zqua!C)f%s+L}c?5w8Pf;M)&dpgiTC-1(cF`d9=92c!abn6|%NC;S=OZ?8?~9d9qr6 zSH3j0QTpL}*vLXG*`4N~{6KKqBP!beBLM65`yHb>dMmMgCX-4b)lHSMkUK|n zr;ZKq9oRcO{b!3HjP1R*v3t6q$@>g6-&zN69zvVQz$tP1PwWw z1580Lb5GOB z$#$(_WU6KJjmRAoI|1JVQ9`m03W9qVxxt^h0su*~n3l6o5i>&AOSp|21$;E70Dp_$)wK>1H$ z0nliqL$lVE9m>@E$gl^g0;MU3)ssGl5~-P7Azm%lu*O2ihB_E1qE!U?c&+z2wLWLG#aDe8f$k+xIq+NHqM4%=arp)Bex) zgj*tVn~9Nkh(Z19=58jOdKr8Q1+WU%u}94!%_zmq%pCHdN-x)E zd4+dJIAsDpZHAAz0KMR^94zDB4nGG=5=@o9`VfA}A;d~~zs%~1rFd4YFwa~wRswpm z^MXq3RG=R%GcWU$AfR96354JYr_+5A>pxgp=c(=GjTSXMguL0_p|*#wRHkOZobUdA z3Vz&~>a@J(Jgph{KW60ESr6No!Vp@%1~UG`0_Rdvn20jqmBi8mh$K}MTM+h&8GfnX z1E#=g*YRG|DGc$eD)(7GHINSM@&3~%VyGn)69Zm802G(YQD)MbRpsL2s#%k!*Jb&G zKR_0NGlsd0RNthRGVRHsEs>)IDV>z9KS`mBXxbp=wv3>L;Kz$i){( z|K$rm$e9ca08mRW>Q~zkgD4f~+aUmvT`gLLTy`G#&{zqHp$dXN#Wsq>NHFy3jx1KQ z#Xl!$9-2bG3%xSD$5RxvAe9~2FccBnBYi_qSB$=H?vuKCczCW^@1@GGGn6$UlGH`i z@dPKH1PB+X2g7?zOhc6gwM7FWSs(1+hPqHFVpg8N-Q{;5^NGs+T4 zU+)e(2X`{})1Mvylu7;yqI%=Lh@*+fGAt=VK>7`2&!Vb)W%X=%G?FWd_kP#2b2*zc zw!k%DdsJX6Dh$wzQ$z4;8JV*~MO}|Q;k+A}ncF(}C1%*_&40bU-A}Owe$(ORyr%n@ zoGrdmnN-Q@&+zK^r7~Fk2;IKl!CHJ@Z6Yzc^caFdU~e=mZD^c9yqO*H5#9j(yhXV# z7F*cY0zurSPoC7x0T{6ZDs> z>JE6>0T(S&yW}+9PZdioBAoiYR`fNiYL!`DQT!L< z`cK^$$}ZEXrOZH$LycW;-}W%Ari(F7{z7@R`6ct0fB(+!jGo*z1wkjHi%s|V?p9Lz zJ;$4En}5heOCiWK{QWmn&_FaZeS*pve>*A-+cvgxzx@iFxdBp&UB2pp+sbd5t-0di zG9HH_GERp6kbV{X`}|5T0=O5NQh(^12;&MKOgF3iQ%Py9%>?-qao#bseZcUJeQ^ec z!FXmI7Tbz^$$R8pj!$ie@rv*ilW?FEur#fo-FKT z<#&Ubg$=)vK>smaxK6>%lMYTkiF-D6%l=%a-49m&k2&GCemleKK3MQKtT))8q_q3OE6FBEr5odY zrLJo)<37dwqldB6pTRKOxcoo99ll+fKgIO_+xT7bzA`wj z<98*cXWN@dH}n#b&^v!Mnfm{)lL4Bx25y55F~rUTD~)YDyT1$@%nI1eB%u_2~XNXYN$qK3EsD8t=UG3$T&u~PSc+c)6D z3rSfT2*GK6QsL)@aB|%*M5SqgQ4YF>se-3hNRfn&oJ@h52AK>uAG&Q6GjJ~V?(4Y0 z+lMR7&KCfZJ_FT+Udfq>UE#+jn!RdX`GPZo8<1D*#$w5KkvT~>dR0ELO+p#0efviP zTYSpGucfN&Y&<8v51)WJ?5+U|wNRLXJv*48K7zI~{V93;+~n}RldBrKkkivzHIhX5 z8YLFX@vujpPW_XXj3kSeY+58Jm1a=a-bC|j(;*1bRv;l%GPH>HprHCSUDS~7rT>`- zb{JZaE;i!g^=v%`;>^dYyXc@Kq{ys!s#D8nzI%OQe1-7%)cCR}%WK;!eEO3!YknWg&*1z4c<;dXdRbe<@cWaO2iqkDm~${?CZYc`NtG# zPkIPwalg1lk`){~J#RJFd_daqxE!iFRX6^W2gsqT=ddDu?o*RFUdCV=WlFoOv~fF0 z`1I1q*F(7)buH{wXI^Hn`uF$o4Wh?&&@ZBW^y+2?B)4YV&JAsMi!B;Z`(c#b&NJb6 zC^ZrMg0gpD##*1KhrJm&2Qq3)U)eb#>U@8>?oIYmU9F{`I-lp>lyGw?H99FOYy*iP z^WbPLNGrV}ih!0!K(L?PM^Dy|Evv@y7DcwV(?g^W!=riAAF53!+K4Lre@uSR-O@I* zk?*~NADR?&VQNR4ecPG>$b0(pqMTtP0jH<^w(;zmNESQu4m_T>DJrK7;_{^{+s*(R z%M8B-lkf*BgI|wLA4xCT$k|`g=%V*5v1fCrTZ?GZj_}HEVnoeY+>ZEYKYk{l&MWSX z4;i_$EV)d&2>VVaG%()>SBG3p0a@sHXs5^ccdG0y zleAQc2X)krfC;6UR8-hOe{d1=-uxy~4<3!tcxjM`Y@hG(8G3hD|3;LK?n&X5u`x_5u(b6Ohn9qtMqCf*i| z)4N0h6P3(gxx_2e;AO`xtJ980zKyjgM7c~R7|L+Tz*VZ$9`Wh|JVpiLcWrE8)sjgfdZnd%+c&R?Z;3e=JAW~I2$c*KzIs56g@aIP;tZH~wp#b2}V z!8X=wziaWX_)R!)psD0!HdLyzv>RcRRlhRm-pD3S<78KO4R+(nf-VZvrxyKLS}oIG z$=r2bPZabx)bU8lRQBPJhWhy#<=CQ2isLC8?|QOqyO!ds9X0#sQ3u=-(bb4`deLaz z>}_r93Al8o2rS-C?%Ks6C+ILL4j)dF?8S;eeBmBkkh3|42#42u0VGUyDcvW}$D_={Nee*%Hy*7zZjBr;o_YsQ@MP^z zL}tpeZ>&g%54AR4rf&)0bSX}6)ma*jj(fh3DFV)Rtg40_;#0ex0;%NR-DtN7u>OhA z^Js1FBKMjj*NPiwE?#r|ogYP6iTMP{z5O-s%;W^HtdSQ6s_FVEb*=Je{2>3yNX z&6|Ce>fHS>fiC9bsV(b>j?MW&w${*k1J|sR3>x&(LF8TLgLWKFL%56O$*Lk;%qU^I z?_n@ zALjb*yws0%tP9Kk$Kh^SnRA-z#VYeqbH+PL{}5yJvsWDI@UnV;{>ZG%yjKkMDDSM0N ziYKy~D;7^b+%a7+vkaXRH-OvNtCBiL1M~<1H%@5J+vUnBgB(`$JzM66 zS*yIi?~zE~0O|PndYsXY2-X}qH!bqHCtPWkzH9h^x`l8hTDk(M*)+{L<5yI?rxLSN z6ISqKWL%MSynJlF-e5e-KDl88+>s7F>)mSIEJIJz+mh7_ET|)FVZ|-<72hYF8Q=5B z7D>-jS~F5z^u2wvhBvvKr`kBt+A^T>_#UbGi$Sw5O<2J<95yt);Yc8GCgM~XuIo_7 zDTOp)z0~J{iFHFKDrIJ7XkJG;IorIX90p&GAI(Z-`gp;g@J*NzfsjougJ!AI$9{@a z97UZkwRuONEdksYcn__>k*FW4e0CkStK;2t=WHE0-Z?ZpUJ_HY%RI&|YZ{_uGCsXK zklx)Cnnz^+672=c#py6Cht9SlDIUD2Q3rAdF`isANJKa?2<^n`_0{6Z)h^z;%&Cem z{9V|UdvRQMPWx-auK2FR=j-*q7(akcJg7&w+&2;T?Dex?-TI!t@`c$9>aR#o7j+3T zCgXKDyb(P*sS^*A<^=pGT*N-u$NhXGg@)#EOn*W8^^vO?na4XL0xpOF`-Td(CT{bIcyJ$ z(}B(dM~=qN5U)6B)v(?66YL6fOx(hJtb^}18ir9C#S^d}#%t_bVe0A~igN`h}L;C}`+h9=!C5vUB;DUA5_t#2Eo*6P1$(9>l8fc;jy zkHaifPS0$a_9vM;nrt3tQ>=VE*oVt%tlE^G;S!G=9!}L8_48>J>?^P^u=Z_TA7K0D zi$}10YM7^5UN@sya&6StUZIWd1^wvEqP2^p*fh-aO0L{8H8zkO7+5&QRPgFZd!s*4 z_r^bSDPU;Qn%!x}IF0f0zN@hFH@oqZ^vI^f;LcgM5k^b&7OupxIwl!E)Zk#0^~rhA z;x1r}(xIW(bM(7&U)!%77FSLOFU{Qp(yHx9WIZ|5UCS@;00-Mikxe}ddW|!*s@IKl zn|a5s490q$)Ym(o5O%)(D}i4}(9N+N4m+dV7{or_m3>Aad0db^HZ!Zg!=P8jCL{K0 zMGBIqUUQbeoR54EB}mKS7hkF0(SOki=vS5lF_7*#0H_MRKTR^mI&f)h2l1}q)fR?4Sv!RB-fLn7<^T@Nx=palPA?&&%hvvf(X>Z5k@f+BBGsiQ z#Jza9X2!Yw+p{E3I1E_i5%#Xr))U~XZAnP&P@mQStMP8B)I`DlUTAL`7y ziROWcaRUL5_tVfF!11afOV-0Qkn@MS+Gm-lOob86w1a$GNA>H0y~JhTKij3 z$}>4ibepFq!)({7VSqD_tcm>Ptz#HDV?vODfTHDU?n2e7=N8b&w&eE|xdr0294FFd zYO6~X!^mW0`#Fwt=ky&Rh^s}WhmyC1pt9>BS&_2JFk*}#=faNf;7=8qA1^|ES{9L^ zkB!Hoq@Ruwwfr&9JmFz+k&0uf{Qmq53412lEVN)DHnt=#e*Y4^qoD~%o*CFx4W8Ne zySGGvmycO2R7VX1hbqSF&ZkC z10tkbcJUi)&3Zwvf*SXS{IgE7BbB433WK%mo=3fGAce>dM2`!;QFJ^h@w?>2a5cBhH$GV-jOaQA)Bd2y((*&vhXu(b@Sy0mz#{>^}wr)m}EfW zt3M4>uT_BF9k4{T` z*OvIH@a@`Gx>UXmEv=Ec4(2M$TqWJ@L;5)E$BEq#h~mW+2#$I6(0Xu>V;HQ3(o0X> z;^n1=>xbF4zP#X~KfRHN6}G3Lx|!@Ro~%urMTr>MrTzT{-Ugs6P9-6g+vYakMeT~N zaWKR&UrkS4Zgn%XD&+A^Bf#4dr&lRG98;hQ7NP^F(iG26+n*;)ghLv0sL zeD8ld47DkGTingmJNZ>Z9~Y2JH4|6fx@1+6p=q&~3-&c(^hz^_F;bSNb7Xtf`Z=I{ zdkGlH2M^GUYQs^@hJOTEjf&Rxiq5un4)Wc|;wQU|m~P_r9@enWwarhVIJfvO^_^QH zG&ja9E(3XpDKU;V^xfi7QC@yF^s!yL_D!Z6m=;;E)&Qp+dQz{_>cIoouD6)DiHg{QUnk$o!biBZ+4XUBzuV08EdPruvH|wLs zN&2Bv-ZgM#bn}HMZGeMH3ea;8BoZPvz+i$}=Dq8JroSixo*Uz&FX2VP^4|!ZS#D>2 zZDYzp@ZX{+3mT~hz?lPlL!0l#rnyy(=N=)yeo+}&I zR@fvVy>RCmLV^`pcj?7z4qM!|DUZuW1hqZYd=b=C8GL@?1{a$^DrwRS(Rt{}3Mlbj z`W8Re*XGbIjcRJyY!st?e7f+vyI zX@KqJTSRsHAFK5+(!C{DscWh~ufp#KklXT;VYdH+ewEI%ve!Gisw`SE;@3yE-5U8? zL6qYP^vAc1UHl+E|;)6d5d)4-^m1Z6KvevDH`2FP}AIo9ji7aXm@tQDj zLGIzte%PXw)5RU};*Ff)&FcKEI=ikVXZpc5Q=AXko)x9X`UR(x-cyt|+C@E@$NjcHY!9$6olNweoInQ+`)_m7s~(qr@a zOv~XPPmcOw1l6QrH%H0G^GlOK9NE1Pup;)sM_b1$y)T%+iG+2~W_!IkUkz4g?pwdPmW1x^%-li6#K& zHXGrX9MR@#m|u{FUaJOyDd?)>?^V@$>?VHvx}u3B%!sMqHc*(skhDP$#KbZV827Ti zRN}2hGL}c~@EFb73)$z}%>|%-N8=w)%hia+-&!rOIu zboo_o{EoS};$g@Ednd4kUS@Xr8~u=y;o!ubKT{JW_m>c7$?JVx<|GVehwhyC@k{L_ zB(mR<+HbN}=0SBLJ;)92B?wIah-U%*Qq){s-+eg<+%MS1BRcx{Vn|kxy$56wv1qQs zKXJ_Gv^p+JSSVyR-&O#2#I&%zqH~68RYdSGIthQYk11>0@0B6k{);%y)i&4}mWjh0 zN?5MjRU@pKKS1~x31azqwVO-SqFl1T?a7dM9MCB+v_3G}c{h|08HmEIA?NP-Y%yQy;(s)0JaGVs15r7h!$#0 zZVmq85zwNvl{NXEVdZ~|=j#Hf_@B@}00M$Twd+WQ76%!}19Y!bHXk_z#bHUy zfDL`3)L(nJBZ_W09K(qPJz(8jf5Tfed_H$1SBU%_R?lU~QA{W<&n9RmfaDz#8c0F+KJ-Fr)&);x zhKWx4idaC)!KPYrV8Vv-YoC_uuiKTbm(I$+KjMu!B|dH6g?050-!fF$?ofn>%nJ6$ z>LT|@8i;Jv1^-5Rv|D%P17;+m;U|rg(?EFZx|NgpJTsz6mo|Xzno93j*XVg2h}vrc z2+(Y@Fh~lJ@7!sT;hc}tOBL5@*jev_^d?^_#N~N^s0_%-yi3!r1&mBzlSZoZ*^|wh z3(-|^F2&6oO^5;Y4H&qno@ht;U+leSR8v_SFzUR{;HZ>wEQko$u+bC*q^qb%5d@`4 z6KP6|5<&|}R1|C!=}3uyC_NMb69`dJ=?OhRAVDbs0*MfkKnl4hPI;Zt_q*$^b=UoM z&mUlM_C9+*`)T{B&XaTbyt2bgeD0*P%m8a8h~mhcIyM(`2Gt8xH@RfSj-8!U(oAI6 zd8uDr@>A!pJowmBnbdisTykVs5M05jRwF)bpM#^YIwqD`hc(k^;|({NmNKl*TfiCe zYOodisw>@9z#+{JKImPX?HhXH5ufoTb<3QdXI%UDI>@t&;Zd5J5?olBKY!Q7z;Hj* zmQ03TIV}c)16*5hz)&Ml^`&HnI7qL#m1z+wGhnNGw?t`f^-ENG?kG_`zO69j%oNQW z(m7Sd22y1Pn=l!R8$lH{pFAr^rUL2%?rCqQp&HMomfv@sshw}a#1S`o6=`S5&HyF{ zvh8*>Y-@yMETl>c4E0oqh9o^F&RlQ8q?Q+#7{8KMa|w|znd*WiyT0IEBKAeQ2FB;F ztpzx3KEbwsQpvl()g@coU*TUkw`NVm)AF4I0UNP+gvgfbXn$3-`1hFJit+*_T4Vjn zbAO$Xw_ySE)-$vQwe_Srr4g;VH!l5JWnL$=yj%%M!Y&WBA(hZ*7dl#_)5)<;1D~56 zI1MCAcOKZ+9Ns$w7^QM_OE-S^U0oBvwXu4$)lg&mW-Z!p@vc-fLF%4-wbIeGKdm`& zb@Zl#v_TV)o0OfrlD(4VzWQmXL#vxM4QYxS>i?nFuxqFZ)2!s%*%jdAy;~Gx7i~rBD26BJD`N(}#axC`ncWWM93q%wBu|9EH9(Mb{{2FrM zcdAR5!I4r~g?~)erCr>KM||gapPqTQN{+O82lzWh;^+TMf9LAum1(c{$W+<4@d`Q2c4lt!=FhB8UB9>1-g`mDJZMKF1E? z@*2~q#gD2L%~*?;3|s^@d&kb@o8;uua3ORqS^xy%#EyYBGt`p9XFzj zcxI6HL9Gb5iVX&zpOt-DP+M;8>-!z%tnhjP zx7Ak7j%fCwKq-iRN;6{pAJbFh`p(m9l9npUEmvnxvd#<*25&tHe!fHAHMe3VCOY#U zJSX&y{@{2-FTUFRKZlGSYr<@mRy7Yi`NV&?5-?9bJHKRbw=wNkX#DrkS@Ry;3*>tz zbk6i_C@S&;X1=x=CY8%jd`I^9!Gab>fXOk3b0kU5*bu;e@qeEB>*aQuwS7QT5%8bS z3Fz0IMHoawzF$oq!(;iF(ZECv*%4zZ0ka5lxGUr^|*s zjuXj@uPfMHeyMfkQO&2c?^nMouc-;M^0H)Nz*J}P%4PV-NoTAD2e3Zty7Pj6{dMcckbV_Gih~w!LPguI5D2l*vZ`DN8 zXIjvW0;YgT@`9E@!)@xmhiaF3Fknz#cLSlXWxfq?4=*hq*-VV|5evD9eFwNRuT?+w zEyBz-de6prwJowt3RGWPJxpd;rcKr>8LOEWc+yQqy{K^FUANS8qaRY6mCax^$vfLp z@_PGih+AGO=e!Ur3W}5A=#mXjmX%+;xc>tb>_vIdR+}9)Ibyl;;6JS-=%qHAv8t8b z7ehr|1hujRGpLEH?*J=|*UqXU6Z0BQ9a;~Cr*M|%^sEQC3-cYkD{-Tj>vKFzI*2#) zHMxV+G`)|k&scUM%>T1Nqp8{QPTg6&dj82Svw^xj{1+SNZXH6nkAhJu z{a7i~i)uHMA62!PxmmoQo1M0FC}Z)0_nn_8271{ZjO2OuG{>05iMUOU>YN+cW5jv} z5$_q00>8NE30Q#xU{3XEUZyy&1A8gog*B{M+AjwbR7nZ49rRk5hKRjnY{Zs|q~U3n zSCyKY{X?~A=WWI=*Kbcu%B2)1v|}E@z`RzMeD&wfI7^yZ=%~S|0lT{l(*81el$oR6 zFuJS}?CExcvc){oNOZ9QtAaP4QhkK-9d8d}jH<+EjJhW3T;|S(5U^Gj$#Xr^w2!Ys z<8&yGt9Pe4dLvWEovJy*u;PL+uO*!ki13blipkoqEel z9^<#$$KGgU@QEM$_cAA~!KB+H-{Rze>U9`G8MXV+kj-b=K7ZEolHB2qQnn_lj1JzI zJSmiP_72fPywbI)($?IX+ciz(bgkHIkqJJ}A2y$=G+kQWpZp#iRx?$otboEP%oz$M zi{dxti}5zEDr={hvNP8QzT7(;&UaaXPJVgfk(&mTh0vd?dPdhMby6(x_G*)31f=W+ zES#j6ckJ~^KtRV`-mAv4`HdQ)(2+*izsV9%+Tuf`Xx<7%$qKQfSL|9;$_rD@<2kKe z05wIp7@QrfBmq8m%U~_zoO+Vc&J2e%iCrPL5Dvsr_%OcT+i5+tAsEsbS32;t^e!hq z8}QweJTFsL7pKS9=B<;9S4lKs(A72%K%>f7FZX!_BhY@4-a%2rfDLQ*)}%|QRZ2jm zot>s}p`^5J`IA)fwbox5OzH^oT^JeX;7J`;)FX@+vpvs;O&j2=i*!{ z>xe-k9wwaji5U!GAoT~bbLqEv`GM@$Q+hHhE4!JjJP^JG#+Xt(15};k18O!{TzFJ( z&y4$M^)HD}3~fJ3%B%GD^e7Uv_cP(m zPxFPz{3@;Ugil@>b*qJ!6gBz=F74;psU%(>7t^KcxT#BqHC>NT@QF)U2l+zN zB8bEw zSLreW)@IQTe?JR)^Y^Cr?i^!KGfX_2S$bc7K*dd11r}xzeMfAQN)$otHR#abXlCT& z`#XY_DaWnFBwV*>-gl@AxLWe*eR_O>oWB9gtTvo5K9_>Fj)$0jynyyweptwx@Uh!0 zpQZX?b-qB!b8uAPB=#Z`U{Ox(gipT<{U+b+M04o3tN3?0*iZVFO#r>LifgWOje-EN zA*ZRJ7#(I7)u3tB|1N)|c7}8AglRNbHeQd=YH6S?1cS{|rPvb4h=<#Bjc`((X?v(N zO!mcWnt1BuDg`F3;Z@4qfvo5j3|X=b?>^*=9AEU-LlKA2-Nf}h)Hi(nS;9l0WQ0-t zrb;(}rL_$&2qxa%yJtA$m#F{Qp}P%#!HGVJ=+(D$b@qkVW{J0>K9*uR>n5X zhLRCpD6wQ{s&OCRaUho+!)+a8k&zNPi+j$ou8XIppBb%b_CF# zmCrtQAJxbh>hWoF1-;SKnbO_NoJ?o3QnH;22rb!Fqv2V3Y`toGI1uf^#ips1gvdRy z&Cr|7wXd4wpq67GeqOwHkRIxaf4Cm+zUTbmWVA-LXNwbl!9$WZ(4G;6Z$wTW=S{RY zQwJUE%_bYbj!UowDVkmDNgo_q17M^bF8EawPmT=e1iHw%htihp^bwRIRaZ~_QVYf! zj%SfLVj-P3-C7gf;_<1i8D|nxI%gZcV+fgZ?#_gcou`SE8g0 zKJP?CcVuQC`amr9qBvt?Z+qWT_L#gR6M`@b4-P!J{LJMJQ=_RM%A^HsC7yCUBCa>a z%*{tgwL?c)&@ZHeSFTan-g;>SxT6>=77X3wRTTm-Yt928GL`G>m}xld;(pV^YtDW2 zICY1gL*08F927v3%p6sjk}17-6gV?qW2ApyKEB!AUJru5PA;Bn(J@HNn1Hcz;;Cn2 zZy@7e$xN|3-sEX7%_;yj9U&nX$|jvzHDiXLC*W9){)e!JJi7%JPIYOdcYoVOJergJ zS+a8oj96NDOP_~w$|kv$zc5U!xo@U<3kRr2W#@Lb%brrPBr><}a179REQvHMMlo#| z%j@w?;_JC$+s6%4r+lv6(&ye~US2SWUnSlPpZkbPXkb0cqUrH|7F*Lf`PO}K17k(o zNH!%=P|O^mF!&>-9mxSD-s#P}?qiIatN6F!;#oXtbfcttoaN`ExO9~y*6MLo?+_l{ z35QfXmYZ+Xny(1VV}>HDO(wdHRuJU^qq+dT!S9!5^|!&+y)G$#%A1uPz-Fmz&LS;J z-P=*`bDAFII5Z#$JNvq+<4G>#E@yY@&xF{z-jd5A-hM|I0SLowI(xCaBZS@r1enop6_G>66fT?t)CT_GKIZc5YzI4(IvgOQ4lU%= zTiBD&f7a=vI7;an`MgcZ>)eGFvVQxGRqY?0Fq#XLx{-paG#gk^7hmHxCLV|H2|2-` z_0xv+3rjG~6?Dgy8&_ZOx$V_-PK}8tzr{iZNps7tGc!cy914vLvnW4Zt0QtJ?Tu{0 zO!53pjleZt3JgqT48&k}3FD*u07Q+_*rh{%H+_=C)X@og1Uf>zb~qLjKlQo{zxjJY z@Bs*c9{({g0k~J>rYRbuc;l6hxoL;w0EZip+DbEXvO9f@)Zku9RnNCy)Zjh+RBqx~ z>#|j=)qV7(-LjpkKK4{j&re0hWX^1Y(uH?VtmK3Z*66x4v*OGd^uU;-`g+#2&jNE!Z}Ty&3Od+)xthxPS!!QyHtM0NzjLC zv|vw8npJ{6*jK-sx)$1^`U%FuubdQCT#1EBhCoc2VG+hqYbq_z46JoC*ihO%eZTxP6p(k8^o_xC&ayIT{zp&!fj^zn6v?^<3AQZQpi1RV!FWbOtN8By+-n*u~ zB-Ar}`X%dhn>E)au~KXrw4K;1(b}B}S1Hp}l99tKIX;!zAsAwUQGQ}7*+^W#6WjP~ zw->$H%t!k64+xaTQ~~Zl@j!f_&RJPR{As4x!b>QCwap|BSZ49EW+aZ3=UTt%_SUDH zM`K!8|M}fOn>f;M$C%YSk;4=tA~BQ|L-jSoyTUcHo0(QKHva3vGA&I%zP`QKX9GGj zavJ5%IQqp1Hw76FKm;!RIzyB2$UJ$4;-~V-k3e?KYTmyvPTFPLyumXQ0dWMe$l>d< zP)T8u`Hk%P@tjNsYpi$HXK1I#GiI3nXNj{=;hIyPM|9tY?`PHTA}=K6M`5_jG(?kX z`~j~fOih2#>eZB+H@s?>!d2WPBPdARoB~F|I!jFue1iq8FLSM$0>ZdB8!)IP}SRQ}vh23dsKC`>}t~n-BM{;VwPh=hkXgYX((7|=(mT#U>Kez5}-23efJwF|y zZZETQdHh*&DWhMdSHqK(d(npKhE^Xq;*bRnfT*sUYQcs|B@fYH@n>A4Eo8SZE<2r< zuz{ai=b-_34>#mvh3gr9(>mHMwKMpmt`PeQmQjv%vj%mC^L5Q#WZJ=r+Wf%w2GtjB zTA&)!G`-~G=hhAVjvd%Tysk0}PpAFNFj;z-{a_1>e}9Cv9C>KbRcdOvOl+gUOZ)V# zmicxU&o4PdlTrW4pzic>INMIk!wVhyC))g}l^7y9=7oA|PTtx?L4k1dTCc8Kt9YH# z1Vy}H30FI7DXoht@NYfGiCzOkAroUaciy05*Jja-j-H^yBIBwlU8%gw7lFK4!BS|f z_5~e1?I77`#F>jArv|1JOa)p}jVA}VsojLfhoRE!nqJ^Qs~)igaUu|Ocj zF{AL3nf(jH=1U^ZxDeva{N5B2@dCKL zkvV}mfGH)fpUv;J_5O`$Rrd?0mo|I!4vC~xlmg-4p8#RWrj%xr_E)cTsv=<+nJ}hQ z?93P2=M7D>k$t?re3l8}s)jiV$9xee7N zja-Jub}F3Vr0KR_U+)4}k9xzNa$8*uU;OR?zNR0Y-t2ozU%Q&+QK?^bxWMZC?T+4D zEDwl}#^g=40Rb_MldA_BP)EfEJ7ycmN3TlKxJY|O1bn@l$?iHiX6>Gl-NVq{4Zq_C z^2()E76f0S*CYXs8oS_ZY_+=jdxuw73r95dT^?qk^2IRb+29cQq{2^zDbo#|lWOK{ zFCqJ4Rpbq$@Gc`|h2PlK7reykzuHb({M?5vsiAk6!>)Sda21x^Sb1P(&Tg6Nb+!7I z10V9eHK`3)lY%xhXsYI_{d0+}k1?wu$JA^k&%S-jWajK;MnD>^f)%djcvKP2ZxN2W z{wCx&Ik`5SBztVu4;dtYI*2)=MtG5K?DW+japKDbmrtQjJUu%SPU2aejQjg?no3L> zQtIPhIhQ}QKOPV9-0ERfiu3|M9>84`peA2aGp4C~-Yy78?*>o0=slC=8_FC4VlG~u zk19NWU~;}PBZ&4|d4}_lqKk%kz7TI^lg+b9YB&WT#AVyMazu@DkDH&&vr&QRi=_G=f33K}hwT*&9C~-vK)G*G@Nwnf6CJWA z9)aQB*G$)yL=rhto@isw+wKRe7XuL)p>OI`EG`0;Q<8E%f3Lt>FE(v4HDx}MgG}B1~w?}0SOY41Jj;QZ3F+_>GPL;iu)rr&V z$WS$uyllH>S2Bwu>rWmpvTmW;hONek3T{gp;Yyf5IBIu>gMWHzF zA6T77#D{^TGNq~2Yja{ch=QX_L2~c2Urk+`_KL_>i0@Qy{g&UxABp>hAVLTdrVDMnk2t?=R;x-p@+hA7w3Ha)jntn6Xt8*RSQ)iAUa( zaF~V2GY-UCwkG6lppMMW2Sh|Uv3{xgGIU!#q(Jh5?E!tGP=`94_|ps(#fZR{)m~4* zd}x03D%YH{Fk=%ufad$>Dl5!qjgK=64wA1RWyFEadu0VNXlJMms}nmzA3{f3HYAyE zEZ|oeetbZv0Zfupm5xCz;mQ!CUkV<=ZO0l@&ylZFw*$hvDxg?@hfJSxQVmKX*&SSm zUYky4r6F%1dy9={yzeVVyw<{tu2xWnf=WAUr)p|Ab@`lU*paD<^3ZawGf1xtb^Bsf zz|>y6hp@_1FCLo5BXbuvh|?lakDw-cRC0mkSR|ui+Z^+Cj|)~qeTiz|8XsXKtq8SG2S*(1bdu?F zvb|()-!GtLfd`P8>G8cY|8Xp*et8W>qopd*Q5kpweghR95?DVHo*jn;WaI7!Ozrrh zRcEW#)QSR9{)4`kSa5b#GCKAjS!&I8_XC{V0g)XU86LC*SoWzYgMgs zv%!cEV?1H#z$e(3QP<>JLv1cMW4<98)&YR2^6CSui}3lK7!m$Vcfq<$juM?aD}QL-PWKF z%d#|e9lik0ZaD&ZhXgc0M}(G1%R6ku<5Xf5RPO;^<1ORP-R4lv`f4QvsN=TtXn9(U z%eG*T7zj<#4-W8R+dP?ky}f{lk71<@ zAVoy8ORl2dy<$~eYp=@-9k+VpRPu#%wDM)oU9(+#WI}NDWent0dt*T3Pi+-HncG&L z_ZGI2UyQHjR!!V0-#+UcqT{rm1BuhrBg)M^gu+9{G+e6EBvTs63tYqca}OJAZ*^W6 z90l*&>ysyQu(zE7yPD_8vnzXC;OWs0xzpT#yJ-(JQ)I0gO&xPa4M?{o`i!=ZZatD6 zplRZ@QnL2+I;Tz+S2DSkW))s{^HQolJ&SPzl+yD;-H}GBV=Qm2io`G>S6*vP!DC0E$fC-7YOA|FZp;C&ZFj-pe9W!N_#w zBl|{W!Cur!YWgZ=BgX0uGgP5>Yhqea)C2bM+elIv&SZFxr-OEw!qS3ls_V24KbUrf%+@+`JqKFglFQZ3v-;@v^)a(I4MfS6z-hPSArRf<#n)rZ-lG6RZ)A)H} zhO}(ho~Bo-p@VI*L4LmX8x25f`s5lPPAO~%pn3F`H`@>dSA*iuls2o-VYat#+Z$L_ z`&J;3p6_*t$qjK!tH0zlFK_S+8C$8o9DUEJq(18oc)sv7q24fF4n2~~(U@Xpbyzy#p38w0G$Z5m7rfl?s&=F5OZtd>^$p^gQYTZTtez4G{ z#%j;hcDdt(xK-8ZecHheb=XQXtq`Dep5>sSTsKf4D5to8w)7|KwWTM? zYi!dcB?3lw-DH$Jtm#=e|3-X$47$7N^_s3IR?836z%{`e<>Y~or2D)pmm5W?Vd9pQ z1Jz*5mKS?d66d>6kW5!LkoIiTm{;Df6b7Cd%ITcl{4P9`am#9Z5QV^uIrvT15q2me?7ku z&I3AjU*!4O9Z#PZV=ND=xjuQ=<_nB^y<`y882W!Vv}8wSxhc%Jx^Fhen8ct7jK1pJ)a+p`TvLfAfV$15POz+&G&CCI${4Suk-~LP@_pf zr-;DYHoI6LpmpS*4@P5^{&%p$3CS_AGD|TYiNiH?iUSp6vhN_TTuQ z>^6bLp1JCWr{Bd92cMV!9lJIbU4bON%DK6o*KokXrU|pUmLzq5$EEy|M!62JPTO$Y(0xfLO~_sfQs`(ybKS;Jy`JyxC>$4j>j~aDZ1^*47s5ucU-~qg7iuzkkFV zXAk^xo;DW%1UDXK=h?j3uc5ABOxf5oSe;=a?Wf92+UWWmP9(Yp4Se?(ke_Hb)k$ z+ZRfdzg}9h4Q(d{_~I*>Dbl+AlkN5sB&^9q2}`e&_Zu%~-}2dyMujE9h*mNdSZ6@_ zG3TNLg{P{2!R(gn;W=i^CCnv=&Z6VlK3uWo&L@`_ysbNr@7D`eNc{NGn<;JZ zZRw=K`Fk*Ul3AMSiqS@2nL!D-V{ohvs6>72CR$r;fjDdtO`q zwn1TiW6^raSuHp0Hg4L@zs}?YV>5fmxOm1#Mze+$#2RM3URw{8rqxDp?tJ?}UFSg` z?V@cf%G1U0Z4>yKgF@;F_|X{1e9ReEY-g1s=aw_5TtaRD*cH}lFf##v!O7`>5&uh6 zxY1Q%;v?8*56Z;!vp^T)BqrPo=j`|TH?DNhf7kFk8*S`USX7j<$dt}EZ2wiDpFdN~ z3so!EsQ9+ST3`1&!@3!9y3fh9jyba%<%$RC73DJUB2eP1CC%I@T>wQxH$d0+INEs! zYA{UrB|vYhI=<2pH_gp=c1I^Kr2_Z(?;Es$f?5VvSJ(F%NE}@)9d8Bvj z*fW%vY2GHDS`STjJ8$YNWx7xESbNG-F(5a@?c-nPE`pPfWM%LYQ=I7-&5?>16DCFj z`yN;|p82+*R^O+0hSd)gy^z1m7>&&Gb{;&42ON*MW2QjY#pD#XU*-BlFuypM8Gpn$ zM}D`0%H`izTyd+t8icd+N%tFzx;cBy7JgK@`Fc5q0MQqoE(1&8g z|HQk_7;cFD?Fs)O)t8oOEiXDr6OC^Cfye+gqDZv>GI1Is9D^C-4QZ>R{&WubVuqq6s_tT*W2{&s$q3nm(Yd@$AX>CyF?Aee|t!} zu7f^Wb}u8hT_Ww0i0$ktcXtt*K}xEFfWk|E9+OA^Q^-_jo9LXvLg{=v-gy|Y)~=d~X%OKG2MOWfXO%w|Y#@ammt z_Ud@2Pd)l;{m#Fzc=;Y|>Y461^YNXvCIy#)8{yOEWWHi-DnWe*;ARYn0+4FhI-eu0 zS6m{CRXJ41PKeZxNU$J>eT?)2HR<%fcL}fvGYrtp!L?L+xYb>hm-?ov*{n5yg890% z>RoaJEQDlVx%+7GtgflK+h*ND0HY&bj>$@K+_r}AnvFI6l)KlOx4fcO4Z6!0nms@^ zN&z@n_VAAKP^F4_Tq=~bhpKPA=rj*- zv_GCZ?+n4yr38&7jfb;JESsb&4n+RwquPPjXZD*IwuhZg&0eexePsZ`H1A|*Txtn# z-9APBIATDaTzH5HbO_MTF@pLx3pPrI%fhnF(hfAVdr%C&sqHp8_lptAI(x;jD`l8l zNVxs%Rc&@OmCE=yXtKsscPIG+f{Mk}%orux+Z7S=r7L*tu7=WerDjhfY zInu?RGS~3wdh#P%O>Z1Pi)%hP=TddV;hRZ=V zqIRb%#4~V>v71a5z(QUPTcJ>QNVcEdN5z2j8;1S6Rdq|H^>#%82c4%R>F_7ik?8vQ zY2DED&>8Iyba)EXv$yAg`X>S|@n{ky=`jd9KfrNP^!Q}1KE;V|zdLiiY8(o6d@!K~ ziLaTt@nENmM)wf)dPc)B^TV_AlWMJQj8Fh1o7Hr998B+q#IXbm9zP;^aVZdQGTx@QsoX$f=QRA2pO>j^%U)Yf&Q?t_G1}!p?rI`N{_YPv(n+lR)Tim)`uYrW+9a2SCaf;Ce4pfcRIVW0S3Seu`LOc+MQ9 zLhFUMv?s>4QhCK?>dnsb0dKO(=r*KqnKE36 zp`0l%fola-X0cu5kNWx1z^ZP0ld$0BAvO4JPB`MI*R5)lP7LS(h6sbdw)i3}*lG~} zAF6)&tC1L}7~f1@_6zPQ3ZWI`I9B-=eLVBo!0X7ZHY9YZ+7r#smuZ*MV5yscd=YTJ ztmmB-A;-kjlC|5EhH^97)o!Vira9FX%#?X^#L+LtLaGzIE@Iv62}Zc1-fRd{D5NZa zq*^?rRy!gEN$aSlxpdhY-M|~KwOVPCJNFRM!Bv52>t!LAG{YLs9!h7LhawSz0(~}! zTxkOH7K_h+xRbXj{1gMJomHv{*D$5uP=$VOH5q{c)h}jz)ZgiEt80hF3wwC}Q)&1B z+VOIOw3F)Y4WW`B=hd%%KFC?9niD8lhJr{#A%rM)7=G2QzGR1V$4xa^jfiw8R*#Z= zr-hkINEuR@UHPW1XkOnoe#2SFl+VdSvI8#JDYF0NyEWIDwT0UIx!Bc5d*2Fz6|fe# z5X!FxzpWTP9`JRjD`HiYH~t|*PK&uYWird^t(vqqce>>)4^4Pgu{#mLsyvg7to)|h zw283>geFfiJw-8%6_(=XS+&wG-Q;!A>p>~Z6<6DY#!rTXaip$WH@)Uq)e#AaGv11$ zh~ybk9#D#5<>wd((`QC!B^q2ZcND(+(Z+1Xd<8w*>fFbp)O40&l?Mh&_Fk?VlUT`s z8#oY5LHVZ_)27?7*Xi?rDJ5Nirt`NDbCRNI)yNNM0!qAuEokTDDuOqzo!)Un@= zFIC25Q1&UsFug>nwJ1Xv_SrrFo=|&aKaS*sp{8n==OUuU4zzLjWtqB-B4{{ zwJkk&&<$Nek7)KURDRMP7u}}TfcUfu$fO)eTyfe2YD(9tWtd?sc2jPh^y{cs9JLm3 zqt&reS-9j%^$1O0aOP%vMc_n(93_kt478~2@_Zmf33vuwU;fJxKKV3 ziM`O{9hcbL;j@;!CZNIHMJ0n~IPN4!f|>V{Y|_ zg+fO3$aUJ&lSZhEGmGhT4Fmff*(hX%8xKhCH00m6sAzUQVtO`xE5ZqBUP3w|8_Dyp zYtG!Kw-@}rySW0WNfZeq*N?R8lp899c67^D5f=>p!AGn9Jcr-D<^f#%nG*IIWFenW z(2l$BucRM*S|l))ow}>es}X@-(WC6{JjE#tJN80Cqtr~6yGv-wa2IT+iL|hde`X^@ zs4th-KkwufH^jc{nf$8Jvf<=dGhBGb|KZV6XvBwcdce%C03gWv3;5jeQop(k((8Q^ zF=?$?RD|N%)eqPl?ohtQ-sZpV3(pR0{F4O|4%!%<{!#URV|K2IhRLV*u#bFd{E* zn43j;YdT_Aw`K63)e8-z3;{t>v9|Q~ZBm8%sFn+{)?{k77Ag7UarLLBvQR#0?c(5@ zTOT4$xLG$F?rqNrj@NN-0HwGH4SldYK`*lP)>!4b#(g?KUhC+!c&h%3DRmY8>Z=_C zHH4UQRsWd#^UQBm^Fu1j;jyzFggZ7`rA~J6-N6?CHG0YNt+qTNZimm$bvV7y#_+ZI zAcrNlJ>4jlgvAY<1JPd8^Y`n;sMky#D8PaI$*MgasI&uc4M5AXAL(a+l8*YBH3&8; zj)&_#uD6{^M>vvKFm3WEXH^8Ftbr!`9(MJ5ZfH2bqsXIdBI;o_V>3{AJgez$>||No zQJvNep3&1pQmXm&4T6%)+wt=`)Tg*jbG&{{lxQ0`7Z4M9G` z&oDFGG-yw=Z?Gg|)hj)9YYY}l1nND}7sLV)+*^@5bw*PIFlK>s?k>DY{ax1;&Oby; zeWSoa8pf!a#TrH%&4wz<4|)C#bngC1D}p}Bx4s8)-LrQpAX?}qw;;Q?^ec1fz?`}Y z;E7S0QyYKvJBURxbvt)YCR$)ZT|^vC8LBBU%|9ZjH-BV-FH5Z^n9dL^#tQIFr@y^Qy;KjGd~PZLFP6(Ki_@ zO!KNMF772ijYoqmoGS0}#zLo%bF{mH-k72OrhYX`)3M56ef`*pv$6Rd zwR&eeld?cTiqz_~5rWvx2f(mKdUjpAL417T%*Oq#8p2suxG>A0Y@MfHU5h7E=e?R& z$7kCru;7#o^R=WLMYR`qy{|Xm(D8Gmbfw--2q@`*p`J&`diuqxrAU|)}-wrUB!l5ueL9VQYxYm3g+hCK*dbdU4d7Y-JU4a?$rhd zv-w^Ao?V&|VfOJiBRb6&-{W36Gjfaw$&nh@XmrGlPn&~~9BGq0HIU3ecH`%b8T>+d z;>xO;>Ns_}?6Z0jbMZ=d0AQ>RfCGJ*(Q z2Sr5Gk7x&`cyym1klM7kBRFCQu>SSC1I#(z68EJfViYur8x2XV= z`JEWFCpxI~m+ilrq&x%^$go(|@@1(Nz2e;ceKIR%RWUtTj%<*_T&l_S1(J^h%0LN{ zmT!^cU&81vcI5(vemLQLW?crt^t4cxZ+~V4Q80145VoYd>hbdoFM$q}6bdPe`P;;M zVir)Rt`u;Y;)2I{BuSc0nr)SLvOfED-JY95?Sg03-iZ(XYr{CWq#;|PVJPAwfsQNp zy8gIE+{3Q?sxdLMX%UchPZ*SJJ&He*k#r77o#nz60R|GR_Mz%}4{D;4A~f43eb?ph zdeSz#=QLs*bh+VYS6A~*B}8|zliJt&tC+FKRx7v&89Wmwk|Q#|SwZ1NK+WHudMR>S za+SNw#g=ElWYgL2$dPv)G5n2a8XayO>@?U|c?~!t(S_x2*nc(Cyzl8IXo&d3H#6Qp zs0kP@Hk%**x-I%_>BxV#HLZLZkT`$r;xFXBMLqzm8gFxB7di#fNx^=jf$zzalxAm~ z_v!vB;4)Ji_x~y2+(CxAj~b;+0kY(51WYx5&Gn44UL>)neYOD07480;!#(}gjD^ob zE`0S|>7D@^0Zq#$;GZ#!zsbi8=mz@09x45Y2@(QfeZ2#yDB*z8=OWw7p_j$&{kfo1 zHY!8zF0g-@)_PNrUK0$Xr+pRWEA`Uft{^!Pv-p)Xp8jb_oao;w{QW^H(AIm~Kdf^e zv|@rf5FqnyD}%hg0bArR1^y195W8}nT>#N_#~uVk3K{hc0d~h0j-3cnqAfa#{g)~? zSrg2^%Bn!X;LfNJt;i+wEA-MhO5dz6cyABkAn?`6YVmLEPa6K9^p?!GCr+!07Z6!v4@l-s&j>qpXQQ?zSq!{=aB{fBI}PPIwJ)Hbka=dqjQA zp06h@f`0H`fa!kQePQ}+O2^k#{Jk+&2k@DCT_vL4zOSE21OET7&s_S7RV&I--+a7~ zTJRN)+A6TvPzO#EQU06gU*YK{p%Qr)2%Yh-{ zv~SyFjAqUF=mYmh0C&dZQh`+z`k99~{2T6Ve<(qQ?cXB*Z1~Jqv=bo#=82-lKaesw z-|U~@xgX*E$2FBEmnixSO$5Gw9q-}e2_tR)1LgpAef;ydUNDSBSRmN&H>5Xh8odt~ z0|7$+9+Ut%iO$Qw5T*dsCI4m!gt(-!;h(G_5Wl361BeE|KK4aYG^(#gQSUprPktpH zRixK9h`kBut@M?2M8F+w`4??qtp5d`(+1VRXJ#LUh;UWA7+AQy&twGj+h!^dmtWQ; zIyt5h)W5-v`#?`YN8lrIaC4)S9!1($He*85G z{U84Q| z_4H|&1Nv$CHBry7ulOS39Cg~?9FaBA_J0w`A5B?Ar<(XZSv~)H?QHjv`Rh}np9X4z z$1i;(0kOMeS=>!Z7~a7etRWLWluV5Of;7$Lz=}%%Tif+Vb>|*%U}hx{UA^zcnKw(qcoOt zz@)WmZNE1HU<5grtC}!glhO@-7wjPdt`r{JJ;&!@>b_z?AqP^EXW^?Ixx0pDZ#K%7 z2&ySPO;LuXeWiD6&_RT-`?-ih@V<+7~|M20^;DjTmHCn;iw1w7rPCLSXhNm!zi{ zF{Yacv+~HpDQZSf9#Ro%lLX<*OAX7L+pExZAqiT#%Y)^kBNl~KC{)loRwszaBA}{329j<2`ViuG;;DL zPM+}~63bM|7-P2KQQ1Oxz$%S1t6eg&wFaEBG7P%<-Zvwi1~)hq3Q)^XgLk1=T1>$SrM z+JmXMH?ak%CWm)y6Q_o3#wwBD!GlXVaO>Z#;=`I&Py#{EBGd$Npe&Xj7liOZwh&( z8|`~?b8yz6%Kxoim47_=Wys6+iEgQubnPB5A5XYeghO3~6$ac8eCSJOuU%x4YHzbt zV)I$6#CROJH^_gUFW>5*Z~9Su=f2I}FU;|W7(Ewd_XTi&LsN9vg8cnx>a>4c7OFn& z(A2`_9B6QE6Q;>9X#=>(etug0k3R?*a|U9c=_y>X z8M+ko9ERWdB+IUmxs0eg{X~6-sW{ z%7q?r9%PUQF2hkVtE-%Dl81uFP#(X|)2Sp`m%W+M%ENH|4L^i*H}P zrOzHCWC1pfpTO+d`aj$Dh1#V;VP z$AuE2@DK$dBPfQ+lFPS4udRrgYFz_VwTy0=_$A5nJ#Lgf$1~4>zCll}-RQ*DuB-17 zZ^lr0FSbmx1kH$`WQ*+rb9D1gp+;yrF^5;NTm3}*CppG}(742`M^kI8MFDS@mb(er z0)T}Txjs(^ApYo&yHLoGk?N@@e}FuX>^lB7Qinrb_dIwx-{v?IR@C9JJLTfprvcPx zq2*yWS=HE>5n*ToAW5dr5=SC!&2VZ-O)G!zAqA92VHaJ%P3 zgPWg|S01a*fj40d1S5y%s!k(cP78^pX$psR_e@T1En`;`IY^{IPEHyE>ZDeuh(TcH zCt7=_n5M$6lK=0lbLGs%|`O=Te|qcdpw zuJR0qHTEXQkhYZp*)TzC(u_*U(C}_2aMtlA3?A<7HIkuHXJ2(` zUG(Tl;_PRY#L8ujL!~TLWeA8C$H88|%BV%IV7v~E6uOUAj3aXE5Sfo1-A04xO%0!1 zup=X@0gXJ84InP)um%<1=?vib4it#467xBK_A|p`+Yy;wV&HhesvHk?IfSkJg3*n+uO+@wxBot>yMsl9inGj#pl~DW0S4R~z$3k&H4Q5LyG+LUy z{eyYDc38`oyUp{aUv*iVyg%`fz6CJQ-U8~qq}`9W>W+NCXTKFD&+7$s3PVep@~i|i zDC;x|Qw^7VQw_HtXi^C^xfyf8r;+K}2X7NPc9UW2_98nCxXV{W-L?y=7Vm@>@np!e znzYGW;j;0x&wj3BDmi4}<4%ydxwM*XtEkH}R2aXy7;`}AZ@4aU`N;uK%4!r@{;HTW zL)hPBP4zM2bbIjX>R3T4-GbiTqs{9ikEYG&%#Jre>-5I{z#E=Sj=XvN46YGA6`sFp z6e4&m$~<)GDGCmsds){iN8VM|BIC%O2v|(gJJ4#$(6}0UqGl3W7BPNM5D4N1IR|uC3vh zt!aSE$;dJ6?G3OBEjbW=r`F033I6r)Rmh0E>E?8f>oP|4U6glg*M6k=R>r-(a)Clx91S=kUT8JOpwE2hdX3y&73YsLP7UQeUdcG%7C-dj zrh>-GeudPpDs@XvMQQsH@utBYz~9psD&C zrHeFaq7;!{11f|TI)+|U1f&bntMr~gAoQZ5p@b@s0HGRs=skpTCa(3qXYcQWNawY1{a}jFmoRn=0;~t6Mo}FM1 zaM!`UXz;%o>0}G6<4Pbd>0R`9cTv%ZR_4vyCS0BUV!{(;ud~5amu*1@~=9xA)D)%Q}CG$3uZd*_zcZ57>?{QGQIF z^^0u6TkGcPB2)ke>elk^tQRF2{-rOdU{d!l??9TL#BU|mR`yf9o7Z+Gtn2LC*GJBKDI9iRg$6Ik(!S(mm5DcX30-b+;;jt9I*aS zRkhP957>Vi`_!kYomqM2(S-}ag~EAB(O^(kL8;nWiP$lp>QnV^p9`LS3`mIhFfXVD z(y=zP;{cCscS%b>^UT782JGHQ9wDL#kjH8esT-dMsA-rY+e2LL-{)aII*yfC*VV%^ zvL}9MkdL_>=^N3Nb`J0M%9~vs>L8Q-`Zu-pSiVyAR(|oNz`(U;xq_SMKP=Bu(+~q@ z2!3Tx30#Y&=0lddMj4`gALd3hD9LzQB1?H^*1G8hyuRVEnn#fy#Z zs20OYBnlC>5R=q;e*7B@O5O5M8MQz2a7GA`@dWkS5+{7k=2?_lRBzi}LOuUHkHu5( zBvkLUX&3wV#Ec4*VCK@HrM@|1NF3u^F;_}(| z8@=83Db)yAmyJYaSLNh!xYVKfo!eS!+s_X5cq^H(!nC?4=gh-H-L|CjW=PQwQ!N@_ z2{azJ3Je^msxgRn`mMgQNy;t7o!HlG5Kh7)`&sRh7ka5$!M&e7H%EPaDXCp(z|~cgK!+u7!VR@xuV0B@$sXL<1ZZyW%M&)xJG3V_z!P( z)#VHfwAqpV@F-FFzB5q@cDQ*Vc_Y5vfA`X~fyh)Pr*Suexfy@S)mKr=jmVPX-oSu0 zkMQ1G>zjkJ99?8g1E0!M_bgYsFBw}Vo6XL`E38)Lgw9VhF_tHChr8gpa4B!FLz z(iHPqb7r^RU6H?K!OLO$W;Z|C{;c6_t($YHz6$KP1fh-K;r0KN#}cF82Y! zYXs+uR+3$Yk_1U@_CDD{Hznzaefr!t)Sf+ja9?-aNwQgjnmA=(q!}e2rGbfOw7Y5E z$Z`a1YanZ>4-y(8b|7PoocY^Qs}L~h=M8i0!p&f#OUE>pd^W3bP~@*->t^CL4bIhu zr`$uVnvbg9FUkGRY#G0LQhP_bu7;L8FQR_o+@>YeZF(p3WHxghyY&i1uf@;w83xc20A3-KY{GU_uA{vxES?FiH&A-g+X z-Nz6-2@kWRiIg zBwU*cI9ogA^UU6L8Sr@Wi8D15Q07iKovZG7J$U~wc7K%lPKg>NjRg2)AxK(psGj&mU;$FaIWrb{z1Rc+(dAs@82e0(>fl5WB_n zCv9Fb8mUk*Qe+nD@>n{Xb!Kf|I+M((*O|#g6m=vjE$7bAh^-6EnkIAW<&1M>&hSSk zD%i@)S9lfKeg$3XCXpsrNIm0U`rr9LG9L=Gal}YmH}rp0_bFiQ(wITzY-crCCb>he znJ&R8x141vaTdYvb@RP%8UJTUjS;oD)vl*W2eg8Z;J+*ui&X)(dnVHL4G(`9 za!l3TFu%d{CCr$3=bgfB*HU}4;*L@hl_=-ixsuJvpydJmRT zXD~P$R^-jPWwT`GgOLY z0|%ExK-C?4$sRFA?q##)-#N1DdZ_ssmf1!=xk3ZZ8ZZka+X!055A=hX`p%Gn=BKKR zN2#^G?dt|=2_JqG8i?9Tg47o0p8KcPC=q+j-VL#4uB4K_XRC99@!aYShLwVRQF zuFQ{SA)NV@N#Cto%WvYK{J^q=wkOd(?GUY!Q(R=U>2n!fzx(%Fb=4h@R_rTZ_0g3K z2!ap-sp$>Bgw-48)~3e42>l32u0;r)!;U*~y3Rv$Gj|jt3qtA^8m?2OCghCI(@?;} zx=c>b7(b_A1~&5h{0?l%Dr5P@O!k{GZ*e47;Fj<$0jD#czIk(N8^_LWb`1Z#o9FCm zRABWYK3VUsaNjDzuIT_f%6#QRBlVZ8EUhxZ%=-ca^zjGe`vSht?YA0f-hrQ(sU>6@ z!pb1e9MR0@tIqnbXq*!+fpu;2id-^j4wdiqFJ&#TH<0pJ@y@ljERtYr=X$RKU<0!O zCE00{u;NX)wEnJOTULLR3CTNqD|TK!${I*i?MlDxI7A?vBSs>p<#jaloA-cRPV z24BVQSOWX?s4smsdQ$$LmIgb`t-BNLA&92bh2^DS?2b>nps#@=ePCc1ENEK}FRAfI%Wj)v42M;+Nz3GtNm@s>s=w_{-t@nR|kTH_5p)doy; zR$?_P@r#+7tI2BOEXL3THh(xXDJOXFeB5JZ*p|th~rMaZ=;5(N~j!E?=i2% zEA1JizG#MqFiOM$4Du1GJ{)zDUiUbk)Vcp1;z4%M7B#(K;XCGo6DLTRl}3-|=RK>| z1PY(UB0m8$D3Qu8|8ESU#OWtv)AZ&#R3QA*Vm(u$xZD#h;HV%345&56cY+hYuDv`5 ztDS5cr<7RVUZ>PG-FY$)x>9JqCAMTrpJO}8v@PxTRl*(!-WcI@r-z?5%i@%f-+a}K zJ9NVG@MK3~!tDa*=Y$^!WL|TW{9H@`;dk7(h{@#?zZH)Q0X)30jkl;4hqbPiw z)W&R%IZA@uX`^AJ&5@Nin|MQgogq8y*QWO;=$-#c3M(vkaadHQ4gjF<^ZA2)Bk8Bo zfP}N2OU6D}Tv$-he|~oJs_F~fO;uVur-Mm@i#V<;&x&VwgT{Z%yh&TH4f|}}6fx){BxwO zB4D!*BWdjU!wZGygtUwdR+;6VTRcO_0JP13eWKX!CG0MQ{ga(T*PRFVx0@6ylu(N^ zYv_!`rlH-kn5|eUNvjSq05j1FGi?Fn$kL8zupE)`@vYQkZ=Wdhq=j&x+ zBwVEo|1Q{Y?MqWrtM6LDZ43FW#!^TSa>N!Gm)P_S=wR|j+7N$)IY|yhTeg(lvM1>S z=GPH(Ea!Uj4EdMrxO*KQ`)kvFhvnjb)jN-w&PT61$hJ2+Ge;Wqe))DJg)9rERO?^$ zyAgh?M9@+$F@rWQLIml9&2+kKbn!Pk8bzZ{kr&=xlu>w$76&aAg0*oV5xn9#y& zmU-r{fKaN?yitBKwIP)0?;z$vj+bkvR%)6ncCbL-YF*u7*c8@GAzBR^YljVUb0OSq{Ys*5*#K!}Hw)2&YqzumFd$v6i-W@G030KqqY6 zVkD1oXvc%?yEj{JtD!q9HVcL@e9M`ZoG%!1xvo<_|Ax(Yio?}p(sLw5V zAu38GZt+xCs>ufQ0qDB2ET7S9UOq!67;!|QM;=L4u@=(ua+33pdNOwtfPU*qceX}F zP5z}246?EoUah9>nVd%WT#n5_mnOVvD-bQYCdi>S)gWlrjqq_wr@C=%QVH~xRdfZE zceMeiXZ=-ew0=e%b4`GB9Fy}X<)Ckgneq-|S+Sj>P%ZJK^lF3f1Htnfb#)i*%1tlT zg1?wdoGEwS*c(R9Kd5ieP!>+UqBp^E3vA}#Y%W`5!aLddw!!z&KA}@WADt-tRM5$B zVL_Dg7y9dAv|K|Zofg>HY@+;DW^P#pU$H8q?xjfrfqBq@Xy6FR9CN6HJ#j>TIaWG< zxEXvld0bD{&(!DhPhC=ldl~|S211aBM?ep&0E_-a;KmN^1-I10Tu%_Q&)a)CbeyI> zMhC#Gz6?b{5nHj4fc=HV{&{&>4b#<=?)d=!HB-3+Q+hN4w%-S_tUnIQP&m`cCm|}})_rY? zeUplP%ZuV{@|<}rBk(wO{ol&kVNCECq5F(fu~bpmgd5^h|Mmk9o6lV}TfGG>cSObA}C{Cg=Pei+JtJ7*v6*7@&c9{K2@u zWBGi{KnMhwC;R>VTse%6PRh7h&SJyVMmrIhLx2r3Ny=!`O!xMb{Z(lRrSDEF8W)__ z6{c4%S9!82rxWN4-ON4)?@Z>14AU!?X>4MxwX4mQ{;FOJ>m+A97~Wt>bSI@r_S33Z|Znmd}Ju~9O5+7XXC{7iLeJKkoxn2PQjnD zt3Itv>{99CNHqZ`P2L0VO}SPKxugX9e~so(Fx+nAZj(OVs7C1j>926sx=WjnV%k70 zi&V)VLo-f{nILc!tJVVdX*8Dl2cDg#dL8MNZH10ctD6cO-ls2CCvixgPX~?P=Pr3s zIhzn~P`uV){mgc~b|IVx|7df#uf45!omBjr61G1kuTi!bDFvU@Em^sHuOO$PfJ~#i ztQIPv+ns^4KFo+qh6?(SO8nYa!a8f#n;G8@ZnNl>raS&mkvUo$>$`3Tfuu5V^`i#w z$nlZ1B3HI|cazy)F)?>^b!k}u;%`KZXWEu7-hwH4NS`_Lv(RnE-U?FzzBYBs)QM*Q zTIUY*(qznRAh5Pk8rBIDUcJ-CYau?mTVsz49If}>8qKGQi>JcJgAqM@Y5^=FyIgl? zJFJG%?M@}yHV*dX68_1Gt+!0`H%7%0!FbNz82ywC8)CsN3+X?%-k-+R5>j3Y$^2J^ zw7B1{G|)U$=wkfgv4p0Qm$f1P%=7rzu17yE(tPzWKi7!8_#2i=pOM)ZIGT!mQPX;5 zr=(doXevRZgsDq>6S0Lsml1nCIi&Bd(7l98)?Z*y!|3{ zoM?N-lGIM%)uX|U&alry8MeHCaK0apH@aSIr+ZGN&;IWpWa;d?RnLAY%fDOVzN^tY z0`s{T>b+4rMgyl`7QD`D>cWjRPrf;=P=0V|h`GjPC5v}a8 zyRxUK9j6~S+(4{#xpfvhwszZj0D330F%)b4JnNXAet@r`hrE9dN)i0aH^TR~L?VFg z`wzFPi>L&O56qv#RrIg^e){HRY5&hY{>wZm2xShO^*0Zvo|y}6 zJFfGLA9#s;OA>nKWBP7ti+g>9>1+$MhPr9~o@=kE{CL0li?!WIo+}b79*TST>l9)V zNzq}azy5Jq-aD!}87i4DJ^T;q8vrFaEad-pssPnyb1(kicr}b#k-gsHz1Dm^L!H3$ z+DfrAj4p7k80#iaQU&+Zq9?vD&mLa;F`eRbX4R=FG?#P2({Jtqllvin8Fp4Dv&Km@ zmpZRTlA$C#ftN!~J#zkU(Iwcz;vd59BTHz+MprVzQO|)HkOx~I+S|DPccM?Dr~$QU z@_ZZ*&Mch>A+hypB^g^Fogt7;1R-X(mSs<{@duKhx)ym%m+f(ItGAV$zaT(}*4@A_ zbgq@T?#`Jy+@6VtNs$U$TpD+N!Wk z7}uEate+$oOO);_x0PH6QAIsap_JW*EIF==40CI9f9@zV z3~1$&;{PzN``F&EZenC$Rh9beFHI|o0k{ux6#h(gzCFzTk1`B_qkp4r7_wTTG3q6b?40_b4 zm;9++-UZ$7g_Ii?rY~Abdqv{fZcZa5&(&ZizP2_=XnC)4ELBTo_3V)A4Lis-Uj(vT zjPt>16jOI!`@e_rUxUpD?kvDdiJ4S1#2_{Qik1FG3F!|#FU|Gdce{duzMPMF8eLXy zoSR-2XN9?a@I>6#T?VzYzKgo6BkwOIgRx-hQ$BrK@@i_5djBeUR`36R25rjPsGnvI#`ZP> z1ajW%f(w-NfxBz`HK3D@CIq!Pu zJow_*2V`oep3#r_Cja;9yH#9@n-~g-#YVRCmYq%tBVsZ`H!J%`d)2KRf%NzLTjf9Y z3!3;_Na(h11+m(>kMa}<#!OYy-_EeTkA~G4CmqdnK$IrJd8D_|--gPlfZU?WGHKj! zjV3GJb$HT*yDJ9e&Les^bP)#;i4eR2nEgmF|$x2@XmT|Rl>rOh#au>$c%ON zp?%e^$me9{S4IZxL>b^7NkH=bNe%0!4i`K9(W~=o*Be*pZoCgKr3bIv&ohFye=PZ$ zelxUonJr9;;B?DYWP(Wskbx@3?$6-8nv8$Uspt7 zHHn0p%i&=^@wG~Cpe-an4Gg#64pU6O=BLy7mj0!!*u{Up+_L%ILRUxzy0_M4y(py) zV=Rwh(*dx+0%4@Kaq%pyVN$-Yp0{1v9oVuCq&44o`IJT19;s~S$w_4L|MdhM{0&M5 zMjo=!;J(5C)M5TK-flNOLeC0t=b0IZRo^>Km_jF;??qb^5B-i)cxJCrQE_rgv1gdo ztWRm3a~!AqnRS!Cf9%(#z*lE9GYh7=l-ZSJB3gsc64b|2p&O5Ol4~9|{q=v@M7zQ) zy3;<4v88@JehuGjoie0dDpMd`bGArmw$^Jw5>`t7t|e9CHPwFB(u}_zCY}S4W?}tB zA{b{p6Y#jp`cw>6QesyG;)8|xA2F2;@FjRfM!WBvwg_1uqur$V2ulS8rOa%fEzNw6 zZS3v8AqjiVT=&n>!^U2K$Mfg(KdAiVkbpBNDgvM7*Y$Jnb3UbH06UI9**~~goD2;b zYxd`5h<7Tso{41tyJq?h9WBT%83Y9J%)_T@?lK5+sFu>bo>$n6Exzt8$%?I(`$4&f ztDSeJy;vad#T&0WSazTt?`{(1^e*cGGiR_req>7n4?N0N$NKu^M~@!$V=%HQ&9X$N zJ=ha9DB$WZD2QS+_Cp|Z}+BT8WqM{KQ6J~Eb_6ikB?-G;mvb&EC z4LKZ+3`*^~;CH!j=^Y&W|M)Wh2B_IyJzD7c*?8nfzl2cSUglJod2X05|6YeMB)X#Q zG{z6vvI~F&Xo35xYBx7I&)%!AZ_v`#f7ka>rM-t=$^RAi)i71PcLo!~TDqH8C63lg zB+@<}`v>wIzXz+OJKqM5urHc@nC-@!b>>Hb3FAUkU33=eQ4azDCZf?#H{5OPS3^IL|fH-$xzuYoF8 zJ_a0X-<1?22ey@&%gg`m;G=Rnb!IR}I}Q0Y`T5=F@ecx=KHsz1N`$Ca=2PQ5OCU?v z_e2>z0y(JZh=!4Hn@I^^cO}p3H>3BhJ5Y^3!V?)iP4vRQ$rIS0yyX2y+!NEzKy~{0 zw$gIqp#&xq>Vx&5gSB6lF;Gho1Xo^g`hlbi_y{ST^{nZj_D=o}^GK6ge<=o!bFI^E zBG>&r6eF=;SnG&CfuUiMYQ2K&S=sgD^U^*s;+&Ot|1No3FU@PzbD26nF_xQ z6e2%WWj%+F>H#Gj<^lK1N+Cw2@v);YnGk9Q8oTEC)~*@^?9=OviOn=qoxL4gK60A} ztDV6$QftAqKE|AvMp*aIj>U&={baqLf9d`bcI_V?d~J5Mu?(hc`G&=R#6vqC z0=_r#K3jN4KK~haGN5m@f}H~J_=pot3tc@OvPl#9;=)vWQ#R(4b7svRLl$7n1mL&< zsBV#?+Sz?GXPVUuPrksKwPgJ3{}bx{tKgpo?ZLw+T|gRjgC8gtpL|^mErqOAE+bA~ zc_v_%65CmmHS%i)2ESHT^LSwX08DKQ&%t~jHDaM&7SDuTx5Aty?!Q(ylDL1z*zbn) zUumdx@Fr;T$`#` zH|?-|T6bsjj~o|5DO+ElyBg)wPrE(Fn&G{Q5}SUS8pF*x&4fiTP#kk#_-qd+_s804 zxo}JOc)dPCu>#thytQ?rm&O1EO!IffYe24hxZmyf*aswdWHCy@5T0N)kTXdD~d0iYe(mU!VR=Q4or~M z#YOp-&J3#PPM7XBDxCYWvXRln!?g=ph+m>=1zqK-$?@TU_X^s>^*lpo{uasJ-VQa( zE4%-@1pLr@OmWY?Q75^u6bCp5Q~f=LBs*JNP1N780Ov*~K&|zS-9uqOpJGENT?2-F z*NG3FM>-j%j#vNKKROT=Q;SS~`c2<#auz@3y^P<3(sB-}7hV zZ0ru~2y^@jRlOB^M;|w-+P{pFGOxW`KzU1PUbbVaq#A-3OKs1^uAbL$KfbwCrsNWq zws#?#P^PTBt2U!w?Ry9Xq}~)>kw{$O(E|1ze{ZH$rvpQ@PIZj2p`-{LTLjzTbB+Vd zRI#Mn${_wt2A_;qiD1ytY2^|rE5(frmC4?okh{g=R5EeoNJF<{*tDU9+1epjDj`yW zHs?O$_P*;@7)-MkTh-=JmRaw8>G7gAt9SgdbG~<-r{J62A{53Yl64~nD?CL~ z6Fo&GgLImfYr`Qa-2oCACklFoj$4neDcWWbmw**o{q_j`!66RxHXu00E2PrAKqf=k z+wQ&WPgJ8mS{K?R4;w_BT7($i~J96^I!RYii@lY;Yb@Up)C+Q$E z0W%YLB~LmvE-gE1W4(XCuBFH}`ROx_Ho$)gxTtb4-QB!j0k2ZwYj~VH6`O2PlulF) zFmjAH0iT3k^k&Ar*Tk#z&)s9(ws*8Xf#bIaNwJ{WHdJ3sg$iv7aIXsVF2Wz zcJs3fMP};RhXKS(s~1%`ru^fWCi_%t6B;84fE|H?k}^8s*Q|ATR}`u>EIb7BI7H-5PbMLVA2Ds-x{SV+gQP`thY2*1uobaroBuZ>amM(G5>a>ME~Xqcsf$80aAEjs236<&Odvx@v>{gESXF0EITzeg6* z=-?tClK11L+F)}Vh%ljjVVS{al^0GQA-Ok~d(&{&#Gy`T(pa_yc^PEgs410cEA|sf zx_&eLZ`4D;SPtGD-%KNFJdc+ zM3JTLA9*hD0E3na+yff#)}aJ^+Mq6Ww0=8+FD@=F*(vhw9(t2%_C9#LFGO&H_xDny zG-gzM<@SFAfc>5IpmCW(CwqmL?dNmz=L;p`M8%O)T^HFcEoVzK-zB=jjKv>(Ol#yY zZJ>U;lv1Beyx{p)-?hnD?A1`l3s{RaEVI@?Jl{z5+Vw-5b00R*^|q=y6P(XAjs;$? z>L+tC>G|TicMnQ=I%_AcdvE_xehs*o_?!U5C+ZefJPORg_&Es+S@F;o;;vJ1Ave*k z!&UEa@TxN_YkFZ>iGg`I3U#m49hcjgEquNV@C_Hj10){Yuk1Qr%WUb_!=&5cw8I=6 zMAE~@5^j`rF-b{FXR}#Lw!-6rz}1F<-@feLuH3N;*o#Yklb6d|llQgZbl7@Pj{A(9 z-|p*e@2CBGBF%k#ZOyi5fj3ZS2~J^`U->mR4f;U)Qbx}&!af3)))u5@X3^QTxi|^Pf6lj>^Qw2SDNx|T z;mmt=om4*)DodCwQh;*|T^b@tq+LGkZu~;JSB4>X8x8Jty@htQtbd~mc)Z7OS#&~n z*LS%hx~KLLGk82p^}^wP-9{bBdkiUlYcFi0d6H?*99&-@d3=kGvG>R@tgd+E`nkPH zCU#(tvq!Vu9tqzyRSV@N6eEpaT|(FEfTWu4NuPu=YG3<}Z8>0KjI+V!Sc;}{ME0ddwzUIm^Zaa)^)&kEOS3K z0JG6GT6eB`b1IelgaiXjv%%N+xF(pqt@4h~UQ>}HgIlIj^(zM)UdK?kSXL4@Dh%;5 z(aT}8a7YFW@c@zu0gw!0!WV3WiGOVmfO!EQ5`Gw1tL3|S<9+MvL9QR@RO!vlaF>a# zOHmp15jyitF|i4hfzwBt>6yTp9;fnVzwZF8Kl6^` zsOko_!N4?9j7ee)a7DFVoLQ5KIG{ui@&Tv0Cu9Srs7sK^6gUm=Gu^rE+co;+^?!^8 zVTCnE=ZDlwVgd83-4p#}7d_sHj!AlQ^6-rXm$a0lU0@hltX&W%1I8E=ogZsxYEp?i zP85}t^4=S*7XJ*ZW=&r7@RigHYeY!jdT_y{dgWWsIN8vyrPcVwfCHv^0aJN1|Ezk= zr=fbg)TBG|<7`g8LIx2nno;9hh?)aq&bt=eD9qqsvq3DYCT?PZtdofoYblIy0tTa| z7Tgrp;Aqynac=R+Zh4;|D-Z8ASRvTZ^& ziNx5o9o)CV!qV^M8$MZZI2C|Xwe%f<4MU1fx^YZ9@&#=4ep3Y!4( zY}Cj3DE_7bSN)8!QBCoUP=o4kLk`T+@6EHl#th@#k4*P6USQW0AH|Agp&*B48^ouv zen!%Q+TTUl2%Rs{@-uWwYY#F=Fhjj+*k!{5f9}e@o8h@#MjR4V+DmG0=7Oe%F?qwj zUCjM=A6bLa7rdx}L=@5uADp_0A_$Up6kpGhNa^c`T$c5h!W+rEYBVVHlAme_HH$}@ z&zl*&?bYAU`d-zp#JYCQvv7}1-48_Zj11V1@!Z+D?6O~ULEWf%OY2fE89brnH?d*f zziSUwB^_{a-K2ts3`H}bHeItl4yhHfIxkC7;Jux?qt78RdzYumEO*1JJ#t+t)a)Ld8a%RNmoQ!; z_1a}fhT+|+0d>O;OR-0Nvh~Q(xo)!Y{>0=DF)mJVT!8MoD0UMJLc11!8gT*B;et{3 z^hV=<6Jjh1^uCF3OVUCxj{12$g=EpX#34l0y`Y+vmgNAaR3?Co1oWoa<3{U+bxIHU z-P(H2w|8_K?5V}ro*bfe|;aXEn1z%-nR~BkV=2v%3 zw{EgFuT_e*Jg6FdGpjdes%A)(*|v)2(vGyh0)M{IGyWcj*{C5qpBykq4>kVwEe+m( zb{HPPizuEYudpPB31L;j`t7Rq&;*aW7qY&QP1k?jJW$Wlx6%jMNXy}6hno3%Iy^xW z@#2$3SD?ahY)~y|Ei5x9*vyzFwmWaosRgB46Szc_oV$lzg?L)Fn5VH?Am)|Tp)0uz z{37K7lb5LQuF)Vh4UsD2RS(2g=11aT)Lm#+r4nv$n8Rh&3oi-(WmO<1Lf^7uMlWVj z758$8KXSvRBqCZzWHZIu&+O&l#N{Z3*FUb5#;v9E&dvK9XUOq(1-&Z!3JW6urt&XW zYh3wJ@h%}(ryTs*1eAX;VMku3K=2_L0+XD;4lJ7tg&cGR`$RBiUUwi5@1 zEEOEqUQMz3SF8J#86T0K{=5)se7OZFu`XRY>|FuP;5q?|o$JY;`W|dEW=aTYk4${g z=tIAR;ge6_7=7weBhtsr*(9_1++%Bq^E9b+b%(5wUm&M;ckVaFyoAn>qi2i2*k4qq zL_d~RIJ}gQ5?MUREz+RMsNY$|WYi2$7`s&M>)n9$i2YV!Om<0}@~qHj2NPhGP$4u! z)+fszz);Wx#@fcl!mm!ZiI}iC)bx(;F=F)uCKtKKt}puRbp6pZp-F z`BibNji10I?6QdKtq}ey+V@b;2&=mcdYe9~p02l7{>#&()00WD^9rAd%XJr2WKw56 z`83GJ%qG`rGtRY~XPNdZDIB0nPW0c8l8Ug6ziUg4!)&jHsBwVPfW3`-6k z^$^MCF*e$G$ATY>&iurq79~}a8@P{DrbdXkr@BaG;`lQEtfZMLbc)h%}ku z#-5~PgYL?P=UPh{hhE7CqeBcfMRFd5MGVBh=(66AqcS2({w$H%x_zGk zFGgB6S*h*D8P+hZl6U28Zv=TOt_&NwN9umV?#m3>n{w{ty7gE-@$@O|ZGgJxue{$PAS8GmBCc&P($0+;@9IxHIo3}#MchkrXA zworg4gJbPW4_Ii^)E^bezo!+eWsU4wx*tl#r(3yvP)emRhKL^UGCcIs;b{%Sg8F(Ju`n<*>D}{`i+cx z#hXbqy5|EGHhvnQb&GVuGPTc8Qif|si&0RVE=4_T3pmnp(CI{K&kZG@?Q5P35Oh0q zuVw?u^Hg#TkQDaka4kh(Ajg1po`6(5xU#!@O>7HBqY1`zhi701UE0OLIKf!$L4On6 z=wRtLZB>4LUW4d(j*6}eEL#g5K3GKnH+I&a9La?b@_j`(cpU<&=d@3&`FO%ko-^OY z=|$mYK%2AStz<`w(Qd-W{8=D8>rrx19WX|8edX!I;~sW!EKJR;rhIK(GVP%oEii5= zJm+X8f2Gms(r*W7*?}wth1c6e+Y!5wfgifda^7qWR2hujdYMvoBYo=+fR!K4yRq>4 zfVJt$%h!Bt4vqS=0P){%?;#ZnK)N(D?iFpW{s+?4T@??_TM+%6-%x7edjtvpJwXE= zFZL;(v6Cb~w$5{3%XqwWq3N^7PX+QhMpb_61~D6E8YJq-FpiQkD8mlb-%IBUpv-2} zyfDOi{aXc2?`K=$)5r~Ge&!{=#zlrmw2B4K)09cU89R>rs%K z9*;Zg$je_6wfRhHzwXz!khSQIZV(y;03R-Y5Bi1POWz3#>LrhJQi*CYL%!DrHV=&$ zViA?L?s$*zF5IUh!%`S*1+IVVOQ&z!r?cJh+Raf4Uug%Hd-L6V_Kd6T!XRa2)|jJm zb$tx0T&1I}GID4~wyKo30!WXZf2T*QMQj&j;9tI_x$tlGH8wIWn(;5#;j(X^_TGsD zV@>!g9%&;o^f~qwcp7VD0GE>NggaXh^SD;ioYbJCpi&b~V!@x`Lsr72w}Gb{cMTNx zKCncV^8z!QrYer&+2L3kEkOK=MBN+s7~Pct?4}d&Gn3vgT)Br-ujumD(9zIX5GT`ys!vuX1ER?j8~Y|F;RzZ@hZsP8OMuK8-@ZGB zJASth7+m#dC)N^=3$4&YVFkh>>(#72L*n#)b-F8xyLWRh>@9o6j^?ve+P4B+>QVm2 zPg9{|S#AQ`BiE~B*V4b9921#$_6OMLhxooLRI>wXAKQ=+F^uyTlr1=jBeL3qSUY5QJgvg&)x& z-`=by#JJV?JAUpmF0SA+Du&nGc6{S)q!s#>Hq)Yi=iHX8{>y@mTER%QG@8316l<&| z1=43-DI@2X*-Q^skLR@?%YIbCW0&f5M9vF-@CaSrN)LORH#cI^aJ>fYneOqkIrT_C zDU*GGqBehCA!;bL>w&blSrc7b{%h}`1#dGHbCdf`TCMKwv=b#POoUFVj3op)-=IUQ zYtB*g%agxLdBx%xBBltgwy_hm*0S5(djy9w^g;^h`laX?GQ)!m>-H`P5QAKxGAMys=`j#|s99ep=Cd(^IK@HQbfWJ3L$m zB$C1?`~+Cvjjo_*`zMP(wd4&(yh|4X#`DBqR=x|YlSK>FlvUi?chSI$qq@FwkE+I` z#1^Sm!&W7>Mk44+dX@4RX?5+zu!;>+at(A`^?f~K zJun!0gaWbaiHiA2-sY`D89#~V3lW}v?4%{Z*P;rA<_(t}%0AlJ7SDs1Ac;N`uk%eRdkh3)QVhrgGqy56Eiy#} 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